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/10/12 23:11:00 UTC
svn commit: r1397724 - in /openejb/trunk/openejb:
container/openejb-core/src/main/java/org/apache/openejb/cdi/
container/openejb-core/src/main/java/org/apache/openejb/util/reflection/
osgi/openejb-core-osgi/src/main/java/org/apache/openejb/core/osgi/impl/
Author: rmannibucau
Date: Fri Oct 12 21:11:00 2012
New Revision: 1397724
URL: http://svn.apache.org/viewvc?rev=1397724&view=rev
Log:
OPENEJB-1922 adding dep cdi classes in cdi classes + same for extensions
Modified:
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiScanner.java
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBLifecycle.java
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/OptimizedLoaderService.java
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/reflection/Reflections.java
openejb/trunk/openejb/osgi/openejb-core-osgi/src/main/java/org/apache/openejb/core/osgi/impl/Deployer.java
Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiScanner.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiScanner.java?rev=1397724&r1=1397723&r2=1397724&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiScanner.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiScanner.java Fri Oct 12 21:11:00 2012
@@ -61,14 +61,6 @@ public class CdiScanner implements Scann
@Override
public void init(Object object) {
- try {
- internalInit(object);
- } finally {
- ADDITIONAL_CLASSES.remove();
- }
- }
-
- public void internalInit(Object object) {
if (!(object instanceof StartupObject)) {
return;
}
Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBLifecycle.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBLifecycle.java?rev=1397724&r1=1397723&r2=1397724&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBLifecycle.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBLifecycle.java Fri Oct 12 21:11:00 2012
@@ -326,6 +326,10 @@ public class OpenEJBLifecycle implements
afterStartApplication(startupObject);
} finally {
Thread.currentThread().setContextClassLoader(oldCl);
+
+ // cleanup threadlocal used to enrich cdi context manually
+ OptimizedLoaderService.ADDITIONAL_EXTENSIONS.remove();
+ CdiScanner.ADDITIONAL_CLASSES.remove();
}
logger.info("OpenWebBeans Container has started, it took {0} ms.", Long.toString(System.currentTimeMillis() - begin));
Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/OptimizedLoaderService.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/OptimizedLoaderService.java?rev=1397724&r1=1397723&r2=1397724&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/OptimizedLoaderService.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/OptimizedLoaderService.java Fri Oct 12 21:11:00 2012
@@ -22,7 +22,9 @@ import org.apache.webbeans.service.Defau
import org.apache.webbeans.spi.LoaderService;
import org.apache.webbeans.spi.plugins.OpenWebBeansPlugin;
+import javax.enterprise.inject.spi.Extension;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.List;
/**
@@ -32,6 +34,8 @@ public class OptimizedLoaderService impl
private static final Logger log = Logger.getInstance(LogCategory.OPENEJB.createChild("cdi"), OptimizedLoaderService.class);
+ public static final ThreadLocal<Collection<String>> ADDITIONAL_EXTENSIONS = new ThreadLocal<Collection<String>>();
+
private final LoaderService loaderService;
public OptimizedLoaderService() {
@@ -53,7 +57,20 @@ public class OptimizedLoaderService impl
if (OpenWebBeansPlugin.class.equals(serviceType)) return loadWebBeansPlugins(classLoader);
// As far as we know, this only is reached for CDI Extension discovery
- return loaderService.load(serviceType, classLoader);
+ final List<T> list = loaderService.load(serviceType, classLoader);
+ if (Extension.class.equals(serviceType)) {
+ final Collection<String> additional = ADDITIONAL_EXTENSIONS.get();
+ if (additional != null) {
+ for (String name : additional) {
+ try {
+ list.add((T) classLoader.loadClass(name).newInstance());
+ } catch (Exception ignored) {
+ // no-op
+ }
+ }
+ }
+ }
+ return list;
}
private <T> List<T> loadWebBeansPlugins(ClassLoader loader) {
Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/reflection/Reflections.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/reflection/Reflections.java?rev=1397724&r1=1397723&r2=1397724&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/reflection/Reflections.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/reflection/Reflections.java Fri Oct 12 21:11:00 2012
@@ -16,6 +16,8 @@
*/
package org.apache.openejb.util.reflection;
+import org.apache.openejb.OpenEJBRuntimeException;
+
import java.lang.reflect.Field;
import java.lang.reflect.Method;
@@ -71,4 +73,27 @@ public final class Reflections {
clazz = clazz.getSuperclass();
}
}
+
+ public static Object get(final Object instance, final String field) {
+ Class<?> clazz = instance.getClass();
+ while (clazz != null) {
+ try {
+ final Field f = clazz.getDeclaredField(field);
+ boolean acc = f.isAccessible();
+ f.setAccessible(true);
+ try {
+ return f.get(instance);
+ } finally {
+ f.setAccessible(acc);
+ }
+ } catch (NoSuchFieldException nsfe) {
+ // no-op
+ } catch (Exception e) {
+ throw new IllegalArgumentException(e);
+ }
+
+ clazz = clazz.getSuperclass();
+ }
+ throw new OpenEJBRuntimeException(new NoSuchFieldException(field));
+ }
}
Modified: openejb/trunk/openejb/osgi/openejb-core-osgi/src/main/java/org/apache/openejb/core/osgi/impl/Deployer.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/osgi/openejb-core-osgi/src/main/java/org/apache/openejb/core/osgi/impl/Deployer.java?rev=1397724&r1=1397723&r2=1397724&view=diff
==============================================================================
--- openejb/trunk/openejb/osgi/openejb-core-osgi/src/main/java/org/apache/openejb/core/osgi/impl/Deployer.java (original)
+++ openejb/trunk/openejb/osgi/openejb-core-osgi/src/main/java/org/apache/openejb/core/osgi/impl/Deployer.java Fri Oct 12 21:11:00 2012
@@ -26,6 +26,7 @@ import org.apache.openejb.assembler.clas
import org.apache.openejb.assembler.classic.BeansInfo;
import org.apache.openejb.assembler.classic.EjbJarInfo;
import org.apache.openejb.cdi.CdiScanner;
+import org.apache.openejb.cdi.OptimizedLoaderService;
import org.apache.openejb.config.AppModule;
import org.apache.openejb.config.ConfigurationFactory;
import org.apache.openejb.config.DeploymentLoader;
@@ -35,6 +36,9 @@ import org.apache.openejb.core.ivm.Intra
import org.apache.openejb.loader.SystemInstance;
import org.apache.openejb.util.ArrayEnumeration;
import org.apache.openejb.util.proxy.ProxyEJB;
+import org.apache.openejb.util.reflection.Reflections;
+import org.apache.webbeans.config.WebBeansContext;
+import org.apache.webbeans.portable.events.ExtensionLoader;
import org.apache.xbean.finder.filter.Filter;
import org.apache.xbean.osgi.bundle.util.BundleUtils;
import org.osgi.framework.Bundle;
@@ -45,6 +49,7 @@ import org.osgi.framework.ServiceRegistr
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import javax.enterprise.inject.spi.Extension;
import java.io.File;
import java.io.IOException;
import java.net.URL;
@@ -71,7 +76,8 @@ public class Deployer implements BundleL
private final Map<Bundle, String> paths = new ConcurrentHashMap<Bundle, String>();
private final Activator openejbActivator;
- private Map<Bundle, Collection<String>> cdiClasses = new ConcurrentHashMap<Bundle, Collection<String>>();
+ private final Map<Bundle, Collection<String>> cdiClasses = new ConcurrentHashMap<Bundle, Collection<String>>();
+ private final Map<Bundle, Collection<String>> cdiExtensions = new ConcurrentHashMap<Bundle, Collection<String>>();
public Deployer(final Activator activator) {
openejbActivator = activator;
@@ -136,13 +142,22 @@ public class Deployer implements BundleL
}
list.addAll(classes);
}
+
+ final Collection<String> extensions = cdiExtensions.get(b);
+ if (extensions != null) {
+ Collection<String> list = OptimizedLoaderService.ADDITIONAL_EXTENSIONS.get();
+ if (list == null) {
+ list = new ArrayList<String>();
+ OptimizedLoaderService.ADDITIONAL_EXTENSIONS.set(list);
+ }
+ list.addAll(extensions);
+ }
}
try {
try {
try {
File bundleDump = findBundleFile(bundle);
- // libs.remove(bundleDump.toURI().toURL()); // remove this bundle from libs
if (bundleDump == null || !bundleDump.exists()) {
LOGGER.warn("can't find bundle {}", bundle.getBundleId());
@@ -184,6 +199,7 @@ public class Deployer implements BundleL
registerService(bundle, appContext);
saveCDIClasses(bundle, appInfo);
+ saveCDIExtension(bundle, appContext);
} catch (UnknownModuleTypeException unknowException) {
LOGGER.info("bundle #" + bundle.getBundleId() + " is not an EJBModule");
} catch (Exception ex) {
@@ -198,6 +214,18 @@ public class Deployer implements BundleL
}
}
+ private void saveCDIExtension(final Bundle bundle, final AppContext appContext) {
+ final WebBeansContext context = appContext.getWebBeansContext();
+ final ExtensionLoader extensionLoader = context.getExtensionLoader();
+ final Set<Class<? extends Extension>> extensions = (Set<Class<? extends Extension>>) Reflections.get(extensionLoader, "extensionClasses");
+ final Set<String> names = new HashSet<String>();
+ for (Class<?> extension : extensions) {
+ names.add(extension.getName());
+ }
+ names.remove(RegisterOSGIServicesExtension.class.getName()); // automatically added to all through our OSGiClassLoader
+ cdiExtensions.put(bundle, names);
+ }
+
private void saveCDIClasses(final Bundle bundle, final AppInfo app) {
for (EjbJarInfo module : app.ejbJars) {
final BeansInfo beans = module.beans;
@@ -288,10 +316,8 @@ public class Deployer implements BundleL
}
private void undeploy(final Bundle bundle) {
- final Collection<String> cdiClassesForThisBundle = cdiClasses.remove(bundle);
- if (cdiClassesForThisBundle != null) {
- cdiClassesForThisBundle.clear();
- }
+ clean(bundle, cdiClasses);
+ clean(bundle, cdiExtensions);
if (registrations.containsKey(bundle)) {
for (final ServiceRegistration registration : registrations.get(bundle)) {
@@ -322,6 +348,13 @@ public class Deployer implements BundleL
LOGGER.info("[Deployer] Bundle {} has been stopped", bundle.getSymbolicName());
}
+ private void clean(final Bundle bundle, final Map<Bundle, Collection<String>> lists) {
+ final Collection<String> list = lists.remove(bundle);
+ if (list != null) {
+ list.clear();
+ }
+ }
+
/**
* Register OSGi Service for EJB so calling the service will actually call the EJB
*