Author: rmannibucau
Date: Tue Aug 14 18:49:35 2012
New Revision: 1373025

URL: http://svn.apache.org/viewvc?rev=1373025&view=rev
Log:
OPENEJB-1890 managing webapp classloader even if artifacts are not on classpath

Added:
    
openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/test/java/org/apache/openejb/arquillian/openejb/SWMavenWarTest.java
    
openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/test/resources/a-pom.xml
Modified:
    openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/pom.xml
    
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

Modified: openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/pom.xml
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/pom.xml?rev=1373025&r1=1373024&r2=1373025&view=diff
==============================================================================
--- openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/pom.xml 
(original)
+++ openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/pom.xml Tue 
Aug 14 18:49:35 2012
@@ -82,6 +82,13 @@
     </dependency>
 
     <dependency>
+      <groupId>org.jboss.shrinkwrap.resolver</groupId>
+      <artifactId>shrinkwrap-resolver-impl-maven</artifactId>
+      <version>2.0.0-alpha-1</version>
+      <scope>test</scope>
+    </dependency>
+
+    <dependency>
       <groupId>org.apache.openejb</groupId>
       <artifactId>arquillian-common</artifactId>
       <version>${tomee.version}</version>

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=1373025&r1=1373024&r2=1373025&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 Aug 14 18:49:35 2012
@@ -28,15 +28,12 @@ import org.apache.openejb.jee.Transactio
 import org.apache.openejb.jee.oejb3.EjbDeployment;
 import org.apache.openejb.jee.oejb3.OpenejbJar;
 import org.apache.openejb.loader.IO;
+import org.apache.openejb.util.classloader.URLClassLoaderFirst;
 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.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;
 import org.jboss.arquillian.test.spi.TestClass;
-import org.jboss.arquillian.test.spi.annotation.SuiteScoped;
 import org.jboss.shrinkwrap.api.Archive;
 import org.jboss.shrinkwrap.api.ArchivePath;
 import org.jboss.shrinkwrap.api.Node;
@@ -53,6 +50,7 @@ import java.io.InputStream;
 import java.lang.reflect.Field;
 import java.net.MalformedURLException;
 import java.net.URL;
+import java.net.URLClassLoader;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -82,7 +80,6 @@ public class OpenEJBArchiveProcessor {
 
     public static AppModule createModule(final Archive<?> archive, final 
TestClass testClass) {
         final Class<?> javaClass = testClass.getJavaClass();
-        final AppModule appModule = new AppModule(javaClass.getClassLoader(), 
archive.getName());
 
         final Collection<URL> additionalPaths = new ArrayList<URL>();
 
@@ -107,6 +104,21 @@ public class OpenEJBArchiveProcessor {
             prefix = META_INF;
         }
 
+        final ClassLoader parent = javaClass.getClassLoader();
+        final URL[] urls = additionalPaths.toArray(new 
URL[additionalPaths.size()]);
+
+        final ClassLoader loader;
+        if (!WEB_INF.equals(prefix)) {
+            loader = new URLClassLoader(urls, parent);
+        } else {
+            loader = new URLClassLoaderFirst(urls, parent);
+        }
+
+        final AppModule appModule = new AppModule(loader, archive.getName());
+        if (WEB_INF.equals(prefix)) {
+            appModule.setDelegateFirst(false);
+        }
+
         // add the test as a managed bean to be able to inject into it easily
         {
             final EjbJar ejbJar = new EjbJar();
@@ -205,6 +217,8 @@ public class OpenEJBArchiveProcessor {
             }
         }
 
+        appModule.getAdditionalLibraries().addAll(additionalPaths);
+
         return appModule;
     }
 

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=1373025&r1=1373024&r2=1373025&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 Aug 14 18:49:35 2012
@@ -192,6 +192,10 @@ public class OpenEJBDeployableContainer 
 
     @Override
     public void undeploy(final Archive<?> archive) throws DeploymentException {
+        // reset classloader for next text
+        // otherwise if it was closed something can fail
+        classLoader.set(OpenEJBDeployableContainer.class.getClassLoader());
+
         if (appContext.get() == null) {
             return;
         }

Added: 
openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/test/java/org/apache/openejb/arquillian/openejb/SWMavenWarTest.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/test/java/org/apache/openejb/arquillian/openejb/SWMavenWarTest.java?rev=1373025&view=auto
==============================================================================
--- 
openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/test/java/org/apache/openejb/arquillian/openejb/SWMavenWarTest.java
 (added)
+++ 
openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/test/java/org/apache/openejb/arquillian/openejb/SWMavenWarTest.java
 Tue Aug 14 18:49:35 2012
@@ -0,0 +1,67 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.openejb.arquillian.openejb;
+
+import org.apache.openejb.util.classloader.URLClassLoaderFirst;
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.spec.WebArchive;
+import org.jboss.shrinkwrap.resolver.api.DependencyResolvers;
+import org.jboss.shrinkwrap.resolver.api.maven.MavenDependencyResolver;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import javax.ejb.EJB;
+import javax.ejb.Singleton;
+import javax.ejb.TransactionManagement;
+import javax.ejb.TransactionManagementType;
+
+import static org.hamcrest.CoreMatchers.instanceOf;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
+
+@RunWith(Arquillian.class)
+public class SWMavenWarTest {
+    @Deployment
+    public static WebArchive war() {
+        return ShrinkWrap.create(WebArchive.class, "sw-mvn.war")
+                .addClass(SWBean.class)
+                
.addAsLibraries(DependencyResolvers.use(MavenDependencyResolver.class)
+                        .loadEffectivePom("src/test/resources/a-pom.xml")
+                        .importAllDependencies()
+                        .resolveAsFiles());
+    }
+
+    @Singleton
+    @TransactionManagement(TransactionManagementType.BEAN)
+    public static class SWBean {
+        public Class<?> gherkin() throws Exception {
+            final ClassLoader loader = 
Thread.currentThread().getContextClassLoader();
+            assertThat(loader, instanceOf(URLClassLoaderFirst.class));
+            return loader.loadClass("gherkin.Main");
+        }
+    }
+
+    @EJB
+    private SWBean bean;
+
+    @Test
+    public void check() throws Exception {
+        bean.gherkin(); // if fail will throw an exception
+    }
+}

Added: 
openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/test/resources/a-pom.xml
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/test/resources/a-pom.xml?rev=1373025&view=auto
==============================================================================
--- 
openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/test/resources/a-pom.xml
 (added)
+++ 
openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/test/resources/a-pom.xml
 Tue Aug 14 18:49:35 2012
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0";
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd";>
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>fake</groupId>
+  <version>fake</version>
+  <artifactId>fake</artifactId>
+
+  <dependencies>
+    <dependency> <!-- whatever it is, just to check we can use it -->
+      <groupId>info.cukes</groupId>
+      <artifactId>gherkin</artifactId>
+      <version>2.11.0</version>
+    </dependency>
+  </dependencies>
+</project>


Reply via email to