Author: rmannibucau
Date: Wed Jun 20 23:59:18 2012
New Revision: 1352371

URL: http://svn.apache.org/viewvc?rev=1352371&view=rev
Log:
TOMEE-247 managing META-INF/org.apache.openejb.observer/<alias>, keeping conf 
in tomee.xml (important to avoid to add all observer available if some of them 
should be turnable on on demand only), adding event configurationloaded

Added:
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/event/ConfigurationLoaded.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/main/java/org/apache/openejb/assembler/classic/FacilitiesInfo.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-loader/src/main/java/org/apache/openejb/loader/SystemInstance.java
    
openejb/trunk/openejb/container/openejb-loader/src/main/java/org/apache/openejb/observer/ObserverManager.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=1352371&r1=1352370&r2=1352371&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:59:18 2012
@@ -87,6 +87,7 @@ import org.apache.openejb.OpenEJBRuntime
 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.assembler.classic.event.ConfigurationLoaded;
 import org.apache.openejb.cdi.CdiAppContextsService;
 import org.apache.openejb.cdi.CdiBuilder;
 import org.apache.openejb.cdi.CdiResourceInjectionService;
@@ -121,7 +122,6 @@ 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.persistence.JtaEntityManagerRegistry;
 import org.apache.openejb.persistence.PersistenceClassLoaderHandler;
 import org.apache.openejb.resource.GeronimoConnectionManagerFactory;
@@ -136,6 +136,7 @@ import org.apache.openejb.util.Messages;
 import org.apache.openejb.util.OpenEJBErrorHandler;
 import org.apache.openejb.util.References;
 import org.apache.openejb.util.SafeToolkit;
+import org.apache.openejb.util.UpdateChecker;
 import org.apache.openejb.util.proxy.ProxyFactory;
 import org.apache.openejb.util.proxy.ProxyManager;
 import org.apache.webbeans.config.WebBeansContext;
@@ -162,6 +163,10 @@ public class Assembler extends Assembler
 
     private static final String GLOBAL_UNIQUE_ID = "global";
 
+    private static final Map<String, String> OBSERVERS_ALIASES = new 
HashMap<String, String>() {{
+        put("update-checker", UpdateChecker.class.getName());
+    }};
+
     Messages messages = new Messages(Assembler.class.getPackage().getName());
 
     private final CoreContainerSystem containerSystem;
@@ -259,6 +264,8 @@ public class Assembler extends Assembler
 
         system.setComponent(EjbResolver.class, new EjbResolver(null, 
EjbResolver.Scope.GLOBAL));
 
+        loadAvailableObservers();
+
         system.fireEvent(new AssemblerCreated());
     }
 
@@ -329,6 +336,9 @@ public class Assembler extends Assembler
         setContext(new HashMap<String, Object>());
         try {
             OpenEjbConfiguration config = getOpenEjbConfiguration();
+            addObserversFromConfig(config);
+            SystemInstance.get().fireEvent(new ConfigurationLoaded(config));
+
             buildContainerSystem(config);
         } catch (OpenEJBException ae) {
             /* OpenEJBExceptions contain useful information and are debbugable.
@@ -348,6 +358,46 @@ public class Assembler extends Assembler
         }
     }
 
+    private void loadAvailableObservers() {
+        final ResourceFinder finder = new ResourceFinder("META-INF");
+        try {
+            final Map<String, String> observers = 
finder.mapAvailableStrings("org.apache.openejb.observer");
+            final ClassLoader cl = 
Thread.currentThread().getContextClassLoader();
+            for (Entry<String, String> entry : observers.entrySet()) {
+                final String alias = entry.getKey();
+                if (!SystemInstance.get().hasObserver(alias)) {
+                    addObserver(cl, alias, entry.getValue());
+                }
+            }
+        } catch (IOException e) {
+            logger.error("can't scan for observer in META-INF/", e);
+        }
+    }
+
+    private void addObserver(final ClassLoader cl, final String alias, final 
String name) {
+        String observer = name;
+        if (OBSERVERS_ALIASES.containsKey(observer)) {
+            observer = OBSERVERS_ALIASES.get(observer);
+        }
+
+        final Object instance;
+        try {
+            instance = cl.loadClass(observer).newInstance();
+        } catch (Exception e) {
+            logger.error("can't add observer " + observer);
+            return;
+        }
+
+        SystemInstance.get().addObserver(alias, instance);
+    }
+
+    private void addObserversFromConfig(final OpenEjbConfiguration config) {
+        final ClassLoader cl = Thread.currentThread().getContextClassLoader();
+        for (String rawObserver : config.facilities.serverObservers) {
+            addObserver(cl, rawObserver, rawObserver); // no real alias when 
found here === "forced by user"
+        }
+    }
+
     protected OpenEjbConfiguration getOpenEjbConfiguration() throws 
OpenEJBException {
         OpenEjbConfiguration config = configFactory.getOpenEjbConfiguration();
         return config;
@@ -1016,7 +1066,7 @@ public class Assembler extends Assembler
         // Sort all the singletons to the back of the list.  We want to make 
sure
         // all non-singletons are created first so that if a singleton refers 
to them
         // they are available.
-        Collections.sort(deployments, new Comparator<BeanContext>(){
+        Collections.sort(deployments, new Comparator<BeanContext>() {
             public int compare(BeanContext a, BeanContext b) {
                 int aa = (a.getComponentType() == BeanType.SINGLETON) ? 1 : 0;
                 int bb = (b.getComponentType() == BeanType.SINGLETON) ? 1 : 0;

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/FacilitiesInfo.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/FacilitiesInfo.java?rev=1352371&r1=1352370&r2=1352371&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/FacilitiesInfo.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/FacilitiesInfo.java
 Wed Jun 20 23:59:18 2012
@@ -30,4 +30,5 @@ public class FacilitiesInfo extends Info
 
     // Don't add anything here unless it's overridable using the 
-DserviceId.property=value convention
     public final List<ServiceInfo> services = new ArrayList<ServiceInfo>();
+    public final List<String> serverObservers = new ArrayList<String>();
 }

Added: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/event/ConfigurationLoaded.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/event/ConfigurationLoaded.java?rev=1352371&view=auto
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/event/ConfigurationLoaded.java
 (added)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/event/ConfigurationLoaded.java
 Wed Jun 20 23:59:18 2012
@@ -0,0 +1,34 @@
+/*
+ * 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.assembler.classic.OpenEjbConfiguration;
+import org.apache.openejb.observer.Event;
+
+@Event
+public class ConfigurationLoaded {
+    private final OpenEjbConfiguration configuration;
+
+    public ConfigurationLoaded(final OpenEjbConfiguration config) {
+        configuration = config;
+    }
+
+    @Override
+    public String toString() {
+        return "ConfigurationLoaded{}";
+    }
+}

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=1352371&r1=1352370&r2=1352371&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:59:18 2012
@@ -384,6 +384,9 @@ public class ConfigurationFactory implem
         sys.containerSystem = new ContainerSystemInfo();
         sys.facilities = new FacilitiesInfo();
 
+        for (ServerObservers observer : openejb.getServerObservers()) {
+            sys.facilities.serverObservers.add(observer.getName());
+        }
 
         for (final JndiProvider provider : openejb.getJndiProvider()) {
             final JndiContextInfo info = configureService(provider, 
JndiContextInfo.class);
@@ -483,6 +486,7 @@ public class ConfigurationFactory implem
         final OpenEjbConfiguration finished = sys;
         sys = null;
         openejb = null;
+
         return finished;
     }
 

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=1352371&r1=1352370&r2=1352371&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:59:18 2012
@@ -20,6 +20,7 @@ import java.net.MalformedURLException;
 import java.net.URL;
 
 import org.apache.openejb.assembler.classic.event.AssemblerCreated;
+import org.apache.openejb.assembler.classic.event.ConfigurationLoaded;
 import org.apache.openejb.loader.IO;
 import org.apache.openejb.loader.SystemInstance;
 import org.apache.openejb.observer.Observes;
@@ -27,7 +28,6 @@ import org.apache.openejb.observer.Obser
 public class UpdateChecker {
     private static final Logger LOGGER = 
Logger.getInstance(LogCategory.OPENEJB_STARTUP, UpdateChecker.class);
 
-    private static final String SKIP_CHECK = "openejb.version.check";
     private static final String REPO_URL = 
SystemInstance.get().getOptions().get("openejb.version.check.repo.url", 
"http://repo1.maven.org/maven2/";);
     private static final String OPENEJB_GROUPID = "org/apache/openejb/";
     private static final String METADATA = "/maven-metadata.xml";
@@ -38,11 +38,7 @@ public class UpdateChecker {
     private static final String UNDEFINED = "undefined";
     private static String LATEST = "undefined";
 
-    public void check(@Observes AssemblerCreated event) {
-        if (isSkipped()) {
-            return;
-        }
-
+    public void check(@Observes ConfigurationLoaded event) {
         String originalProxyHost = null;
         String originalProxyPort = null;
         String originalProxyUser = null;
@@ -143,10 +139,6 @@ public class UpdateChecker {
     }
 
     public static String message() {
-        if (isSkipped()) {
-            return "version checking is skipped";
-        }
-
         if (UNDEFINED.equals(LATEST)) {
             return "can't determine the latest version";
         }
@@ -159,8 +151,4 @@ public class UpdateChecker {
                 .append(", our latest stable version ").append(LATEST)
                 .append(" is available on ").append(REPO_URL).toString();
     }
-
-    public static boolean isSkipped() {
-        return System.getProperty(SKIP_CHECK) == null;
-    }
 }

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=1352371&r1=1352370&r2=1352371&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:59:18 2012
@@ -84,14 +84,22 @@ public class SystemInstance {
         observerManager.fireEvent(event);
     }
 
-    public boolean addObserver(Object observer) {
-        return observerManager.addObserver(observer);
+    public ObserverManager.Observer addObserver(Object observer) {
+        return observerManager.addObserver(observer.getClass().getName(), 
observer);
     }
 
-    public boolean removeObserver(Object observer) {
+    public void addObserver(final String alias, final Object instance) {
+        observerManager.addObserver(alias, instance);
+    }
+
+    public ObserverManager.Observer removeObserver(Object observer) {
         return observerManager.removeObserver(observer);
     }
 
+    public boolean hasObserver(final String value) {
+        return observerManager.hasObserver(value);
+    }
+
     public long getStartTime() {
         return startTime;
     }
@@ -201,6 +209,9 @@ public class SystemInstance {
 
     public static synchronized void reset() {
         try {
+            if (system != null) {
+                system.observerManager.clear();
+            }
             system = new SystemInstance(new Properties()); // don't put system 
properties here, it is already done
             initialized = false;
         } catch (Exception e) {
@@ -259,5 +270,4 @@ public class SystemInstance {
     public boolean hasProperty(final String propName) {
         return this.internalProperties.get(propName) != null;
     }
-
 }

Modified: 
openejb/trunk/openejb/container/openejb-loader/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?rev=1352371&r1=1352370&r2=1352371&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-loader/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:59:18 2012
@@ -31,32 +31,32 @@ import java.util.Map;
 
 public class ObserverManager {
 
-    private final List<Observer> observers = new ArrayList<Observer>();
+    private final Map<String, Observer> observers = new HashMap<String, 
Observer>();
 
-    public boolean addObserver(Object observer) {
+    public Observer addObserver(String alias, Object observer) {
         if (observer == null) throw new IllegalArgumentException("observer 
cannot be null");
 
-        final boolean added = observers.add(new Observer(observer));
+        final Observer put = observers.put(alias, new Observer(observer));
 
         // Observers can observe they have been added and are active
         fireEvent(new ObserverAdded(observer));
 
-        return added;
+        return put;
     }
 
-    public boolean removeObserver(Object observer) {
+    public Observer 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));
+        return observers.remove(observer.getClass().getName());
     }
 
     public void fireEvent(Object event) {
         if (event == null) throw new IllegalArgumentException("event cannot be 
null");
 
-        for (Observer observer : observers) {
+        for (Observer observer : observers.values()) {
             try {
                 observer.invoke(event);
             } catch (Throwable t) {
@@ -67,6 +67,14 @@ public class ObserverManager {
         }
     }
 
+    public boolean hasObserver(final String value) {
+        return observers.containsKey(value);
+    }
+
+    public void clear() {
+        observers.clear();
+    }
+
     /**
      * @version $Rev$ $Date$
      */


Reply via email to