fix #7231 replacing SpringApplicationEventBus by scoped Vaadin4Spring Event Bus
authorAndreas Kohlbecker <a.kohlbecker@bgbm.org>
Thu, 1 Feb 2018 13:53:25 +0000 (14:53 +0100)
committerAndreas Kohlbecker <a.kohlbecker@bgbm.org>
Thu, 1 Feb 2018 13:56:18 +0000 (14:56 +0100)
47 files changed:
pom.xml
src/main/java/eu/etaxonomy/cdm/addon/config/CdmVaadinConfiguration.java
src/main/java/eu/etaxonomy/cdm/vaadin/component/DistributionToolbar.java
src/main/java/eu/etaxonomy/cdm/vaadin/component/registration/RegistrationItem.java
src/main/java/eu/etaxonomy/cdm/vaadin/debug/EntityCacheDebugger.java
src/main/java/eu/etaxonomy/cdm/vaadin/event/EditorActionTypeFilter.java [new file with mode: 0644]
src/main/java/eu/etaxonomy/cdm/vaadin/event/EntityChangeEventFilter.java [new file with mode: 0644]
src/main/java/eu/etaxonomy/cdm/vaadin/event/ShowDetailsEventEntityTypeFilter.java [new file with mode: 0644]
src/main/java/eu/etaxonomy/cdm/vaadin/toolbar/RegistrationToolbar.java
src/main/java/eu/etaxonomy/cdm/vaadin/ui/DistributionStatusUI.java
src/main/java/eu/etaxonomy/cdm/vaadin/ui/RegistrationUI.java
src/main/java/eu/etaxonomy/cdm/vaadin/view/LoginPresenter.java
src/main/java/eu/etaxonomy/cdm/vaadin/view/LoginViewBean.java
src/main/java/eu/etaxonomy/cdm/vaadin/view/RedirectToLoginView.java
src/main/java/eu/etaxonomy/cdm/vaadin/view/distributionStatus/DistributionTablePresenter.java
src/main/java/eu/etaxonomy/cdm/vaadin/view/name/NameTypeDesignationPopupEditor.java
src/main/java/eu/etaxonomy/cdm/vaadin/view/name/NameTypeDesignationPresenter.java
src/main/java/eu/etaxonomy/cdm/vaadin/view/name/SpecimenTypeDesignationWorkingsetEditorPresenter.java
src/main/java/eu/etaxonomy/cdm/vaadin/view/name/SpecimenTypeDesignationWorkingsetPopupEditor.java
src/main/java/eu/etaxonomy/cdm/vaadin/view/name/TaxonNameEditorPresenter.java
src/main/java/eu/etaxonomy/cdm/vaadin/view/name/TaxonNamePopupEditor.java
src/main/java/eu/etaxonomy/cdm/vaadin/view/occurrence/CollectionEditorPresenter.java
src/main/java/eu/etaxonomy/cdm/vaadin/view/occurrence/CollectionPopupEditor.java
src/main/java/eu/etaxonomy/cdm/vaadin/view/reference/ReferenceEditorPresenter.java
src/main/java/eu/etaxonomy/cdm/vaadin/view/reference/ReferencePopupEditor.java
src/main/java/eu/etaxonomy/cdm/vaadin/view/registration/DashBoardView.java
src/main/java/eu/etaxonomy/cdm/vaadin/view/registration/ListPresenter.java
src/main/java/eu/etaxonomy/cdm/vaadin/view/registration/ListViewBean.java
src/main/java/eu/etaxonomy/cdm/vaadin/view/registration/RegistrationEditorPresenter.java
src/main/java/eu/etaxonomy/cdm/vaadin/view/registration/RegistrationPopupEditor.java
src/main/java/eu/etaxonomy/cdm/vaadin/view/registration/RegistrationWorkingsetPresenter.java
src/main/java/eu/etaxonomy/cdm/vaadin/view/registration/RegistrationWorksetViewBean.java
src/main/java/eu/etaxonomy/cdm/vaadin/view/registration/StartRegistrationPresenter.java
src/main/java/eu/etaxonomy/cdm/vaadin/view/registration/StartRegistrationViewBean.java
src/main/java/eu/etaxonomy/vaadin/mvp/AbstractCdmEditorPresenter.java
src/main/java/eu/etaxonomy/vaadin/mvp/AbstractEditorPresenter.java
src/main/java/eu/etaxonomy/vaadin/mvp/AbstractPopupEditor.java
src/main/java/eu/etaxonomy/vaadin/mvp/AbstractPresenter.java
src/main/java/eu/etaxonomy/vaadin/mvp/AbstractView.java
src/main/java/eu/etaxonomy/vaadin/ui/mainmenu/MenuBeanDiscoveryBean.java
src/main/java/eu/etaxonomy/vaadin/ui/mainmenu/ValoMainMenuBean.java
src/main/java/eu/etaxonomy/vaadin/ui/navigation/NavigationManagerBean.java
src/main/java/eu/etaxonomy/vaadin/ui/navigation/NavigationUriFragmentManager.java
src/main/java/eu/etaxonomy/vaadin/ui/navigation/ViewChangeListenerBean.java
src/main/java/eu/etaxonomy/vaadin/ui/view/DoneWithPopupEvent.java
src/main/java/eu/etaxonomy/vaadin/ui/view/PopupEditorFactory.java [deleted file]
src/test/java/eu/etaxonomy/vaadin/mvp/CdmEditorPresenterTest.java

diff --git a/pom.xml b/pom.xml
index 0af132a39db6fcafd2d08e0602f95585a31bdeb1..24359a3d0b620c51b4cee29316463909be583a75 100755 (executable)
--- a/pom.xml
+++ b/pom.xml
@@ -11,6 +11,7 @@
     <vaadin.version>7.7.10</vaadin.version>
     <vaadin-spring.version>1.2.0</vaadin-spring.version>
     <vaadin.plugin.version>${vaadin.version}</vaadin.plugin.version>
+    <vaadin-spring-addon-eventbus.version>2.0.0.RELEASE</vaadin-spring-addon-eventbus.version>
     <cdmlib.version>4.14.0-SNAPSHOT</cdmlib.version>
     <unitils.version>3.4.2</unitils.version>
     <!-- 
       <artifactId>vaadin-spring</artifactId>
       <version>${vaadin-spring.version}</version>
     </dependency>
+    <dependency>
+      <groupId>org.vaadin.spring.addons</groupId>
+      <artifactId>vaadin-spring-addon-eventbus</artifactId>
+      <version>${vaadin-spring-addon-eventbus.version}</version>
+    </dependency>
     <dependency>
       <groupId>com.vaadin</groupId>
       <artifactId>vaadin-server</artifactId>
index aed7430c87dcb2ed2a70b7bab96b3893e34351e6..13dd25d98c19fc07e3e0759c2420e45ed9f75c19 100644 (file)
@@ -31,6 +31,7 @@ import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.FilterType;
 import org.springframework.core.env.Environment;
 import org.springframework.security.authentication.AuthenticationProvider;
+import org.vaadin.spring.events.annotation.EnableEventBus;
 
 import com.vaadin.spring.annotation.EnableVaadin;
 import com.vaadin.spring.annotation.SpringUI;
@@ -77,6 +78,7 @@ import eu.etaxonomy.vaadin.ui.annotation.EnableVaadinSpringNavigation;
 @EnableVaadin   // this imports VaadinConfiguration
 @EnableVaadinSpringNavigation // activate the NavigationManagerBean
 @EnableAnnotationBasedAccessControl // enable annotation based per view access control
+@EnableEventBus // enable the vaadin spring event bus
 public class CdmVaadinConfiguration implements ApplicationContextAware  {
 
 
index c340e262690432221311996f75b6ff1c8b94261f..371a8dd1f935dc1e75f447a87ba0bc3aea77e89f 100644 (file)
@@ -6,8 +6,8 @@ import javax.annotation.PostConstruct;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.context.ApplicationEventPublisher;
-import org.springframework.context.event.EventListener;
+import org.vaadin.spring.events.EventBus;
+import org.vaadin.spring.events.annotation.EventBusListenerMethod;
 
 import com.vaadin.server.FontAwesome;
 import com.vaadin.server.ThemeResource;
@@ -33,8 +33,13 @@ public class DistributionToolbar extends HorizontalLayout implements Serializabl
         */
        private static final long serialVersionUID = 5344340511582993289L;
 
+    private EventBus.UIEventBus uiEventBus;
+
     @Autowired
-    protected ApplicationEventPublisher eventBus;
+    private final void setViewEventBus(EventBus.UIEventBus viewEventBus){
+        this.uiEventBus = viewEventBus;
+        viewEventBus.subscribe(AuthenticationSuccessEvent.class);
+    }
 
     @Autowired
     @Qualifier("cdmRepository")
@@ -101,8 +106,8 @@ public class DistributionToolbar extends HorizontalLayout implements Serializabl
                updateAuthenticationButtons();
     }
 
-    @EventListener
-    public void onAuthenticationSuccessEvent(AuthenticationSuccessEvent event){
+       @EventBusListenerMethod
+    public void onAuthenticationSuccessEvent(org.vaadin.spring.events.Event<AuthenticationSuccessEvent> event){
         boolean isInitialized = userButton != null;
         // The RegistrationToolbar is being initialize even if not needed only because it is a EventListener
         // which causes Spring to initialize it.
@@ -143,7 +148,7 @@ public class DistributionToolbar extends HorizontalLayout implements Serializabl
      * @return
      */
     private void performLogin() {
-        eventBus.publishEvent(new NavigationEvent("login", navigationManager.getCurrentViewName())); //$NON-NLS-1$
+        uiEventBus.publish(this, new NavigationEvent("login", navigationManager.getCurrentViewName())); //$NON-NLS-1$
     }
 
 
@@ -172,4 +177,5 @@ public class DistributionToolbar extends HorizontalLayout implements Serializabl
        public Button getDetailButton() {
                return detailButton;
        }
+
 }
index 98829ddb980b2d7a09cf809b83badff615b4349e..bf6bab9abaacdd3882d3f11ea0d74a6c71f9bae1 100644 (file)
@@ -15,6 +15,7 @@ import java.util.EnumSet;
 
 import org.joda.time.DateTime;
 import org.joda.time.format.ISODateTimeFormat;
+import org.vaadin.spring.events.EventScope;
 
 import com.vaadin.server.ExternalResource;
 import com.vaadin.server.FontAwesome;
@@ -296,7 +297,11 @@ public class RegistrationItem extends GridLayout {
 
 
     private void publishEvent(Object event) {
-        parentView.getEventBus().publishEvent(event);
+        if(event instanceof NavigationEvent){
+            parentView.getViewEventBus().publish(EventScope.UI, this, event);
+        } else {
+            parentView.getViewEventBus().publish(this, event);
+        }
     }
 
     /* ====== RegistrationItemDesign Getters ====== */
index ac791a0b6542273e24574400db997c568ad80e44..1b213bbf10fb3dd51965c06ba1159629668f875e 100644 (file)
@@ -14,8 +14,11 @@ import java.util.Optional;
 
 import org.apache.log4j.Logger;
 import org.springframework.context.annotation.Profile;
-import org.springframework.context.event.EventListener;
 import org.springframework.stereotype.Component;
+import org.vaadin.spring.events.Event;
+import org.vaadin.spring.events.EventBus;
+import org.vaadin.spring.events.EventBus.ViewEventBus;
+import org.vaadin.spring.events.EventBusListener;
 
 import com.vaadin.event.ShortcutAction;
 import com.vaadin.event.ShortcutListener;
@@ -29,6 +32,7 @@ import eu.etaxonomy.vaadin.mvp.AbstractCdmPopupEditor;
 import eu.etaxonomy.vaadin.mvp.AbstractPresenter;
 import eu.etaxonomy.vaadin.mvp.AbstractView;
 import eu.etaxonomy.vaadin.ui.view.PopEditorOpenedEvent;
+import eu.etaxonomy.vaadin.ui.view.PopupView;
 
 /**
  * @author a.kohlbecker
@@ -37,9 +41,17 @@ import eu.etaxonomy.vaadin.ui.view.PopEditorOpenedEvent;
  */
 @Component
 @Profile("debug")
-public class EntityCacheDebugger implements ViewChangeListener {
+public class EntityCacheDebugger implements ViewChangeListener, EventBusListener<PopEditorOpenedEvent> {
 
     Logger logger = Logger.getLogger(EntityCacheDebugger.class);
+    private ViewEventBus viewEventBus;
+
+
+    // @Autowired // FIXME autowiring fails, need to put in UI Scope?
+    protected final void setViewEventBus(EventBus.ViewEventBus viewEventBus){
+        this.viewEventBus = viewEventBus;
+        viewEventBus.subscribe(this);
+    }
 
     EntityCacheDebuggerShortcutListener shortcutListener;
 
@@ -119,10 +131,11 @@ public class EntityCacheDebugger implements ViewChangeListener {
         }
     }
 
-    @EventListener
-    public void onPopEditorOpenedEvent(PopEditorOpenedEvent event){
-        if(event.getPopupView() != null && event.getPopupView() instanceof AbstractCdmPopupEditor){
-            findWindow(((AbstractCdmPopupEditor)event.getPopupView())).addShortcutListener(shortcutListener);
+    @Override
+    public void onEvent(Event<PopEditorOpenedEvent> event){
+        PopupView popupView = event.getPayload().getPopupView();
+        if(popupView != null && popupView instanceof AbstractCdmPopupEditor){
+            findWindow(((AbstractCdmPopupEditor)popupView)).addShortcutListener(shortcutListener);
         }
 
     }
diff --git a/src/main/java/eu/etaxonomy/cdm/vaadin/event/EditorActionTypeFilter.java b/src/main/java/eu/etaxonomy/cdm/vaadin/event/EditorActionTypeFilter.java
new file mode 100644 (file)
index 0000000..52deec7
--- /dev/null
@@ -0,0 +1,65 @@
+/**
+* Copyright (C) 2018 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+package eu.etaxonomy.cdm.vaadin.event;
+
+import org.vaadin.spring.events.Event;
+import org.vaadin.spring.events.EventBusListenerMethodFilter;
+
+import eu.etaxonomy.vaadin.event.EditorActionType;
+
+/**
+ * @author a.kohlbecker
+ * @since Jan 31, 2018
+ *
+ */
+public class EditorActionTypeFilter implements EventBusListenerMethodFilter {
+
+    EditorActionType action;
+
+    private EditorActionTypeFilter(EditorActionType action) {
+        this.action = action;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean filter(Event<?> event) {
+        if (event.getPayload() instanceof AbstractEditorAction) {
+            AbstractEditorAction editorAction = (AbstractEditorAction) event.getPayload();
+            return this.action.equals(editorAction.type);
+        }
+        return false;
+    }
+
+    public static class Add extends EditorActionTypeFilter {
+
+        public Add() {
+            super(EditorActionType.ADD);
+        }
+
+    }
+
+    public static class Edit extends EditorActionTypeFilter {
+
+        public Edit() {
+            super(EditorActionType.EDIT);
+        }
+
+    }
+
+    public static class Remove extends EditorActionTypeFilter {
+
+        public Remove() {
+            super(EditorActionType.REMOVE);
+        }
+
+    }
+
+}
diff --git a/src/main/java/eu/etaxonomy/cdm/vaadin/event/EntityChangeEventFilter.java b/src/main/java/eu/etaxonomy/cdm/vaadin/event/EntityChangeEventFilter.java
new file mode 100644 (file)
index 0000000..c0b31dd
--- /dev/null
@@ -0,0 +1,77 @@
+/**
+* Copyright (C) 2018 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+package eu.etaxonomy.cdm.vaadin.event;
+
+import java.util.Optional;
+
+import org.vaadin.spring.events.Event;
+import org.vaadin.spring.events.EventBusListenerMethodFilter;
+
+import eu.etaxonomy.cdm.vaadin.event.EntityChangeEvent.Type;
+
+/**
+ * @author a.kohlbecker
+ * @since Jan 31, 2018
+ *
+ */
+public class EntityChangeEventFilter implements EventBusListenerMethodFilter {
+
+
+    private Optional<Class<?>> entityType = null;
+
+    private Optional<Type> eventType = null;
+
+    private EntityChangeEventFilter(Class<?> entityType, Type eventType){
+        this.entityType = Optional.of(entityType);
+        this.eventType = Optional.of(eventType);
+    }
+
+    private EntityChangeEventFilter(Type eventType){
+        this.eventType = Optional.of(eventType);
+    }
+
+    private EntityChangeEventFilter(Class<?> entityType){
+        this.entityType = Optional.of(entityType);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean filter(Event<?> event) {
+        if(event.getPayload() instanceof EntityChangeEvent){
+            EntityChangeEvent testEvent = (EntityChangeEvent)event.getPayload();
+            boolean match = true;
+            if(this.entityType != null){
+                match &= this.entityType.get().equals(testEvent.getEntityType());
+            }
+            if(this.eventType != null){
+                match &= this.eventType.get().equals(testEvent.getType());
+            }
+            return match;
+        }
+        return false;
+    }
+
+
+    public static class OccurrenceCollectionFilter extends EntityChangeEventFilter{
+
+        OccurrenceCollectionFilter(){
+            super(eu.etaxonomy.cdm.model.occurrence.Collection.class);
+        }
+    }
+
+    public static class ReferenceFilter extends EntityChangeEventFilter {
+
+        public ReferenceFilter() {
+            super(eu.etaxonomy.cdm.model.reference.Reference.class);
+        }
+    }
+
+}
diff --git a/src/main/java/eu/etaxonomy/cdm/vaadin/event/ShowDetailsEventEntityTypeFilter.java b/src/main/java/eu/etaxonomy/cdm/vaadin/event/ShowDetailsEventEntityTypeFilter.java
new file mode 100644 (file)
index 0000000..30b885e
--- /dev/null
@@ -0,0 +1,54 @@
+/**
+* Copyright (C) 2018 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+package eu.etaxonomy.cdm.vaadin.event;
+
+import org.vaadin.spring.events.Event;
+import org.vaadin.spring.events.EventBusListenerMethodFilter;
+
+/**
+ * @author a.kohlbecker
+ * @since Jan 31, 2018
+ *
+ */
+public class ShowDetailsEventEntityTypeFilter implements EventBusListenerMethodFilter {
+
+
+    Class entityType;
+
+    private ShowDetailsEventEntityTypeFilter(Class entityType){
+        this.entityType = entityType;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean filter(Event<?> event) {
+
+        if(event.getPayload() instanceof ShowDetailsEvent){
+            ShowDetailsEvent detailsEvent = (ShowDetailsEvent)event.getPayload();
+            return this.entityType.equals(detailsEvent.getEntityType());
+        }
+        return false;
+    }
+
+    public static class RegistrationWorkingSet extends ShowDetailsEventEntityTypeFilter{
+
+        public RegistrationWorkingSet(){
+            super(RegistrationWorkingSet.class);
+        }
+    }
+
+    public static class RegistrationDTO extends ShowDetailsEventEntityTypeFilter{
+
+        public RegistrationDTO(){
+            super(RegistrationDTO.class);
+        }
+    }
+}
index a7a1aa27bd3d8bf4211a71a025ea48f2373c13bb..3795d9d8096447d5946b7fec22ebb141bbeb0865 100644 (file)
@@ -10,8 +10,9 @@ package eu.etaxonomy.cdm.vaadin.toolbar;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.context.ApplicationEventPublisher;
-import org.springframework.context.event.EventListener;
+import org.vaadin.spring.events.EventBus;
+import org.vaadin.spring.events.EventBus.UIEventBus;
+import org.vaadin.spring.events.EventBusListener;
 
 import com.vaadin.server.FontAwesome;
 import com.vaadin.spring.annotation.SpringComponent;
@@ -36,17 +37,22 @@ import eu.etaxonomy.vaadin.ui.navigation.NavigationManager;
  */
 @SpringComponent("registrationToolbar")
 @UIScope
-public class RegistrationToolbar extends HorizontalLayout implements Toolbar {
+public class RegistrationToolbar extends HorizontalLayout implements Toolbar, EventBusListener<AuthenticationSuccessEvent> {
 
     private static final long serialVersionUID = 2594781255088231474L;
 
-    @Autowired
-    protected ApplicationEventPublisher eventBus;
-
     @Autowired
     @Qualifier("cdmRepository")
     private CdmRepository repo;
 
+    private UIEventBus uiEventBus;
+
+    @Autowired
+    protected final void setUIEventBus(EventBus.UIEventBus uiEventBus){
+        this.uiEventBus = uiEventBus;
+        uiEventBus.subscribe(this);
+    }
+
     @Autowired
     protected NavigationManager navigationManager;
 
@@ -85,15 +91,9 @@ public class RegistrationToolbar extends HorizontalLayout implements Toolbar {
     }
 
 
-    @EventListener
-    public void onAuthenticationSuccessEvent(AuthenticationSuccessEvent event){
-        boolean isInitialized = userButton != null;
-        // The RegistrationToolbar is being initialize even if not needed only because it is a EventListener
-        // which causes Spring to initialize it.
-        // TODO After switching to an other event bus this check can be removed
-        if(isInitialized){
-            updateAuthenticationButtons();
-        }
+    @Override
+    public void onEvent(org.vaadin.spring.events.Event<AuthenticationSuccessEvent> event) {
+        updateAuthenticationButtons();
     }
 
     /**
@@ -121,7 +121,7 @@ public class RegistrationToolbar extends HorizontalLayout implements Toolbar {
      * @return
      */
     private void performLogin() {
-        eventBus.publishEvent(new NavigationEvent("login", navigationManager.getCurrentViewName()));
+        uiEventBus.publish(this, new NavigationEvent("login", navigationManager.getCurrentViewName()));
     }
 
 
index 22d47230cc1a1693c2ff8abdf55c844761c7d070..300c3af1c705120f9f7d7b7b870965c542e73ea3 100644 (file)
@@ -2,7 +2,7 @@ package eu.etaxonomy.cdm.vaadin.ui;
 
 import org.apache.log4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.ApplicationEventPublisher;
+import org.vaadin.spring.events.EventBus.UIEventBus;
 
 import com.vaadin.annotations.Theme;
 import com.vaadin.annotations.Title;
@@ -66,7 +66,7 @@ public class DistributionStatusUI extends UI{
 //    private Toolbar toolbar;
 
     @Autowired
-    ApplicationEventPublisher eventBus;
+    UIEventBus uiEventBus;
 
     public DistributionStatusUI() {
 
@@ -97,7 +97,7 @@ public class DistributionStatusUI extends UI{
 //            ((ToolbarDisplay)viewDisplay).setToolbar(toolbar);
 //        }
 
-        eventBus.publishEvent(new UIInitializedEvent());
+        uiEventBus.publish(this, new UIInitializedEvent());
 
         navigator.setDefaultViewName(INITIAL_VIEW);
 
index b682f74786c46b2a1672342528c5e263d50da5c8..5f0c3ce93ea97ff48abfe953a2235f18a2c44478 100644 (file)
@@ -10,7 +10,7 @@ package eu.etaxonomy.cdm.vaadin.ui;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.context.ApplicationEventPublisher;
+import org.vaadin.spring.events.EventBus.UIEventBus;
 
 import com.flowingcode.vaadin.addons.errorwindow.WindowErrorHandler;
 import com.vaadin.annotations.Theme;
@@ -73,6 +73,32 @@ public class RegistrationUI extends UI {
     @Autowired(required = false)
     EntityCacheDebugger entityCacheDebugger = null;
 
+    @Autowired
+    UIEventBus uiEventBus;
+
+    /*
+         * this HACKY solution forces the bean to be instantiated, TODO do it properly
+         */
+    //    @Autowired
+    //    MenuBeanDiscoveryBean bean;
+    
+        @Autowired
+        private MainMenu mainMenu;
+
+    /*
+             * this HACKY solution forces the bean to be instantiated, TODO do it properly
+             */
+        //    @Autowired
+        //    MenuBeanDiscoveryBean bean;
+        
+            @Autowired
+            @Qualifier("registrationToolbar")
+            private Toolbar toolbar;
+
+    //---------------------------------------------
+            
+            public static final String INITIAL_VIEW =  DashBoardView.NAME;
+
     protected void configureAccessDeniedView() {
         viewProvider.setAccessDeniedViewClass(RedirectToLoginView.class);
     }
@@ -92,7 +118,7 @@ public class RegistrationUI extends UI {
 
     //---------------------------------------------
 
-    public static final String INITIAL_VIEW =  DashBoardView.NAME;
+    
 
 
     /*
@@ -101,16 +127,6 @@ public class RegistrationUI extends UI {
 //    @Autowired
 //    MenuBeanDiscoveryBean bean;
 
-    @Autowired
-    private MainMenu mainMenu;
-
-    @Autowired
-    @Qualifier("registrationToolbar")
-    private Toolbar toolbar;
-
-    @Autowired
-    ApplicationEventPublisher eventBus;
-
     public RegistrationUI() {
 
     }
@@ -143,7 +159,7 @@ public class RegistrationUI extends UI {
         }
 
 
-        eventBus.publishEvent(new UIInitializedEvent());
+        uiEventBus.publish(this, new UIInitializedEvent());
 
         String brand = "phycobank";
         //TODO create annotation:
index 215f3f3b17ca88f14e8649bdcbfd72ff11c55022..44eeceb5b1cc8d5b1381eee6124f6e27850a5e0b 100644 (file)
@@ -13,12 +13,14 @@ import java.util.List;
 import org.apache.commons.lang.StringUtils;
 import org.apache.log4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.ApplicationEventPublisher;
-import org.springframework.context.event.EventListener;
 import org.springframework.security.authentication.AuthenticationManager;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
 import org.springframework.security.core.Authentication;
 import org.springframework.security.core.AuthenticationException;
+import org.vaadin.spring.events.Event;
+import org.vaadin.spring.events.EventBus;
+import org.vaadin.spring.events.EventBus.ViewEventBus;
+import org.vaadin.spring.events.EventBusListener;
 
 import com.vaadin.spring.annotation.SpringComponent;
 import com.vaadin.spring.annotation.ViewScope;
@@ -47,7 +49,7 @@ import eu.etaxonomy.vaadin.ui.navigation.NavigationManager;
  */
 @SpringComponent
 @ViewScope
-public class LoginPresenter extends AbstractPresenter<LoginView> {
+public class LoginPresenter extends AbstractPresenter<LoginView> implements EventBusListener<AuthenticationAttemptEvent> {
 
     private static final long serialVersionUID = 4020699735656994791L;
 
@@ -57,11 +59,24 @@ public class LoginPresenter extends AbstractPresenter<LoginView> {
 
     private final static String PROPNAME_PASSWORD = "cdm-vaadin.login.pwd";
 
-    @Autowired
-    protected ApplicationEventPublisher eventBus;
-
     private String redirectToState;
 
+    protected EventBus.UIEventBus uiEventBus;
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected void eventViewBusSubscription(ViewEventBus viewEventBus) {
+        // not listening to view scope events
+    }
+
+    @Autowired
+    protected void setUIEventBus(EventBus.UIEventBus uiEventBus){
+        this.uiEventBus = uiEventBus;
+        uiEventBus.subscribe(this);
+    }
+
     public boolean authenticate(String userName, String password) {
 
         getView().clearMessage();
@@ -74,9 +89,9 @@ public class LoginPresenter extends AbstractPresenter<LoginView> {
                 log.debug("user '" + userName + "' authenticated");
                 currentSecurityContext().setAuthentication(authentication);
                 if(NavigationManager.class.isAssignableFrom(getNavigationManager().getClass())){
-                    eventBus.publishEvent(new AuthenticationSuccessEvent(userName));
+                    uiEventBus.publish(this, new AuthenticationSuccessEvent(userName));
                     log.debug("redirecting to " + redirectToState);
-                    eventBus.publishEvent(new NavigationEvent(redirectToState));
+                    uiEventBus.publish(this, new NavigationEvent(redirectToState));
                 }
             }
         } catch (AuthenticationException e){
@@ -113,11 +128,10 @@ public class LoginPresenter extends AbstractPresenter<LoginView> {
         }
     }
 
-    @EventListener
-    protected void onLoginEvent(AuthenticationAttemptEvent e){
-        authenticate(e.getUserName(), getView().getLoginDialog().getPassword().getValue());
+    @Override
+    public void onEvent(Event<AuthenticationAttemptEvent> event) {
+        authenticate(event.getPayload().getUserName(), getView().getLoginDialog().getPassword().getValue());
     }
 
 
-
 }
index 626747a589d65f72b55809cf82afd94fbe99b583..505fea58f2dcbe7919dbd2af751a57b59a41cc17 100644 (file)
@@ -8,6 +8,8 @@
 */
 package eu.etaxonomy.cdm.vaadin.view;
 
+import org.vaadin.spring.events.EventScope;
+
 import com.vaadin.navigator.View;
 import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent;
 import com.vaadin.spring.annotation.SpringView;
@@ -51,18 +53,18 @@ public class LoginViewBean  extends AbstractView<LoginPresenter> implements Logi
         setCompositionRoot(root);
 
         loginDialog.getLoginButton().addClickListener(e -> handleLoginClick(e));
-        loginDialog.getRegisterButton().addClickListener(e -> eventBus.publishEvent(new RegisterNewUserEvent(e)));
-        loginDialog.getSendOnetimeLogin().addClickListener(e -> eventBus.publishEvent(new PasswordRevoveryEvent(e)));
+        loginDialog.getRegisterButton().addClickListener(e -> getViewEventBus().publish(EventScope.UI, this, new RegisterNewUserEvent(e)));
+        loginDialog.getSendOnetimeLogin().addClickListener(e -> getViewEventBus().publish(EventScope.UI, this, new PasswordRevoveryEvent(e)));
         // NOTE: null viewName will be replaced by the default view name in NavigationManagerBean
-        loginDialog.getCancelLoginButton().addClickListener(e -> eventBus.publishEvent(new NavigationEvent(null)));
-        loginDialog.getCancelRegistrationButton().addClickListener(e -> eventBus.publishEvent(new NavigationEvent(null)));
+        loginDialog.getCancelLoginButton().addClickListener(e -> getViewEventBus().publish(EventScope.UI, this, new NavigationEvent(null)));
+        loginDialog.getCancelRegistrationButton().addClickListener(e -> getViewEventBus().publish(EventScope.UI, this, new NavigationEvent(null)));
     }
 
     /**
      * @param e
      */
     private void handleLoginClick(ClickEvent e) {
-        eventBus.publishEvent(new AuthenticationAttemptEvent(e, loginDialog.getUserName().getValue()));
+        getViewEventBus().publish(this, new AuthenticationAttemptEvent(e, loginDialog.getUserName().getValue()));
     }
 
     @Override
index a9c4afa9788b8572aafebfa53d6a3310b3c7c81a..df79b5fb19850ab123de90ed5560647d432b8668 100644 (file)
@@ -10,8 +10,8 @@ package eu.etaxonomy.cdm.vaadin.view;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.config.ConfigurableBeanFactory;
-import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.context.annotation.Scope;
+import org.vaadin.spring.events.EventBus;
 
 import com.vaadin.navigator.Navigator;
 import com.vaadin.navigator.View;
@@ -49,7 +49,7 @@ public class RedirectToLoginView extends VerticalLayout implements View {
     NavigationManager navigationManager;
 
     @Autowired
-    protected ApplicationEventPublisher eventBus;
+    protected EventBus.UIEventBus uiEventBus;
 
     public RedirectToLoginView() {
 
@@ -70,7 +70,7 @@ public class RedirectToLoginView extends VerticalLayout implements View {
 
         String currentState = ((Navigator)navigationManager).getState();
         // redirect to the login view and pass over the current state
-        eventBus.publishEvent(new NavigationEvent(LoginViewBean.NAME, currentState));
+        uiEventBus.publish(this, new NavigationEvent(LoginViewBean.NAME, currentState));
     }
 
 }
index 28bad2e3d1de2ea3beab499e9fb319cc7722b07a..8d15765e6ee65e943977bdda2863cc6b748502e0 100644 (file)
@@ -26,6 +26,7 @@ import org.springframework.transaction.TransactionStatus;
 import org.vaadin.addons.lazyquerycontainer.LazyQueryContainer;
 import org.vaadin.addons.lazyquerycontainer.QueryDefinition;
 import org.vaadin.addons.lazyquerycontainer.QueryFactory;
+import org.vaadin.spring.events.EventBus.ViewEventBus;
 
 import com.vaadin.server.VaadinSession;
 import com.vaadin.spring.annotation.SpringComponent;
@@ -76,9 +77,17 @@ public class DistributionTablePresenter extends AbstractPresenter<IDistributionT
 
     @Autowired
     @Qualifier("cdmRepository")
-    private CdmRepository repo;
+    private CdmRepository repo; // TODO remove, since this is already in the super class
 
-       public int updateDistributionField(String distributionAreaString, Object comboValue, Taxon taxon) {
+       /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected void eventViewBusSubscription(ViewEventBus viewEventBus) {
+        // no point subscribing
+    }
+
+    public int updateDistributionField(String distributionAreaString, Object comboValue, Taxon taxon) {
            TransactionStatus tx = repo.startTransaction();
            taxon = (Taxon)repo.getTaxonService().find(taxon.getUuid());
            Set<DefinedTermBase> chosenTerms = getChosenTerms();
index 9dbacfc51d5d3981a7a7e17e24caf55d473fd3f5..01181d164a9524562688e843db5ea18a51e3a6f1 100644 (file)
@@ -8,6 +8,9 @@
 */
 package eu.etaxonomy.cdm.vaadin.view.name;
 
+import org.springframework.context.annotation.Scope;
+
+import com.vaadin.spring.annotation.SpringComponent;
 import com.vaadin.ui.Alignment;
 import com.vaadin.ui.CheckBox;
 import com.vaadin.ui.GridLayout;
@@ -27,6 +30,8 @@ import eu.etaxonomy.vaadin.mvp.AbstractCdmPopupEditor;
  * @since Jan 26, 2018
  *
  */
+@SpringComponent
+@Scope("prototype")
 public class NameTypeDesignationPopupEditor extends AbstractCdmPopupEditor<NameTypeDesignation, NameTypeDesignationPresenter>
     implements NameTypeDesignationEditorView {
 
index 3fe97c6b135235a52d5204cb3ff9c7c1b01d4cd6..c10b4c7744714879fa6f9b0cfec8422a727cfa83 100644 (file)
@@ -13,6 +13,9 @@ import java.util.HashSet;
 import java.util.List;
 
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Scope;
+
+import com.vaadin.spring.annotation.SpringComponent;
 
 import eu.etaxonomy.cdm.api.service.IService;
 import eu.etaxonomy.cdm.model.name.NameTypeDesignation;
@@ -35,6 +38,8 @@ import eu.etaxonomy.vaadin.mvp.AbstractCdmEditorPresenter;
  * @since Jan 26, 2018
  *
  */
+@SpringComponent
+@Scope("prototype")
 public class NameTypeDesignationPresenter
         extends AbstractCdmEditorPresenter<NameTypeDesignation, NameTypeDesignationEditorView> {
 
index 00575d591f8bea958420420223c9e719da96b66a..d2744bab63719ec6bd69e98d7734761a57d5350a 100644 (file)
@@ -14,9 +14,12 @@ import java.util.HashSet;
 import java.util.Set;
 
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.event.EventListener;
+import org.springframework.context.annotation.Scope;
+import org.vaadin.spring.events.annotation.EventBusListenerMethod;
 import org.vaadin.viritin.fields.AbstractElementCollection;
 
+import com.vaadin.spring.annotation.SpringComponent;
+
 import eu.etaxonomy.cdm.api.service.IRegistrationService;
 import eu.etaxonomy.cdm.cache.CdmTransientEntityCacher;
 import eu.etaxonomy.cdm.model.ICdmCacher;
@@ -36,6 +39,7 @@ import eu.etaxonomy.cdm.service.ISpecimenTypeDesignationWorkingSetService;
 import eu.etaxonomy.cdm.vaadin.component.CdmBeanItemContainerFactory;
 import eu.etaxonomy.cdm.vaadin.component.CollectionRowItemCollection;
 import eu.etaxonomy.cdm.vaadin.event.EntityChangeEvent;
+import eu.etaxonomy.cdm.vaadin.event.EntityChangeEventFilter;
 import eu.etaxonomy.cdm.vaadin.event.ToOneRelatedEntityButtonUpdater;
 import eu.etaxonomy.cdm.vaadin.event.ToOneRelatedEntityReloader;
 import eu.etaxonomy.cdm.vaadin.model.registration.RegistrationTermLists;
@@ -56,6 +60,8 @@ import eu.etaxonomy.vaadin.mvp.AbstractEditorPresenter;
  * @since Jun 13, 2017
  *
  */
+@SpringComponent
+@Scope("prototype")
 public class SpecimenTypeDesignationWorkingsetEditorPresenter
     extends AbstractEditorPresenter<SpecimenTypeDesignationWorkingSetDTO , SpecimenTypeDesignationWorkingsetPopupEditorView>
     implements CachingPresenter {
@@ -99,7 +105,6 @@ public class SpecimenTypeDesignationWorkingsetEditorPresenter
         return store;
     }
 
-
     /**
      * Loads an existing working set from the database. This process actually involves
      * loading the Registration specified by the <code>RegistrationAndWorkingsetId.registrationId</code> and in
@@ -316,10 +321,13 @@ public class SpecimenTypeDesignationWorkingsetEditorPresenter
         collectionPopupEditor.loadInEditor(collectionId);
     }
 
-    @EventListener(condition = "#event.entityType == T(eu.etaxonomy.cdm.model.occurrence.Collection)")
+
+    @EventBusListenerMethod(filter = EntityChangeEventFilter.OccurrenceCollectionFilter.class)
     public void onCollectionEvent(EntityChangeEvent event){
 
-        Collection newCollection = getRepo().getCollectionService().load(event.getEntityId(), Arrays.asList(new String[]{"$.institute"}));
+        Collection newCollection = getRepo().getCollectionService().load(
+                event.getEntityId(), Arrays.asList(new String[]{"$.institute"})
+                );
         cache.load(newCollection);
 
         for( CollectionRowItemCollection row : collectionPopuEditorSourceRows) {
@@ -347,7 +355,7 @@ public class SpecimenTypeDesignationWorkingsetEditorPresenter
         referencePopupEditor.loadInEditor(referenceId);
     }
 
-    @EventListener(condition = "#event.entityType == T(eu.etaxonomy.cdm.model.reference.Reference)")
+    @EventBusListenerMethod(filter = EntityChangeEventFilter.ReferenceFilter.class)
     public void onReferenceEvent(EntityChangeEvent event){
 
         Reference newRef = getRepo().getReferenceService().load(event.getEntityId(), Arrays.asList(new String[]{"$"}));
index 1ecd788463d318ef6803560a7ea40ab44e19faa6..9ae801bdd9751403a4a723cb717eb05246580c68 100644 (file)
@@ -11,10 +11,12 @@ package eu.etaxonomy.cdm.vaadin.view.name;
 import java.util.Collection;
 import java.util.EnumSet;
 
+import org.springframework.context.annotation.Scope;
 import org.springframework.security.core.GrantedAuthority;
 import org.vaadin.viritin.fields.ElementCollectionField;
 
 import com.vaadin.data.validator.DoubleRangeValidator;
+import com.vaadin.spring.annotation.SpringComponent;
 import com.vaadin.ui.AbstractSelect.ItemCaptionMode;
 import com.vaadin.ui.Component;
 import com.vaadin.ui.GridLayout;
@@ -39,6 +41,8 @@ import eu.etaxonomy.vaadin.mvp.AbstractPopupEditor;
  * @since May 15, 2017
  *
  */
+@SpringComponent
+@Scope("prototype")
 public class SpecimenTypeDesignationWorkingsetPopupEditor
     extends AbstractPopupEditor<SpecimenTypeDesignationWorkingSetDTO, SpecimenTypeDesignationWorkingsetEditorPresenter>
     implements SpecimenTypeDesignationWorkingsetPopupEditorView, AccessRestrictedView, PerEntityAuthorityGrantingEditor {
index 2ea488b84e9030dccd62639f1a328242959290e8..a1618f4e33af4db284536a6d6961c362be179729 100644 (file)
@@ -16,8 +16,10 @@ import java.util.Set;
 
 import org.apache.log4j.Logger;
 import org.hibernate.criterion.Restrictions;
-import org.springframework.context.event.EventListener;
+import org.springframework.context.annotation.Scope;
+import org.vaadin.spring.events.annotation.EventBusListenerMethod;
 
+import com.vaadin.spring.annotation.SpringComponent;
 import com.vaadin.ui.AbstractField;
 
 import eu.etaxonomy.cdm.api.service.INameService;
@@ -35,6 +37,7 @@ import eu.etaxonomy.cdm.model.reference.ReferenceType;
 import eu.etaxonomy.cdm.persistence.hibernate.permission.CRUD;
 import eu.etaxonomy.cdm.service.CdmFilterablePagingProvider;
 import eu.etaxonomy.cdm.vaadin.component.CdmBeanItemContainerFactory;
+import eu.etaxonomy.cdm.vaadin.event.EditorActionTypeFilter;
 import eu.etaxonomy.cdm.vaadin.event.ReferenceEditorAction;
 import eu.etaxonomy.cdm.vaadin.event.TaxonNameEditorAction;
 import eu.etaxonomy.cdm.vaadin.event.ToOneRelatedEntityButtonUpdater;
@@ -53,6 +56,8 @@ import eu.etaxonomy.vaadin.ui.view.DoneWithPopupEvent.Reason;
  * @since May 22, 2017
  *
  */
+@SpringComponent
+@Scope("prototype")
 public class TaxonNameEditorPresenter extends AbstractCdmEditorPresenter<TaxonName, TaxonNamePopupEditorView> {
 
     /**
@@ -271,12 +276,13 @@ public class TaxonNameEditorPresenter extends AbstractCdmEditorPresenter<TaxonNa
         return getRepo().getNameService();
     }
 
-    @EventListener(condition = "#event.type == T(eu.etaxonomy.vaadin.event.EditorActionType).ADD")
+    @EventBusListenerMethod(filter = EditorActionTypeFilter.Add.class)
     public void onReferenceEditorActionAdd(ReferenceEditorAction event) {
 
         if(getView() == null || event.getSourceView() != getView() ){
             return;
         }
+
         referenceEditorPopup = getNavigationManager().showInPopup(ReferencePopupEditor.class);
 
         referenceEditorPopup.grantToCurrentUser(EnumSet.of(CRUD.UPDATE, CRUD.DELETE));
@@ -291,9 +297,10 @@ public class TaxonNameEditorPresenter extends AbstractCdmEditorPresenter<TaxonNa
         }
     }
 
-    @EventListener(condition = "#event.type == T(eu.etaxonomy.vaadin.event.EditorActionType).EDIT")
+    @EventBusListenerMethod(filter = EditorActionTypeFilter.Edit.class)
     public void onReferenceEditorActionEdit(ReferenceEditorAction event) {
 
+
         if(getView() == null || event.getSourceView() != getView() ){
             return;
         }
@@ -311,7 +318,7 @@ public class TaxonNameEditorPresenter extends AbstractCdmEditorPresenter<TaxonNa
         }
     }
 
-    @EventListener
+    @EventBusListenerMethod
     public void onDoneWithPopupEvent(DoneWithPopupEvent event){
 
         if(event.getPopup() == referenceEditorPopup){
@@ -347,12 +354,13 @@ public class TaxonNameEditorPresenter extends AbstractCdmEditorPresenter<TaxonNa
         }
     }
 
-    @EventListener(condition = "#event.type == T(eu.etaxonomy.vaadin.event.EditorActionType).EDIT")
+    @EventBusListenerMethod(filter = EditorActionTypeFilter.Edit.class)
     public void onTaxonNameEditorActionEdit(TaxonNameEditorAction event) {
 
         if(getView() == null || event.getSourceView() != getView() ){
             return;
         }
+
         basionymSourceField = (AbstractField<TaxonName>)event.getSourceComponent();
 
         basionymNamePopup = getNavigationManager().showInPopup(TaxonNamePopupEditor.class);
@@ -364,12 +372,13 @@ public class TaxonNameEditorPresenter extends AbstractCdmEditorPresenter<TaxonNa
 
     }
 
-    @EventListener(condition = "#event.type == T(eu.etaxonomy.vaadin.event.EditorActionType).ADD")
+    @EventBusListenerMethod(filter = EditorActionTypeFilter.Add.class)
     public void onReferenceEditorActionAdd(TaxonNameEditorAction event) {
 
         if(getView() == null || event.getSourceView() != getView() ){
             return;
         }
+
         basionymSourceField = (AbstractField<TaxonName>)event.getSourceComponent();
 
         basionymNamePopup = getNavigationManager().showInPopup(TaxonNamePopupEditor.class);
index 8bc84f49d076273b5a94810e40d6cf5e964f3f38..fb69cecb2094fe4e6f2606690bfb4fc019632939 100644 (file)
@@ -12,9 +12,11 @@ import java.util.Collection;
 import java.util.EnumSet;
 
 import org.apache.commons.lang3.BooleanUtils;
+import org.springframework.context.annotation.Scope;
 import org.springframework.security.core.GrantedAuthority;
 
 import com.vaadin.shared.ui.label.ContentMode;
+import com.vaadin.spring.annotation.SpringComponent;
 import com.vaadin.ui.Alignment;
 import com.vaadin.ui.CheckBox;
 import com.vaadin.ui.GridLayout;
@@ -45,6 +47,8 @@ import eu.etaxonomy.vaadin.permission.EditPermissionTester;
  * @since May 22, 2017
  *
  */
+@SpringComponent
+@Scope("prototype")
 public class TaxonNamePopupEditor extends AbstractCdmPopupEditor<TaxonName, TaxonNameEditorPresenter> implements TaxonNamePopupEditorView, AccessRestrictedView {
 
     private static final long serialVersionUID = -7037436241474466359L;
@@ -253,12 +257,12 @@ public class TaxonNamePopupEditor extends AbstractCdmPopupEditor<TaxonName, Taxo
 
         row++;
         nomReferenceCombobox = new ToOneRelatedEntityCombobox<Reference>("Nomenclatural reference", Reference.class);
-        nomReferenceCombobox.addClickListenerAddEntity(e -> getEventBus().publishEvent(
+        nomReferenceCombobox.addClickListenerAddEntity(e -> getViewEventBus().publish(this,
                 new ReferenceEditorAction(EditorActionType.ADD, null, nomReferenceCombobox, this)
                 ));
         nomReferenceCombobox.addClickListenerEditEntity(e -> {
             if(nomReferenceCombobox.getValue() != null){
-                getEventBus().publishEvent(
+                getViewEventBus().publish(this,
                     new ReferenceEditorAction(
                             EditorActionType.EDIT,
                             nomReferenceCombobox.getValue().getId(),
@@ -300,7 +304,7 @@ public class TaxonNamePopupEditor extends AbstractCdmPopupEditor<TaxonName, Taxo
                 beanId = ((CdmBase)fieldValue).getId();
 
             }
-            eventBus.publishEvent(new TaxonNameEditorAction(e.getAction(), beanId, e.getSource(), this));
+            getViewEventBus().publish(this, new TaxonNameEditorAction(e.getAction(), beanId, e.getSource(), this));
         });
         grid.setComponentAlignment(basionymsComboboxSelect, Alignment.TOP_RIGHT);
         row++;
index af70515fe05e8c656b451a2b8e5b56abc1b39a71..cdb8f28f45a2fad15df22b88068f2afcbe9ed419 100644 (file)
@@ -11,12 +11,16 @@ package eu.etaxonomy.cdm.vaadin.view.occurrence;
 import java.util.Arrays;
 import java.util.List;
 
-import org.springframework.context.event.EventListener;
+import org.springframework.context.annotation.Scope;
+import org.vaadin.spring.events.annotation.EventBusListenerMethod;
+
+import com.vaadin.spring.annotation.SpringComponent;
 
 import eu.etaxonomy.cdm.api.service.IService;
 import eu.etaxonomy.cdm.model.occurrence.Collection;
 import eu.etaxonomy.cdm.service.CdmFilterablePagingProvider;
 import eu.etaxonomy.cdm.vaadin.event.CollectionEditorAction;
+import eu.etaxonomy.cdm.vaadin.event.EditorActionTypeFilter;
 import eu.etaxonomy.cdm.vaadin.event.ToOneRelatedEntityReloader;
 import eu.etaxonomy.cdm.vaadin.security.UserHelper;
 import eu.etaxonomy.vaadin.mvp.AbstractCdmEditorPresenter;
@@ -28,11 +32,14 @@ import eu.etaxonomy.vaadin.ui.view.DoneWithPopupEvent.Reason;
  * @since Dec 21, 2017
  *
  */
+@SpringComponent
+@Scope("prototype")
 public class CollectionEditorPresenter extends AbstractCdmEditorPresenter<Collection, CollectionPopupEditorView> {
 
     private static final long serialVersionUID = -1996365248431425021L;
     private CollectionPopupEditor collectionPopuEditor;
 
+
     /**
      * {@inheritDoc}
      */
@@ -99,7 +106,7 @@ public class CollectionEditorPresenter extends AbstractCdmEditorPresenter<Collec
         getView().getSuperCollectionCombobox().getSelect().addValueChangeListener(new ToOneRelatedEntityReloader<Collection>(getView().getSuperCollectionCombobox(),this));
     }
 
-    @EventListener(condition = "#event.type == T(eu.etaxonomy.vaadin.event.EditorActionType).ADD")
+    @EventBusListenerMethod(filter = EditorActionTypeFilter.Add.class)
     public void onCollectionEditorActionAdd(CollectionEditorAction event) {
 
         if(!checkFromOwnView(event)){
@@ -113,7 +120,7 @@ public class CollectionEditorPresenter extends AbstractCdmEditorPresenter<Collec
         collectionPopuEditor.loadInEditor(null);
     }
 
-    @EventListener(condition = "#event.type == T(eu.etaxonomy.vaadin.event.EditorActionType).EDIT")
+    @EventBusListenerMethod(filter = EditorActionTypeFilter.Edit.class)
     public void onCollectionEditorActionEdit(CollectionEditorAction event) {
 
         if(!checkFromOwnView(event)){
@@ -127,6 +134,7 @@ public class CollectionEditorPresenter extends AbstractCdmEditorPresenter<Collec
         collectionPopuEditor.loadInEditor(event.getEntityId());
     }
 
+    @EventBusListenerMethod()
     public void onDoneWithPopupEvent(DoneWithPopupEvent event){
         if(event.getPopup() == collectionPopuEditor){
             if(event.getReason() == Reason.SAVE){
index 68bb44bca1bf10f05cf76467397edcdc46f425eb..88f20df7966670c584003a64c67c63c5b29043c3 100644 (file)
@@ -8,8 +8,10 @@
 */
 package eu.etaxonomy.cdm.vaadin.view.occurrence;
 
+import org.springframework.context.annotation.Scope;
 import org.springframework.security.core.GrantedAuthority;
 
+import com.vaadin.spring.annotation.SpringComponent;
 import com.vaadin.ui.GridLayout;
 import com.vaadin.ui.TextField;
 
@@ -27,6 +29,8 @@ import eu.etaxonomy.vaadin.mvp.AbstractCdmPopupEditor;
  * @since Dec 21, 2017
  *
  */
+@SpringComponent
+@Scope("prototype")
 public class CollectionPopupEditor extends AbstractCdmPopupEditor<Collection, CollectionEditorPresenter> implements CollectionPopupEditorView, AccessRestrictedView {
 
     private static final long serialVersionUID = 2019724189877425882L;
@@ -133,12 +137,12 @@ public class CollectionPopupEditor extends AbstractCdmPopupEditor<Collection, Co
         row++;
 
         superCollectionCombobox = new ToOneRelatedEntityCombobox<Collection>("Super-collection", Collection.class);
-        superCollectionCombobox.addClickListenerAddEntity(e -> getEventBus().publishEvent(
+        superCollectionCombobox.addClickListenerAddEntity(e -> getViewEventBus().publish(this,
                 new CollectionEditorAction(EditorActionType.ADD, null, superCollectionCombobox, this)
                 ));
         superCollectionCombobox.addClickListenerEditEntity(e -> {
             if(superCollectionCombobox.getValue() != null){
-                getEventBus().publishEvent(
+                getViewEventBus().publish(this,
                     new CollectionEditorAction(
                             EditorActionType.EDIT,
                             superCollectionCombobox.getValue().getId(),
@@ -157,7 +161,7 @@ public class CollectionPopupEditor extends AbstractCdmPopupEditor<Collection, Co
                 new ToOneRelatedEntityButtonUpdater<Collection>(superCollectionCombobox)
                 );
 
-        superCollectionCombobox.addClickListenerAddEntity( e -> getEventBus().publishEvent(
+        superCollectionCombobox.addClickListenerAddEntity( e -> getViewEventBus().publish(this,
                 new CollectionEditorAction(
                         EditorActionType.ADD,
                         null,
@@ -166,7 +170,7 @@ public class CollectionPopupEditor extends AbstractCdmPopupEditor<Collection, Co
                 ));
         superCollectionCombobox.addClickListenerEditEntity(e -> {
                 if(superCollectionCombobox.getValue() != null){
-                    getEventBus().publishEvent(
+                    getViewEventBus().publish(this,
                             new CollectionEditorAction(
                                 EditorActionType.EDIT,
                                 superCollectionCombobox.getValue().getId(),
index 3e6ada45d20ee958a4de1d07fe3eec24da1613d7..520e9d57ba964d4df8dc92ddf6b660891374b356 100644 (file)
@@ -12,9 +12,12 @@ import java.util.Arrays;
 import java.util.List;
 
 import org.apache.log4j.Logger;
-import org.springframework.context.event.EventListener;
+import org.springframework.context.annotation.Scope;
+import org.vaadin.spring.events.annotation.EventBusListenerMethod;
 import org.vaadin.viritin.fields.CaptionGenerator;
 
+import com.vaadin.spring.annotation.SpringComponent;
+
 import eu.etaxonomy.cdm.api.service.IService;
 import eu.etaxonomy.cdm.model.agent.AgentBase;
 import eu.etaxonomy.cdm.model.agent.Person;
@@ -36,6 +39,8 @@ import eu.etaxonomy.vaadin.ui.view.DoneWithPopupEvent.Reason;
  * @since Apr 5, 2017
  *
  */
+@SpringComponent
+@Scope("prototype")
 public class ReferenceEditorPresenter extends AbstractCdmEditorPresenter<Reference, ReferencePopupEditorView> {
 
     private static final long serialVersionUID = -7926116447719010837L;
@@ -48,6 +53,7 @@ public class ReferenceEditorPresenter extends AbstractCdmEditorPresenter<Referen
 
     }
 
+
     /**
      * {@inheritDoc}
      */
@@ -134,11 +140,13 @@ public class ReferenceEditorPresenter extends AbstractCdmEditorPresenter<Referen
     * @param editorAction
      * @throws EditorEntityBeanException
     */
-   @EventListener(condition = "#editorAction.sourceComponent != null")
+   @EventBusListenerMethod
    public void onReferenceEditorAction(ReferenceEditorAction editorAction) {
-       if(!isFromOwnView(editorAction)){
+
+       if(!isFromOwnView(editorAction) || editorAction.getSourceComponent() == null){
            return;
        }
+
        if(ToOneRelatedEntityField.class.isAssignableFrom(editorAction.getSourceComponent().getClass())){
            if(editorAction.isAddAction()){
                inReferencePopup = getNavigationManager().showInPopup(ReferencePopupEditor.class);
@@ -152,7 +160,7 @@ public class ReferenceEditorPresenter extends AbstractCdmEditorPresenter<Referen
        }
    }
 
-   @EventListener
+   @EventBusListenerMethod
    public void doDoneWithPopupEvent(DoneWithPopupEvent event){
 
        if(event.getPopup().equals(inReferencePopup)){
index 85a48d538d4eec165dbcace9989caba4c66e1a4f..2369f20ee0a587fd5e253394b0eb5dd21ed6c5d3 100644 (file)
@@ -11,8 +11,10 @@ package eu.etaxonomy.cdm.vaadin.view.reference;
 import java.util.Collection;
 import java.util.EnumSet;
 
+import org.springframework.context.annotation.Scope;
 import org.springframework.security.core.GrantedAuthority;
 
+import com.vaadin.spring.annotation.SpringComponent;
 import com.vaadin.ui.Alignment;
 import com.vaadin.ui.GridLayout;
 import com.vaadin.ui.ListSelect;
@@ -37,6 +39,8 @@ import eu.etaxonomy.vaadin.mvp.AbstractCdmPopupEditor;
  * @since Apr 4, 2017
  *
  */
+@SpringComponent
+@Scope("prototype")
 public class ReferencePopupEditor extends AbstractCdmPopupEditor<Reference, ReferenceEditorPresenter> implements ReferencePopupEditorView, AccessRestrictedView {
 
     private static final long serialVersionUID = -4347633563800758815L;
@@ -127,12 +131,12 @@ public class ReferencePopupEditor extends AbstractCdmPopupEditor<Reference, Refe
 
         inReferenceCombobox = new ToOneRelatedEntityCombobox<Reference>("In-reference", Reference.class);
         inReferenceCombobox.setWidth(100, Unit.PERCENTAGE);
-        inReferenceCombobox.addClickListenerAddEntity(e -> getEventBus().publishEvent(
+        inReferenceCombobox.addClickListenerAddEntity(e -> getViewEventBus().publish(this,
                 new ReferenceEditorAction(EditorActionType.ADD, null, inReferenceCombobox, this)
                 ));
         inReferenceCombobox.addClickListenerEditEntity(e -> {
             if(inReferenceCombobox.getValue() != null){
-                getEventBus().publishEvent(
+                getViewEventBus().publish(this,
                     new ReferenceEditorAction(
                             EditorActionType.EDIT,
                             inReferenceCombobox.getValue().getId(),
index 60dd53fb64aa1254fe3cada4778cc3648e91690d..d466a1cf284a00934ad76a3dad780b2ad4fd41b9 100644 (file)
@@ -9,7 +9,7 @@
 package eu.etaxonomy.cdm.vaadin.view.registration;
 
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.ApplicationEventPublisher;
+import org.vaadin.spring.events.EventBus;
 
 import com.vaadin.navigator.View;
 import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent;
@@ -32,13 +32,13 @@ public class DashBoardView extends DashBoardDesign implements View {
     private static final long serialVersionUID = -6172448806905158782L;
 
     @Autowired
-    ApplicationEventPublisher eventBus;
+    protected EventBus.UIEventBus uiEventBus;
 
     public DashBoardView() {
         Responsive.makeResponsive(dashboard);
-        buttonNew.addClickListener(e -> eventBus.publishEvent(new NavigationEvent(StartRegistrationViewBean.NAME)));
-        buttonContinue.addClickListener(e -> eventBus.publishEvent(new NavigationEvent(ListViewBean.NAME + "/" + ListView.Mode.inProgress.name())));
-        buttonList.addClickListener(e -> eventBus.publishEvent(new NavigationEvent(ListViewBean.NAME + "/" + ListViewBean.Mode.all.name())));
+        buttonNew.addClickListener(e -> uiEventBus.publish(this, new NavigationEvent(StartRegistrationViewBean.NAME)));
+        buttonContinue.addClickListener(e -> uiEventBus.publish(this, new NavigationEvent(ListViewBean.NAME + "/" + ListView.Mode.inProgress.name())));
+        buttonList.addClickListener(e -> uiEventBus.publish(this, new NavigationEvent(ListViewBean.NAME + "/" + ListViewBean.Mode.all.name())));
     }
 
     /**
index 4b075b3fc9dfe556a40c0454e903c87264d7b54b..21d6d7d3f7d0c932010763e25d9a31a6553e01a5 100644 (file)
@@ -12,8 +12,8 @@ import java.util.EnumSet;
 
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.event.EventListener;
 import org.springframework.security.core.Authentication;
+import org.vaadin.spring.events.annotation.EventBusListenerMethod;
 
 import com.vaadin.spring.annotation.SpringComponent;
 import com.vaadin.spring.annotation.ViewScope;
@@ -58,6 +58,7 @@ public class ListPresenter extends AbstractPresenter<ListView> {
         return workingSetService;
     }
 
+
     @Override
     public void handleViewEntered() {
 
@@ -129,24 +130,27 @@ public class ListPresenter extends AbstractPresenter<ListView> {
         return dtoPager;
     }
 
-    @EventListener(classes=ShowDetailsEvent.class, condition = "#event.type == T(eu.etaxonomy.cdm.vaadin.view.registration.RegistrationDTO)")
-    public void onShowDetailsEvent(ShowDetailsEvent<?,?> event) { // WARNING don't use more specific generic type arguments
-        RegistrationDTO regDto = getWorkingSetService().loadDtoById((Integer)event.getIdentifier());
-        if(event.getProperty().equals("messages")){
-            if(getView() != null){
-                getView().openDetailsPopup("Messages", regDto.getMessages());
+    @EventBusListenerMethod
+    public void onShowDetailsEvent(ShowDetailsEvent<?,?> event) {
+
+        if(event.getEntityType().equals(RegistrationDTO.class)){
+            RegistrationDTO regDto = getWorkingSetService().loadDtoById((Integer)event.getIdentifier());
+            if(event.getProperty().equals("messages")){
+                if(getView() != null){
+                    getView().openDetailsPopup("Messages", regDto.getMessages());
+                }
             }
         }
     }
 
-    @EventListener
+    @EventBusListenerMethod
     public void onEntityChangeEvent(EntityChangeEvent event){
         if(event.getEntityType().isAssignableFrom(Reference.class)){
             // TODO update component showing the according reference, is there a Vaadin event supporting this?
         }
     }
 
-    @EventListener
+    @EventBusListenerMethod
     public void onUpdateResultsEvent(UpdateResultsEvent event){
         getView().populate(pageRegistrations(event.getField(), event.getNewText()));
     }
index 8dcc44eee1ed4d1e1efe8d2e95ac7a0a49ad4df3..c84052ba5e5e8b4a9d3656801540e5a2310b8a19 100644 (file)
@@ -119,7 +119,7 @@ public class ListViewBean extends AbstractPageView<ListPresenter> implements Lis
      * @return
      */
     private void updateResults(TextField field, String newText) {
-        eventBus.publishEvent(new UpdateResultsEvent(field, newText, this));
+        getViewEventBus().publish(this, new UpdateResultsEvent(field, newText, this));
     }
 
     @Override
index 7c3a4c5d41fd9a96d2849e707be774fcbc65ce85..a2f7d0814d3fa7126d316292c3ae5124b1fd3df1 100644 (file)
@@ -11,6 +11,10 @@ package eu.etaxonomy.cdm.vaadin.view.registration;
 import java.util.Arrays;
 import java.util.List;
 
+import org.springframework.context.annotation.Scope;
+
+import com.vaadin.spring.annotation.SpringComponent;
+
 import eu.etaxonomy.cdm.api.service.IRegistrationService;
 import eu.etaxonomy.cdm.model.agent.Institution;
 import eu.etaxonomy.cdm.model.common.User;
@@ -24,6 +28,8 @@ import eu.etaxonomy.vaadin.mvp.AbstractCdmEditorPresenter;
  * @since May 15, 2017
  *
  */
+@SpringComponent
+@Scope("prototype")
 public class RegistrationEditorPresenter extends AbstractCdmEditorPresenter<Registration, RegistrationPopEditorView> {
 
     private static final long serialVersionUID = 6930557602995331944L;
index 54f167dd43c2c638e89369b2c7f9e9a04a8e5496..e050d4b8c015314e9b8af2f11cb62305a35ef360 100644 (file)
@@ -11,8 +11,10 @@ package eu.etaxonomy.cdm.vaadin.view.registration;
 import java.util.Arrays;
 import java.util.Collection;
 
+import org.springframework.context.annotation.Scope;
 import org.springframework.security.core.GrantedAuthority;
 
+import com.vaadin.spring.annotation.SpringComponent;
 import com.vaadin.ui.DateField;
 import com.vaadin.ui.FormLayout;
 import com.vaadin.ui.ListSelect;
@@ -30,6 +32,8 @@ import eu.etaxonomy.vaadin.mvp.AbstractCdmPopupEditor;
  * @since May 15, 2017
  *
  */
+@SpringComponent
+@Scope("prototype")
 public class RegistrationPopupEditor extends AbstractCdmPopupEditor<Registration, RegistrationEditorPresenter>
     implements RegistrationPopEditorView, AccessRestrictedView {
 
index afc361f808b43d20aa5d6462665dc1f0de4838eb..cd262cd45d2b0f4b08500a62ed817c6ced2ccbae 100644 (file)
@@ -17,9 +17,9 @@ import java.util.UUID;
 import org.hibernate.Session;
 import org.hibernate.Transaction;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.event.EventListener;
 import org.springframework.security.core.Authentication;
 import org.springframework.transaction.TransactionStatus;
+import org.vaadin.spring.events.annotation.EventBusListenerMethod;
 
 import com.vaadin.spring.annotation.SpringComponent;
 import com.vaadin.spring.annotation.ViewScope;
@@ -46,10 +46,12 @@ import eu.etaxonomy.cdm.persistence.hibernate.permission.Operation;
 import eu.etaxonomy.cdm.service.CdmFilterablePagingProvider;
 import eu.etaxonomy.cdm.service.CdmStore;
 import eu.etaxonomy.cdm.service.IRegistrationWorkingSetService;
+import eu.etaxonomy.cdm.vaadin.event.EditorActionTypeFilter;
 import eu.etaxonomy.cdm.vaadin.event.EntityChangeEvent;
 import eu.etaxonomy.cdm.vaadin.event.ReferenceEditorAction;
 import eu.etaxonomy.cdm.vaadin.event.RegistrationEditorAction;
 import eu.etaxonomy.cdm.vaadin.event.ShowDetailsEvent;
+import eu.etaxonomy.cdm.vaadin.event.ShowDetailsEventEntityTypeFilter;
 import eu.etaxonomy.cdm.vaadin.event.TaxonNameEditorAction;
 import eu.etaxonomy.cdm.vaadin.event.TypeDesignationWorkingsetEditorAction;
 import eu.etaxonomy.cdm.vaadin.event.registration.RegistrationWorkingsetAction;
@@ -109,7 +111,6 @@ public class RegistrationWorkingsetPresenter extends AbstractPresenter<Registrat
     public RegistrationWorkingsetPresenter() {
     }
 
-
     /**
      * Always create a new Store
      *
@@ -214,7 +215,8 @@ public class RegistrationWorkingsetPresenter extends AbstractPresenter<Registrat
         }
     }
 
-    @EventListener(condition = "#event.type == T(eu.etaxonomy.vaadin.event.EditorActionType).ADD")
+
+    @EventBusListenerMethod(filter = EditorActionTypeFilter.Add.class)
     public void onReferenceEditorActionAdd(ReferenceEditorAction event) {
 
         if(!checkFromOwnView(event)){
@@ -226,7 +228,7 @@ public class RegistrationWorkingsetPresenter extends AbstractPresenter<Registrat
         popup.loadInEditor(null);
     }
 
-    @EventListener(condition = "#event.type == T(eu.etaxonomy.vaadin.event.EditorActionType).EDIT")
+    @EventBusListenerMethod(filter = EditorActionTypeFilter.Edit.class)
     public void onReferenceEditorActionEdit(ReferenceEditorAction event) {
 
         if(!checkFromOwnView(event)){
@@ -238,7 +240,7 @@ public class RegistrationWorkingsetPresenter extends AbstractPresenter<Registrat
         popup.loadInEditor(event.getEntityId());
     }
 
-    @EventListener
+    @EventBusListenerMethod    
     public void onDoneWithReferencePopupEditor(DoneWithPopupEvent event) throws RegistrationValidationException{
         if(event.getPopup() instanceof ReferencePopupEditor){
             if(event.getReason().equals(Reason.SAVE)){
@@ -247,7 +249,7 @@ public class RegistrationWorkingsetPresenter extends AbstractPresenter<Registrat
         }
     }
 
-    @EventListener
+    @EventBusListenerMethod
     public void onDoneWithSpecimenTypeDesignationWorkingsetPopupEditor(DoneWithPopupEvent event) throws RegistrationValidationException{
         if(event.getPopup() instanceof SpecimenTypeDesignationWorkingsetPopupEditor){
             if(event.getReason().equals(Reason.SAVE)){
@@ -256,7 +258,7 @@ public class RegistrationWorkingsetPresenter extends AbstractPresenter<Registrat
         }
     }
 
-    @EventListener(condition = "#event.type == T(eu.etaxonomy.vaadin.event.EditorActionType).EDIT")
+    @EventBusListenerMethod(filter = EditorActionTypeFilter.Edit.class)
     public void onRegistrationEditorAction(RegistrationEditorAction event) {
 
         if(!checkFromOwnView(event)){
@@ -267,7 +269,7 @@ public class RegistrationWorkingsetPresenter extends AbstractPresenter<Registrat
         popup.loadInEditor(event.getEntityId());
     }
 
-    @EventListener(condition = "#event.type == T(eu.etaxonomy.vaadin.event.EditorActionType).EDIT")
+    @EventBusListenerMethod(filter = EditorActionTypeFilter.Edit.class)
     public void onTaxonNameEditorActionEdit(TaxonNameEditorAction event) {
 
         if(!checkFromOwnView(event)){
@@ -285,7 +287,7 @@ public class RegistrationWorkingsetPresenter extends AbstractPresenter<Registrat
     }
 
 
-    @EventListener(condition = "#event.type == T(eu.etaxonomy.vaadin.event.EditorActionType).ADD")
+    @EventBusListenerMethod(filter = EditorActionTypeFilter.Add.class)
     public void onTaxonNameEditorActionAdd(TaxonNameEditorAction event) {
 
         if(!checkFromOwnView(event)){
@@ -326,7 +328,7 @@ public class RegistrationWorkingsetPresenter extends AbstractPresenter<Registrat
      * @param event
      * @throws RegistrationValidationException
      */
-    @EventListener
+    @EventBusListenerMethod
     public void onDoneWithTaxonnameEditor(DoneWithPopupEvent event) throws RegistrationValidationException{
         if(event.getPopup() instanceof TaxonNamePopupEditor){
             TransactionStatus txStatus = getRepo().startTransaction();
@@ -358,9 +360,13 @@ public class RegistrationWorkingsetPresenter extends AbstractPresenter<Registrat
      * @param event
      * @throws RegistrationValidationException
      */
-    @EventListener(condition = "#event.action == T(eu.etaxonomy.cdm.vaadin.event.registration.RegistrationWorkingsetAction.Action).start")
+    @EventBusListenerMethod
     public void onRegistrationWorkflowEventActionStart(RegistrationWorkingsetAction event) throws RegistrationValidationException {
 
+        if(!event.isStart()){
+            return;
+        }
+
         getView().getAddExistingNameCombobox().commit();
         TaxonName typifiedName = getView().getAddExistingNameCombobox().getValue();
         if(typifiedName != null){
@@ -378,7 +384,8 @@ public class RegistrationWorkingsetPresenter extends AbstractPresenter<Registrat
 
     }
 
-    @EventListener(condition = "#event.type == T(eu.etaxonomy.vaadin.event.EditorActionType).EDIT")
+
+    @EventBusListenerMethod(filter = EditorActionTypeFilter.Edit.class)
     public void onTypeDesignationsEditorActionEdit(TypeDesignationWorkingsetEditorAction event) {
 
         if(!checkFromOwnView(event)){
@@ -409,9 +416,13 @@ public class RegistrationWorkingsetPresenter extends AbstractPresenter<Registrat
         }
     }
 
-    @EventListener(condition = "#event.type == T(eu.etaxonomy.vaadin.event.EditorActionType).ADD && #event.sourceComponent == null")
+    @EventBusListenerMethod(filter = EditorActionTypeFilter.Add.class)
     public void onAddNewTypeDesignationWorkingset(TypeDesignationWorkingsetEditorAction event) {
 
+        if(event.getSourceComponent() != null){
+            return;
+        }
+
         if(event.getWorkingSetType() == TypeDesignationWorkingSetType.SPECIMEN_TYPE_DESIGNATION_WORKINGSET){
             SpecimenTypeDesignationWorkingsetPopupEditor popup = getNavigationManager().showInPopup(SpecimenTypeDesignationWorkingsetPopupEditor.class);
             TypeDesignationWorkingsetEditorIdSet identifierSet;
@@ -479,7 +490,7 @@ public class RegistrationWorkingsetPresenter extends AbstractPresenter<Registrat
      * @param event
      * @throws RegistrationValidationException
      */
-    @EventListener
+    @EventBusListenerMethod
     public void onDoneWithTypeDesignationEditor(DoneWithPopupEvent event) throws RegistrationValidationException{
         if(event.getPopup() instanceof SpecimenTypeDesignationWorkingsetPopupEditor){
             if(event.getReason().equals(Reason.SAVE)){
@@ -517,8 +528,8 @@ public class RegistrationWorkingsetPresenter extends AbstractPresenter<Registrat
     }
 
 
-    @EventListener(classes=ShowDetailsEvent.class, condition = "#event.type == T(eu.etaxonomy.cdm.vaadin.model.registration.RegistrationWorkingSet)")
-    public void onShowRegistrationWorkingSetMessages(ShowDetailsEvent<?,?> event) { // WARNING don't use more specific generic type arguments
+    @EventBusListenerMethod(filter = ShowDetailsEventEntityTypeFilter.RegistrationWorkingSet.class)
+    public void onShowRegistrationWorkingSetMessages(ShowDetailsEvent<?,?> event) {
         List<String> messages = new ArrayList<>();
         for(RegistrationDTO dto : workingset.getRegistrationDTOs()){
             dto.getMessages().forEach(m -> messages.add(dto.getSummary() + ": " + m));
@@ -528,8 +539,9 @@ public class RegistrationWorkingsetPresenter extends AbstractPresenter<Registrat
         }
     }
 
-    @EventListener(classes=ShowDetailsEvent.class, condition = "#event.type == T(eu.etaxonomy.cdm.vaadin.view.registration.RegistrationDTO)")
-    public void onShowRegistrationMessages(ShowDetailsEvent<?,?> event) { // WARNING don't use more specific generic type arguments
+
+    @EventBusListenerMethod(filter = ShowDetailsEventEntityTypeFilter.RegistrationDTO.class)
+    public void onShowRegistrationMessages(ShowDetailsEvent<?,?> event) {
         RegistrationDTO regDto = regWorkingSetService.loadDtoById((Integer)event.getIdentifier());
         if(event.getProperty().equals("messages")){
             if(getView() != null){
@@ -538,7 +550,7 @@ public class RegistrationWorkingsetPresenter extends AbstractPresenter<Registrat
         }
     }
 
-    @EventListener
+    @EventBusListenerMethod
     public void onEntityChangeEvent(EntityChangeEvent event){
         if(workingset == null){
             return;
index af780b99de5a02d03149d1b96b01ccd0d6a38b7e..d6129e7b65426122962309ac3d398af18f949c39 100644 (file)
@@ -184,14 +184,14 @@ public class RegistrationWorksetViewBean extends AbstractPageView<RegistrationWo
         addNewNameRegistrationButton = new Button("new name");
         addNewNameRegistrationButton.setDescription("A name which is newly published in this publication.");
         addNewNameRegistrationButton.addClickListener(
-                e -> eventBus.publishEvent(new TaxonNameEditorAction(EditorActionType.ADD, null, addNewNameRegistrationButton, this))
+                e -> getViewEventBus().publish(this, new TaxonNameEditorAction(EditorActionType.ADD, null, addNewNameRegistrationButton, this))
                 );
 
         addExistingNameButton = new Button("existing name:");
         addExistingNameButton.setDescription("A name which was previously published in a earlier publication.");
         addExistingNameButton.setEnabled(false);
         addExistingNameButton.addClickListener(
-                e -> eventBus.publishEvent(new RegistrationWorkingsetAction(citationID, RegistrationWorkingsetAction.Action.start))
+                e -> getViewEventBus().publish(this, new RegistrationWorkingsetAction(citationID, RegistrationWorkingsetAction.Action.start))
                 );
 
         existingNameCombobox = new LazyComboBox<TaxonName>(TaxonName.class);
@@ -229,7 +229,7 @@ public class RegistrationWorksetViewBean extends AbstractPageView<RegistrationWo
         if(dto.getMessages().isEmpty()){
             messageButton.setEnabled(false);
         } else {
-            messageButton.addClickListener(e -> eventBus.publishEvent(
+            messageButton.addClickListener(e -> getViewEventBus().publish(this,
                     new ShowDetailsEvent<RegistrationDTO, Integer>(
                         e,
                         RegistrationDTO.class,
@@ -250,7 +250,7 @@ public class RegistrationWorksetViewBean extends AbstractPageView<RegistrationWo
             Button editRegistrationButton = new Button(FontAwesome.COG);
             editRegistrationButton.setStyleName(ValoTheme.BUTTON_TINY);
             editRegistrationButton.setDescription("Edit registration");
-            editRegistrationButton.addClickListener(e -> getEventBus().publishEvent(new RegistrationEditorAction(
+            editRegistrationButton.addClickListener(e -> getViewEventBus().publish(this, new RegistrationEditorAction(
                 EditorActionType.EDIT,
                 dto.getId(),
                 null,
@@ -269,7 +269,7 @@ public class RegistrationWorksetViewBean extends AbstractPageView<RegistrationWo
         if(editButtonGroup.getNameButton() != null){
             editButtonGroup.getNameButton().getButton().addClickListener(e -> {
                 Integer nameId = editButtonGroup.getNameButton().getId();
-                getEventBus().publishEvent(new TaxonNameEditorAction(
+                getViewEventBus().publish(this, new TaxonNameEditorAction(
                     EditorActionType.EDIT,
                     nameId,
                     e.getButton(),
@@ -284,7 +284,7 @@ public class RegistrationWorksetViewBean extends AbstractPageView<RegistrationWo
                 TypedEntityReference baseEntityRef = workingsetButton.getBaseEntity();
                 TypeDesignationWorkingSetType workingsetType = workingsetButton.getType();
                 Integer registrationEntityID = dto.getId();
-                getEventBus().publishEvent(new TypeDesignationWorkingsetEditorAction(
+                getViewEventBus().publish(this, new TypeDesignationWorkingsetEditorAction(
                         EditorActionType.EDIT,
                         baseEntityRef,
                         workingsetType,
@@ -342,7 +342,7 @@ public class RegistrationWorksetViewBean extends AbstractPageView<RegistrationWo
      */
     protected void addNewTypeDesignationWorkingset(TypeDesignationWorkingSetType newWorkingsetType, Integer registrationEntityId, Window typeDesignationTypeCooser) {
         UI.getCurrent().removeWindow(typeDesignationTypeCooser);
-        getEventBus().publishEvent(new TypeDesignationWorkingsetEditorAction(
+        getViewEventBus().publish(this, new TypeDesignationWorkingsetEditorAction(
                 EditorActionType.ADD,
                 newWorkingsetType,
                 registrationEntityId,
index 59eeb899b0e61f71bc7e18a0b4680c885d9fcbe6..a9acfd6074d1d48a06555918a3ab3d10c1df681e 100644 (file)
@@ -10,7 +10,8 @@ package eu.etaxonomy.cdm.vaadin.view.registration;
 
 import java.util.EnumSet;
 
-import org.springframework.context.event.EventListener;
+import org.vaadin.spring.events.EventScope;
+import org.vaadin.spring.events.annotation.EventBusListenerMethod;
 import org.vaadin.viritin.fields.LazyComboBox;
 
 import com.vaadin.server.SystemError;
@@ -23,6 +24,7 @@ import eu.etaxonomy.cdm.model.reference.Reference;
 import eu.etaxonomy.cdm.model.reference.ReferenceType;
 import eu.etaxonomy.cdm.persistence.hibernate.permission.CRUD;
 import eu.etaxonomy.cdm.service.CdmFilterablePagingProvider;
+import eu.etaxonomy.cdm.vaadin.event.EditorActionTypeFilter;
 import eu.etaxonomy.cdm.vaadin.event.ReferenceEditorAction;
 import eu.etaxonomy.cdm.vaadin.event.RegistrationEditorAction;
 import eu.etaxonomy.cdm.vaadin.ui.RegistrationUIDefaults;
@@ -54,6 +56,7 @@ public class StartRegistrationPresenter extends AbstractEditorPresenter<Registra
         super();
     }
 
+
     /**
      * {@inheritDoc}
      */
@@ -81,12 +84,14 @@ public class StartRegistrationPresenter extends AbstractEditorPresenter<Registra
         super.handleViewExit();
     }
 
-    @EventListener(condition = "#event.type == T(eu.etaxonomy.vaadin.event.EditorActionType).ADD")
+
+    @EventBusListenerMethod(filter = EditorActionTypeFilter.Add.class)
     public void onReferenceEditorActionAdd(ReferenceEditorAction event) {
 
         if(getView() == null || getView().getNewPublicationButton() != event.getSourceComponent()){
             return;
         }
+
         newReferencePopup = getNavigationManager().showInPopup(ReferencePopupEditor.class);
         EnumSet<ReferenceType> refTypes = RegistrationUIDefaults.PRINTPUB_REFERENCE_TYPES.clone();
         refTypes.remove(ReferenceType.Section);
@@ -96,7 +101,7 @@ public class StartRegistrationPresenter extends AbstractEditorPresenter<Registra
         newReferencePopup.loadInEditor(null);
     }
 
-    @EventListener(condition = "#event.type == T(eu.etaxonomy.vaadin.event.EditorActionType).REMOVE")
+    @EventBusListenerMethod(filter = EditorActionTypeFilter.Remove.class)
     public void onReferenceEditorActionRemove(ReferenceEditorAction event) {
 
         if(getView().getRemoveNewPublicationButton() != event.getSourceComponent()){
@@ -120,8 +125,9 @@ public class StartRegistrationPresenter extends AbstractEditorPresenter<Registra
         getView().getNewPublicationLabel().setVisible(false);
     }
 
-    @EventListener
+    @EventBusListenerMethod
     public void onDoneWithPopupEvent(DoneWithPopupEvent event){
+
         if(event.getPopup() == newReferencePopup){
             if(event.getReason() == Reason.SAVE){
 
@@ -147,12 +153,13 @@ public class StartRegistrationPresenter extends AbstractEditorPresenter<Registra
         }
     }
 
-    @EventListener(condition = "#event.type == T(eu.etaxonomy.vaadin.event.EditorActionType).ADD")
+    @EventBusListenerMethod(filter = EditorActionTypeFilter.Add.class)
     public void onRegistrationEditorActionAdd(RegistrationEditorAction event) {
 
         if(getView().getContinueButton() != event.getSourceComponent()){
             return;
         }
+
         Integer referenceId = null;
         LazyComboBox<Reference> referenceCombobox = getView().getReferenceCombobox();
         referenceCombobox.commit();
@@ -167,7 +174,7 @@ public class StartRegistrationPresenter extends AbstractEditorPresenter<Registra
             getView().getContinueButton().setEnabled(false);
         }
         registrationInProgress = true;
-        eventBus.publishEvent(new NavigationEvent(RegistrationWorksetViewBean.NAME, Integer.toString(referenceId)));
+        viewEventBus.publish(EventScope.UI, this, new NavigationEvent(RegistrationWorksetViewBean.NAME, Integer.toString(referenceId)));
 
     }
 
index f1c4b36b8c9df9cadc047d01588f643c6f8967f2..09598e1d74c3d5437adb1f792c99dd9928f175ef 100644 (file)
@@ -88,7 +88,7 @@ public class StartRegistrationViewBean extends AbstractPageView<StartRegistratio
         });
 
         newPublicationButton = new Button("New");
-        newPublicationButton.addClickListener( e -> eventBus.publishEvent(
+        newPublicationButton.addClickListener( e -> getViewEventBus().publish(this,
                 new ReferenceEditorAction(EditorActionType.ADD, newPublicationButton)
                 ));
         newPublicationButton.setCaption("New");
@@ -100,7 +100,7 @@ public class StartRegistrationViewBean extends AbstractPageView<StartRegistratio
         removeNewPublicationButton = new Button("Delete");
         removeNewPublicationButton.setStyleName(ValoTheme.BUTTON_DANGER);
         removeNewPublicationButton.setWidth(ELEMENT_WIDTH);
-        removeNewPublicationButton.addClickListener( e -> eventBus.publishEvent(
+        removeNewPublicationButton.addClickListener( e -> getViewEventBus().publish(this,
                 new ReferenceEditorAction(EditorActionType.REMOVE, removeNewPublicationButton)
                 ));
 
@@ -133,7 +133,7 @@ public class StartRegistrationViewBean extends AbstractPageView<StartRegistratio
             if(referenceCombobox.getValue() != null){
                 refId = referenceCombobox.getValue().getId();
             }
-            eventBus.publishEvent(
+            getViewEventBus().publish(this,
                 new RegistrationEditorAction(EditorActionType.ADD,
                         // passing the refId is hack, bit for some reason the presenter is always referring to the wrong view
                         refId,
index b24bc22266893ae4abef74d7af77c237d7ab51dd..b8e4c6bb5bbf231080ded034ac628e6b3ec8ba6d 100644 (file)
@@ -14,7 +14,7 @@ import java.util.HashSet;
 
 import org.apache.log4j.Logger;
 import org.hibernate.HibernateException;
-import org.springframework.context.event.EventListener;
+import org.vaadin.spring.events.annotation.EventBusListenerMethod;
 
 import eu.etaxonomy.cdm.api.service.IService;
 import eu.etaxonomy.cdm.cache.CdmTransientEntityCacher;
@@ -120,10 +120,10 @@ public abstract class AbstractCdmEditorPresenter<DTO extends CdmBase, V extends
      * @return
      */
     protected abstract IService<DTO> getService();
-
+    
     @SuppressWarnings("unchecked")
     @Override
-    @EventListener // the generic type parameter <DTO> must not be used here otherwise events will not be received
+    @EventBusListenerMethod
     public void onEditorPreSaveEvent(EditorPreSaveEvent preSaveEvent){
 
         if(!isFromOwnView(preSaveEvent)){
@@ -134,16 +134,15 @@ public abstract class AbstractCdmEditorPresenter<DTO extends CdmBase, V extends
 
     @SuppressWarnings("unchecked")
     @Override
-    @EventListener // the generic type parameter <DTO> must not be used here otherwise events will not be received
-    public void onEditorSaveEvent(EditorSaveEvent saveEvent){
+    @EventBusListenerMethod
+    public void onEditorSaveEvent(EditorSaveEvent<DTO> saveEvent){
 
         if(!isFromOwnView(saveEvent)){
             return;
         }
-
-
+        
         // the bean is now updated with the changes made by the user
-        DTO bean = (DTO) saveEvent.getBean();
+        DTO bean = saveEvent.getBean();
 
         if(logger.isTraceEnabled()){
             PersistentContextAnalyzer pca = new PersistentContextAnalyzer(bean);
@@ -161,7 +160,7 @@ public abstract class AbstractCdmEditorPresenter<DTO extends CdmBase, V extends
             EntityChangeEvent changeEvent = getStore().saveBean(bean);
 
             if(changeEvent != null){
-                eventBus.publishEvent(changeEvent);
+                viewEventBus.publish(this, changeEvent);
             }
         } catch (HibernateException e){
             if(newAuthorityCreated != null){
@@ -172,7 +171,7 @@ public abstract class AbstractCdmEditorPresenter<DTO extends CdmBase, V extends
     }
 
     /**
-     * EditorPresneters for beans with transient properties should overwrite this method to
+     * EditorPresenters for beans with transient properties should overwrite this method to
      * update the beanItem with the changes made to the transient properties.
      * <p>
      * This is necessary because Vaadin MethodProperties are readonly when no setter is
@@ -220,7 +219,7 @@ public abstract class AbstractCdmEditorPresenter<DTO extends CdmBase, V extends
     protected final void deleteBean(DTO bean){
         EntityChangeEvent changeEvent = getStore().deleteBean(bean);
         if(changeEvent != null){
-            eventBus.publishEvent(changeEvent);
+            viewEventBus.publish(this, changeEvent);
         }
 
     }
index b42f0b23656860bcf335fb560ac1848bfdb1d924..61730af0625785a21ab61976271e39ad461f21fc 100644 (file)
@@ -9,9 +9,7 @@
 package eu.etaxonomy.vaadin.mvp;
 
 import org.hibernate.FlushMode;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.ApplicationEventPublisher;
-import org.springframework.context.event.EventListener;
+import org.vaadin.spring.events.annotation.EventBusListenerMethod;
 
 import eu.etaxonomy.cdm.vaadin.event.AbstractEditorAction;
 import eu.etaxonomy.vaadin.mvp.event.EditorDeleteEvent;
@@ -32,9 +30,6 @@ public abstract class AbstractEditorPresenter<DTO extends Object, V extends Appl
 
     FlushMode previousPreSaveEvenFlushMode = null;
 
-    @Autowired
-    protected ApplicationEventPublisher eventBus;
-
     protected BeanInstantiator<DTO> beanInstantiator = null;
 
     /**
@@ -53,51 +48,25 @@ public abstract class AbstractEditorPresenter<DTO extends Object, V extends Appl
         this.beanInstantiator = beanInstantiator;
     }
 
-    /**
-     * Regarding changing the Flush mode see see also {@link ViewScopeConversationHolder}
-     *
-     * @param preSaveEvent
-     */
-    @EventListener
+    @EventBusListenerMethod
     public void onEditorPreSaveEvent(EditorPreSaveEvent<DTO> preSaveEvent){
-        if(!isFromOwnView(preSaveEvent)){
-            return;
-        }
-//        getSession().setFlushMode(FlushMode.AUTO);
-
     }
 
-    @EventListener
+    @EventBusListenerMethod
     public void onEditorSaveEvent(EditorSaveEvent<DTO> saveEvent){
-        if(!isFromOwnView(saveEvent)){
-            return;
-        }
+
         DTO bean = saveEvent.getBean();
-        try {
-            saveBean(bean);
-        } catch(Exception e){
-//            if(getSession().isOpen()){
-//                getSession().clear();
-//            }
-            throw e; // re-throw after cleaning up the session
-        } finally {
-//            if(getSession().isOpen()){
-//                getSession().setFlushMode(previousPreSaveEvenFlushMode);
-//            }
-//            previousPreSaveEvenFlushMode = null;
-        }
+        saveBean(bean);
     }
 
-    /**
+   /**
     * Regarding changing the Flush mode see see also {@link ViewScopeConversationHolder}
     *
     * @param saveEvent
     */
-   @EventListener
+   @EventBusListenerMethod
    public void onEditorDeleteEvent(EditorDeleteEvent<DTO> deleteEvent){
-       if(!isFromOwnView(deleteEvent)){
-           return;
-       }
+
        FlushMode previousFlushMode = getSession().getFlushMode();
        getSession().setFlushMode(FlushMode.AUTO);
        deleteBean(deleteEvent.getBean());
index 59c82f26bc255a7c068740b200c6b09bab6f513a..b5a9b724f69677b518133d8f1b106c1dfe959c5e 100644 (file)
@@ -11,6 +11,7 @@ package eu.etaxonomy.vaadin.mvp;
 import java.util.Map;
 
 import org.apache.log4j.Logger;
+import org.vaadin.spring.events.EventScope;
 
 import com.vaadin.data.Validator.InvalidValueException;
 import com.vaadin.data.fieldgroup.BeanFieldGroup;
@@ -244,7 +245,7 @@ public abstract class AbstractPopupEditor<DTO extends Object, P extends Abstract
         public void preCommit(CommitEvent commitEvent) throws CommitException {
             logger.debug("preCommit(), publishing EditorPreSaveEvent");
             // notify the presenter to start a transaction
-            eventBus.publishEvent(new EditorPreSaveEvent<DTO>(AbstractPopupEditor.this, getBean()));
+            viewEventBus.publish(this, new EditorPreSaveEvent<DTO>(AbstractPopupEditor.this, getBean()));
         }
 
         @Override
@@ -254,12 +255,12 @@ public abstract class AbstractPopupEditor<DTO extends Object, P extends Abstract
                     logger.trace("postCommit() publishing EditorSaveEvent for " + getBean().toString());
                 }
                 // notify the presenter to persist the bean and to commit the transaction
-                eventBus.publishEvent(new EditorSaveEvent<DTO>(AbstractPopupEditor.this, getBean()));
+                viewEventBus.publish(this, new EditorSaveEvent<DTO>(AbstractPopupEditor.this, getBean()));
                 if(logger.isTraceEnabled()){
                     logger.trace("postCommit() publishing DoneWithPopupEvent");
                 }
                 // notify the NavigationManagerBean to close the window and to dispose the view
-                eventBus.publishEvent(new DoneWithPopupEvent(AbstractPopupEditor.this, Reason.SAVE));
+                viewEventBus.publish(EventScope.UI, this, new DoneWithPopupEvent(AbstractPopupEditor.this, Reason.SAVE));
             } catch (Exception e) {
                 logger.error(e);
                 throw new CommitException("Failed to store data to backend", e);
@@ -278,15 +279,15 @@ public abstract class AbstractPopupEditor<DTO extends Object, P extends Abstract
     @Override
     public void cancel() {
         fieldGroup.discard();
-        eventBus.publishEvent(new DoneWithPopupEvent(this, Reason.CANCEL));
+        viewEventBus.publish(EventScope.UI, this, new DoneWithPopupEvent(this, Reason.CANCEL));
     }
 
     /**
      * @return
      */
     private void delete() {
-        eventBus.publishEvent(new EditorDeleteEvent<DTO>(this, fieldGroup.getItemDataSource().getBean()));
-        eventBus.publishEvent(new DoneWithPopupEvent(this, Reason.DELETE));
+        viewEventBus.publish(this, new EditorDeleteEvent<DTO>(this, fieldGroup.getItemDataSource().getBean()));
+        viewEventBus.publish(EventScope.UI, this, new DoneWithPopupEvent(this, Reason.DELETE));
     }
 
     /**
index 4377033cadfe06a9b1bd1cad8022d33e05b0462b..f648ccd28a07960e7377ed0bfb29f918a651c804 100644 (file)
@@ -10,6 +10,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.security.core.context.SecurityContext;
 import org.springframework.security.core.context.SecurityContextHolder;
+import org.vaadin.spring.events.EventBus;
 
 import eu.etaxonomy.cdm.api.application.CdmRepository;
 import eu.etaxonomy.cdm.vaadin.event.AbstractEditorAction;
@@ -34,7 +35,6 @@ public abstract class AbstractPresenter<V extends ApplicationView> implements Se
 
        private V view;
 
-
        protected V getView() {
            if(view == null){
             Logger.getLogger(this.getClass()).warn("CDM-VAADIN#6562: presenter " + toString() + " without view.");
@@ -49,6 +49,27 @@ public abstract class AbstractPresenter<V extends ApplicationView> implements Se
        @Autowired
        private NavigationManager navigationManager;
 
+    protected EventBus.ViewEventBus viewEventBus;
+
+    @Autowired
+    protected void setViewEventBus(EventBus.ViewEventBus viewEventBus){
+        this.viewEventBus = viewEventBus;
+        eventViewBusSubscription(viewEventBus);
+    }
+
+    /**
+     * Override if needed, e.g. to skip subscription
+     *
+     * @param viewEventBus
+     */
+    protected void eventViewBusSubscription(EventBus.ViewEventBus viewEventBus){
+            viewEventBus.subscribe(this);
+    }
+
+    public void unsubscribeFromEventBuses(){
+        viewEventBus.unsubscribe(this);
+    }
+
 
        //      protected DefaultTransactionDefinition definition = null;
 
index e477bed187213e1c0d518a1c9dc11d3ec5b18694..1affa63904a65128a166eb2723ec52f611051465 100644 (file)
@@ -7,7 +7,7 @@ import org.springframework.beans.BeansException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.ApplicationContextAware;
-import org.springframework.context.ApplicationEventPublisher;
+import org.vaadin.spring.events.EventBus;
 
 import com.vaadin.ui.CustomComponent;
 
@@ -36,7 +36,7 @@ public abstract class AbstractView<P extends AbstractPresenter> extends CustomCo
        private ApplicationContext applicationContext;
 
     @Autowired
-    protected ApplicationEventPublisher eventBus;
+    EventBus.ViewEventBus viewEventBus;
 
        @SuppressWarnings("unchecked")
     @PostConstruct
@@ -91,8 +91,8 @@ public abstract class AbstractView<P extends AbstractPresenter> extends CustomCo
                this.applicationContext = applicationContext;
        }
 
-       public ApplicationEventPublisher getEventBus(){
-           return eventBus;
+       public EventBus.ViewEventBus getViewEventBus(){
+           return viewEventBus;
        }
 
    @Override
index 33be9e9e04ae7e2ac2d5f2d6503d8701ad841f85..5085cdd44c59a7b62858608e172e15c17c15b0a0 100644 (file)
@@ -7,8 +7,8 @@ import java.util.stream.Collectors;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.ApplicationContext;
-import org.springframework.context.ApplicationEventPublisher;
-import org.springframework.context.event.EventListener;
+import org.vaadin.spring.events.EventBus.UIEventBus;
+import org.vaadin.spring.events.annotation.EventBusListenerMethod;
 
 import com.vaadin.navigator.View;
 import com.vaadin.spring.annotation.SpringView;
@@ -31,8 +31,13 @@ public class MenuBeanDiscoveryBean {
        @Autowired
        private ApplicationContext beanManager;
 
+    private UIEventBus uiEventBus;
+
     @Autowired
-    private ApplicationEventPublisher eventBus;
+    private void setUiEventBus(UIEventBus uiEventBus){
+        this.uiEventBus = uiEventBus;
+        uiEventBus.subscribe(this);
+    }
 
        private MainMenu mainMenuLookup = null;
 
@@ -48,7 +53,7 @@ public class MenuBeanDiscoveryBean {
            this.mainMenuLookup = mainMenu;
        }
 
-       @EventListener
+       @EventBusListenerMethod
        protected void doMenuItemLookup(UIInitializedEvent event) {
 
                if (mainMenuLookup == null) {
index d2dba6193b86058eb9922d34e37016dd010f9568..171f4ca9ee0c476adfae84f19cc110435151a72d 100644 (file)
@@ -6,8 +6,8 @@ import java.util.stream.Collectors;
 import java.util.stream.StreamSupport;
 
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.ApplicationEventPublisher;
-import org.springframework.context.event.EventListener;
+import org.vaadin.spring.events.EventBus;
+import org.vaadin.spring.events.annotation.EventBusListenerMethod;
 
 import com.vaadin.server.FontAwesome;
 import com.vaadin.server.Resource;
@@ -41,7 +41,12 @@ class ValoMainMenuBean extends CssLayout implements MainMenu {
        private Button menuToggle;
 
        @Autowired
-    ApplicationEventPublisher eventBus;
+    protected EventBus.UIEventBus uiEventBus;
+
+       protected void setUIEventBus(EventBus.UIEventBus uiEventBus){
+           this.uiEventBus = uiEventBus;
+           uiEventBus.subscribe(this);
+       }
 
        public ValoMainMenuBean() {
                setPrimaryStyleName(ValoTheme.MENU_ROOT);
@@ -82,10 +87,10 @@ class ValoMainMenuBean extends CssLayout implements MainMenu {
        }
 
        private void onMenuItemClicked(String navigationResource) {
-           eventBus.publishEvent(new NavigationEvent(navigationResource));
+           uiEventBus.publish(this, new NavigationEvent(navigationResource));
        }
 
-       @EventListener
+       @EventBusListenerMethod
        protected void onNavigationEvent(NavigationEvent e) {
                List<MainMenuItemBean> menuItems = StreamSupport.stream(menuArea.spliterator(), false)
                                .filter(component -> MainMenuItemBean.class.isAssignableFrom(component.getClass()))
@@ -99,8 +104,8 @@ class ValoMainMenuBean extends CssLayout implements MainMenu {
                }
        }
 
-       @EventListener
-       protected void afterViewChange(AfterViewChangeEvent event) {
+       @EventBusListenerMethod
+       protected void afterViewChange(org.vaadin.spring.events.Event<AfterViewChangeEvent> event) {
                removeStyleName(MENU_VISIBLE);
        }
 
index 2089b63a811f969d8e49d61b371d83d9904032bc..fe2410abe8562a8e2f1bd12534732d0044401afd 100644 (file)
@@ -1,17 +1,20 @@
 package eu.etaxonomy.vaadin.ui.navigation;
 
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.log4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.ApplicationEventPublisher;
+import org.springframework.context.ApplicationContext;
 import org.springframework.context.annotation.Lazy;
-import org.springframework.context.event.EventListener;
 import org.springframework.context.event.PojoEventListenerManager;
+import org.vaadin.spring.events.EventBus;
+import org.vaadin.spring.events.annotation.EventBusListenerMethod;
 
 import com.vaadin.navigator.ViewChangeListener;
 import com.vaadin.navigator.ViewDisplay;
@@ -30,7 +33,6 @@ import eu.etaxonomy.vaadin.mvp.AbstractPopupEditor;
 import eu.etaxonomy.vaadin.ui.UIInitializedEvent;
 import eu.etaxonomy.vaadin.ui.view.DoneWithPopupEvent;
 import eu.etaxonomy.vaadin.ui.view.PopEditorOpenedEvent;
-import eu.etaxonomy.vaadin.ui.view.PopupEditorFactory;
 import eu.etaxonomy.vaadin.ui.view.PopupView;
 
 @UIScope
@@ -54,10 +56,19 @@ public class NavigationManagerBean extends SpringNavigator implements Navigation
        private List<ViewChangeListener> viewChangeListeners;
 
        @Autowired
-       private PojoEventListenerManager eventListenerManager;
+       protected ApplicationContext applicationContext;
 
        @Autowired
-       private PopupEditorFactory popupEditorFactory;
+       private PojoEventListenerManager eventListenerManager;
+
+       protected EventBus.UIEventBus uiEventBus;
+
+    @Autowired
+    protected void setViewEventBus(EventBus.UIEventBus uiEventBus){
+        this.uiEventBus = uiEventBus;
+        uiEventBus.subscribe(this);
+    }
+
 
        /**
         * This reference will cause the scoped UserHelper being initialized
@@ -99,22 +110,33 @@ public class NavigationManagerBean extends SpringNavigator implements Navigation
 //         this.uriFragmentManager = uriFragmentManager;
 //     }
 
-       @Autowired
-       ApplicationEventPublisher eventBus;
-
 
        public NavigationManagerBean() {
            popupMap = new HashMap<>();
        }
 
+       private Collection<PopupView> popupViews = new HashSet<>();
 
-       private <P extends PopupView> PopupView findPopupView(Class<P> popupViewClass){
-           return popupEditorFactory.newPopupView(popupViewClass);
-       }
+//     @Lazy
+//    @Autowired(required=false)
+//    private void popUpViews(Collection<PopupView> popupViews){
+//        this.popupViews = popupViews;
+//        // popupViews.forEach(view -> this.popupViews.put(view.getClass(), view));
+//    }
+
+    private <P extends PopupView> P findPopupView(Class<P> type){
+        P viewBean = applicationContext.getBean(type);
+        if(viewBean == null){
+            throw new NullPointerException("no popup-view bean of type " + type.getName() + " found");
+        }
+        return viewBean;
+        // return popupViews.stream().filter(p -> p.getClass().equals(type)).findFirst();
+    }
 
-       @EventListener
+       @EventBusListenerMethod
        protected void onUIInitialized(UIInitializedEvent e) {
                init(UI.getCurrent(), uriFragmentManager, viewDisplay);
+               addProvider(viewProvider);
                viewChangeListeners.forEach(vcl -> addViewChangeListener(vcl));
        }
 
@@ -138,7 +160,7 @@ public class NavigationManagerBean extends SpringNavigator implements Navigation
                //eventBus.publishEvent(new NavigationEvent(navigationState));
        }
 
-       @EventListener
+       @EventBusListenerMethod
        protected void onNavigationEvent(NavigationEvent e) {
                navigateTo(e.getViewName(), false);
        }
@@ -146,7 +168,7 @@ public class NavigationManagerBean extends SpringNavigator implements Navigation
        @Override
        public <T extends PopupView> T showInPopup(Class<T> popupType) {
 
-           PopupView popupView =  findPopupView(popupType); // TODO make better use of Optional
+           PopupView popupView =  findPopupView(popupType);
 
            if(AbstractPopupEditor.class.isAssignableFrom(popupView.getClass())){
                AbstractEditorPresenter presenter = ((AbstractPopupEditor)popupView).presenter();
@@ -169,18 +191,18 @@ public class NavigationManagerBean extends SpringNavigator implements Navigation
                // see #6843
                window.setHeight("100%");
                window.setContent(popupView.asComponent());
-               // window.addCloseListener(e -> popupView.cancel());
+               window.addCloseListener(e -> popupView.cancel());
                UI.getCurrent().addWindow(window);
                popupView.viewEntered();
                popupView.focusFirst();
-               eventBus.publishEvent(new PopEditorOpenedEvent(this, popupView));
+               uiEventBus.publish(this, new PopEditorOpenedEvent(this, popupView));
 
                popupMap.put(popupView, window);
 
                return (T) popupView;
        }
 
-    @EventListener
+    @EventBusListenerMethod
        protected void onDoneWithTheEditor(DoneWithPopupEvent e) {
 
                PopupView popup = e.getPopup();
@@ -190,8 +212,7 @@ public class NavigationManagerBean extends SpringNavigator implements Navigation
                        popupMap.remove(popup);
                }
                if(AbstractPopupEditor.class.isAssignableFrom(popup.getClass())){
-                   AbstractEditorPresenter presenter = ((AbstractPopupEditor)popup).presenter();
-                   eventListenerManager.removeEventListeners(presenter);
+                   ((AbstractPopupEditor)popup).presenter().unsubscribeFromEventBuses();
                }
 
        }
index 571dbd1bc6851c1aacded7ebf4158262abc45e3a..c685c9877f0e977daf4297019bdee153a57922d3 100644 (file)
@@ -1,7 +1,7 @@
 package eu.etaxonomy.vaadin.ui.navigation;
 
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.ApplicationEventPublisher;
+import org.vaadin.spring.events.EventBus.UIEventBus;
 
 import com.vaadin.navigator.Navigator.UriFragmentManager;
 import com.vaadin.server.Page;
@@ -16,7 +16,7 @@ public class NavigationUriFragmentManager extends UriFragmentManager {
     private static final long serialVersionUID = -2033745435437337863L;
 
     @Autowired
-    ApplicationEventPublisher eventBus;
+    UIEventBus uiEventBus;
 
        public NavigationUriFragmentManager() {
                super(Page.getCurrent());
@@ -24,6 +24,6 @@ public class NavigationUriFragmentManager extends UriFragmentManager {
 
        @Override
        public void uriFragmentChanged(UriFragmentChangedEvent event) {
-           eventBus.publishEvent(new NavigationEvent(getState()));
+           uiEventBus.publish(this, new NavigationEvent(getState()));
        }
 }
index a6806f53e34bb27b1e83d83cd6008c15d03dba69..db4ef5e88a26c255f161e37bce5c2495c960a1ec 100644 (file)
@@ -3,8 +3,8 @@ package eu.etaxonomy.vaadin.ui.navigation;
 import java.util.Collection;
 
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.context.annotation.Lazy;
+import org.vaadin.spring.events.EventBus.UIEventBus;
 
 import com.vaadin.navigator.View;
 import com.vaadin.navigator.ViewChangeListener;
@@ -24,7 +24,7 @@ class ViewChangeListenerBean implements ViewChangeListener {
        private NavigationManager navigationManager;
 
        @Autowired
-    ApplicationEventPublisher eventBus;
+    UIEventBus uiEventBus;
 
        @Override
        public boolean beforeViewChange(ViewChangeEvent event) {
@@ -43,7 +43,7 @@ class ViewChangeListenerBean implements ViewChangeListener {
 
        @Override
        public void afterViewChange(ViewChangeEvent event) {
-           eventBus.publishEvent(new AfterViewChangeEvent());
+           uiEventBus.publish(this, new AfterViewChangeEvent());
        }
 
 }
index e3e0a755324d7020952d1c7d9617a59359ee95f0..74930d2df2143b748c65e84e27abdadb032ba487 100644 (file)
@@ -1,7 +1,15 @@
 package eu.etaxonomy.vaadin.ui.view;
 
+/**
+ * Event indicating the end of a popup view which is send via the uiEventBus to the NavigationManagerBean.
+ * +
+ * @author a.kohlbecker
+ * @since Feb 1, 2018
+ *
+ */
 public class DoneWithPopupEvent {
 
+
        public enum Reason {
                CANCEL, SAVE, DELETE;
        }
@@ -14,6 +22,7 @@ public class DoneWithPopupEvent {
                this.reason = reason;
        }
 
+
        public Reason getReason() {
                return reason;
        }
diff --git a/src/main/java/eu/etaxonomy/vaadin/ui/view/PopupEditorFactory.java b/src/main/java/eu/etaxonomy/vaadin/ui/view/PopupEditorFactory.java
deleted file mode 100644 (file)
index 57df100..0000000
+++ /dev/null
@@ -1,202 +0,0 @@
-/**
-* Copyright (C) 2017 EDIT
-* European Distributed Institute of Taxonomy
-* http://www.e-taxonomy.eu
-*
-* The contents of this file are subject to the Mozilla Public License Version 1.1
-* See LICENSE.TXT at the top of this package for the full license terms.
-*/
-package eu.etaxonomy.vaadin.ui.view;
-
-import java.io.Serializable;
-import java.lang.reflect.Field;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.Type;
-
-import javax.sql.DataSource;
-
-import org.hibernate.SessionFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.context.ApplicationEventPublisher;
-import org.springframework.context.annotation.Lazy;
-import org.springframework.transaction.PlatformTransactionManager;
-
-import com.vaadin.spring.annotation.SpringComponent;
-import com.vaadin.spring.annotation.UIScope;
-
-import eu.etaxonomy.cdm.api.application.CdmRepository;
-import eu.etaxonomy.cdm.service.IRegistrationWorkingSetService;
-import eu.etaxonomy.cdm.service.ISpecimenTypeDesignationWorkingSetService;
-import eu.etaxonomy.cdm.vaadin.view.name.NameTypeDesignationPresenter;
-import eu.etaxonomy.cdm.vaadin.view.name.SpecimenTypeDesignationWorkingsetEditorPresenter;
-import eu.etaxonomy.vaadin.mvp.AbstractEditorPresenter;
-import eu.etaxonomy.vaadin.mvp.AbstractPopupEditor;
-import eu.etaxonomy.vaadin.mvp.AbstractPresenter;
-import eu.etaxonomy.vaadin.mvp.AbstractView;
-import eu.etaxonomy.vaadin.ui.navigation.NavigationManager;
-
-/**
- * @author a.kohlbecker
- * @since May 30, 2017
- *
- */
-@SpringComponent
-@UIScope
-public class PopupEditorFactory implements Serializable {
-
-
-    private static final long serialVersionUID = -3371003970671610677L;
-
-    @Autowired
-    protected ApplicationEventPublisher eventBus;
-
-    @Autowired
-    @Qualifier("cdmRepository")
-    private CdmRepository repo;
-
-    @Autowired
-    private SessionFactory sessionFactory;
-
-    @Autowired
-    private DataSource dataSource;
-
-    @Autowired
-    private PlatformTransactionManager transactionManager;
-
-    @Autowired
-    private ISpecimenTypeDesignationWorkingSetService specimenTypeDesignationWorkingSetService;
-
-    @Autowired
-    private IRegistrationWorkingSetService registrationWorkingSetService;
-
-    @Autowired
-    @Lazy
-    private NavigationManager navigationManager;
-
-    private Field presenterRepoField;
-    private Field presenterNavigationManagerField;
-    private Field presenterEventBusField;
-
-    private Field viewEventBusField;
-    private Field specimenTypeDesignationWorkingSetServiceField;
-    private Method viewInjectPresenterMethod;
-
-    private Field Field;
-
-    private Method viewInitMethod;
-
-    public PopupEditorFactory(){
-        initFieldsAccess();
-    }
-
-
-    /**
-     *
-     */
-    private void initFieldsAccess() {
-
-        try {
-            presenterRepoField = AbstractPresenter.class.getDeclaredField("repo");
-            presenterRepoField.setAccessible(true);
-
-            presenterNavigationManagerField = AbstractPresenter.class.getDeclaredField("navigationManager");
-            presenterNavigationManagerField.setAccessible(true);
-
-            presenterEventBusField = AbstractEditorPresenter.class.getDeclaredField("eventBus");
-            presenterEventBusField.setAccessible(true);
-
-            viewEventBusField = AbstractView.class.getDeclaredField("eventBus");
-            viewEventBusField.setAccessible(true);
-
-            viewInjectPresenterMethod = AbstractView.class.getDeclaredMethod("injectPresenter", AbstractPresenter.class);
-            viewInjectPresenterMethod.setAccessible(true);
-
-            viewInitMethod = AbstractView.class.getDeclaredMethod("init");
-            viewInitMethod.setAccessible(true);
-
-            specimenTypeDesignationWorkingSetServiceField = SpecimenTypeDesignationWorkingsetEditorPresenter.class.getDeclaredField("specimenTypeDesignationWorkingSetService");
-            specimenTypeDesignationWorkingSetServiceField.setAccessible(true);
-
-            Field = NameTypeDesignationPresenter.class.getDeclaredField("registrationWorkingSetService");
-            Field.setAccessible(true);
-
-        } catch (NoSuchFieldException | SecurityException | NoSuchMethodException  e) {
-            throw new RuntimeException("Severe error during initialization. Please check the classes AbstractPresenter, AbstractEditorPresenter, AbstractView for modificactions.", e);
-        }
-
-    }
-
-
-    /**
-     * @param popupViewClass
-     * @return
-     */
-    public <V extends PopupView, P extends AbstractPresenter> PopupView newPopupView(Class<V> popupViewClass) {
-
-        Class<? extends AbstractPresenter<?>> presenterClass = findGenericPresenterType(popupViewClass);
-        try {
-
-            P presenter = (P) presenterClass.newInstance();
-
-            injectPresenterBeans(presenterClass, presenter);
-
-            PopupView view = popupViewClass.newInstance();
-            if(AbstractView.class.isAssignableFrom(popupViewClass)){
-                AbstractView<P> abstractView = (AbstractView<P>)view;
-                viewEventBusField.set(abstractView, eventBus);
-                viewInjectPresenterMethod.invoke(abstractView, presenter);
-                // invoke the @PostConstruct method
-
-                viewInitMethod.invoke(abstractView);
-            }
-            return view;
-        } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
-            throw new RuntimeException(String.format("Error creating the view class '%s' with presenter class '%s'", popupViewClass, presenterClass), e);
-        }
-    }
-
-
-    /**
-     * @param presenterClass
-     * @param presenter
-     * @throws IllegalAccessException
-     * @throws InvocationTargetException
-     * @throws IllegalArgumentException
-     */
-    public <P extends AbstractPresenter> void injectPresenterBeans(
-            Class<? extends AbstractPresenter<?>> presenterClass, P presenter) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
-        presenterRepoField.set(presenter, repo);
-        presenterNavigationManagerField.set(presenter, navigationManager);
-
-        if(AbstractEditorPresenter.class.isAssignableFrom(presenterClass)){
-            presenterEventBusField.set(presenter, eventBus);
-        }
-        if(SpecimenTypeDesignationWorkingsetEditorPresenter.class.equals(presenterClass)){
-            specimenTypeDesignationWorkingSetServiceField.set(presenter, specimenTypeDesignationWorkingSetService);
-        }
-        if(NameTypeDesignationPresenter.class.equals(presenterClass)){
-            Field.set(presenter, registrationWorkingSetService);
-        }
-    }
-
-    /**
-     * @param popupViewClass
-     * @return
-     */
-    @SuppressWarnings("unchecked")
-    private Class<? extends AbstractPresenter<?>> findGenericPresenterType(Class<?  extends PopupView> popupViewClass) {
-
-        ParameterizedType genericSuperClass = (ParameterizedType)popupViewClass.getGenericSuperclass();
-        Type[] typeArgs = genericSuperClass.getActualTypeArguments();
-        if(AbstractPopupEditor.class.isAssignableFrom(popupViewClass)){
-           return (Class<? extends AbstractPresenter<?>>) typeArgs[1];
-        } else {
-           return (Class<? extends AbstractPresenter<?>>) typeArgs[0];
-        }
-    }
-
-
-}
index eeee73c17929b3af8cafaff63f142b739ed88fb5..f02a1ca26575f9f4042ac9ff0bf9d21054549788 100644 (file)
@@ -11,10 +11,10 @@ package eu.etaxonomy.vaadin.mvp;
 import java.lang.reflect.InvocationTargetException;
 
 import org.apache.log4j.Logger;
-import org.springframework.context.ApplicationEventPublisher;
 import org.unitils.dbunit.annotation.DataSet;
 import org.unitils.spring.annotation.SpringBean;
 import org.unitils.spring.annotation.SpringBeanByType;
+import org.vaadin.spring.events.EventBus.ViewEventBus;
 
 import com.vaadin.ui.ListSelect;
 
@@ -24,7 +24,6 @@ import eu.etaxonomy.cdm.vaadin.component.common.TeamOrPersonField;
 import eu.etaxonomy.cdm.vaadin.view.reference.ReferenceEditorPresenter;
 import eu.etaxonomy.cdm.vaadin.view.reference.ReferencePopupEditorView;
 import eu.etaxonomy.vaadin.component.ToOneRelatedEntityCombobox;
-import eu.etaxonomy.vaadin.ui.view.PopupEditorFactory;
 
 /**
  * @author a.kohlbecker
@@ -39,20 +38,18 @@ public class CdmEditorPresenterTest {
     private static final Logger logger = Logger.getLogger(CdmEditorPresenterTest.class);
 
     @SpringBeanByType
-    protected ApplicationEventPublisher eventBus;
+    protected ViewEventBus viewEventBus;
+
+    @SpringBeanByType
+    private ReferenceEditorPresenter referencePresenter;
 
     @SpringBean("cdmRepository")
     private CdmRepository repo;
 
-    @SpringBeanByType
-    protected PopupEditorFactory factory;
-
     @DataSet
     // @Test test setup not jet working :(
     public void testSaveReference() throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
 
-        ReferenceEditorPresenter referencePresenter = new ReferenceEditorPresenter();
-        factory.injectPresenterBeans(ReferenceEditorPresenter.class, referencePresenter);
 
         TestReferenceEditorView testView = new TestReferenceEditorView();
         referencePresenter.init(testView);