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() +
+ '}';
+ }
+}