]> source.dussan.org Git - vaadin-framework.git/commitdiff
Use ServiceLoader to let add-ons register listeners (#9273)
authorLeif Åstrand <leif@vaadin.com>
Thu, 9 Aug 2012 13:19:43 +0000 (16:19 +0300)
committerLeif Åstrand <leif@vaadin.com>
Thu, 9 Aug 2012 13:39:35 +0000 (16:39 +0300)
src/com/vaadin/terminal/DeploymentConfiguration.java
src/com/vaadin/terminal/gwt/server/AbstractApplicationPortlet.java
src/com/vaadin/terminal/gwt/server/AbstractApplicationServlet.java
src/com/vaadin/terminal/gwt/server/AbstractDeploymentConfiguration.java
src/com/vaadin/terminal/gwt/server/VaadinContext.java [new file with mode: 0644]
src/com/vaadin/terminal/gwt/server/VaadinContextEvent.java [new file with mode: 0644]
src/com/vaadin/terminal/gwt/server/VaadinContextListener.java [new file with mode: 0644]

index ddb42349d8add86c7d18b182a00a96c8a7c79632..160350ca2415d53d9428d36f4b4dda9d0d1a6fe6 100644 (file)
@@ -5,11 +5,15 @@
 package com.vaadin.terminal;
 
 import java.io.Serializable;
+import java.util.Iterator;
 import java.util.Properties;
 
 import javax.portlet.PortletContext;
 import javax.servlet.ServletContext;
 
+import com.vaadin.terminal.gwt.server.VaadinContext;
+import com.vaadin.terminal.gwt.server.VaadinContextListener;
+
 /**
  * Provide deployment specific settings that are required outside terminal
  * specific code.
@@ -110,4 +114,10 @@ public interface DeploymentConfiguration extends Serializable {
      * @return properties for the application.
      */
     public Properties getInitParameters();
+
+    public Iterator<VaadinContextListener> getContextListeners();
+
+    public VaadinContext getVaadinContext();
+
+    public void setVaadinContext(VaadinContext vaadinContext);
 }
index 363f7e486933a5bde1fb7e365178eb1a29ecb47d..bb4e8ba0a7e3799e8e23f45b5bc178b0e7001c0e 100644 (file)
@@ -290,6 +290,9 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet
         }
     };
 
+    private final VaadinContext vaadinContext = new VaadinContext(
+            getDeploymentConfiguration());
+
     @Override
     public void init(PortletConfig config) throws PortletException {
         super.init(config);
@@ -315,6 +318,15 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet
 
         checkProductionMode();
         checkCrossSiteProtection();
+
+        vaadinContext.init();
+    }
+
+    @Override
+    public void destroy() {
+        super.destroy();
+
+        vaadinContext.destroy();
     }
 
     private void checkCrossSiteProtection() {
@@ -787,8 +799,8 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet
             application.setLocale(locale);
             // No application URL when running inside a portlet
             application.start(new ApplicationStartEvent(null,
-                    getDeploymentConfiguration().getInitParameters(),
-                    context, isProductionMode()));
+                    getDeploymentConfiguration().getInitParameters(), context,
+                    isProductionMode()));
         }
     }
 
index a0e807801e44eb0035dee0e947d85c61560e75a5..c2e1d2d3e7a4c6b943581e80951c5d8e65382498 100644 (file)
@@ -128,6 +128,9 @@ public abstract class AbstractApplicationServlet extends HttpServlet implements
         }
     };
 
+    private final VaadinContext vaadinContext = new VaadinContext(
+            getDeploymentConfiguration());
+
     /**
      * Called by the servlet container to indicate to a servlet that the servlet
      * is being placed into service.
@@ -166,6 +169,15 @@ public abstract class AbstractApplicationServlet extends HttpServlet implements
         checkProductionMode();
         checkCrossSiteProtection();
         checkResourceCacheTime();
+
+        vaadinContext.init();
+    }
+
+    @Override
+    public void destroy() {
+        super.destroy();
+
+        vaadinContext.destroy();
     }
 
     private void checkCrossSiteProtection() {
index 1ac090ad765bf6ebbe2860f23cc9cdbd0d623a62..47bf5ecc6063b3b977346ec29addff92b176b816 100644 (file)
@@ -5,7 +5,9 @@
 package com.vaadin.terminal.gwt.server;
 
 import java.lang.reflect.Constructor;
+import java.util.Iterator;
 import java.util.Properties;
+import java.util.ServiceLoader;
 
 import com.vaadin.terminal.DeploymentConfiguration;
 
@@ -14,6 +16,7 @@ public abstract class AbstractDeploymentConfiguration implements
 
     private final Class<?> systemPropertyBaseClass;
     private final Properties applicationProperties = new Properties();
+    private VaadinContext vaadinContext;
 
     public AbstractDeploymentConfiguration(Class<?> systemPropertyBaseClass) {
         this.systemPropertyBaseClass = systemPropertyBaseClass;
@@ -118,4 +121,23 @@ public abstract class AbstractDeploymentConfiguration implements
     public Properties getInitParameters() {
         return applicationProperties;
     }
+
+    @Override
+    public Iterator<VaadinContextListener> getContextListeners() {
+        // Called once for init and once for destroy, so it's probably not worth
+        // the effort caching the ServiceLoader instance
+        ServiceLoader<VaadinContextListener> contextListenerLoader = ServiceLoader
+                .load(VaadinContextListener.class, getClassLoader());
+        return contextListenerLoader.iterator();
+    }
+
+    @Override
+    public void setVaadinContext(VaadinContext vaadinContext) {
+        this.vaadinContext = vaadinContext;
+    }
+
+    @Override
+    public VaadinContext getVaadinContext() {
+        return vaadinContext;
+    }
 }
diff --git a/src/com/vaadin/terminal/gwt/server/VaadinContext.java b/src/com/vaadin/terminal/gwt/server/VaadinContext.java
new file mode 100644 (file)
index 0000000..b55809a
--- /dev/null
@@ -0,0 +1,46 @@
+/* 
+@VaadinApache2LicenseForJavaFiles@
+ */
+
+package com.vaadin.terminal.gwt.server;
+
+import java.util.Iterator;
+
+import com.vaadin.event.EventRouter;
+import com.vaadin.terminal.DeploymentConfiguration;
+
+public class VaadinContext {
+    private final DeploymentConfiguration deploymentConfiguration;
+
+    private final EventRouter eventRouter = new EventRouter();
+
+    public VaadinContext(DeploymentConfiguration deploymentConfiguration) {
+        this.deploymentConfiguration = deploymentConfiguration;
+        deploymentConfiguration.setVaadinContext(this);
+    }
+
+    public DeploymentConfiguration getDeploymentConfiguration() {
+        return deploymentConfiguration;
+    }
+
+    public void init() {
+        VaadinContextEvent event = new VaadinContextEvent(this);
+        Iterator<VaadinContextListener> listeners = deploymentConfiguration
+                .getContextListeners();
+        while (listeners.hasNext()) {
+            VaadinContextListener listener = listeners.next();
+            listener.contextCreated(event);
+        }
+    }
+
+    public void destroy() {
+        VaadinContextEvent event = new VaadinContextEvent(this);
+        Iterator<VaadinContextListener> listeners = deploymentConfiguration
+                .getContextListeners();
+        while (listeners.hasNext()) {
+            VaadinContextListener listener = listeners.next();
+            listener.contextDestoryed(event);
+        }
+    }
+
+}
diff --git a/src/com/vaadin/terminal/gwt/server/VaadinContextEvent.java b/src/com/vaadin/terminal/gwt/server/VaadinContextEvent.java
new file mode 100644 (file)
index 0000000..2394904
--- /dev/null
@@ -0,0 +1,19 @@
+/* 
+@VaadinApache2LicenseForJavaFiles@
+ */
+
+package com.vaadin.terminal.gwt.server;
+
+import java.util.EventObject;
+
+public class VaadinContextEvent extends EventObject {
+
+    public VaadinContextEvent(VaadinContext source) {
+        super(source);
+    }
+
+    public VaadinContext getVaadinContext() {
+        return (VaadinContext) getSource();
+    }
+
+}
diff --git a/src/com/vaadin/terminal/gwt/server/VaadinContextListener.java b/src/com/vaadin/terminal/gwt/server/VaadinContextListener.java
new file mode 100644 (file)
index 0000000..5e379d9
--- /dev/null
@@ -0,0 +1,13 @@
+/* 
+@VaadinApache2LicenseForJavaFiles@
+ */
+
+package com.vaadin.terminal.gwt.server;
+
+import java.util.EventListener;
+
+public interface VaadinContextListener extends EventListener {
+    public void contextCreated(VaadinContextEvent event);
+
+    public void contextDestoryed(VaadinContextEvent event);
+}