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;
+ }
+ }
+}