Author: rmannibucau
Date: Sun Sep 30 20:38:55 2012
New Revision: 1392104

URL: http://svn.apache.org/viewvc?rev=1392104&view=rev
Log:
OPENEJB-1903 managing resources from SW as we can

Added:
    
openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/SWClassLoader.java
    
openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/test/java/org/apache/openejb/arquillian/openejb/VirtualResourceTest.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/test/java/org/apache/openejb/arquillian/openejb/LifecycleTest.java
    
openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/test/java/org/apache/openejb/arquillian/openejb/SWMavenWarTest.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=1392104&r1=1392103&r2=1392104&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
 Sun Sep 30 20:38:55 2012
@@ -42,6 +42,7 @@ import org.jboss.shrinkwrap.api.asset.As
 import org.jboss.shrinkwrap.api.asset.ClassLoaderAsset;
 import org.jboss.shrinkwrap.api.asset.FileAsset;
 import org.jboss.shrinkwrap.api.asset.UrlAsset;
+import org.jboss.shrinkwrap.api.classloader.ShrinkWrapClassLoader;
 import org.jboss.shrinkwrap.api.spec.WebArchive;
 import org.jboss.shrinkwrap.impl.base.filter.IncludeRegExpPaths;
 
@@ -112,9 +113,9 @@ public class OpenEJBArchiveProcessor {
 
         final ClassLoader loader;
         if (!WEB_INF.equals(prefix)) {
-            loader = new URLClassLoader(urls, parent);
+            loader = new SWClassLoader("", new URLClassLoader(urls, parent), 
archive);
         } else {
-            loader = new URLClassLoaderFirst(urls, parent);
+            loader = new SWClassLoader("/WEB-INF/classes/", new 
URLClassLoaderFirst(urls, parent), archive);
         }
 
         final AppModule appModule = new AppModule(loader, archive.getName());

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=1392104&r1=1392103&r2=1392104&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
 Sun Sep 30 20:38:55 2012
@@ -176,7 +176,7 @@ public class OpenEJBDeployableContainer 
         try {
             final AppModule module = 
OpenEJBArchiveProcessor.createModule(archive, testClass.get());
             final AppInfo appInfo = 
configurationFactory.configureApplication(module);
-            final AppContext appCtx = assembler.createApplication(appInfo);
+            final AppContext appCtx = assembler.createApplication(appInfo, 
module.getClassLoader());
 
             final ServletContext appServletContext = new MockServletContext();
             final HttpSession appSession = new MockHttpSession();
@@ -206,6 +206,11 @@ public class OpenEJBDeployableContainer 
             return;
         }
 
+        final ClassLoader cl = appContext.get().getClassLoader();
+        if (cl instanceof SWClassLoader) {
+            ((SWClassLoader) cl).close();
+        }
+
         try {
             assembler.destroyApplication(info.get().path);
             
stopContexts(appContext.get().getWebBeansContext().getContextsService(), 
servletContext.get(), session.get());

Added: 
openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/SWClassLoader.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/SWClassLoader.java?rev=1392104&view=auto
==============================================================================
--- 
openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/SWClassLoader.java
 (added)
+++ 
openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/SWClassLoader.java
 Sun Sep 30 20:38:55 2012
@@ -0,0 +1,97 @@
+/**
+ * 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.Enumerator;
+import org.jboss.shrinkwrap.api.Archive;
+import org.jboss.shrinkwrap.api.ArchivePath;
+import org.jboss.shrinkwrap.api.ArchivePaths;
+import org.jboss.shrinkwrap.api.Node;
+import org.jboss.shrinkwrap.api.asset.Asset;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.net.URLConnection;
+import java.net.URLStreamHandler;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Enumeration;
+
+public class SWClassLoader extends ClassLoader {
+    private final Archive<?> archive;
+    private final String prefix;
+    private final Collection<Closeable> closeables = new 
ArrayList<Closeable>();
+
+    public SWClassLoader(final String prefix, final ClassLoader parent, final 
Archive<?> ar) {
+        super(parent);
+        this.prefix = prefix;
+        this.archive = ar;
+    }
+
+    protected Enumeration<URL> findResources(final String name) throws 
IOException {
+        final ArchivePath path = ArchivePaths.create(prefix + name);
+        final Node node = archive.get(path);
+        if (node != null) {
+            return new Enumerator(Arrays.asList(new URL(null, "archive:" + 
archive.getName() + "/", new ArchiveStreamHandler(node, closeables))));
+        }
+        return super.findResources(name);
+    }
+
+    private static class ArchiveStreamHandler extends URLStreamHandler {
+        private final Node node;
+        private final Collection<Closeable> closeables;
+
+        private ArchiveStreamHandler(final Node node, final 
Collection<Closeable> closeables) {
+            this.node = node;
+            this.closeables = closeables;
+        }
+
+        @Override
+        protected URLConnection openConnection(final URL u) throws IOException 
{
+            return new URLConnection(u) {
+                @Override
+                public void connect() throws IOException {
+                    // no-op
+                }
+
+                @Override
+                public InputStream getInputStream() throws IOException {
+                    final Asset asset = node.getAsset();
+                    final InputStream input = asset.openStream();
+                    synchronized (closeables) {
+                        closeables.add(input);
+                    }
+                    return input;
+
+                }
+            };
+        }
+    }
+
+    public void close() {
+        for (Closeable cl : closeables) {
+            try {
+                cl.close();
+            } catch (IOException e) {
+                // no-op
+            }
+        }
+    }
+}

Modified: 
openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/test/java/org/apache/openejb/arquillian/openejb/LifecycleTest.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/test/java/org/apache/openejb/arquillian/openejb/LifecycleTest.java?rev=1392104&r1=1392103&r2=1392104&view=diff
==============================================================================
--- 
openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/test/java/org/apache/openejb/arquillian/openejb/LifecycleTest.java
 (original)
+++ 
openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/test/java/org/apache/openejb/arquillian/openejb/LifecycleTest.java
 Sun Sep 30 20:38:55 2012
@@ -103,7 +103,7 @@ public class LifecycleTest {
     }
 
     private static void checkCl() { // openejb classloader, not the app one
-        assertThat(Thread.currentThread().getContextClassLoader(), 
instanceOf(URLClassLoader.class));
+        assertThat(Thread.currentThread().getContextClassLoader().getParent(), 
instanceOf(URLClassLoader.class));
     }
 
     public static class Foo {

Modified: 
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=1392104&r1=1392103&r2=1392104&view=diff
==============================================================================
--- 
openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/test/java/org/apache/openejb/arquillian/openejb/SWMavenWarTest.java
 (original)
+++ 
openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/test/java/org/apache/openejb/arquillian/openejb/SWMavenWarTest.java
 Sun Sep 30 20:38:55 2012
@@ -52,7 +52,7 @@ public class SWMavenWarTest {
     public static class SWBean {
         public Class<?> gherkin() throws Exception {
             final ClassLoader loader = 
Thread.currentThread().getContextClassLoader();
-            assertThat(loader, instanceOf(URLClassLoaderFirst.class));
+            assertThat(loader.getParent(), 
instanceOf(URLClassLoaderFirst.class));
             return loader.loadClass("gherkin.Main");
         }
     }

Added: 
openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/test/java/org/apache/openejb/arquillian/openejb/VirtualResourceTest.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/test/java/org/apache/openejb/arquillian/openejb/VirtualResourceTest.java?rev=1392104&view=auto
==============================================================================
--- 
openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/test/java/org/apache/openejb/arquillian/openejb/VirtualResourceTest.java
 (added)
+++ 
openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/test/java/org/apache/openejb/arquillian/openejb/VirtualResourceTest.java
 Sun Sep 30 20:38:55 2012
@@ -0,0 +1,56 @@
+/**
+ * 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.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.shrinkwrap.api.ArchivePaths;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.asset.EmptyAsset;
+import org.jboss.shrinkwrap.api.spec.WebArchive;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import javax.enterprise.event.Observes;
+import javax.enterprise.inject.spi.BeforeBeanDiscovery;
+import javax.enterprise.inject.spi.Extension;
+
+import static org.junit.Assert.assertTrue;
+
+@RunWith(Arquillian.class)
+public class VirtualResourceTest {
+    @Deployment
+    public static WebArchive jar() {
+        return ShrinkWrap.create(WebArchive.class, 
SWLibTest.class.getSimpleName() + ".war")
+                .addAsWebInfResource(EmptyAsset.INSTANCE, 
ArchivePaths.create("beans.xml"))
+                .addAsServiceProvider(Extension.class, MyExtension.class)
+                .addClass(MyExtension.class);
+    }
+
+    @Test
+    public void check() {
+        assertTrue(MyExtension.called);
+    }
+
+    public static class MyExtension implements Extension {
+        public static boolean called = false;
+
+        public void observe(@Observes final BeforeBeanDiscovery bbd) {
+            called = true;
+        }
+    }
+}


Reply via email to