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/06/05 02:19:18 UTC

svn commit: r1346197 - in /openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb: OpenEJBArchiveProcessor.java OpenEJBDeployableContainer.java OpenEJBExtension.java TestObserver.java

Author: rmannibucau
Date: Tue Jun  5 00:19:18 2012
New Revision: 1346197

URL: http://svn.apache.org/viewvc?rev=1346197&view=rev
Log:
management of libs in a webarchive as additinal classloader elements (ease test writing))

Added:
    openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/TestObserver.java
Modified:
    openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBArchiveProcessor.java
    openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBDeployableContainer.java
    openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBExtension.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=1346197&r1=1346196&r2=1346197&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 Tue Jun  5 00:19:18 2012
@@ -8,6 +8,7 @@ import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
@@ -16,17 +17,22 @@ import java.util.logging.Logger;
 import org.apache.openejb.OpenEJBException;
 import org.apache.openejb.OpenEJBRuntimeException;
 import org.apache.openejb.config.AppModule;
+import org.apache.openejb.config.ConfigurableClasspathArchive;
+import org.apache.openejb.config.DeploymentLoader;
 import org.apache.openejb.config.EjbModule;
 import org.apache.openejb.config.ReadDescriptors;
+import org.apache.openejb.config.WebModule;
 import org.apache.openejb.jee.EjbJar;
 import org.apache.openejb.jee.ManagedBean;
 import org.apache.openejb.jee.TransactionType;
+import org.apache.openejb.jee.WebApp;
 import org.apache.openejb.jee.oejb3.EjbDeployment;
 import org.apache.openejb.jee.oejb3.OpenejbJar;
 import org.apache.openejb.loader.IO;
 import org.apache.xbean.finder.AnnotationFinder;
 import org.apache.xbean.finder.archive.ClassesArchive;
-import org.jboss.arquillian.container.spi.context.annotation.DeploymentScoped;
+import org.apache.xbean.finder.archive.CompositeArchive;
+import org.apache.xbean.finder.archive.JarArchive;
 import org.jboss.arquillian.container.test.spi.client.deployment.ApplicationArchiveProcessor;
 import org.jboss.arquillian.core.api.InstanceProducer;
 import org.jboss.arquillian.core.api.annotation.Inject;
@@ -53,6 +59,7 @@ public class OpenEJBArchiveProcessor imp
     private static final String PERSISTENCE_XML = "persistence.xml";
     private static final String OPENEJB_JAR_XML = "openejb-jar.xml";
     private static final String ENV_ENTRIES_PROPERTIES = "env-entries.properties";
+    public static final String WEB_INF_CLASSES = "/WEB-INF/classes/";
 
     @Inject
     @SuiteScoped
@@ -63,9 +70,25 @@ public class OpenEJBArchiveProcessor imp
         final Class<?> javaClass = testClass.getJavaClass();
         final AppModule appModule = new AppModule(javaClass.getClassLoader(), javaClass.getName());
 
+        final Collection<URL> additionalPaths = new ArrayList<URL>();
+
         final String prefix;
         if (archive instanceof WebArchive) {
             prefix = WEB_INF;
+
+            final Map<ArchivePath, Node> content = archive.getContent(new IncludeRegExpPaths("/WEB-INF/lib/.*"));
+            for (Map.Entry<ArchivePath, Node> node : content.entrySet()) {
+                final Asset asset = node.getValue().getAsset();
+                if (asset instanceof UrlAsset) {
+                    additionalPaths.add(get(URL.class, "url", asset));
+                } else if (asset instanceof FileAsset) {
+                    try {
+                        additionalPaths.add(get(File.class, "file", asset).toURI().toURL());
+                    } catch (MalformedURLException e) {
+                        LOGGER.log(Level.SEVERE, "can't add a library to the deployment", e);
+                    }
+                }
+            }
         } else {
             prefix = META_INF;
         }
@@ -81,7 +104,7 @@ public class OpenEJBArchiveProcessor imp
             appModule.getEjbModules().add(new EjbModule(ejbJar, openejbJar));
         }
 
-        final org.apache.xbean.finder.archive.Archive finderArchive = finderArchive(archive, appModule.getClassLoader());
+        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));
@@ -172,7 +195,7 @@ public class OpenEJBArchiveProcessor imp
         }
     }
 
-    private org.apache.xbean.finder.archive.Archive finderArchive(final Archive<?> archive, final ClassLoader cl) {
+    private org.apache.xbean.finder.archive.Archive finderArchive(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()) {
@@ -183,11 +206,21 @@ public class OpenEJBArchiveProcessor imp
                 e.printStackTrace();
             }
         }
-        return new ClassesArchive(classes);
+
+        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()]))) {
+            archives.add(new JarArchive(cl, url));
+        }
+        archives.add(new ClassesArchive(classes));
+        return new CompositeArchive(archives);
     }
 
     private static String name(final String raw) {
-        final String name = raw.replace('/', '.');
+        String name = raw;
+        if (name.startsWith(WEB_INF_CLASSES)) {
+            name = name.substring(WEB_INF_CLASSES.length() - 1);
+        }
+        name = name.replace('/', '.');
         return name.substring(1, name.length() - 6);
     }
 

Modified: openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBDeployableContainer.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBDeployableContainer.java?rev=1346197&r1=1346196&r2=1346197&view=diff
==============================================================================
--- openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBDeployableContainer.java (original)
+++ openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBDeployableContainer.java Tue Jun  5 00:19:18 2012
@@ -14,6 +14,7 @@ import org.apache.openejb.OpenEJBRuntime
 import org.apache.openejb.OpenEjbContainer;
 import org.apache.openejb.assembler.classic.AppInfo;
 import org.apache.openejb.assembler.classic.Assembler;
+import org.apache.openejb.assembler.classic.WebAppBuilder;
 import org.apache.openejb.config.AppModule;
 import org.apache.openejb.config.ConfigurationFactory;
 import org.apache.openejb.config.DeploymentFilterable;
@@ -89,6 +90,10 @@ public class OpenEJBDeployableContainer 
 
     @Inject
     @SuiteScoped
+    private InstanceProducer<ClassLoader> classLoader;
+
+    @Inject
+    @SuiteScoped
     private Instance<AppModule> module;
 
     @Inject
@@ -156,9 +161,12 @@ public class OpenEJBDeployableContainer 
 
             appInfoProducer.set(appInfo);
             appContextProducer.set(appCtx);
+            classLoader.set(appCtx.getClassLoader());
         } catch (Exception e) {
             throw new DeploymentException("can't deploy " + archive.getName(), e);
         }
+
+
         return new ProtocolMetaData();
     }
 

Modified: openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBExtension.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBExtension.java?rev=1346197&r1=1346196&r2=1346197&view=diff
==============================================================================
--- openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBExtension.java (original)
+++ openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBExtension.java Tue Jun  5 00:19:18 2012
@@ -38,6 +38,7 @@ public class OpenEJBExtension implements
     public void register(final ExtensionBuilder extensionBuilder) {
         extensionBuilder.service(DeployableContainer.class, OpenEJBDeployableContainer.class)
             .service(TestEnricher.class, OpenEJBInjectionEnricher.class)
-            .service(ApplicationArchiveProcessor.class, OpenEJBArchiveProcessor.class);
+            .service(ApplicationArchiveProcessor.class, OpenEJBArchiveProcessor.class)
+            .observer(TestObserver.class);
     }
 }

Added: openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/TestObserver.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/TestObserver.java?rev=1346197&view=auto
==============================================================================
--- openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/TestObserver.java (added)
+++ openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/TestObserver.java Tue Jun  5 00:19:18 2012
@@ -0,0 +1,28 @@
+package org.apache.openejb.arquillian.openejb;
+
+import org.jboss.arquillian.core.api.Instance;
+import org.jboss.arquillian.core.api.annotation.Inject;
+import org.jboss.arquillian.core.api.annotation.Observes;
+import org.jboss.arquillian.core.spi.EventContext;
+import org.jboss.arquillian.test.spi.annotation.SuiteScoped;
+import org.jboss.arquillian.test.spi.event.suite.Test;
+
+public class TestObserver {
+    @Inject
+    @SuiteScoped
+    private Instance<ClassLoader> classLoader;
+
+    public void observe(@Observes EventContext<Test> event) {
+        final ClassLoader cl = Thread.currentThread().getContextClassLoader();
+        setTCCL(classLoader.get());
+        try {
+            event.proceed();
+        } finally {
+            setTCCL(cl);
+        }
+    }
+
+    private void setTCCL(final ClassLoader cl) {
+        Thread.currentThread().setContextClassLoader(cl);
+    }
+}