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)) {