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$
*/