[jboss-svn-commits] JBoss Common SVN: r4768 - in arquillian/trunk/containers: weld-ee-embedded-1.1/src/main/java/org/jboss/arquillian/container/weld/ee/embedded_1_1/shrinkwrap and 4 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Sun Jul 18 10:22:01 EDT 2010
Author: aslak
Date: 2010-07-18 10:22:00 -0400 (Sun, 18 Jul 2010)
New Revision: 4768
Added:
arquillian/trunk/containers/weld-ee-embedded-1.1/src/main/java/org/jboss/arquillian/container/weld/ee/embedded_1_1/ContextClassLoaderManager.java
arquillian/trunk/containers/weld-se-embedded-1/src/main/java/org/jboss/arquillian/container/weld/se/embedded_1/ContextClassLoaderManager.java
arquillian/trunk/containers/weld-se-embedded-1/src/test/java/org/jboss/arquillian/container/weld/se/embedded_1/shrinkwrap/
arquillian/trunk/containers/weld-se-embedded-1/src/test/java/org/jboss/arquillian/container/weld/se/embedded_1/shrinkwrap/ShrinkwrapBeanDeploymentArchiveTestCase.java
Removed:
arquillian/trunk/containers/weld-se-embedded-1/src/main/java/org/jboss/arquillian/container/weld/se/embedded_1/shrinkwrap/ShrinkWrapClassLoader.java
Modified:
arquillian/trunk/containers/weld-ee-embedded-1.1/src/main/java/org/jboss/arquillian/container/weld/ee/embedded_1_1/WeldEEMockContainer.java
arquillian/trunk/containers/weld-ee-embedded-1.1/src/main/java/org/jboss/arquillian/container/weld/ee/embedded_1_1/shrinkwrap/ShrinkwrapBeanDeploymentArchive.java
arquillian/trunk/containers/weld-ee-embedded-1.1/src/main/java/org/jboss/arquillian/container/weld/ee/embedded_1_1/shrinkwrap/ShrinkwrapBeanDeploymentArchiveImpl.java
arquillian/trunk/containers/weld-se-embedded-1/src/main/java/org/jboss/arquillian/container/weld/se/embedded_1/WeldSEContainer.java
arquillian/trunk/containers/weld-se-embedded-1/src/main/java/org/jboss/arquillian/container/weld/se/embedded_1/shrinkwrap/ShrinkwrapBeanDeploymentArchive.java
arquillian/trunk/containers/weld-se-embedded-1/src/main/java/org/jboss/arquillian/container/weld/se/embedded_1/shrinkwrap/ShrinkwrapBeanDeploymentArchiveImpl.java
Log:
ARQ-161 ARQ-97 Changed to use ShrinkWrap ClassLoader extension in Weld SE and Weld EE containers
Added: arquillian/trunk/containers/weld-ee-embedded-1.1/src/main/java/org/jboss/arquillian/container/weld/ee/embedded_1_1/ContextClassLoaderManager.java
===================================================================
--- arquillian/trunk/containers/weld-ee-embedded-1.1/src/main/java/org/jboss/arquillian/container/weld/ee/embedded_1_1/ContextClassLoaderManager.java (rev 0)
+++ arquillian/trunk/containers/weld-ee-embedded-1.1/src/main/java/org/jboss/arquillian/container/weld/ee/embedded_1_1/ContextClassLoaderManager.java 2010-07-18 14:22:00 UTC (rev 4768)
@@ -0,0 +1,61 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * Licensed 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.jboss.arquillian.container.weld.ee.embedded_1_1;
+
+import java.io.IOException;
+
+import org.jboss.shrinkwrap.classloader.ShrinkWrapClassLoader;
+
+/**
+ * ContextClassLoaderManager
+ *
+ * @author <a href="mailto:aslak at redhat.com">Aslak Knutsen</a>
+ * @version $Revision: $
+ */
+public class ContextClassLoaderManager
+{
+ private ShrinkWrapClassLoader shrinkWrapClassLoader;
+ private ClassLoader contextClassLoader;
+
+ public ContextClassLoaderManager(final ShrinkWrapClassLoader shrinkWrapClassLoader)
+ {
+ if(shrinkWrapClassLoader == null)
+ {
+ throw new IllegalArgumentException("ShrinkWrapClassLoader must be specified");
+ }
+ this.shrinkWrapClassLoader = shrinkWrapClassLoader;
+ }
+
+ public void enable()
+ {
+ this.contextClassLoader = Thread.currentThread().getContextClassLoader();
+ Thread.currentThread().setContextClassLoader(shrinkWrapClassLoader);
+ }
+
+ public void disable()
+ {
+ Thread.currentThread().setContextClassLoader(contextClassLoader);
+ try
+ {
+ this.shrinkWrapClassLoader.close();
+ }
+ catch (IOException e)
+ {
+ throw new RuntimeException("Could not close ShrinkWrapClassLoader", e);
+ }
+ }
+}
Modified: arquillian/trunk/containers/weld-ee-embedded-1.1/src/main/java/org/jboss/arquillian/container/weld/ee/embedded_1_1/WeldEEMockContainer.java
===================================================================
--- arquillian/trunk/containers/weld-ee-embedded-1.1/src/main/java/org/jboss/arquillian/container/weld/ee/embedded_1_1/WeldEEMockContainer.java 2010-07-18 14:16:00 UTC (rev 4767)
+++ arquillian/trunk/containers/weld-ee-embedded-1.1/src/main/java/org/jboss/arquillian/container/weld/ee/embedded_1_1/WeldEEMockContainer.java 2010-07-18 14:22:00 UTC (rev 4768)
@@ -66,9 +66,14 @@
.getContainerConfig(WeldEEMockConfiguration.class)
.isEnableConversationScope();
- MockEELifecycle lifecycle = new MockEELifecycle(
- archive.as(ShrinkwrapBeanDeploymentArchive.class));
+ ShrinkwrapBeanDeploymentArchive beanArchive = archive.as(ShrinkwrapBeanDeploymentArchive.class);
+ MockEELifecycle lifecycle = new MockEELifecycle(beanArchive);
+ ContextClassLoaderManager classLoaderManager = new ContextClassLoaderManager(beanArchive.getClassLoader());
+ classLoaderManager.enable();
+
+ context.add(ContextClassLoaderManager.class, classLoaderManager);
+
TestContainer container = new TestContainer(lifecycle);
container.startContainer();
@@ -122,6 +127,8 @@
{
container.stopContainer();
}
+ ContextClassLoaderManager classLoaderManager = context.get(ContextClassLoaderManager.class);
+ classLoaderManager.disable();
}
public void stop(Context context) throws LifecycleException
Modified: arquillian/trunk/containers/weld-ee-embedded-1.1/src/main/java/org/jboss/arquillian/container/weld/ee/embedded_1_1/shrinkwrap/ShrinkwrapBeanDeploymentArchive.java
===================================================================
--- arquillian/trunk/containers/weld-ee-embedded-1.1/src/main/java/org/jboss/arquillian/container/weld/ee/embedded_1_1/shrinkwrap/ShrinkwrapBeanDeploymentArchive.java 2010-07-18 14:16:00 UTC (rev 4767)
+++ arquillian/trunk/containers/weld-ee-embedded-1.1/src/main/java/org/jboss/arquillian/container/weld/ee/embedded_1_1/shrinkwrap/ShrinkwrapBeanDeploymentArchive.java 2010-07-18 14:22:00 UTC (rev 4768)
@@ -17,6 +17,7 @@
package org.jboss.arquillian.container.weld.ee.embedded_1_1.shrinkwrap;
import org.jboss.shrinkwrap.api.Assignable;
+import org.jboss.shrinkwrap.classloader.ShrinkWrapClassLoader;
import org.jboss.weld.bootstrap.spi.BeanDeploymentArchive;
/**
@@ -27,5 +28,5 @@
*/
public interface ShrinkwrapBeanDeploymentArchive extends BeanDeploymentArchive, Assignable
{
-
+ ShrinkWrapClassLoader getClassLoader();
}
Modified: arquillian/trunk/containers/weld-ee-embedded-1.1/src/main/java/org/jboss/arquillian/container/weld/ee/embedded_1_1/shrinkwrap/ShrinkwrapBeanDeploymentArchiveImpl.java
===================================================================
--- arquillian/trunk/containers/weld-ee-embedded-1.1/src/main/java/org/jboss/arquillian/container/weld/ee/embedded_1_1/shrinkwrap/ShrinkwrapBeanDeploymentArchiveImpl.java 2010-07-18 14:16:00 UTC (rev 4767)
+++ arquillian/trunk/containers/weld-ee-embedded-1.1/src/main/java/org/jboss/arquillian/container/weld/ee/embedded_1_1/shrinkwrap/ShrinkwrapBeanDeploymentArchiveImpl.java 2010-07-18 14:22:00 UTC (rev 4768)
@@ -18,7 +18,6 @@
import java.io.IOException;
import java.io.InputStream;
-import java.lang.reflect.Field;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLStreamHandler;
@@ -41,11 +40,10 @@
import org.jboss.shrinkwrap.api.ArchivePath;
import org.jboss.shrinkwrap.api.Filters;
import org.jboss.shrinkwrap.api.Node;
-import org.jboss.shrinkwrap.api.asset.Asset;
+import org.jboss.shrinkwrap.classloader.ShrinkWrapClassLoader;
import org.jboss.shrinkwrap.impl.base.AssignableBase;
import org.jboss.shrinkwrap.impl.base.Validate;
import org.jboss.shrinkwrap.impl.base.asset.ArchiveAsset;
-import org.jboss.shrinkwrap.impl.base.asset.ClassAsset;
import org.jboss.weld.bootstrap.api.ServiceRegistry;
import org.jboss.weld.bootstrap.api.helpers.SimpleServiceRegistry;
import org.jboss.weld.bootstrap.spi.BeanDeploymentArchive;
@@ -63,10 +61,14 @@
private ServiceRegistry serviceRegistry = new SimpleServiceRegistry();
+ private ShrinkWrapClassLoader classLoader;
+
public ShrinkwrapBeanDeploymentArchiveImpl(Archive<?> archive)
{
Validate.notNull(archive, "Archive must be specified");
this.archive = archive;
+
+ this.classLoader = new ShrinkWrapClassLoader(archive.getClass().getClassLoader(), archive);
}
@Override
@@ -75,6 +77,11 @@
return archive;
}
+ public ShrinkWrapClassLoader getClassLoader()
+ {
+ return classLoader;
+ }
+
public String getId()
{
return archive.getName();
@@ -164,36 +171,37 @@
{
List<Class<?>> beanClasses = new ArrayList<Class<?>>();
- Map<ArchivePath, Node> nestedArchives = archive.getContent(Filters.include(".*\\.jar|.*\\.war"));
- for(final Map.Entry<ArchivePath, Node> nestedArchiveEntry : nestedArchives.entrySet())
+ try
{
- if( !(nestedArchiveEntry.getValue().getAsset() instanceof ArchiveAsset))
+ Map<ArchivePath, Node> nestedArchives = archive.getContent(Filters.include(".*\\.jar|.*\\.war|.*\\.rar"));
+ for(final Map.Entry<ArchivePath, Node> nestedArchiveEntry : nestedArchives.entrySet())
{
- continue;
+ if( !(nestedArchiveEntry.getValue().getAsset() instanceof ArchiveAsset))
+ {
+ continue;
+ }
+ ArchiveAsset nestedArchive = (ArchiveAsset)nestedArchiveEntry.getValue().getAsset();
+ Map<ArchivePath, Node> classes = nestedArchive.getArchive().getContent(Filters.include(".*\\.class"));
+ for(Map.Entry<ArchivePath, Node> classEntry : classes.entrySet())
+ {
+ Class<?> loadedClass = getClassLoader().loadClass(
+ getClassName(classEntry.getKey()));
+
+ beanClasses.add(loadedClass);
+ }
}
- ArchiveAsset nestedArchive = (ArchiveAsset)nestedArchiveEntry.getValue().getAsset();
- Map<ArchivePath, Node> classes = nestedArchive.getArchive().getContent(Filters.include(".*\\.class"));
+ Map<ArchivePath, Node> classes = archive.getContent(Filters.include(".*\\.class"));
for(Map.Entry<ArchivePath, Node> classEntry : classes.entrySet())
{
- if (classEntry.getValue().getAsset() instanceof ClassAsset)
- {
- beanClasses.add(
- (Class<?>)extractFieldFromAsset(
- classEntry.getValue().getAsset(),
- "clazz"));
- }
+ Class<?> loadedClass = getClassLoader().loadClass(
+ getClassName(classEntry.getKey()));
+
+ beanClasses.add(loadedClass);
}
}
- Map<ArchivePath, Node> classes = archive.getContent(Filters.include(".*\\.class"));
- for(Map.Entry<ArchivePath, Node> classEntry : classes.entrySet())
+ catch (ClassNotFoundException e)
{
- if (classEntry.getValue().getAsset() instanceof ClassAsset)
- {
- beanClasses.add(
- (Class<?>)extractFieldFromAsset(
- classEntry.getValue().getAsset(),
- "clazz"));
- }
+ throw new RuntimeException("Could not load class from archive " + archive.getName(), e);
}
return beanClasses;
}
@@ -226,19 +234,20 @@
return ejbs;
}
- private Object extractFieldFromAsset(Asset asset, String fieldName)
+ /*
+ * input: /org/MyClass.class
+ * output: org.MyClass
+ */
+ public String getClassName(ArchivePath path)
{
- try
+ String className = path.get();
+ className = className.replaceAll("/WEB-INF/classes/", "");
+ if(className.charAt(0) == '/')
{
- Field field = asset.getClass().getDeclaredField(fieldName);
- field.setAccessible(true);
-
- return field.get(asset);
- }
- catch (Exception e)
- {
- e.printStackTrace();
+ className = className.substring(1);
}
- return null;
+ className = className.replaceAll("\\.class", "");
+ className = className.replaceAll("/", ".");
+ return className;
}
}
\ No newline at end of file
Added: arquillian/trunk/containers/weld-se-embedded-1/src/main/java/org/jboss/arquillian/container/weld/se/embedded_1/ContextClassLoaderManager.java
===================================================================
--- arquillian/trunk/containers/weld-se-embedded-1/src/main/java/org/jboss/arquillian/container/weld/se/embedded_1/ContextClassLoaderManager.java (rev 0)
+++ arquillian/trunk/containers/weld-se-embedded-1/src/main/java/org/jboss/arquillian/container/weld/se/embedded_1/ContextClassLoaderManager.java 2010-07-18 14:22:00 UTC (rev 4768)
@@ -0,0 +1,61 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * Licensed 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.jboss.arquillian.container.weld.se.embedded_1;
+
+import java.io.IOException;
+
+import org.jboss.shrinkwrap.classloader.ShrinkWrapClassLoader;
+
+/**
+ * ContextClassLoaderManager
+ *
+ * @author <a href="mailto:aslak at redhat.com">Aslak Knutsen</a>
+ * @version $Revision: $
+ */
+public class ContextClassLoaderManager
+{
+ private ShrinkWrapClassLoader shrinkWrapClassLoader;
+ private ClassLoader contextClassLoader;
+
+ public ContextClassLoaderManager(final ShrinkWrapClassLoader shrinkWrapClassLoader)
+ {
+ if(shrinkWrapClassLoader == null)
+ {
+ throw new IllegalArgumentException("ShrinkWrapClassLoader must be specified");
+ }
+ this.shrinkWrapClassLoader = shrinkWrapClassLoader;
+ }
+
+ public void enable()
+ {
+ this.contextClassLoader = Thread.currentThread().getContextClassLoader();
+ Thread.currentThread().setContextClassLoader(shrinkWrapClassLoader);
+ }
+
+ public void disable()
+ {
+ Thread.currentThread().setContextClassLoader(contextClassLoader);
+ try
+ {
+ this.shrinkWrapClassLoader.close();
+ }
+ catch (IOException e)
+ {
+ throw new RuntimeException("Could not close ShrinkWrapClassLoader", e);
+ }
+ }
+}
Modified: arquillian/trunk/containers/weld-se-embedded-1/src/main/java/org/jboss/arquillian/container/weld/se/embedded_1/WeldSEContainer.java
===================================================================
--- arquillian/trunk/containers/weld-se-embedded-1/src/main/java/org/jboss/arquillian/container/weld/se/embedded_1/WeldSEContainer.java 2010-07-18 14:16:00 UTC (rev 4767)
+++ arquillian/trunk/containers/weld-se-embedded-1/src/main/java/org/jboss/arquillian/container/weld/se/embedded_1/WeldSEContainer.java 2010-07-18 14:22:00 UTC (rev 4768)
@@ -19,7 +19,6 @@
import java.util.Arrays;
import java.util.Collection;
-import org.jboss.arquillian.container.weld.se.embedded_1.shrinkwrap.ShrinkWrapClassLoader;
import org.jboss.arquillian.container.weld.se.embedded_1.shrinkwrap.ShrinkwrapBeanDeploymentArchive;
import org.jboss.arquillian.protocol.local.LocalMethodExecutor;
import org.jboss.arquillian.spi.Configuration;
@@ -72,17 +71,13 @@
public ContainerMethodExecutor deploy(Context context, final Archive<?> archive)
throws DeploymentException
{
- final BeanDeploymentArchive beanArchive = archive.as(ShrinkwrapBeanDeploymentArchive.class);
+ final ShrinkwrapBeanDeploymentArchive beanArchive = archive.as(ShrinkwrapBeanDeploymentArchive.class);
- ClassLoader cl = new ShrinkWrapClassLoader(archive);
-
- Thread.currentThread().setContextClassLoader(cl);
-
- Deployment deployment = new Deployment()
+ final Deployment deployment = new Deployment()
{
public Collection<BeanDeploymentArchive> getBeanDeploymentArchives()
{
- return Arrays.asList(beanArchive);
+ return Arrays.asList((BeanDeploymentArchive)beanArchive);
}
public ServiceRegistry getServices()
@@ -97,6 +92,11 @@
}
};
+ ContextClassLoaderManager classLoaderManager = new ContextClassLoaderManager(beanArchive.getClassLoader());
+ classLoaderManager.enable();
+
+ context.add(ContextClassLoaderManager.class, classLoaderManager);
+
WeldBootstrap bootstrap = new WeldBootstrap();
bootstrap.startContainer(Environments.SE, deployment, new ConcurrentHashMapBeanStore())
.startInitialization()
@@ -122,7 +122,7 @@
{
bootstrap.shutdown();
}
- Thread.currentThread().setContextClassLoader(
- Thread.currentThread().getContextClassLoader().getParent());
+ ContextClassLoaderManager classLoaderManager = context.get(ContextClassLoaderManager.class);
+ classLoaderManager.disable();
}
}
\ No newline at end of file
Deleted: arquillian/trunk/containers/weld-se-embedded-1/src/main/java/org/jboss/arquillian/container/weld/se/embedded_1/shrinkwrap/ShrinkWrapClassLoader.java
===================================================================
--- arquillian/trunk/containers/weld-se-embedded-1/src/main/java/org/jboss/arquillian/container/weld/se/embedded_1/shrinkwrap/ShrinkWrapClassLoader.java 2010-07-18 14:16:00 UTC (rev 4767)
+++ arquillian/trunk/containers/weld-se-embedded-1/src/main/java/org/jboss/arquillian/container/weld/se/embedded_1/shrinkwrap/ShrinkWrapClassLoader.java 2010-07-18 14:22:00 UTC (rev 4768)
@@ -1,116 +0,0 @@
-/*
- * JBoss, Community-driven Open Source Middleware
- * Copyright 2010, JBoss by Red Hat, Inc., and individual contributors
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * Licensed 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.jboss.arquillian.container.weld.se.embedded_1.shrinkwrap;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.net.URLConnection;
-import java.net.URLStreamHandler;
-import java.security.SecureClassLoader;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Enumeration;
-import java.util.Iterator;
-
-import org.jboss.shrinkwrap.api.Archive;
-import org.jboss.shrinkwrap.api.Node;
-
-/**
- * A ClassLoader implementation that can locate resources in a ShrinkWrap archive
- *
- * <p><strong>NOTE</strong> This is a prototype implementation of this concept. It
- * does not address all classloading concerns as of yet.</p>
- *
- * @author <a href="mailto:dan.allen at mojavelinux.com">Dan Allen</a>
- */
-public class ShrinkWrapClassLoader extends SecureClassLoader
-{
- public static final String ARCHIVE_PROTOCOL = "archive:/";
-
- private final Archive<?> archive;
-
- public ShrinkWrapClassLoader(Archive<?> archive)
- {
- super();
- this.archive = archive;
- }
-
- @Override
- protected URL findResource(final String name)
- {
- final Node a = archive.get(name);
- if (a == null)
- {
- return null;
- }
- try
- {
- return new URL(null, ARCHIVE_PROTOCOL + name, new URLStreamHandler()
- {
- @Override
- protected java.net.URLConnection openConnection(URL u) throws java.io.IOException
- {
- return new URLConnection(u)
- {
- @Override
- public void connect() throws IOException
- {
- }
-
- @Override
- public InputStream getInputStream()
- throws IOException
- {
- return a.getAsset().openStream();
- }
- };
- }
-
- ;
- });
- }
- catch (Exception e)
- {
- return null;
- }
- }
-
- @Override
- protected Enumeration<URL> findResources(String name) throws IOException
- {
- Iterator<URL> it = new ArrayList<URL>(0).iterator();
- URL resource = findResource(name);
- if (resource != null)
- {
- it = Arrays.asList(resource).iterator();
- }
- final Iterator<URL> i = it;
- return new Enumeration<URL>()
- {
- public boolean hasMoreElements()
- {
- return i.hasNext();
- }
-
- public URL nextElement()
- {
- return i.next();
- }
- };
- }
-}
Modified: arquillian/trunk/containers/weld-se-embedded-1/src/main/java/org/jboss/arquillian/container/weld/se/embedded_1/shrinkwrap/ShrinkwrapBeanDeploymentArchive.java
===================================================================
--- arquillian/trunk/containers/weld-se-embedded-1/src/main/java/org/jboss/arquillian/container/weld/se/embedded_1/shrinkwrap/ShrinkwrapBeanDeploymentArchive.java 2010-07-18 14:16:00 UTC (rev 4767)
+++ arquillian/trunk/containers/weld-se-embedded-1/src/main/java/org/jboss/arquillian/container/weld/se/embedded_1/shrinkwrap/ShrinkwrapBeanDeploymentArchive.java 2010-07-18 14:22:00 UTC (rev 4768)
@@ -17,6 +17,7 @@
package org.jboss.arquillian.container.weld.se.embedded_1.shrinkwrap;
import org.jboss.shrinkwrap.api.Assignable;
+import org.jboss.shrinkwrap.classloader.ShrinkWrapClassLoader;
import org.jboss.weld.bootstrap.spi.BeanDeploymentArchive;
/**
@@ -27,5 +28,5 @@
*/
public interface ShrinkwrapBeanDeploymentArchive extends BeanDeploymentArchive, Assignable
{
-
+ ShrinkWrapClassLoader getClassLoader();
}
Modified: arquillian/trunk/containers/weld-se-embedded-1/src/main/java/org/jboss/arquillian/container/weld/se/embedded_1/shrinkwrap/ShrinkwrapBeanDeploymentArchiveImpl.java
===================================================================
--- arquillian/trunk/containers/weld-se-embedded-1/src/main/java/org/jboss/arquillian/container/weld/se/embedded_1/shrinkwrap/ShrinkwrapBeanDeploymentArchiveImpl.java 2010-07-18 14:16:00 UTC (rev 4767)
+++ arquillian/trunk/containers/weld-se-embedded-1/src/main/java/org/jboss/arquillian/container/weld/se/embedded_1/shrinkwrap/ShrinkwrapBeanDeploymentArchiveImpl.java 2010-07-18 14:22:00 UTC (rev 4768)
@@ -18,7 +18,6 @@
import java.io.IOException;
import java.io.InputStream;
-import java.lang.reflect.Field;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLStreamHandler;
@@ -32,10 +31,9 @@
import org.jboss.shrinkwrap.api.ArchivePath;
import org.jboss.shrinkwrap.api.Filters;
import org.jboss.shrinkwrap.api.Node;
-import org.jboss.shrinkwrap.api.asset.Asset;
+import org.jboss.shrinkwrap.classloader.ShrinkWrapClassLoader;
import org.jboss.shrinkwrap.impl.base.AssignableBase;
import org.jboss.shrinkwrap.impl.base.Validate;
-import org.jboss.shrinkwrap.impl.base.asset.ClassAsset;
import org.jboss.weld.bootstrap.api.ServiceRegistry;
import org.jboss.weld.bootstrap.api.helpers.SimpleServiceRegistry;
import org.jboss.weld.bootstrap.spi.BeanDeploymentArchive;
@@ -53,10 +51,14 @@
private ServiceRegistry serviceRegistry = new SimpleServiceRegistry();
+ private ShrinkWrapClassLoader classLoader;
+
public ShrinkwrapBeanDeploymentArchiveImpl(Archive<?> archive)
{
Validate.notNull(archive, "Archive must be specified");
this.archive = archive;
+
+ this.classLoader = new ShrinkWrapClassLoader(archive.getClass().getClassLoader(), archive);
}
@Override
@@ -65,6 +67,11 @@
return archive;
}
+ public ShrinkWrapClassLoader getClassLoader()
+ {
+ return classLoader;
+ }
+
public Collection<URL> getBeansXml()
{
List<URL> beanClasses = new ArrayList<URL>();
@@ -105,15 +112,20 @@
{
List<Class<?>> beanClasses = new ArrayList<Class<?>>();
Map<ArchivePath, Node> classes = archive.getContent(Filters.include(".*\\.class"));
- for(Map.Entry<ArchivePath, Node> classEntry : classes.entrySet())
+
+ try
{
- if (classEntry.getValue().getAsset() instanceof ClassAsset)
+ for(Map.Entry<ArchivePath, Node> classEntry : classes.entrySet())
{
- beanClasses.add(
- (Class<?>)extractFieldFromAsset(
- classEntry.getValue().getAsset(),
- "clazz"));
+ Class<?> loadedClass = getClassLoader().loadClass(
+ getClassName(classEntry.getKey()));
+
+ beanClasses.add(loadedClass);
}
+ }
+ catch (ClassNotFoundException e)
+ {
+ throw new RuntimeException("Could not load class from archive " + archive.getName(), e);
}
return beanClasses;
}
@@ -138,19 +150,19 @@
return serviceRegistry;
}
- private Object extractFieldFromAsset(Asset asset, String fieldName)
+ /*
+ * input: /org/MyClass.class
+ * output: org.MyClass
+ */
+ public String getClassName(ArchivePath path)
{
- try
+ String className = path.get();
+ if(className.charAt(0) == '/')
{
- Field field = asset.getClass().getDeclaredField(fieldName);
- field.setAccessible(true);
-
- return field.get(asset);
- }
- catch (Exception e)
- {
- e.printStackTrace();
+ className = className.substring(1);
}
- return null;
+ className = className.replaceAll("\\.class", "");
+ className = className.replaceAll("/", ".");
+ return className;
}
}
\ No newline at end of file
Added: arquillian/trunk/containers/weld-se-embedded-1/src/test/java/org/jboss/arquillian/container/weld/se/embedded_1/shrinkwrap/ShrinkwrapBeanDeploymentArchiveTestCase.java
===================================================================
--- arquillian/trunk/containers/weld-se-embedded-1/src/test/java/org/jboss/arquillian/container/weld/se/embedded_1/shrinkwrap/ShrinkwrapBeanDeploymentArchiveTestCase.java (rev 0)
+++ arquillian/trunk/containers/weld-se-embedded-1/src/test/java/org/jboss/arquillian/container/weld/se/embedded_1/shrinkwrap/ShrinkwrapBeanDeploymentArchiveTestCase.java 2010-07-18 14:22:00 UTC (rev 4768)
@@ -0,0 +1,57 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * Licensed 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.jboss.arquillian.container.weld.se.embedded_1.shrinkwrap;
+
+import java.util.Collection;
+
+import junit.framework.Assert;
+
+import org.jboss.arquillian.container.weld.se.embedded_1.beans.MyBean;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.spec.JavaArchive;
+import org.junit.Test;
+
+
+/**
+ * ShrinkwrapBeanDeploymentArchiveTestCase
+ *
+ * @author <a href="mailto:aslak at redhat.com">Aslak Knutsen</a>
+ * @version $Revision: $
+ */
+public class ShrinkwrapBeanDeploymentArchiveTestCase
+{
+
+ @Test
+ public void shouldBeAbleToFindAllClasses() throws Exception
+ {
+ JavaArchive archive = ShrinkWrap.create(JavaArchive.class)
+ .addPackage(MyBean.class.getPackage());
+
+
+ ShrinkwrapBeanDeploymentArchive beanDeployment = archive.as(ShrinkwrapBeanDeploymentArchive.class);
+ try
+ {
+ Collection<Class<?>> classes = beanDeployment.getBeanClasses();
+ Assert.assertEquals(1, classes.size());
+ }
+ finally
+ {
+ beanDeployment.getClassLoader().close();
+ }
+
+ }
+}
More information about the jboss-svn-commits
mailing list