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