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/20 21:41:29 UTC

svn commit: r1352280 - in /openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/observer: ./ ObserverManager.java Observes.java event/ event/ConfigurationReadEvent.java event/DestroyingEvent.java

Author: rmannibucau
Date: Wed Jun 20 19:41:28 2012
New Revision: 1352280

URL: http://svn.apache.org/viewvc?rev=1352280&view=rev
Log:
TOMEE-247 forgot observer package

Added:
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/observer/
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/observer/ObserverManager.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/observer/Observes.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/observer/event/
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/observer/event/ConfigurationReadEvent.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/observer/event/DestroyingEvent.java

Added: 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-core/src/main/java/org/apache/openejb/observer/ObserverManager.java?rev=1352280&view=auto
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/observer/ObserverManager.java (added)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/observer/ObserverManager.java Wed Jun 20 19:41:28 2012
@@ -0,0 +1,147 @@
+package org.apache.openejb.observer;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+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));
+    }
+
+    public boolean removeObserver(Object listener) {
+        if (listener == null) throw new IllegalArgumentException("listener cannot be null");
+        return observers.remove(new Observer(listener));
+    }
+
+    public void fireEvent(Object event) {
+        if (event == null) throw new IllegalArgumentException("event cannot be null");
+
+        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 (IllegalAccessException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    public void clean() {
+        observers.clear();
+    }
+
+    /**
+     * @version $Rev$ $Date$
+     */
+    public static class Observer {
+        private final Map<Class, Method> methods = new HashMap<Class, Method>();
+        private final Object observer;
+        private final Method defaultMethod;
+
+        public Observer(Object observer) {
+            if (observer == null) throw new IllegalArgumentException("observer cannot be null");
+
+            this.observer = observer;
+            for (Method method : observer.getClass().getMethods()) {
+                if (!isObserver(method)) continue;
+
+                if (method.getParameterTypes().length > 1) {
+                    throw new IllegalArgumentException("@Observes method must have only 1 parameter: " + method.toString());
+                }
+
+                if (Modifier.isAbstract(method.getModifiers())) {
+                    throw new IllegalArgumentException("@Observes method must not be abstract: " + method.toString());
+                }
+
+                if (!Modifier.isPublic(method.getModifiers())) {
+                    throw new IllegalArgumentException("@Observes method must be public: " + method.toString());
+                }
+
+                final Class<?> type = method.getParameterTypes()[0];
+
+                if (type.isAnnotation()) {
+                    throw new IllegalArgumentException("@Observes method parameter must be a concrete class (not an annotation): " + method.toString());
+                }
+
+                if (Modifier.isAbstract(type.getModifiers())) {
+                    throw new IllegalArgumentException("@Observes method parameter must be a concrete class (not an abstract class): " + method.toString());
+                }
+
+                if (type.isInterface()) {
+                    throw new IllegalArgumentException("@Observes method parameter must be a concrete class (not an interface): " + method.toString());
+                }
+
+                if (type.isArray()) {
+                    throw new IllegalArgumentException("@Observes method parameter must be a concrete class (not an array): " + method.toString());
+                }
+
+                if (type.isPrimitive()) {
+                    throw new IllegalArgumentException("@Observes method parameter must be a concrete class (not a primitive): " + method.toString());
+                }
+
+                methods.put(type, method);
+            }
+
+            defaultMethod = methods.get(Object.class);
+
+            if (methods.size() == 0) {
+                throw new IllegalArgumentException("Object has no @Observes methods. For example: public void observe(@Observes RetryConditionAdded event){...}");
+            }
+        }
+
+        public void invoke(Object event) throws InvocationTargetException, IllegalAccessException {
+            if (event == null) throw new IllegalArgumentException("event cannot be null");
+
+            final Class eventType = event.getClass();
+            final Method method = methods.get(eventType);
+
+            if (method != null) {
+                method.invoke(observer, event);
+            } else if (defaultMethod != null) {
+                defaultMethod.invoke(observer, event);
+            }
+        }
+
+        private boolean isObserver(Method method) {
+            for (Annotation[] annotations : method.getParameterAnnotations()) {
+                for (Annotation annotation : annotations) {
+                    if (annotation.annotationType().equals(Observes.class)) return true;
+                }
+            }
+            return false;
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            if (this == o) return true;
+            if (o == null || getClass() != o.getClass()) return false;
+
+            final Observer observer1 = (Observer) o;
+
+            return observer.equals(observer1.observer);
+        }
+
+        @Override
+        public int hashCode() {
+            return observer.hashCode();
+        }
+    }
+}

Added: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/observer/Observes.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/observer/Observes.java?rev=1352280&view=auto
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/observer/Observes.java (added)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/observer/Observes.java Wed Jun 20 19:41:28 2012
@@ -0,0 +1,33 @@
+/*
+ * 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.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+/**
+ * @version $Rev$ $Date$
+ */
+@Target(PARAMETER)
+@Retention(RUNTIME)
+@Documented
+public @interface Observes {
+}

Added: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/observer/event/ConfigurationReadEvent.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/observer/event/ConfigurationReadEvent.java?rev=1352280&view=auto
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/observer/event/ConfigurationReadEvent.java (added)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/observer/event/ConfigurationReadEvent.java Wed Jun 20 19:41:28 2012
@@ -0,0 +1,4 @@
+package org.apache.openejb.observer.event;
+
+public class ConfigurationReadEvent {
+}

Added: 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/observer/event/DestroyingEvent.java?rev=1352280&view=auto
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/observer/event/DestroyingEvent.java (added)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/observer/event/DestroyingEvent.java Wed Jun 20 19:41:28 2012
@@ -0,0 +1,4 @@
+package org.apache.openejb.observer.event;
+
+public class DestroyingEvent {
+}