You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by dj...@apache.org on 2010/11/23 18:37:27 UTC
svn commit: r1038217 - in /geronimo/server/trunk/plugins:
j2ee/geronimo-j2ee-builder/src/main/java/org/apache/geronimo/j2ee/deployment/
openwebbeans/geronimo-openwebbeans-builder/src/main/java/org/apache/geronimo/openwebbeans/deployment/
openwebbeans/g...
Author: djencks
Date: Tue Nov 23 17:37:27 2010
New Revision: 1038217
URL: http://svn.apache.org/viewvc?rev=1038217&view=rev
Log:
GERONIMO-5050 OWB integration set up injection of ee resources with naming builders. Also provide a more likely classloader for proxies
Modified:
geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/main/java/org/apache/geronimo/j2ee/deployment/NamingBuilderCollection.java
geronimo/server/trunk/plugins/openwebbeans/geronimo-openwebbeans-builder/src/main/java/org/apache/geronimo/openwebbeans/deployment/OpenWebBeansModuleBuilderExtension.java
geronimo/server/trunk/plugins/openwebbeans/geronimo-openwebbeans-builder/src/main/java/org/apache/geronimo/openwebbeans/deployment/OpenWebBeansNamingBuilder.java
geronimo/server/trunk/plugins/openwebbeans/geronimo-openwebbeans/src/main/java/org/apache/geronimo/openwebbeans/OsgiMetaDataScannerService.java
geronimo/server/trunk/plugins/openwebbeans/geronimo-openwebbeans/src/main/java/org/apache/geronimo/openwebbeans/SingletonServiceInitializerGBean.java
geronimo/server/trunk/plugins/openwebbeans/openwebbeans-deployer/src/main/plan/plan.xml
Modified: geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/main/java/org/apache/geronimo/j2ee/deployment/NamingBuilderCollection.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/main/java/org/apache/geronimo/j2ee/deployment/NamingBuilderCollection.java?rev=1038217&r1=1038216&r2=1038217&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/main/java/org/apache/geronimo/j2ee/deployment/NamingBuilderCollection.java (original)
+++ geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/main/java/org/apache/geronimo/j2ee/deployment/NamingBuilderCollection.java Tue Nov 23 17:37:27 2010
@@ -33,6 +33,7 @@ import org.apache.geronimo.gbean.annotat
import org.apache.geronimo.gbean.annotation.ParamReference;
import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory;
import org.apache.openejb.jee.JndiConsumer;
+import org.apache.xmlbeans.QNameSet;
import org.apache.xmlbeans.XmlObject;
/**
@@ -88,7 +89,15 @@ public class NamingBuilderCollection ext
}
public QName getBaseQName() {
- throw new IllegalStateException("Don't call this");
+ return new QName("foo");
+ }
+
+ public QNameSet getSpecQNameSet() {
+ return QNameSet.EMPTY;
+ }
+
+ public QNameSet getPlanQNameSet() {
+ return QNameSet.EMPTY;
}
}
Modified: geronimo/server/trunk/plugins/openwebbeans/geronimo-openwebbeans-builder/src/main/java/org/apache/geronimo/openwebbeans/deployment/OpenWebBeansModuleBuilderExtension.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/openwebbeans/geronimo-openwebbeans-builder/src/main/java/org/apache/geronimo/openwebbeans/deployment/OpenWebBeansModuleBuilderExtension.java?rev=1038217&r1=1038216&r2=1038217&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/openwebbeans/geronimo-openwebbeans-builder/src/main/java/org/apache/geronimo/openwebbeans/deployment/OpenWebBeansModuleBuilderExtension.java (original)
+++ geronimo/server/trunk/plugins/openwebbeans/geronimo-openwebbeans-builder/src/main/java/org/apache/geronimo/openwebbeans/deployment/OpenWebBeansModuleBuilderExtension.java Tue Nov 23 17:37:27 2010
@@ -17,14 +17,22 @@
package org.apache.geronimo.openwebbeans.deployment;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
import java.net.URL;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import java.util.jar.JarFile;
+import javax.enterprise.inject.Produces;
+import javax.enterprise.inject.spi.Producer;
import org.apache.geronimo.common.DeploymentException;
import org.apache.geronimo.deployment.ModuleIDBuilder;
import org.apache.geronimo.deployment.service.EnvironmentBuilder;
@@ -32,6 +40,7 @@ import org.apache.geronimo.gbean.Abstrac
import org.apache.geronimo.gbean.GBeanData;
import org.apache.geronimo.gbean.annotation.GBean;
import org.apache.geronimo.gbean.annotation.ParamAttribute;
+import org.apache.geronimo.gbean.annotation.ParamReference;
import org.apache.geronimo.j2ee.annotation.Holder;
import org.apache.geronimo.j2ee.deployment.EARContext;
import org.apache.geronimo.j2ee.deployment.Module;
@@ -45,9 +54,14 @@ import org.apache.geronimo.kernel.reposi
import org.apache.geronimo.openwebbeans.WebBeansConfigurationListener;
import org.apache.geronimo.web.info.WebAppInfo;
import org.apache.openejb.jee.WebApp;
+import org.apache.xbean.finder.BundleAnnotationFinder;
import org.apache.xbean.finder.ClassFinder;
+import org.apache.xbean.osgi.bundle.util.DiscoveryRange;
+import org.apache.xbean.osgi.bundle.util.ResourceDiscoveryFilter;
import org.apache.xmlbeans.XmlObject;
import org.osgi.framework.Bundle;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.packageadmin.PackageAdmin;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -61,14 +75,16 @@ public class OpenWebBeansModuleBuilderEx
private final Environment defaultEnvironment;
//only plausible naming builder is ours that adds BeanManager entry
- private final NamingBuilder namingBuilders = new OpenWebBeansNamingBuilder();
+ private final NamingBuilder namingBuilders;
//this is the geronimo copy
private static final String CONTEXT_LISTENER_NAME = WebBeansConfigurationListener.class.getName();
public OpenWebBeansModuleBuilderExtension(
- @ParamAttribute(name = "defaultEnvironment") Environment defaultEnvironment) {
+ @ParamAttribute(name = "defaultEnvironment") Environment defaultEnvironment,
+ @ParamReference(name = "NamingBuilders", namingType = NameFactory.MODULE_BUILDER) NamingBuilder namingBuilders) {
this.defaultEnvironment = defaultEnvironment;
+ this.namingBuilders = namingBuilders;
}
public void createModule(Module module, Bundle bundle, Naming naming, ModuleIDBuilder idBuilder)
@@ -164,7 +180,46 @@ public class OpenWebBeansModuleBuilderEx
}
private List<Class> getManagedClasses(WebApp webApp, WebModule webModule) throws DeploymentException {
- return Collections.EMPTY_LIST;
+ Bundle bundle = webModule.getEarContext().getDeploymentBundle();
+ ServiceReference reference = bundle.getBundleContext().getServiceReference(PackageAdmin.class.getName());
+ try {
+ PackageAdmin packageAdmin = (PackageAdmin) bundle.getBundleContext().getService(reference);
+ Map<Class<? extends Annotation>, Set<Class>> annotationClassSetMap = new HashMap<Class<? extends Annotation>, Set<Class>>();
+ BundleAnnotationFinder bundleAnnotationFinder = new BundleAnnotationFinder(packageAdmin, bundle, new ResourceDiscoveryFilter() {
+
+ @Override
+ public boolean directoryDiscoveryRequired(String directory) {
+ //TODO WEB-INF/classes ???
+ return true;
+ }
+
+ @Override
+ public boolean rangeDiscoveryRequired(DiscoveryRange discoveryRange) {
+ return discoveryRange.equals(DiscoveryRange.BUNDLE_CLASSPATH);
+ }
+
+ @Override
+ public boolean zipFileDiscoveryRequired(String jarFile) {
+ //????
+ return true;
+ }
+
+ });
+ Set<Class<?>> classes = new HashSet<Class<?>>();
+ List<Method> methods = bundleAnnotationFinder.findAnnotatedMethods(Produces.class);
+ for (Method method: methods) {
+ classes.add(method.getDeclaringClass());
+ }
+ List<Field> fields = bundleAnnotationFinder.findAnnotatedFields(Produces.class);
+ for (Field field: fields) {
+ classes.add(field.getDeclaringClass());
+ }
+ return new ArrayList(classes);
+ } catch (Exception e) {
+ throw new DeploymentException("Fail to scan jsr299 annotations", e);
+ } finally {
+ bundle.getBundleContext().ungetService(reference);
+ }
}
-
+
}
Modified: geronimo/server/trunk/plugins/openwebbeans/geronimo-openwebbeans-builder/src/main/java/org/apache/geronimo/openwebbeans/deployment/OpenWebBeansNamingBuilder.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/openwebbeans/geronimo-openwebbeans-builder/src/main/java/org/apache/geronimo/openwebbeans/deployment/OpenWebBeansNamingBuilder.java?rev=1038217&r1=1038216&r2=1038217&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/openwebbeans/geronimo-openwebbeans-builder/src/main/java/org/apache/geronimo/openwebbeans/deployment/OpenWebBeansNamingBuilder.java (original)
+++ geronimo/server/trunk/plugins/openwebbeans/geronimo-openwebbeans-builder/src/main/java/org/apache/geronimo/openwebbeans/deployment/OpenWebBeansNamingBuilder.java Tue Nov 23 17:37:27 2010
@@ -24,8 +24,10 @@ import java.util.Collections;
import java.util.Map;
import org.apache.geronimo.common.DeploymentException;
+import org.apache.geronimo.gbean.annotation.GBean;
import org.apache.geronimo.j2ee.deployment.EARContext;
import org.apache.geronimo.j2ee.deployment.Module;
+import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory;
import org.apache.geronimo.naming.deployment.AbstractNamingBuilder;
import org.apache.geronimo.openwebbeans.BeanManagerReference;
import org.apache.openejb.jee.InjectionTarget;
@@ -36,6 +38,7 @@ import org.apache.xmlbeans.XmlObject;
/**
* @version $Rev:$ $Date:$
*/
+@GBean(j2eeType = NameFactory.MODULE_BUILDER)
public class OpenWebBeansNamingBuilder extends AbstractNamingBuilder {
@Override
public void buildNaming(JndiConsumer specDD, XmlObject plan, Module module, Map<EARContext.Key, Object> sharedContext) throws DeploymentException {
@@ -44,11 +47,11 @@ public class OpenWebBeansNamingBuilder e
@Override
public QNameSet getSpecQNameSet() {
- return null;
+ return QNameSet.EMPTY;
}
@Override
public QNameSet getPlanQNameSet() {
- return null;
+ return QNameSet.EMPTY;
}
}
Modified: geronimo/server/trunk/plugins/openwebbeans/geronimo-openwebbeans/src/main/java/org/apache/geronimo/openwebbeans/OsgiMetaDataScannerService.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/openwebbeans/geronimo-openwebbeans/src/main/java/org/apache/geronimo/openwebbeans/OsgiMetaDataScannerService.java?rev=1038217&r1=1038216&r2=1038217&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/openwebbeans/geronimo-openwebbeans/src/main/java/org/apache/geronimo/openwebbeans/OsgiMetaDataScannerService.java (original)
+++ geronimo/server/trunk/plugins/openwebbeans/geronimo-openwebbeans/src/main/java/org/apache/geronimo/openwebbeans/OsgiMetaDataScannerService.java Tue Nov 23 17:37:27 2010
@@ -18,8 +18,11 @@
*/
package org.apache.geronimo.openwebbeans;
+import org.apache.webbeans.config.OpenWebBeansConfiguration;
+import org.apache.webbeans.corespi.se.DefaultBDABeansXmlScanner;
import org.apache.webbeans.exception.WebBeansDeploymentException;
import org.apache.webbeans.logger.WebBeansLogger;
+import org.apache.webbeans.spi.BDABeansXmlScanner;
import org.apache.webbeans.spi.ScannerService;
import org.apache.xbean.finder.BundleAssignableClassFinder;
@@ -52,10 +55,12 @@ public class OsgiMetaDataScannerService
private boolean configured = false;
-// protected ServletContext servletContext = null;
private static final String META_INF_BEANS_XML = "META-INF/beans.xml";
private static final String WEB_INF_BEANS_XML = "WEB-INF/beans.xml";
+ protected boolean isBDAScannerEnabled = false;
+ protected BDABeansXmlScanner bdaBeansXmlScanner;
+
/** All classes which have to be scanned for Bean information */
private Set<Class<?>> beanClasses = new HashSet<Class<?>>();
@@ -68,10 +73,15 @@ public class OsgiMetaDataScannerService
@Override
public void init(Object object)
{
-// if (object instanceof ServletContext)
-// {
-// servletContext = (ServletContext) object;
-// }
+ // set per BDA beans.xml flag here because setting it in constructor
+ // occurs before
+ // properties are loaded.
+ String usage = OpenWebBeansConfiguration.getInstance().getProperty(OpenWebBeansConfiguration.USE_BDA_BEANSXML_SCANNER);
+ this.isBDAScannerEnabled = Boolean.parseBoolean(usage);
+ if (isBDAScannerEnabled)
+ {
+ bdaBeansXmlScanner = new DefaultBDABeansXmlScanner();
+ }
}
@Override
@@ -221,4 +231,16 @@ public class OsgiMetaDataScannerService
{
return beanClasses;
}
+
+ @Override
+ public boolean isBDABeansXmlScanningEnabled()
+ {
+ return isBDAScannerEnabled;
+ }
+
+ @Override
+ public BDABeansXmlScanner getBDABeansXmlScanner()
+ {
+ return bdaBeansXmlScanner;
+ }
}
Modified: geronimo/server/trunk/plugins/openwebbeans/geronimo-openwebbeans/src/main/java/org/apache/geronimo/openwebbeans/SingletonServiceInitializerGBean.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/openwebbeans/geronimo-openwebbeans/src/main/java/org/apache/geronimo/openwebbeans/SingletonServiceInitializerGBean.java?rev=1038217&r1=1038216&r2=1038217&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/openwebbeans/geronimo-openwebbeans/src/main/java/org/apache/geronimo/openwebbeans/SingletonServiceInitializerGBean.java (original)
+++ geronimo/server/trunk/plugins/openwebbeans/geronimo-openwebbeans/src/main/java/org/apache/geronimo/openwebbeans/SingletonServiceInitializerGBean.java Tue Nov 23 17:37:27 2010
@@ -20,6 +20,18 @@
package org.apache.geronimo.openwebbeans;
+import java.net.URL;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+import javassist.util.proxy.ProxyFactory;
+import javassist.util.proxy.ProxyObject;
import org.apache.geronimo.gbean.annotation.GBean;
import org.apache.geronimo.gbean.annotation.ParamSpecial;
import org.apache.geronimo.gbean.annotation.SpecialAttributeType;
@@ -34,5 +46,111 @@ public class SingletonServiceInitializer
public SingletonServiceInitializerGBean(@ParamSpecial(type = SpecialAttributeType.bundle) Bundle bundle) {
GeronimoSingletonService.init(bundle);
+ ProxyFactory.classLoaderProvider = new GeronimoClassLoaderProvider();
+ }
+
+ private static class GeronimoClassLoaderProvider implements ProxyFactory.ClassLoaderProvider {
+
+ private final ConcurrentMap<Bundle, ClassLoader> proxyClassLoaders = new ConcurrentHashMap<Bundle, ClassLoader>();
+
+ @Override
+ public ClassLoader get(ProxyFactory proxyFactory) {
+ Collection<ClassLoader> baseCl = getBaseCl(proxyFactory);
+ if (baseCl.size() == 1) {
+ return baseCl.iterator().next();
+ }
+// Bundle bundle = null;
+// if (baseCl instanceof BundleReference) {
+// bundle = ((BundleReference)baseCl).getBundle();
+// ClassLoader proxyCl = proxyClassLoaders.get(bundle);
+// if (proxyCl != null) {
+// return proxyCl;
+// }
+// }
+// ClassLoader extensionCl = baseProvider.getClass().getClassLoader();
+ ClassLoader proxyCl = new MultiParentClassLoader(baseCl);
+// if (bundle != null) {
+// ClassLoader oldCl = proxyClassLoaders.putIfAbsent(bundle, proxyCl);
+// if (oldCl != null) {
+// return oldCl;
+// }
+// }
+ return proxyCl;
+ }
+
+ private Collection<ClassLoader> getBaseCl(ProxyFactory proxyFactory) {
+ Set<Class<?>> classes = new HashSet<Class<?>>();
+ classes.add(ProxyObject.class);
+ Class<?> superClass = proxyFactory.getSuperclass();
+ if (superClass != null && superClass != Object.class) {
+ classes.add(superClass);
+ }
+ for (Class<?> clazz: proxyFactory.getInterfaces()) {
+ classes.add(clazz);
+ }
+ Map<Class<?>, ClassLoader> classLoaderMap = new HashMap<Class<?>, ClassLoader>(3);
+ for (Class<?> clazz: classes) {
+ ClassLoader newCl = clazz.getClassLoader();
+ if (newCl != null) {
+ boolean loadable = false;
+ for (Map.Entry<Class<?>, ClassLoader> entry: classLoaderMap.entrySet()) {
+ try {
+ entry.getValue().loadClass(clazz.getName());
+ loadable = true;
+ break;
+ } catch (ClassNotFoundException e) {
+ //continue looking
+ }
+ }
+ if (!loadable) {
+ for (Iterator<Map.Entry<Class<?>, ClassLoader>> it = classLoaderMap.entrySet().iterator(); it.hasNext(); ) {
+ Map.Entry<Class<?>, ClassLoader> entry = it.next();
+ try {
+ newCl.loadClass(entry.getKey().getName());
+ it.remove();
+ } catch (ClassNotFoundException e) {
+ //continue
+ }
+ }
+ classLoaderMap.put(clazz, newCl);
+ }
+ }
+ }
+ //check for default access superclass and more than one or wrong classloader
+
+
+ return classLoaderMap.values();
+ }
+
+ private static class MultiParentClassLoader extends ClassLoader {
+ private final Collection<ClassLoader> classLoaders;
+ public MultiParentClassLoader(Collection<ClassLoader> classLoaders) {
+ this.classLoaders = classLoaders;
+ }
+
+ @Override
+ public Class<?> loadClass(String name) throws ClassNotFoundException {
+ for (ClassLoader cl: classLoaders) {
+ try {
+ return cl.loadClass(name);
+ } catch (ClassNotFoundException e) {
+ //ignore
+ }
+
+ }
+ return super.loadClass(name);
+ }
+
+ @Override
+ public URL getResource(String name) {
+ for (ClassLoader cl: classLoaders) {
+ URL url = cl.getResource(name);
+ if (url != null) {
+ return url;
+ }
+ }
+ return null;
+ }
+ }
}
}
Modified: geronimo/server/trunk/plugins/openwebbeans/openwebbeans-deployer/src/main/plan/plan.xml
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/openwebbeans/openwebbeans-deployer/src/main/plan/plan.xml?rev=1038217&r1=1038216&r2=1038217&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/openwebbeans/openwebbeans-deployer/src/main/plan/plan.xml (original)
+++ geronimo/server/trunk/plugins/openwebbeans/openwebbeans-deployer/src/main/plan/plan.xml Tue Nov 23 17:37:27 2010
@@ -21,6 +21,9 @@
<module xmlns="http://geronimo.apache.org/xml/ns/deployment-${geronimoSchemaVersion}">
<gbean name="OpenWebBeansModuleBuilderExtension" class="org.apache.geronimo.openwebbeans.deployment.OpenWebBeansModuleBuilderExtension">
+ <reference name="NamingBuilders">
+ <name>OWBNamingBuilders</name>
+ </reference>
<xml-attribute name="defaultEnvironment">
<environment xmlns="http://geronimo.apache.org/xml/ns/deployment-1.2">
<dependencies>
@@ -53,4 +56,17 @@
</xml-attribute>
</gbean>
+ <gbean name="OWBNamingBuilder" class="org.apache.geronimo.openwebbeans.deployment.OpenWebBeansNamingBuilder"/>
+
+ <gbean name="OWBNamingBuilders" class="org.apache.geronimo.j2ee.deployment.NamingBuilderCollection">
+ <references name="NamingBuilders">
+ <pattern>
+ <name>NamingBuilders</name>
+ </pattern>
+ <pattern>
+ <name>OWBNamingBuilder</name>
+ </pattern>
+ </references>
+ </gbean>
+
</module>