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
      *