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 19:05:28 UTC

svn commit: r1397645 - in /openejb/trunk/openejb: container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiScanner.java osgi/openejb-core-osgi/src/main/java/org/apache/openejb/core/osgi/impl/Deployer.java

Author: rmannibucau
Date: Fri Oct 12 17:05:28 2012
New Revision: 1397645

URL: http://svn.apache.org/viewvc?rev=1397645&view=rev
Log:
adding cdi classes from other bundle in KarafEE (without ejb or not loadable classes)

Modified:
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiScanner.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=1397645&r1=1397644&r2=1397645&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 17:05:28 2012
@@ -18,21 +18,10 @@
 
 package org.apache.openejb.cdi;
 
-import java.net.URL;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import javax.interceptor.Interceptor;
-
-import org.apache.openejb.AppContext;
-import org.apache.openejb.OpenEJB;
 import org.apache.openejb.assembler.classic.AppInfo;
 import org.apache.openejb.assembler.classic.BeansInfo;
 import org.apache.openejb.assembler.classic.EjbJarInfo;
 import org.apache.openejb.assembler.classic.EnterpriseBeanInfo;
-import org.apache.openejb.core.WebContext;
 import org.apache.openejb.loader.SystemInstance;
 import org.apache.openejb.util.classloader.ClassLoaderComparator;
 import org.apache.openejb.util.classloader.DefaultClassLoaderComparator;
@@ -46,11 +35,21 @@ import org.apache.webbeans.spi.BDABeansX
 import org.apache.webbeans.spi.ScannerService;
 import org.apache.webbeans.util.AnnotationUtil;
 
+import javax.interceptor.Interceptor;
+import java.net.URL;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
 /**
  * @version $Rev:$ $Date:$
  */
 public class CdiScanner implements ScannerService {
     public static final String OPENEJB_CDI_FILTER_CLASSLOADER = "openejb.cdi.filter.classloader";
+    public static final ThreadLocal<Collection<String>> ADDITIONAL_CLASSES = new ThreadLocal<Collection<String>>();
 
     // TODO add all annotated class
     private final Set<Class<?>> classes = new HashSet<Class<?>>();
@@ -62,6 +61,14 @@ 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;
         }
@@ -167,25 +174,42 @@ public class CdiScanner implements Scann
             // here for ears we need to skip classes in the parent classloader
             final ClassLoader scl = ClassLoader.getSystemClassLoader();
             final boolean filterByClassLoader = "true".equals(SystemInstance.get().getProperty(OPENEJB_CDI_FILTER_CLASSLOADER, "true"));
-            for (String className : beans.managedClasses) {
-                if (ejbClasses.contains(className)) continue;
-                final Class clazz = load(className, classLoader);
-                if (clazz == null) {
-                    continue;
-                }
 
-                final ClassLoader cl = clazz.getClassLoader();
-                // 1. this classloader is the good one
-                // 2. the classloader is the appclassloader one and we are in the ear parent
-                if (!filterByClassLoader
-                        || comparator.isSame(cl) || (cl.equals(scl) && startupObject.getWebContext() == null)) {
-                    classes.add(clazz);
+            final Iterator<String> it = beans.managedClasses.iterator();
+            while (it.hasNext()) {
+                process(classLoader, ejbClasses, it, startupObject, comparator, scl, filterByClassLoader);
+            }
+
+            final Collection<String> otherClasses = ADDITIONAL_CLASSES.get();
+            if (otherClasses != null) {
+                final Iterator<String> it2 = otherClasses.iterator();
+                while (it2.hasNext()) {
+                    process(classLoader, ejbClasses, it2, startupObject, comparator, scl, filterByClassLoader);
                 }
             }
         }
 
     }
 
+    private void process(final ClassLoader classLoader, final Set<String> ejbClasses, final Iterator<String> it, final StartupObject startupObject, final ClassLoaderComparator comparator, final ClassLoader scl, final boolean filterByClassLoader) {
+        final String className = it.next();
+        if (ejbClasses.contains(className)) it.remove();
+        final Class clazz = load(className, classLoader);
+        if (clazz == null) {
+            return;
+        }
+
+        final ClassLoader cl = clazz.getClassLoader();
+        // 1. this classloader is the good one
+        // 2. the classloader is the appclassloader one and we are in the ear parent
+        if (!filterByClassLoader
+                || comparator.isSame(cl) || (cl.equals(scl) && startupObject.getWebContext() == null)) {
+            classes.add(clazz);
+        } else {
+            it.remove();
+        }
+    }
+
     private boolean addErrors(final StringBuilder errors, final String msg, final List<String> list) {
         if (!list.isEmpty()) {
             errors.append("[ ").append(msg).append(" --> ");

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=1397645&r1=1397644&r2=1397645&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 17:05:28 2012
@@ -23,15 +23,20 @@ import org.apache.openejb.NoSuchApplicat
 import org.apache.openejb.UndeployException;
 import org.apache.openejb.assembler.classic.AppInfo;
 import org.apache.openejb.assembler.classic.Assembler;
+import org.apache.openejb.assembler.classic.BeansInfo;
+import org.apache.openejb.assembler.classic.EjbJarInfo;
+import org.apache.openejb.cdi.CdiScanner;
 import org.apache.openejb.config.AppModule;
 import org.apache.openejb.config.ConfigurationFactory;
 import org.apache.openejb.config.DeploymentLoader;
+import org.apache.openejb.config.NewLoaderLogic;
 import org.apache.openejb.config.UnknownModuleTypeException;
 import org.apache.openejb.core.ivm.IntraVmProxy;
 import org.apache.openejb.loader.SystemInstance;
 import org.apache.openejb.util.ArrayEnumeration;
 import org.apache.openejb.util.proxy.ProxyEJB;
 import org.apache.xbean.finder.filter.Filter;
+import org.apache.xbean.osgi.bundle.util.BundleUtils;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.BundleEvent;
@@ -45,6 +50,7 @@ import java.io.IOException;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.Enumeration;
 import java.util.HashSet;
 import java.util.List;
@@ -65,6 +71,7 @@ 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>>();
 
     public Deployer(final Activator activator) {
         openejbActivator = activator;
@@ -112,9 +119,7 @@ public class Deployer implements BundleL
 
         Thread.currentThread().setContextClassLoader(osgiCl);
 
-        /*
         final Set<Bundle> wiredBundles = BundleUtils.getWiredBundles(bundle);
-        final Set<URL> libs = new HashSet<URL>();
         final Filter filter = new OSGiPrefixFilter(NewLoaderLogic.getExclusions());
         for (Bundle b : wiredBundles) {
             final String location = b.getLocation();
@@ -122,23 +127,16 @@ public class Deployer implements BundleL
                 continue;
             }
 
-            final File file = findBundleFile(b);
-            if (file == null) {
-                continue;
-            }
-
-            try {
-                libs.add(file.toURI().toURL());
-            } catch (MalformedURLException e) {
-                // no-op
+            final Collection<String> classes = cdiClasses.get(b);
+            if (classes != null) {
+                Collection<String> list = CdiScanner.ADDITIONAL_CLASSES.get();
+                if (list == null) {
+                    list = new ArrayList<String>();
+                    CdiScanner.ADDITIONAL_CLASSES.set(list);
+                }
+                list.addAll(classes);
             }
-
-            // final Set<URL> others = libByBundle.get(b);
-            // if (others != null) {
-            //    libs.addAll(others);
-            //}
         }
-        */
 
         try {
             try {
@@ -184,6 +182,8 @@ public class Deployer implements BundleL
 
                     registrations.put(bundle, new ArrayList<ServiceRegistration>());
                     registerService(bundle, appContext);
+
+                    saveCDIClasses(bundle, appInfo);
                 } catch (UnknownModuleTypeException unknowException) {
                     LOGGER.info("bundle #" + bundle.getBundleId() + " is not an EJBModule");
                 } catch (Exception ex) {
@@ -198,6 +198,26 @@ public class Deployer implements BundleL
         }
     }
 
+    private void saveCDIClasses(final Bundle bundle, final AppInfo app) {
+        for (EjbJarInfo module : app.ejbJars) {
+            final BeansInfo beans = module.beans;
+            if (beans == null) {
+                continue;
+            }
+
+            storeCDIClasses(bundle, beans.managedClasses);
+        }
+    }
+
+    private void storeCDIClasses(final Bundle bundle, final Collection<String> names) {
+        Collection<String> list = cdiClasses.get(bundle);
+        if (list == null) {
+            list = new ArrayList<String>();
+            cdiClasses.put(bundle, list);
+        }
+        list.addAll(names);
+    }
+
     private static File findBundleFile(final Bundle bundle) {
         // equinox? found in aries
         File bundleDump = bundle.getBundleContext().getDataFile(bundle.getSymbolicName() + "/" + bundle.getVersion() + "/");
@@ -268,7 +288,10 @@ public class Deployer implements BundleL
     }
 
     private void undeploy(final Bundle bundle) {
-        // libByBundle.remove(bundle);
+        final Collection<String> cdiClassesForThisBundle = cdiClasses.remove(bundle);
+        if (cdiClassesForThisBundle != null) {
+            cdiClassesForThisBundle.clear();
+        }
 
         if (registrations.containsKey(bundle)) {
             for (final ServiceRegistration registration : registrations.get(bundle)) {