You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2012/06/26 15:15:18 UTC

svn commit: r1354003 - in /openejb/trunk/openejb: container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/event/ container/openejb-core/src/test/java/org/apach...

Author: rmannibucau
Date: Tue Jun 26 13:15:16 2012
New Revision: 1354003

URL: http://svn.apache.org/viewvc?rev=1354003&view=rev
Log:
TOMEE-257 using event even for our deployment

Added:
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/event/AssemblerAfterApplicationCreated.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/event/AssemblerBeforeApplicationDestroyed.java
    openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/event/
    openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/event/AfterApplicationCreated.java
Modified:
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
    openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/DependenceValidationTest.java
    openejb/trunk/openejb/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java
    openejb/trunk/openejb/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/WsService.java
    openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatLoader.java
    openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
    openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/WebDeploymentListeners.java
    openejb/trunk/openejb/tomee/tomee-jaxrs/src/main/java/org/apache/tomee/webservices/TomeeJaxRsService.java
    openejb/trunk/openejb/tomee/tomee-webservices/src/main/java/org/apache/tomee/webservices/TomeeJaxWsService.java

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java?rev=1354003&r1=1354002&r2=1354003&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java Tue Jun 26 13:15:16 2012
@@ -86,9 +86,10 @@ import org.apache.openejb.OpenEJB;
 import org.apache.openejb.OpenEJBException;
 import org.apache.openejb.OpenEJBRuntimeException;
 import org.apache.openejb.UndeployException;
+import org.apache.openejb.assembler.classic.event.AssemblerAfterApplicationCreated;
+import org.apache.openejb.assembler.classic.event.AssemblerBeforeApplicationDestroyed;
 import org.apache.openejb.assembler.classic.event.AssemblerCreated;
 import org.apache.openejb.assembler.classic.event.AssemblerDestroyed;
-import org.apache.openejb.assembler.classic.event.ConfigurationLoaded;
 import org.apache.openejb.cdi.CdiAppContextsService;
 import org.apache.openejb.cdi.CdiBuilder;
 import org.apache.openejb.cdi.CdiResourceInjectionService;
@@ -123,7 +124,7 @@ import org.apache.openejb.monitoring.Dyn
 import org.apache.openejb.assembler.monitoring.JMXContainer;
 import org.apache.openejb.monitoring.LocalMBeanServer;
 import org.apache.openejb.monitoring.ObjectNameBuilder;
-import org.apache.openejb.observer.ObserverManager;
+import org.apache.openejb.observer.Observes;
 import org.apache.openejb.persistence.JtaEntityManagerRegistry;
 import org.apache.openejb.persistence.PersistenceClassLoaderHandler;
 import org.apache.openejb.resource.GeronimoConnectionManagerFactory;
@@ -173,7 +174,6 @@ public class Assembler extends Assembler
     private SecurityService securityService;
     protected OpenEjbConfigurationFactory configFactory;
     private final Map<String, AppInfo> deployedApplications = new HashMap<String, AppInfo> ();
-    private final List<DeploymentListener> deploymentListeners = new ArrayList<DeploymentListener>();
     private final Set<String> moduleIds = new HashSet<String>();
     private final Set<ObjectName> containersObjectNames = new HashSet<ObjectName>();
 
@@ -191,43 +191,13 @@ public class Assembler extends Assembler
     }
 
     public synchronized void addDeploymentListener(DeploymentListener deploymentListener) {
-        deploymentListeners.add(deploymentListener);
+        logger.warning("DeploymentListener API is replaced by ");
+        SystemInstance.get().addObserver(new DeploymentListenerObserver(deploymentListener));
     }
 
     public synchronized void removeDeploymentListener(DeploymentListener deploymentListener) {
-        deploymentListeners.remove(deploymentListener);
-    }
-
-    private synchronized void fireAfterApplicationCreated(AppInfo appInfo) {
-        ArrayList<DeploymentListener> listeners;
-        synchronized (this) {
-            listeners = new ArrayList<DeploymentListener>(deploymentListeners);
-        }
-        for (DeploymentListener listener : listeners) {
-            String listenerName = listener.getClass().getSimpleName();
-            try {
-                logger.debug("appCreationEvent.start", listenerName, appInfo.path);
-                listener.afterApplicationCreated(appInfo);
-            } catch (Throwable e) {
-                logger.error("appCreationEvent.failed", e, listenerName, appInfo.path);
-            }
-        }
-    }
-
-    private synchronized void fireBeforeApplicationDestroyed(AppInfo appInfo) {
-        ArrayList<DeploymentListener> listeners;
-        synchronized (this) {
-            listeners = new ArrayList<DeploymentListener>(deploymentListeners);
-        }
-        for (DeploymentListener listener : listeners) {
-            String listenerName = listener.getClass().getSimpleName();
-            try {
-                logger.debug("appDestroyedEvent.start", listenerName, appInfo.path);
-                listener.beforeApplicationDestroyed(appInfo);
-            } catch (Throwable e) {
-                logger.error("appDestroyedEvent.failed", e, listenerName, appInfo.path);
-            }
-        }
+        // the wrapping is done here to get the correct equals/hashcode methods
+        SystemInstance.get().removeObserver(new DeploymentListenerObserver(deploymentListener));
     }
 
     protected SafeToolkit toolkit = SafeToolkit.getToolkit("Assembler");
@@ -929,7 +899,7 @@ public class Assembler extends Assembler
             logger.info("createApplication.success", appInfo.path);
 
             deployedApplications.put(appInfo.path, appInfo);
-            fireAfterApplicationCreated(appInfo);
+            systemInstance.fireEvent(new AssemblerAfterApplicationCreated(appInfo));
 
             return appContext;
         } catch (ValidationException ve) {
@@ -1175,7 +1145,7 @@ public class Assembler extends Assembler
         deployedApplications.remove(appInfo.path);
         logger.info("destroyApplication.start", appInfo.path);
 
-        fireBeforeApplicationDestroyed(appInfo);
+        SystemInstance.get().fireEvent(new AssemblerBeforeApplicationDestroyed(appInfo));
 
         final AppContext appContext = containerSystem.getAppContext(appInfo.appId);
 
@@ -1998,4 +1968,39 @@ public class Assembler extends Assembler
             return thread;
         }
     }
+
+    private static class DeploymentListenerObserver {
+        private final DeploymentListener delegate;
+
+        public DeploymentListenerObserver(final DeploymentListener deploymentListener) {
+            delegate = deploymentListener;
+        }
+
+        public void afterApplicationCreated(@Observes AssemblerAfterApplicationCreated event) {
+            delegate.afterApplicationCreated(event.getApp());
+        }
+
+        public void beforeApplicationDestroyed(@Observes AssemblerBeforeApplicationDestroyed event) {
+            delegate.beforeApplicationDestroyed(event.getApp());
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            if (this == o) {
+                return true;
+            }
+            if (!(o instanceof DeploymentListenerObserver)) {
+                return false;
+            }
+
+            final DeploymentListenerObserver that = (DeploymentListenerObserver) o;
+
+            return !(delegate != null ? !delegate.equals(that.delegate) : that.delegate != null);
+        }
+
+        @Override
+        public int hashCode() {
+            return delegate != null ? delegate.hashCode() : 0;
+        }
+    }
 }

Added: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/event/AssemblerAfterApplicationCreated.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/event/AssemblerAfterApplicationCreated.java?rev=1354003&view=auto
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/event/AssemblerAfterApplicationCreated.java (added)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/event/AssemblerAfterApplicationCreated.java Tue Jun 26 13:15:16 2012
@@ -0,0 +1,15 @@
+package org.apache.openejb.assembler.classic.event;
+
+import org.apache.openejb.assembler.classic.AppInfo;
+
+public class AssemblerAfterApplicationCreated {
+    private final AppInfo app;
+
+    public AssemblerAfterApplicationCreated(final AppInfo appInfo) {
+        app = appInfo;
+    }
+
+    public AppInfo getApp() {
+        return app;
+    }
+}

Added: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/event/AssemblerBeforeApplicationDestroyed.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/event/AssemblerBeforeApplicationDestroyed.java?rev=1354003&view=auto
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/event/AssemblerBeforeApplicationDestroyed.java (added)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/event/AssemblerBeforeApplicationDestroyed.java Tue Jun 26 13:15:16 2012
@@ -0,0 +1,15 @@
+package org.apache.openejb.assembler.classic.event;
+
+import org.apache.openejb.assembler.classic.AppInfo;
+
+public class AssemblerBeforeApplicationDestroyed {
+    private final AppInfo app;
+
+    public AssemblerBeforeApplicationDestroyed(final AppInfo appInfo) {
+        app = appInfo;
+    }
+
+    public AppInfo getApp() {
+        return app;
+    }
+}

Modified: openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/DependenceValidationTest.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/DependenceValidationTest.java?rev=1354003&r1=1354002&r2=1354003&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/DependenceValidationTest.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/DependenceValidationTest.java Tue Jun 26 13:15:16 2012
@@ -53,9 +53,9 @@ public class DependenceValidationTest ex
 
         depsOfPackages = dependencyVisitor.groups;
 
-        // Nothing may depend on the Assembler except the config code
+        // Nothing may depend on the Assembler except the config code and events
         String dynamicAssembler = "org.apache.openejb.assembler.dynamic";
-        assertNotDependentOn("org.apache.openejb", "org.apache.openejb.assembler.classic", "org.apache.openejb.assembler", "org.apache.openejb.config", "org.apache.openejb.assembler.dynamic", "org.apache.openejb.assembler.classic.cmd", "org.apache.openejb.assembler.monitoring", "org.apache.openejb.cdi", "org.apache.openejb.junit");
+        assertNotDependentOn("org.apache.openejb", "org.apache.openejb.assembler.classic", "org.apache.openejb.assembler", "org.apache.openejb.config", "org.apache.openejb.assembler.dynamic", "org.apache.openejb.assembler.classic.cmd", "org.apache.openejb.assembler.monitoring", "org.apache.openejb.cdi", "org.apache.openejb.junit", "org.apache.openejb.assembler.classic.event");
 
         // Nothing may depend on the Dynamic Assembler
         assertNotDependentOn("org.apache.openejb", dynamicAssembler);

Modified: openejb/trunk/openejb/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java?rev=1354003&r1=1354002&r2=1354003&view=diff
==============================================================================
--- openejb/trunk/openejb/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java (original)
+++ openejb/trunk/openejb/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java Tue Jun 26 13:15:16 2012
@@ -42,13 +42,15 @@ import org.apache.openejb.BeanType;
 import org.apache.openejb.Injection;
 import org.apache.openejb.assembler.classic.AppInfo;
 import org.apache.openejb.assembler.classic.Assembler;
-import org.apache.openejb.assembler.classic.DeploymentListener;
 import org.apache.openejb.assembler.classic.EjbJarInfo;
 import org.apache.openejb.assembler.classic.EnterpriseBeanInfo;
 import org.apache.openejb.assembler.classic.WebAppInfo;
+import org.apache.openejb.assembler.classic.event.AssemblerAfterApplicationCreated;
+import org.apache.openejb.assembler.classic.event.AssemblerBeforeApplicationDestroyed;
 import org.apache.openejb.core.CoreContainerSystem;
 import org.apache.openejb.core.WebContext;
 import org.apache.openejb.loader.SystemInstance;
+import org.apache.openejb.observer.Observes;
 import org.apache.openejb.server.SelfManaging;
 import org.apache.openejb.server.ServerService;
 import org.apache.openejb.server.ServiceException;
@@ -59,7 +61,7 @@ import org.apache.openejb.util.LogCatego
 import org.apache.openejb.util.Logger;
 import org.apache.webbeans.config.WebBeansContext;
 
-public abstract class RESTService implements ServerService, SelfManaging, DeploymentListener {
+public abstract class RESTService implements ServerService, SelfManaging {
     public static final Logger LOGGER = Logger.getInstance(LogCategory.OPENEJB_RS, RESTService.class);
     private static final boolean OLD_WEBSERVICE_DEPLOYMENT = SystemInstance.get().getOptions().get("openejb.webservice.old-deployment", false);
     public static final String OPENEJB_JAXRS_PROVIDERS_AUTO_PROP = "openejb.jaxrs.providers.auto";
@@ -220,7 +222,8 @@ public abstract class RESTService implem
         return additionalProviders;
     }
 
-    @Override public void afterApplicationCreated(final AppInfo appInfo) {
+    public void afterApplicationCreated(@Observes final AssemblerAfterApplicationCreated event) {
+        final AppInfo appInfo = event.getApp();
         if (deployedApplications.add(appInfo)) {
             if (appInfo.webApps.size() == 0) {
                 final Map<String, EJBRestServiceInfo> restEjbs = getRestEjbs(appInfo);
@@ -432,10 +435,10 @@ public abstract class RESTService implem
         return cl;
     }
 
-    @Override
-    public void beforeApplicationDestroyed(AppInfo appInfo) {
-        if (deployedApplications.contains(appInfo)) {
-            for (WebAppInfo webApp : appInfo.webApps) {
+    public void beforeApplicationDestroyed(@Observes AssemblerBeforeApplicationDestroyed event) {
+        final AppInfo app = event.getApp();
+        if (deployedApplications.contains(app)) {
+            for (WebAppInfo webApp : app.webApps) {
                 final List<DeployedService> toRemove = new ArrayList<DeployedService>();
                 for (DeployedService service : services) {
                     if (service.isInWebApp(webApp)) {
@@ -457,9 +460,9 @@ public abstract class RESTService implem
         containerSystem = (CoreContainerSystem) SystemInstance.get().getComponent(ContainerSystem.class);
         assembler = SystemInstance.get().getComponent(Assembler.class);
         if (assembler != null) {
-            assembler.addDeploymentListener(this);
+            SystemInstance.get().addObserver(this);
             for (AppInfo appInfo : assembler.getDeployedApplications()) {
-                afterApplicationCreated(appInfo);
+                afterApplicationCreated(new AssemblerAfterApplicationCreated(appInfo));
             }
         }
     }
@@ -473,9 +476,9 @@ public abstract class RESTService implem
 
     @Override public void stop() throws ServiceException {
         if (assembler != null) {
-            assembler.removeDeploymentListener(this);
+            SystemInstance.get().removeObserver(this);
             for (AppInfo appInfo : new ArrayList<AppInfo>(deployedApplications)) {
-                beforeApplicationDestroyed(appInfo);
+                beforeApplicationDestroyed(new AssemblerBeforeApplicationDestroyed(appInfo));
             }
         }
 

Modified: openejb/trunk/openejb/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/WsService.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/WsService.java?rev=1354003&r1=1354002&r2=1354003&view=diff
==============================================================================
--- openejb/trunk/openejb/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/WsService.java (original)
+++ openejb/trunk/openejb/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/WsService.java Tue Jun 26 13:15:16 2012
@@ -17,12 +17,28 @@
  */
 package org.apache.openejb.server.webservices;
 
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.MalformedURLException;
+import java.net.Socket;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+import java.util.TreeMap;
+import javax.naming.Context;
 import javax.xml.namespace.QName;
 import org.apache.openejb.BeanContext;
 import org.apache.openejb.Injection;
 import org.apache.openejb.assembler.classic.AppInfo;
 import org.apache.openejb.assembler.classic.Assembler;
-import org.apache.openejb.assembler.classic.DeploymentListener;
 import org.apache.openejb.assembler.classic.EjbJarInfo;
 import org.apache.openejb.assembler.classic.EnterpriseBeanInfo;
 import org.apache.openejb.assembler.classic.PortInfo;
@@ -31,12 +47,15 @@ import org.apache.openejb.assembler.clas
 import org.apache.openejb.assembler.classic.StatelessBeanInfo;
 import org.apache.openejb.assembler.classic.WebAppInfo;
 import org.apache.openejb.assembler.classic.WsBuilder;
+import org.apache.openejb.assembler.classic.event.AssemblerAfterApplicationCreated;
+import org.apache.openejb.assembler.classic.event.AssemblerBeforeApplicationDestroyed;
 import org.apache.openejb.core.CoreContainerSystem;
 import org.apache.openejb.core.WebContext;
 import org.apache.openejb.core.webservices.PortAddressRegistry;
 import org.apache.openejb.core.webservices.PortAddressRegistryImpl;
 import org.apache.openejb.core.webservices.PortData;
 import org.apache.openejb.loader.SystemInstance;
+import org.apache.openejb.observer.Observes;
 import org.apache.openejb.server.SelfManaging;
 import org.apache.openejb.server.ServerService;
 import org.apache.openejb.server.ServiceException;
@@ -48,25 +67,7 @@ import org.apache.openejb.util.LogCatego
 import org.apache.openejb.util.Logger;
 import org.apache.openejb.util.StringTemplate;
 
-import javax.naming.Context;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.MalformedURLException;
-import java.net.Socket;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.Set;
-import java.util.TreeMap;
-
-public abstract class WsService implements ServerService, SelfManaging, DeploymentListener {
+public abstract class WsService implements ServerService, SelfManaging {
     public static final Logger logger = Logger.getInstance(LogCategory.OPENEJB_WS, WsService.class);
     public static final String WS_ADDRESS_FORMAT = "openejb.wsAddress.format";
     public static final String WS_FORCE_ADDRESS = "openejb.webservice.deployment.address";
@@ -170,18 +171,18 @@ public abstract class WsService implemen
         assembler = SystemInstance.get().getComponent(Assembler.class);
         SystemInstance.get().setComponent(WsService.class, this);
         if (assembler != null) {
-            assembler.addDeploymentListener(this);
+            SystemInstance.get().addObserver(this);
             for (AppInfo appInfo : assembler.getDeployedApplications()) {
-                afterApplicationCreated(appInfo);
+                afterApplicationCreated(new AssemblerAfterApplicationCreated(appInfo));
             }
         }
     }
 
     public void stop() throws ServiceException {
         if (assembler != null) {
-            assembler.removeDeploymentListener(this);
+            SystemInstance.get().removeObserver(this);
             for (AppInfo appInfo : new ArrayList<AppInfo>(deployedApplications)) {
-                beforeApplicationDestroyed(appInfo);
+                beforeApplicationDestroyed(new AssemblerBeforeApplicationDestroyed(appInfo));
             }
             assembler = null;
             if (SystemInstance.get().getComponent(WsService.class) == this) {
@@ -198,7 +199,8 @@ public abstract class WsService implemen
 
     protected abstract void destroyPojoWsContainer(String serviceId);
 
-    public void afterApplicationCreated(AppInfo appInfo) {
+    public void afterApplicationCreated(@Observes AssemblerAfterApplicationCreated event) {
+        final AppInfo appInfo = event.getApp();
         if (deployedApplications.add(appInfo)) {
             Map<String, String> webContextByEjb = new HashMap<String, String>();
             for (WebAppInfo webApp : appInfo.webApps) {
@@ -361,7 +363,8 @@ public abstract class WsService implemen
         }
     }
 
-    public void beforeApplicationDestroyed(AppInfo appInfo) {
+    public void beforeApplicationDestroyed(@Observes AssemblerBeforeApplicationDestroyed event) {
+        final AppInfo appInfo = event.getApp();
         if (deployedApplications.remove(appInfo)) {
             for (EjbJarInfo ejbJar : appInfo.ejbJars) {
                 Map<String,PortInfo> ports = new TreeMap<String,PortInfo>();

Modified: openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatLoader.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatLoader.java?rev=1354003&r1=1354002&r2=1354003&view=diff
==============================================================================
--- openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatLoader.java (original)
+++ openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatLoader.java Tue Jun 26 13:15:16 2012
@@ -203,7 +203,7 @@ public class TomcatLoader implements Loa
             SystemInstance.get().setComponent(WebAppBuilder.class, tomcatWebAppBuilder);
         }
 
-        // Web Services will be installed into the WebDeploymentListeners list
+        // for compatibility purpose, no more used normally by our trunk
         SystemInstance.get().setComponent(WebDeploymentListeners.class, new WebDeploymentListeners());
 
         if (optionalService(properties, "org.apache.tomee.webservices.TomeeJaxRsService")) {

Modified: openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java?rev=1354003&r1=1354002&r2=1354003&view=diff
==============================================================================
--- openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java (original)
+++ openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java Tue Jun 26 13:15:16 2012
@@ -73,6 +73,7 @@ import org.apache.openejb.util.LogCatego
 import org.apache.openejb.util.Logger;
 import org.apache.tomcat.InstanceManager;
 import org.apache.tomcat.util.digester.Digester;
+import org.apache.tomee.catalina.event.AfterApplicationCreated;
 import org.apache.tomee.common.LegacyAnnotationProcessor;
 import org.apache.tomee.common.TomcatVersion;
 import org.apache.tomee.common.UserTransactionFactory;
@@ -955,11 +956,8 @@ public class TomcatWebAppBuilder impleme
         // required for Pojo Web Services because when Assembler creates the application
         // the CoreContainerSystem does not contain the WebContext
         // see also the start method getContainerSystem().addWebDeployment(webContext);
-        final WebDeploymentListeners listeners = SystemInstance.get().getComponent(WebDeploymentListeners.class);
-        if (listeners != null) {
-            for (final WebAppInfo webApp : contextInfo.appInfo.webApps) {
-                listeners.afterApplicationCreated(contextInfo.appInfo, webApp);
-            }
+        for (final WebAppInfo webApp : contextInfo.appInfo.webApps) {
+            SystemInstance.get().fireEvent(new AfterApplicationCreated(contextInfo.appInfo, webApp));
         }
 
         if (!TomcatVersion.hasAnnotationProcessingSupport()) {

Modified: openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/WebDeploymentListeners.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/WebDeploymentListeners.java?rev=1354003&r1=1354002&r2=1354003&view=diff
==============================================================================
--- openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/WebDeploymentListeners.java (original)
+++ openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/WebDeploymentListeners.java Tue Jun 26 13:15:16 2012
@@ -21,22 +21,33 @@ import org.apache.openejb.assembler.clas
 
 import java.util.ArrayList;
 import java.util.List;
+import org.apache.openejb.loader.SystemInstance;
+import org.apache.openejb.observer.Observes;
+import org.apache.openejb.util.LogCategory;
+import org.apache.openejb.util.Logger;
+import org.apache.tomee.catalina.event.AfterApplicationCreated;
 
 /**
 * @version $Rev$ $Date$
 */
-public class WebDeploymentListeners implements WebDeploymentListener {
-    List<WebDeploymentListener> listeners = new ArrayList<WebDeploymentListener>();
+public class WebDeploymentListeners {
+    private static final Logger LOGGER = Logger.getInstance(LogCategory.OPENEJB, WebDeploymentListeners.class);
 
-    public boolean add(WebDeploymentListener webDeploymentListener) {
-        return listeners.add(webDeploymentListener);
+    public boolean add(WebDeploymentListener webDeploymentListener) { // compatibility
+        LOGGER.warning("WebDeploymentListener API is replaced by 'void afterApplicationCreated(@Observes final AfterApplicationCreated event)' API");
+        SystemInstance.get().addObserver(new WebDeploymentListenerObserver(webDeploymentListener));
+        return true;
     }
 
-    @Override
-    public void afterApplicationCreated(AppInfo appInfo, WebAppInfo webApp) {
-        for (WebDeploymentListener listener : listeners) {
-            listener.afterApplicationCreated(appInfo, webApp);
+    private static class WebDeploymentListenerObserver {
+        private final WebDeploymentListener delegate;
+
+        public WebDeploymentListenerObserver(final WebDeploymentListener webDeploymentListener) {
+            delegate = webDeploymentListener;
         }
-    }
 
+        public void afterApplicationCreated(@Observes final AfterApplicationCreated event) {
+            delegate.afterApplicationCreated(event.getApp(), event.getWeb());
+        }
+    }
 }

Added: openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/event/AfterApplicationCreated.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/event/AfterApplicationCreated.java?rev=1354003&view=auto
==============================================================================
--- openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/event/AfterApplicationCreated.java (added)
+++ openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/event/AfterApplicationCreated.java Tue Jun 26 13:15:16 2012
@@ -0,0 +1,22 @@
+package org.apache.tomee.catalina.event;
+
+import org.apache.openejb.assembler.classic.AppInfo;
+import org.apache.openejb.assembler.classic.WebAppInfo;
+
+public class AfterApplicationCreated {
+    private final AppInfo app;
+    private final WebAppInfo web;
+
+    public AfterApplicationCreated(final AppInfo appInfo, final WebAppInfo webApp) {
+        app = appInfo;
+        web = webApp;
+    }
+
+    public AppInfo getApp() {
+        return app;
+    }
+
+    public WebAppInfo getWeb() {
+        return web;
+    }
+}

Modified: openejb/trunk/openejb/tomee/tomee-jaxrs/src/main/java/org/apache/tomee/webservices/TomeeJaxRsService.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/tomee/tomee-jaxrs/src/main/java/org/apache/tomee/webservices/TomeeJaxRsService.java?rev=1354003&r1=1354002&r2=1354003&view=diff
==============================================================================
--- openejb/trunk/openejb/tomee/tomee-jaxrs/src/main/java/org/apache/tomee/webservices/TomeeJaxRsService.java (original)
+++ openejb/trunk/openejb/tomee/tomee-jaxrs/src/main/java/org/apache/tomee/webservices/TomeeJaxRsService.java Tue Jun 26 13:15:16 2012
@@ -16,21 +16,18 @@
  */
 package org.apache.tomee.webservices;
 
-import org.apache.openejb.assembler.classic.AppInfo;
-import org.apache.openejb.assembler.classic.WebAppInfo;
+import java.util.Properties;
 import org.apache.openejb.loader.SystemInstance;
+import org.apache.openejb.observer.Observes;
 import org.apache.openejb.server.rest.RESTService;
 import org.apache.openejb.server.rest.RsRegistry;
 import org.apache.openejb.spi.Service;
-import org.apache.tomee.catalina.WebDeploymentListener;
-import org.apache.tomee.catalina.WebDeploymentListeners;
-
-import java.util.Properties;
+import org.apache.tomee.catalina.event.AfterApplicationCreated;
 
 /**
  * @version $Rev$ $Date$
  */
-public class TomeeJaxRsService implements Service, WebDeploymentListener {
+public class TomeeJaxRsService implements Service {
 
     @Override
     public void init(Properties props) throws Exception {
@@ -42,17 +39,16 @@ public class TomeeJaxRsService implement
             system.setComponent(RsRegistry.class, tomcatRestHandler);
         }
 
-        system.getComponent(WebDeploymentListeners.class).add(this);
+        system.addObserver(this);
     }
 
-    @Override
-    public void afterApplicationCreated(AppInfo appInfo, WebAppInfo webApp) {
+    public void afterApplicationCreated(@Observes final AfterApplicationCreated event) {
         // required for Pojo Web Services because when Assembler creates the application
         // the CoreContainerSystem does not contain the WebContext
         // see also the start method getContainerSystem().addWebDeployment(webContext);
         RESTService component = SystemInstance.get().getComponent(RESTService.class);
         if (component == null) return;
-        component.afterApplicationCreated(appInfo, webApp);
+        component.afterApplicationCreated(event.getApp(), event.getWeb());
     }
 
 }

Modified: openejb/trunk/openejb/tomee/tomee-webservices/src/main/java/org/apache/tomee/webservices/TomeeJaxWsService.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/tomee/tomee-webservices/src/main/java/org/apache/tomee/webservices/TomeeJaxWsService.java?rev=1354003&r1=1354002&r2=1354003&view=diff
==============================================================================
--- openejb/trunk/openejb/tomee/tomee-webservices/src/main/java/org/apache/tomee/webservices/TomeeJaxWsService.java (original)
+++ openejb/trunk/openejb/tomee/tomee-webservices/src/main/java/org/apache/tomee/webservices/TomeeJaxWsService.java Tue Jun 26 13:15:16 2012
@@ -16,21 +16,18 @@
  */
 package org.apache.tomee.webservices;
 
-import org.apache.openejb.assembler.classic.AppInfo;
-import org.apache.openejb.assembler.classic.WebAppInfo;
+import java.util.Properties;
 import org.apache.openejb.loader.SystemInstance;
+import org.apache.openejb.observer.Observes;
 import org.apache.openejb.server.webservices.WsRegistry;
 import org.apache.openejb.server.webservices.WsService;
 import org.apache.openejb.spi.Service;
-import org.apache.tomee.catalina.WebDeploymentListener;
-import org.apache.tomee.catalina.WebDeploymentListeners;
-
-import java.util.Properties;
+import org.apache.tomee.catalina.event.AfterApplicationCreated;
 
 /**
  * @version $Rev$ $Date$
  */
-public class TomeeJaxWsService implements Service, WebDeploymentListener {
+public class TomeeJaxWsService implements Service {
 
     @Override
     public void init(Properties props) throws Exception {
@@ -43,16 +40,15 @@ public class TomeeJaxWsService implement
             system.setComponent(WsRegistry.class, tomcatSoapHandler);
         }
 
-        system.getComponent(WebDeploymentListeners.class).add(this);
+        system.addObserver(this);
     }
 
-    @Override
-    public void afterApplicationCreated(AppInfo appInfo, WebAppInfo webApp) {
+    public void afterApplicationCreated(@Observes final AfterApplicationCreated event) {
         // required for Pojo Web Services because when Assembler creates the application
         // the CoreContainerSystem does not contain the WebContext
         // see also the start method getContainerSystem().addWebDeployment(webContext);
         WsService component = SystemInstance.get().getComponent(WsService.class);
         if (component == null) return;
-        component.afterApplicationCreated(webApp);
+        component.afterApplicationCreated(event.getWeb());
     }
 }