Author: rmannibucau
Date: Wed Nov 14 15:59:03 2012
New Revision: 1409239

URL: http://svn.apache.org/viewvc?rev=1409239&view=rev
Log:
OPENEJB-1934 respect cdi (beans.xml) for arquillian-openejb-embedded-4 when 
using webarchive

Modified:
    
openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBArchiveProcessor.java
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/WebappAggregatedArchive.java
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/EmptyResourcesClassLoader.java

Modified: 
openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBArchiveProcessor.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBArchiveProcessor.java?rev=1409239&r1=1409238&r2=1409239&view=diff
==============================================================================
--- 
openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBArchiveProcessor.java
 (original)
+++ 
openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBArchiveProcessor.java
 Wed Nov 14 15:59:03 2012
@@ -21,7 +21,9 @@ import org.apache.openejb.OpenEJBRuntime
 import org.apache.openejb.config.AppModule;
 import org.apache.openejb.config.DeploymentLoader;
 import org.apache.openejb.config.EjbModule;
+import org.apache.openejb.config.FinderFactory;
 import org.apache.openejb.config.ReadDescriptors;
+import org.apache.openejb.config.WebappAggregatedArchive;
 import org.apache.openejb.jee.EjbJar;
 import org.apache.openejb.jee.ManagedBean;
 import org.apache.openejb.jee.TransactionType;
@@ -32,6 +34,7 @@ import org.apache.openejb.util.classload
 import org.apache.xbean.finder.AnnotationFinder;
 import org.apache.xbean.finder.archive.ClassesArchive;
 import org.apache.xbean.finder.archive.CompositeArchive;
+import org.apache.xbean.finder.archive.FilteredArchive;
 import org.apache.xbean.finder.archive.JarArchive;
 import org.jboss.arquillian.test.spi.TestClass;
 import org.jboss.shrinkwrap.api.Archive;
@@ -55,6 +58,8 @@ import java.net.URLClassLoader;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
@@ -133,8 +138,6 @@ public class OpenEJBArchiveProcessor {
             appModule.getEjbModules().add(new EjbModule(ejbJar, openejbJar));
         }
 
-        final org.apache.xbean.finder.archive.Archive finderArchive = 
finderArchive(archive, appModule.getClassLoader(), additionalPaths);
-
         final EjbJar ejbJar;
         final Node ejbJarXml = archive.get(prefix.concat(EJB_JAR_XML));
         if (ejbJarXml != null) {
@@ -157,18 +160,19 @@ public class OpenEJBArchiveProcessor {
         }
 
         final EjbModule ejbModule = new EjbModule(ejbJar);
-        ejbModule.setFinder(new AnnotationFinder(finderArchive));
-        appModule.getEjbModules().add(ejbModule);
 
-        {
-            Node beansXml = archive.get(prefix.concat(BEANS_XML));
-            if (beansXml == null && WEB_INF.equals(prefix)) {
-                beansXml = 
archive.get(WEB_INF_CLASSES.concat(META_INF).concat(BEANS_XML));
-            }
-            if (beansXml != null) {
-                ejbModule.getAltDDs().put(BEANS_XML, new 
AssetSource(beansXml.getAsset()));
-            }
+        Node beansXml = archive.get(prefix.concat(BEANS_XML));
+        if (beansXml == null && WEB_INF.equals(prefix)) {
+            beansXml = 
archive.get(WEB_INF_CLASSES.concat(META_INF).concat(BEANS_XML));
         }
+        if (beansXml != null) {
+            ejbModule.getAltDDs().put(BEANS_XML, new 
AssetSource(beansXml.getAsset()));
+        }
+
+        final org.apache.xbean.finder.archive.Archive finderArchive = 
finderArchive(beansXml, archive, appModule.getClassLoader(), additionalPaths);
+
+        ejbModule.setFinder(new FinderFactory.ModuleLimitedFinder(new 
AnnotationFinder(finderArchive)));
+        appModule.getEjbModules().add(ejbModule);
 
         {
             Node persistenceXml = archive.get(prefix.concat(PERSISTENCE_XML));
@@ -247,7 +251,7 @@ public class OpenEJBArchiveProcessor {
         }
     }
 
-    private static org.apache.xbean.finder.archive.Archive finderArchive(final 
Archive<?> archive, final ClassLoader cl, final Collection<URL> 
additionalPaths) {
+    private static org.apache.xbean.finder.archive.Archive finderArchive(final 
Node beansXml, final Archive<?> archive, final ClassLoader cl, final 
Collection<URL> additionalPaths) {
         final List<Class<?>> classes = new ArrayList<Class<?>>();
         final Map<ArchivePath, Node> content = archive.getContent(new 
IncludeRegExpPaths(".*.class"));
         for (Map.Entry<ArchivePath, Node> node : content.entrySet()) {
@@ -259,12 +263,31 @@ public class OpenEJBArchiveProcessor {
             }
         }
 
+        final Map<URL, List<String>> classesByUrl = new HashMap<URL, 
List<String>>();
+
         final List<org.apache.xbean.finder.archive.Archive> archives = new 
ArrayList<org.apache.xbean.finder.archive.Archive>();
         for (URL url : 
DeploymentLoader.filterWebappUrls(additionalPaths.toArray(new 
URL[additionalPaths.size()]), null)) {
-            archives.add(new JarArchive(cl, url));
+            final List<String> currentClasses = new ArrayList<String>();
+            final org.apache.xbean.finder.archive.Archive newArchive = new 
FilteredArchive(new JarArchive(cl, url), new 
WebappAggregatedArchive.ScanXmlSaverFilter(false, null, currentClasses));
+            classesByUrl.put(url, currentClasses);
+            archives.add(newArchive);
         }
+
         archives.add(new ClassesArchive(classes));
-        return new CompositeArchive(archives);
+        if (beansXml != null) {
+            final List<String> mainClasses = new ArrayList<String>();
+            for (Class<?> clazz : classes) {
+                mainClasses.add(clazz.getName());
+            }
+            // look 
org.apache.openejb.config.AnnotationDeployer.DiscoverAnnotatedBeans.hasBeansXml()
+            try {
+                classesByUrl.put(new URL("file://foo.jar!/WEB-INF/classes/"), 
mainClasses);
+            } catch (MalformedURLException mue) {
+                // no-op
+            }
+        }
+
+        return new SimpleWebappAggregatedArchive(new 
CompositeArchive(archives), classesByUrl);
     }
 
     private static String name(final String raw) {
@@ -288,4 +311,37 @@ public class OpenEJBArchiveProcessor {
             return asset.openStream();
         }
     }
+
+    // mainly extended to be sure to reuse our tip about scanning for CDI
+    private static class SimpleWebappAggregatedArchive extends 
WebappAggregatedArchive {
+        private final CompositeArchive delegate;
+        private final Map<URL, List<String>> classesMap;
+
+        public SimpleWebappAggregatedArchive(final CompositeArchive archive, 
final Map<URL, List<String>> map) {
+            super(Thread.currentThread().getContextClassLoader(), new 
HashMap<String, Object>(), new ArrayList<URL>());
+
+            delegate = archive;
+            classesMap = map;
+        }
+
+        @Override
+        public Map<URL, List<String>> getClassesMap() {
+            return classesMap;
+        }
+
+        @Override
+        public InputStream getBytecode(final String s) throws IOException, 
ClassNotFoundException {
+            return delegate.getBytecode(s);
+        }
+
+        @Override
+        public Class<?> loadClass(final String s) throws 
ClassNotFoundException {
+            return delegate.loadClass(s);
+        }
+
+        @Override
+        public Iterator<Entry> iterator() {
+            return delegate.iterator();
+        }
+    }
 }

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java?rev=1409239&r1=1409238&r2=1409239&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
 Wed Nov 14 15:59:03 2012
@@ -22,6 +22,7 @@ import org.apache.openejb.api.LocalClien
 import org.apache.openejb.api.Proxy;
 import org.apache.openejb.api.RemoteClient;
 import org.apache.openejb.cdi.CdiBeanInfo;
+import org.apache.openejb.core.EmptyResourcesClassLoader;
 import org.apache.openejb.core.webservices.JaxWsUtils;
 import org.apache.openejb.jee.ActivationConfig;
 import org.apache.openejb.jee.ActivationSpec;
@@ -1581,11 +1582,11 @@ public class AnnotationDeployer implemen
             return classes;
         }
 
-        private boolean hasBeansXml(URL url) {
+        public static boolean hasBeansXml(URL url) {
             if (url.getPath().endsWith("WEB-INF/classes/")) return true;
             if (url.getPath().endsWith("!/META-INF/beans.xml")) return true;
             try {
-                final URLClassLoader loader = new URLClassLoader(new 
URL[]{url});
+                final URLClassLoader loader = new URLClassLoader(new URL[]{ 
url } , new EmptyResourcesClassLoader());
                 String[] paths = {
                         "META-INF/beans.xml",
                         "WEB-INF/beans.xml",

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/WebappAggregatedArchive.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/WebappAggregatedArchive.java?rev=1409239&r1=1409238&r2=1409239&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/WebappAggregatedArchive.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/WebappAggregatedArchive.java
 Wed Nov 14 15:59:03 2012
@@ -83,12 +83,12 @@ public class WebappAggregatedArchive imp
         return archive.iterator();
     }
 
-    private static class ScanXmlSaverFilter implements Filter {
+    public static class ScanXmlSaverFilter implements Filter {
         private boolean scanXmlExists;
         private final ScanUtil.ScanHandler handler;
         private final List<String> classes;
 
-        private ScanXmlSaverFilter(boolean scanXmlExists, ScanUtil.ScanHandler 
handler, List<String> classes) {
+        public ScanXmlSaverFilter(boolean scanXmlExists, ScanUtil.ScanHandler 
handler, List<String> classes) {
             this.scanXmlExists = scanXmlExists;
             this.handler = handler;
             this.classes = classes;

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/EmptyResourcesClassLoader.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/EmptyResourcesClassLoader.java?rev=1409239&r1=1409238&r2=1409239&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/EmptyResourcesClassLoader.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/EmptyResourcesClassLoader.java
 Wed Nov 14 15:59:03 2012
@@ -26,7 +26,12 @@ public class EmptyResourcesClassLoader e
     }
 
     @Override
-    public Enumeration<URL> getResources(String name) throws IOException {
+    protected URL findResource(final String name) {
+        return null;
+    }
+
+    @Override
+    public Enumeration<URL> getResources(final String name) throws IOException 
{
         return new Enumeration<URL>() {
             @Override
             public boolean hasMoreElements() {


Reply via email to