You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by db...@apache.org on 2012/06/21 01:00:36 UTC

svn commit: r1352365 - in /openejb/trunk/openejb/container: openejb-core/src/main/java/org/apache/openejb/assembler/classic/ openejb-core/src/main/java/org/apache/openejb/assembler/classic/event/ openejb-core/src/main/java/org/apache/openejb/config/ op...

Author: dblevins
Date: Wed Jun 20 23:00:35 2012
New Revision: 1352365

URL: http://svn.apache.org/viewvc?rev=1352365&view=rev
Log:
Make the observer capabilities hardwired into SystemInstance like Options, Properties and Components
Added Assembler{Created,Destroyed} events
@Event annotation we can use for creating validation rules on event classes and perhaps use for testing
TOMEE-247

Added:
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/event/
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/event/AssemblerCreated.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/event/AssemblerDestroyed.java
      - copied, changed from r1352283, openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/observer/event/DestroyingEvent.java
    openejb/trunk/openejb/container/openejb-loader/src/main/java/org/apache/openejb/loader/event/
    openejb/trunk/openejb/container/openejb-loader/src/main/java/org/apache/openejb/loader/event/ComponentAdded.java
    openejb/trunk/openejb/container/openejb-loader/src/main/java/org/apache/openejb/loader/event/ComponentRemoved.java
    openejb/trunk/openejb/container/openejb-loader/src/main/java/org/apache/openejb/observer/
    openejb/trunk/openejb/container/openejb-loader/src/main/java/org/apache/openejb/observer/Event.java
    openejb/trunk/openejb/container/openejb-loader/src/main/java/org/apache/openejb/observer/ObserverManager.java
      - copied, changed from r1352300, openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/observer/ObserverManager.java
    openejb/trunk/openejb/container/openejb-loader/src/main/java/org/apache/openejb/observer/Observes.java
      - copied unchanged from r1352300, openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/observer/Observes.java
    openejb/trunk/openejb/container/openejb-loader/src/main/java/org/apache/openejb/observer/event/
    openejb/trunk/openejb/container/openejb-loader/src/main/java/org/apache/openejb/observer/event/ObserverAdded.java
    openejb/trunk/openejb/container/openejb-loader/src/main/java/org/apache/openejb/observer/event/ObserverFailed.java
    openejb/trunk/openejb/container/openejb-loader/src/main/java/org/apache/openejb/observer/event/ObserverRemoved.java
Removed:
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/observer/
Modified:
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/UpdateChecker.java
    openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/config/HooksTest.java
    openejb/trunk/openejb/container/openejb-loader/src/main/java/org/apache/openejb/loader/SystemInstance.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=1352365&r1=1352364&r2=1352365&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 Wed Jun 20 23:00:35 2012
@@ -85,6 +85,8 @@ 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.AssemblerCreated;
+import org.apache.openejb.assembler.classic.event.AssemblerDestroyed;
 import org.apache.openejb.cdi.CdiAppContextsService;
 import org.apache.openejb.cdi.CdiBuilder;
 import org.apache.openejb.cdi.CdiResourceInjectionService;
@@ -120,7 +122,6 @@ import org.apache.openejb.assembler.moni
 import org.apache.openejb.monitoring.LocalMBeanServer;
 import org.apache.openejb.monitoring.ObjectNameBuilder;
 import org.apache.openejb.observer.ObserverManager;
-import org.apache.openejb.observer.event.DestroyingEvent;
 import org.apache.openejb.persistence.JtaEntityManagerRegistry;
 import org.apache.openejb.persistence.PersistenceClassLoaderHandler;
 import org.apache.openejb.resource.GeronimoConnectionManagerFactory;
@@ -257,6 +258,8 @@ public class Assembler extends Assembler
         }
 
         system.setComponent(EjbResolver.class, new EjbResolver(null, EjbResolver.Scope.GLOBAL));
+
+        system.fireEvent(new AssemblerCreated());
     }
 
     private void setConfiguration(OpenEjbConfiguration config) {
@@ -1089,17 +1092,11 @@ public class Assembler extends Assembler
             destroyResource(binding.getName(), binding.getClassName(), object);
         }
 
-        final ObserverManager mgr = SystemInstance.get().getComponent(ObserverManager.class);
-        if (mgr != null) {
-            mgr.fireEvent(new DestroyingEvent());
-            mgr.clean();
-        }
-
-        SystemInstance.get().removeComponent(ObserverManager.class);
         SystemInstance.get().removeComponent(OpenEjbConfiguration.class);
         SystemInstance.get().removeComponent(JtaEntityManagerRegistry.class);
         SystemInstance.get().removeComponent(TransactionSynchronizationRegistry.class);
         SystemInstance.get().removeComponent(EjbResolver.class);
+        SystemInstance.get().fireEvent(new AssemblerDestroyed());
         SystemInstance.reset();
     }
 

Added: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/event/AssemblerCreated.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/event/AssemblerCreated.java?rev=1352365&view=auto
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/event/AssemblerCreated.java (added)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/event/AssemblerCreated.java Wed Jun 20 23:00:35 2012
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.openejb.assembler.classic.event;
+
+import org.apache.openejb.observer.Event;
+
+@Event
+public class AssemblerCreated {
+
+    @Override
+    public String toString() {
+        return "AssemblerCreated{}";
+    }
+}

Copied: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/event/AssemblerDestroyed.java (from r1352283, openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/observer/event/DestroyingEvent.java)
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/event/AssemblerDestroyed.java?p2=openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/event/AssemblerDestroyed.java&p1=openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/observer/event/DestroyingEvent.java&r1=1352283&r2=1352365&rev=1352365&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/observer/event/DestroyingEvent.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/event/AssemblerDestroyed.java Wed Jun 20 23:00:35 2012
@@ -1,4 +1,28 @@
-package org.apache.openejb.observer.event;
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.openejb.assembler.classic.event;
 
-public class DestroyingEvent {
+import org.apache.openejb.observer.Event;
+
+@Event
+public class AssemblerDestroyed {
+
+    @Override
+    public String toString() {
+        return "AssemblerDestroyed{}";
+    }
 }

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java?rev=1352365&r1=1352364&r2=1352365&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java Wed Jun 20 23:00:35 2012
@@ -92,15 +92,12 @@ import org.apache.openejb.loader.FileUti
 import org.apache.openejb.loader.IO;
 import org.apache.openejb.loader.Options;
 import org.apache.openejb.loader.SystemInstance;
-import org.apache.openejb.observer.event.ConfigurationReadEvent;
-import org.apache.openejb.observer.ObserverManager;
 import org.apache.openejb.util.LogCategory;
 import org.apache.openejb.util.Logger;
 import org.apache.openejb.util.Messages;
 import org.apache.openejb.util.SuperProperties;
 import org.apache.openejb.util.URISupport;
 import org.apache.openejb.util.URLs;
-import org.apache.openejb.util.UpdateChecker;
 import org.apache.openejb.util.proxy.QueryProxy;
 import org.apache.xbean.finder.MetaAnnotatedClass;
 
@@ -117,14 +114,8 @@ public class ConfigurationFactory implem
     private static final Logger logger = Logger.getInstance(LogCategory.OPENEJB_STARTUP_CONFIG, ConfigurationFactory.class);
     private static final Messages messages = new Messages(ConfigurationFactory.class);
 
-    private static final Map<String, String> KNOWN_HOOKS = new HashMap<String, String>() {{
-        put("update-checker", UpdateChecker.class.getName());
-    }};
-
     private static final String IGNORE_DEFAULT_VALUES_PROP = "IgnoreDefaultValues";
 
-    private final List<Object> instantiatedHooks = new ArrayList<Object>();
-
     private String configLocation;
     private OpenEjbConfiguration sys;
     private Openejb openejb;
@@ -389,8 +380,6 @@ public class ConfigurationFactory implem
 
         loadPropertiesDeclaredConfiguration(openejb);
 
-        initObservers();
-
         sys = new OpenEjbConfiguration();
         sys.containerSystem = new ContainerSystemInfo();
         sys.facilities = new FacilitiesInfo();
@@ -497,41 +486,6 @@ public class ConfigurationFactory implem
         return finished;
     }
 
-    private void initObservers() {
-        if (openejb == null) {
-            return;
-        }
-
-        final ClassLoader loader = Thread.currentThread().getContextClassLoader();
-        if (loader == null) {
-            return;
-        }
-
-        ObserverManager mgr = SystemInstance.get().getComponent(ObserverManager.class);
-        if (mgr == null) {
-            mgr = new ObserverManager();
-            SystemInstance.get().setComponent(ObserverManager.class, mgr);
-        }
-
-        for (ServerObservers hook : openejb.getServerObservers()) {
-            String name = hook.getName();
-            if (KNOWN_HOOKS.containsKey(name)) { // aliases
-                name = KNOWN_HOOKS.get(name);
-            }
-
-            try {
-                final Class<?> clazz = loader.loadClass(name);
-                final Object instance = clazz.newInstance();
-
-                mgr.addObserver(instance);
-            } catch (Exception e) {
-                logger.error("can't instantiate hook '" + hook.getName() + "'", e);
-            }
-        }
-
-        mgr.fireEvent(new ConfigurationReadEvent());
-    }
-
     private List<String> getDeclaredApps() {
         // make a copy of the list because we update it
         final List<Deployments> deployments = new ArrayList<Deployments>();

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/UpdateChecker.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/UpdateChecker.java?rev=1352365&r1=1352364&r2=1352365&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/UpdateChecker.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/UpdateChecker.java Wed Jun 20 23:00:35 2012
@@ -18,11 +18,11 @@ package org.apache.openejb.util;
 
 import java.net.MalformedURLException;
 import java.net.URL;
-import org.apache.openejb.config.ConfigurationFactory;
+
+import org.apache.openejb.assembler.classic.event.AssemblerCreated;
 import org.apache.openejb.loader.IO;
 import org.apache.openejb.loader.SystemInstance;
 import org.apache.openejb.observer.Observes;
-import org.apache.openejb.observer.event.ConfigurationReadEvent;
 
 public class UpdateChecker {
     private static final Logger LOGGER = Logger.getInstance(LogCategory.OPENEJB_STARTUP, UpdateChecker.class);
@@ -38,7 +38,7 @@ public class UpdateChecker {
     private static final String UNDEFINED = "undefined";
     private static String LATEST = "undefined";
 
-    public void check(@Observes ConfigurationReadEvent event) {
+    public void check(@Observes AssemblerCreated event) {
         if (isSkipped()) {
             return;
         }

Modified: openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/config/HooksTest.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/config/HooksTest.java?rev=1352365&r1=1352364&r2=1352365&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/config/HooksTest.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/config/HooksTest.java Wed Jun 20 23:00:35 2012
@@ -16,18 +16,18 @@
  */
 package org.apache.openejb.config;
 
-import java.util.Properties;
 import org.apache.openejb.OpenEJBException;
 import org.apache.openejb.assembler.classic.Assembler;
+import org.apache.openejb.assembler.classic.event.AssemblerCreated;
+import org.apache.openejb.assembler.classic.event.AssemblerDestroyed;
 import org.apache.openejb.loader.SystemInstance;
-import org.apache.openejb.observer.ObserverManager;
 import org.apache.openejb.observer.Observes;
-import org.apache.openejb.observer.event.ConfigurationReadEvent;
-import org.apache.openejb.observer.event.DestroyingEvent;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
+import java.util.Properties;
+
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
@@ -46,11 +46,22 @@ public class HooksTest {
 
     @Test
     public void check() throws OpenEJBException {
-        final ConfigurationFactory cf = new ConfigurationFactory();
-        cf.getOpenEjbConfiguration(); // load observers
+
+        SystemInstance.get().addObserver(new HookLifecycle());
+
+        assertFalse(HookLifecycle.start);
+        assertFalse(HookLifecycle.stop);
+
+        final Assembler assembler = new Assembler();
+
+
         assertTrue(HookLifecycle.start);
         assertFalse(HookLifecycle.stop);
-        SystemInstance.get().getComponent(ObserverManager.class).fireEvent(new DestroyingEvent());
+
+        assembler.destroy();
+
+
+        assertTrue(HookLifecycle.start);
         assertTrue(HookLifecycle.stop);
     }
 
@@ -58,11 +69,11 @@ public class HooksTest {
         private static boolean start = false;
         private static boolean stop = false;
 
-        public void start(@Observes ConfigurationReadEvent notUsed) {
+        public void start(@Observes AssemblerCreated notUsed) {
             start = true;
         }
 
-        public void stop(@Observes DestroyingEvent notUsed) {
+        public void stop(@Observes AssemblerDestroyed notUsed) {
             stop = true;
         }
     }

Modified: openejb/trunk/openejb/container/openejb-loader/src/main/java/org/apache/openejb/loader/SystemInstance.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-loader/src/main/java/org/apache/openejb/loader/SystemInstance.java?rev=1352365&r1=1352364&r2=1352365&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-loader/src/main/java/org/apache/openejb/loader/SystemInstance.java (original)
+++ openejb/trunk/openejb/container/openejb-loader/src/main/java/org/apache/openejb/loader/SystemInstance.java Wed Jun 20 23:00:35 2012
@@ -16,6 +16,10 @@
  */
 package org.apache.openejb.loader;
 
+import org.apache.openejb.loader.event.ComponentAdded;
+import org.apache.openejb.loader.event.ComponentRemoved;
+import org.apache.openejb.observer.ObserverManager;
+
 import java.io.File;
 import java.io.IOException;
 import java.util.HashMap;
@@ -54,6 +58,7 @@ public class SystemInstance {
     private final ClassLoader classLoader;
     private final HashMap<Class, Object> components;
     private final ClassPath classPath;
+    private final ObserverManager observerManager = new ObserverManager();
 
     // FIXME: Why is Exception thrown at all? It's almost impossible that it'll happen.
     private SystemInstance(final Properties properties) throws Exception {
@@ -63,7 +68,6 @@ public class SystemInstance {
         this.internalProperties.putAll(properties);
 
         this.options = new Options(internalProperties, new Options(System.getProperties()));
-
         this.home = new FileUtils("openejb.home", "user.dir", this.internalProperties);
         this.base = new FileUtils("openejb.base", "openejb.home", this.internalProperties);
         this.classPath = ClassPathFactory.createClassPath(this.internalProperties.getProperty("openejb.loader", "context"));
@@ -72,6 +76,20 @@ public class SystemInstance {
         this.internalProperties.setProperty("openejb.home", home.getDirectory().getCanonicalPath());
         this.internalProperties.setProperty("openejb.base", base.getDirectory().getCanonicalPath());
         System.setProperty("derby.system.home", base.getDirectory().getCanonicalPath());
+
+
+    }
+
+    public void fireEvent(Object event) {
+        observerManager.fireEvent(event);
+    }
+
+    public boolean addObserver(Object observer) {
+        return observerManager.addObserver(observer);
+    }
+
+    public boolean removeObserver(Object observer) {
+        return observerManager.removeObserver(observer);
     }
 
     public long getStartTime() {
@@ -143,14 +161,30 @@ public class SystemInstance {
     }
 
     public <T> T removeComponent(final Class<T> type) {
-        return (T) components.remove(type);
+        final T component = (T) components.remove(type);
+
+        if (component != null) {
+            fireEvent(new ComponentRemoved(type, component));
+        }
+
+        return component;
     }
 
     /**
      * @param type the class type of the component required
      */
     public <T> T setComponent(final Class<T> type, final T value) {
-        return (T) components.put(type, value);
+        final T removed = (T) components.put(type, value);
+
+        if (removed !=null) {
+            fireEvent(new ComponentRemoved(type, value));
+        }
+
+        if (value != null) {
+            fireEvent(new ComponentAdded(type, value));
+        }
+
+        return removed;
     }
 
     private static SystemInstance system;

Added: openejb/trunk/openejb/container/openejb-loader/src/main/java/org/apache/openejb/loader/event/ComponentAdded.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-loader/src/main/java/org/apache/openejb/loader/event/ComponentAdded.java?rev=1352365&view=auto
==============================================================================
--- openejb/trunk/openejb/container/openejb-loader/src/main/java/org/apache/openejb/loader/event/ComponentAdded.java (added)
+++ openejb/trunk/openejb/container/openejb-loader/src/main/java/org/apache/openejb/loader/event/ComponentAdded.java Wed Jun 20 23:00:35 2012
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.openejb.loader.event;
+
+import org.apache.openejb.observer.Event;
+
+/**
+ * @version $Rev$ $Date$
+ */
+@Event
+public class ComponentAdded<T> {
+
+    private final Class<T> type;
+    private final T component;
+
+    public ComponentAdded(Class<T> type, T component) {
+        this.type = type;
+        this.component = component;
+    }
+
+    public Class<T> getType() {
+        return type;
+    }
+
+    public T getComponent() {
+        return component;
+    }
+
+    @Override
+    public String toString() {
+        return "ComponentAdded{" +
+                "type=" + type +
+                ", component=" + component.getClass().getName() +
+                '}';
+    }
+}

Added: openejb/trunk/openejb/container/openejb-loader/src/main/java/org/apache/openejb/loader/event/ComponentRemoved.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-loader/src/main/java/org/apache/openejb/loader/event/ComponentRemoved.java?rev=1352365&view=auto
==============================================================================
--- openejb/trunk/openejb/container/openejb-loader/src/main/java/org/apache/openejb/loader/event/ComponentRemoved.java (added)
+++ openejb/trunk/openejb/container/openejb-loader/src/main/java/org/apache/openejb/loader/event/ComponentRemoved.java Wed Jun 20 23:00:35 2012
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.openejb.loader.event;
+
+import org.apache.openejb.observer.Event;
+
+/**
+ * @version $Rev$ $Date$
+ */
+@Event
+public class ComponentRemoved<T> {
+
+    private final Class<T> type;
+    private final T component;
+
+    public ComponentRemoved(Class<T> type, T component) {
+        this.type = type;
+        this.component = component;
+    }
+
+    public Class<T> getType() {
+        return type;
+    }
+
+    public T getComponent() {
+        return component;
+    }
+
+    @Override
+    public String toString() {
+        return "ComponentRemoved{" +
+                "type=" + type +
+                ", component=" + component.getClass().getName() +
+                '}';
+    }
+}

Added: openejb/trunk/openejb/container/openejb-loader/src/main/java/org/apache/openejb/observer/Event.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-loader/src/main/java/org/apache/openejb/observer/Event.java?rev=1352365&view=auto
==============================================================================
--- openejb/trunk/openejb/container/openejb-loader/src/main/java/org/apache/openejb/observer/Event.java (added)
+++ openejb/trunk/openejb/container/openejb-loader/src/main/java/org/apache/openejb/observer/Event.java Wed Jun 20 23:00:35 2012
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.openejb.observer;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.TYPE;
+
+/**
+ * Exists for documentation purposes
+ *
+ * Event guidelines:
+ *  - Fields should be final
+ *  - Avoid logic
+ *  - Implement toString()
+ *
+ * @version $Rev$ $Date$
+ */
+@Target(TYPE)
+@Documented
+public @interface Event {
+}

Copied: openejb/trunk/openejb/container/openejb-loader/src/main/java/org/apache/openejb/observer/ObserverManager.java (from r1352300, openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/observer/ObserverManager.java)
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-loader/src/main/java/org/apache/openejb/observer/ObserverManager.java?p2=openejb/trunk/openejb/container/openejb-loader/src/main/java/org/apache/openejb/observer/ObserverManager.java&p1=openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/observer/ObserverManager.java&r1=1352300&r2=1352365&rev=1352365&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/observer/ObserverManager.java (original)
+++ openejb/trunk/openejb/container/openejb-loader/src/main/java/org/apache/openejb/observer/ObserverManager.java Wed Jun 20 23:00:35 2012
@@ -16,6 +16,10 @@
  */
 package org.apache.openejb.observer;
 
+import org.apache.openejb.observer.event.ObserverAdded;
+import org.apache.openejb.observer.event.ObserverFailed;
+import org.apache.openejb.observer.event.ObserverRemoved;
+
 import java.lang.annotation.Annotation;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
@@ -24,22 +28,29 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import org.apache.openejb.util.LogCategory;
-import org.apache.openejb.util.Logger;
 
 public class ObserverManager {
-    private static final Logger logger = Logger.getInstance(LogCategory.OPENEJB_SERVER, ObserverManager.class.getName());
 
     private final List<Observer> observers = new ArrayList<Observer>();
 
     public boolean addObserver(Object observer) {
         if (observer == null) throw new IllegalArgumentException("observer cannot be null");
-        return observers.add(new Observer(observer));
+
+        final boolean added = observers.add(new Observer(observer));
+
+        // Observers can observe they have been added and are active
+        fireEvent(new ObserverAdded(observer));
+
+        return added;
     }
 
-    public boolean removeObserver(Object listener) {
-        if (listener == null) throw new IllegalArgumentException("listener cannot be null");
-        return observers.remove(new Observer(listener));
+    public boolean removeObserver(Object observer) {
+        if (observer == null) throw new IllegalArgumentException("observer cannot be null");
+
+        // Observers can observe they are to be removed
+        fireEvent(new ObserverRemoved(observer));
+
+        return observers.remove(new Observer(observer));
     }
 
     public void fireEvent(Object event) {
@@ -48,22 +59,14 @@ public class ObserverManager {
         for (Observer observer : observers) {
             try {
                 observer.invoke(event);
-            } catch (InvocationTargetException e) {
-                final Throwable t = e.getTargetException() == null ? e : e.getTargetException();
-
-                if (e.getTargetException() != null) {
-                    logger.warning("Observer method invocation failed", t);
+            } catch (Throwable t) {
+                if (!(event instanceof ObserverFailed)) {
+                    fireEvent(new ObserverFailed(observer, event, t));
                 }
-            } catch (IllegalAccessException e) {
-                e.printStackTrace();
             }
         }
     }
 
-    public void clean() {
-        observers.clear();
-    }
-
     /**
      * @version $Rev$ $Date$
      */

Added: openejb/trunk/openejb/container/openejb-loader/src/main/java/org/apache/openejb/observer/event/ObserverAdded.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-loader/src/main/java/org/apache/openejb/observer/event/ObserverAdded.java?rev=1352365&view=auto
==============================================================================
--- openejb/trunk/openejb/container/openejb-loader/src/main/java/org/apache/openejb/observer/event/ObserverAdded.java (added)
+++ openejb/trunk/openejb/container/openejb-loader/src/main/java/org/apache/openejb/observer/event/ObserverAdded.java Wed Jun 20 23:00:35 2012
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.openejb.observer.event;
+
+import org.apache.openejb.observer.Event;
+
+/**
+ * @version $Rev$ $Date$
+ */
+@Event
+public class ObserverAdded {
+
+    private final Object observer;
+
+    public ObserverAdded(Object observer) {
+        this.observer = observer;
+    }
+
+    public Object getObserver() {
+        return observer;
+    }
+
+    @Override
+    public String toString() {
+        return "ObserverAdded{" +
+                "observer=" + observer.getClass().getName() +
+                '}';
+    }
+}

Added: openejb/trunk/openejb/container/openejb-loader/src/main/java/org/apache/openejb/observer/event/ObserverFailed.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-loader/src/main/java/org/apache/openejb/observer/event/ObserverFailed.java?rev=1352365&view=auto
==============================================================================
--- openejb/trunk/openejb/container/openejb-loader/src/main/java/org/apache/openejb/observer/event/ObserverFailed.java (added)
+++ openejb/trunk/openejb/container/openejb-loader/src/main/java/org/apache/openejb/observer/event/ObserverFailed.java Wed Jun 20 23:00:35 2012
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.openejb.observer.event;
+
+import org.apache.openejb.observer.Event;
+
+/**
+ * @version $Rev$ $Date$
+ */
+@Event
+public class ObserverFailed {
+
+    private final Object observer;
+
+    private final Object event;
+
+    private final Throwable throwable;
+
+    public ObserverFailed(Object observer, Object event, Throwable throwable) {
+        this.observer = observer;
+        this.event = event;
+        this.throwable = throwable;
+    }
+
+    public Object getObserver() {
+        return observer;
+    }
+
+    public Object getEvent() {
+        return event;
+    }
+
+    public Throwable getThrowable() {
+        return throwable;
+    }
+
+    @Override
+    public String toString() {
+        return "ObserverFailed{" +
+                "observer=" + observer.getClass().getName() +
+                ", throwable=" + throwable.getClass().getName() +
+                "} " + event;
+    }
+}

Added: openejb/trunk/openejb/container/openejb-loader/src/main/java/org/apache/openejb/observer/event/ObserverRemoved.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-loader/src/main/java/org/apache/openejb/observer/event/ObserverRemoved.java?rev=1352365&view=auto
==============================================================================
--- openejb/trunk/openejb/container/openejb-loader/src/main/java/org/apache/openejb/observer/event/ObserverRemoved.java (added)
+++ openejb/trunk/openejb/container/openejb-loader/src/main/java/org/apache/openejb/observer/event/ObserverRemoved.java Wed Jun 20 23:00:35 2012
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.openejb.observer.event;
+
+import org.apache.openejb.observer.Event;
+
+/**
+ * @version $Rev$ $Date$
+ */
+@Event
+public class ObserverRemoved {
+
+    private final Object observer;
+
+    public ObserverRemoved(Object observer) {
+        this.observer = observer;
+    }
+
+    public Object getObserver() {
+        return observer;
+    }
+
+    @Override
+    public String toString() {
+        return "ObserverRemoved{" +
+                "observer=" + observer.getClass().getName() +
+                '}';
+    }
+}