[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