[jboss-svn-commits] JBoss Common SVN: r3817 - in shrinkwrap/trunk: impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/container and 1 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed Dec 2 14:56:16 EST 2009


Author: ALRubinger
Date: 2009-12-02 14:56:15 -0500 (Wed, 02 Dec 2009)
New Revision: 3817

Modified:
   shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/container/ClassContainer.java
   shrinkwrap/trunk/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/container/ContainerBase.java
   shrinkwrap/trunk/impl-base/src/test/java/org/jboss/shrinkwrap/impl/base/test/DynamicContainerTestBase.java
Log:
[SHRINKWRAP-92] Support archive.addClass(String name,ClassLoader cl) and tests

Modified: shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/container/ClassContainer.java
===================================================================
--- shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/container/ClassContainer.java	2009-12-01 12:13:25 UTC (rev 3816)
+++ shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/container/ClassContainer.java	2009-12-02 19:56:15 UTC (rev 3817)
@@ -40,16 +40,29 @@
     * Adds the specified Class to the {@link Archive}.
     * 
     * @param class The class to add to the Archive
-    * @return This virtual archive
+    * @return This archive
     * @throws IllegalArgumentException If no class were specified
     */
    T addClass(Class<?> clazz) throws IllegalArgumentException;
 
    /**
+    * Adds the Class with the specified fully-qualified name,
+    * loaded by the specified ClassLoader, to the {@link Archive}.
+    * 
+    * @param fullyQualifiedClassName The name of the Class to add
+    * @param cl The ClassLoader used to load the Class, or null to denote the 
+    *       Thread Context ClassLoader
+    * @return This archive
+    * @throws IllegalArgumentException If no class name was specified, or if the Class 
+    *   could not be loaded by the target ClassLoader
+    */
+   T addClass(String fullyQualifiedClassName, ClassLoader cl) throws IllegalArgumentException;
+
+   /**
     * Adds the specified Classes to the {@link Archive}.
     * 
     * @param classes The classes to add to the Archive
-    * @return This virtual archive
+    * @return This archive
     * @throws IllegalArgumentException If no classes were specified
     */
    T addClasses(Class<?>... classes) throws IllegalArgumentException;
@@ -62,7 +75,7 @@
     * @throws IllegalArgumentException If no package were specified
     */
    T addPackage(Package pack) throws IllegalArgumentException;
-   
+
    /**
     * Adds all classes in the specified {@link Package}s to the {@link Archive}.
     * 

Modified: shrinkwrap/trunk/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/container/ContainerBase.java
===================================================================
--- shrinkwrap/trunk/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/container/ContainerBase.java	2009-12-01 12:13:25 UTC (rev 3816)
+++ shrinkwrap/trunk/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/container/ContainerBase.java	2009-12-02 19:56:15 UTC (rev 3817)
@@ -18,6 +18,8 @@
 
 import java.io.File;
 import java.net.URL;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
 import java.util.Map;
 import java.util.Set;
 
@@ -55,6 +57,22 @@
    // Class Members ----------------------------------------------------------------------||
    //-------------------------------------------------------------------------------------||
    
+   /**
+    * Secure action to obtain the Thread Context ClassLoader
+    * 
+    * @author <a href="mailto:andrew.rubinger at jboss.org">ALR</a>
+    * @version $Revision: $
+    */
+   private enum GetTcclAction implements PrivilegedAction<ClassLoader>{
+      INSTANCE;
+
+      @Override
+      public ClassLoader run()
+      {
+         return Thread.currentThread().getContextClassLoader();
+      }
+   }
+   
    //-------------------------------------------------------------------------------------||
    // Instance Members -------------------------------------------------------------------||
    //-------------------------------------------------------------------------------------||
@@ -556,6 +574,41 @@
       return addClasses(clazz);
    }
    
+   /**
+    * @see org.jboss.shrinkwrap.api.container.ClassContainer#addClass(java.lang.String, java.lang.ClassLoader)
+    */
+   @Override
+   public T addClass(final String fullyQualifiedClassName, final ClassLoader cl) throws IllegalArgumentException
+   {
+      // Precondition checks
+      if (fullyQualifiedClassName == null || fullyQualifiedClassName.length() == 0)
+      {
+         throw new IllegalArgumentException("Fully-qualified class name must be specified");
+      }
+
+      // Default to TCCL if not specified
+      ClassLoader loadingCl = cl;
+      if (loadingCl == null)
+      {
+         loadingCl = AccessController.doPrivileged(GetTcclAction.INSTANCE);
+      }
+
+      // Obtain the Class
+      final Class<?> clazz;
+      try
+      {
+         clazz = Class.forName(fullyQualifiedClassName, false, loadingCl);
+      }
+      catch (final ClassNotFoundException e)
+      {
+         throw new IllegalArgumentException("Could not load class of name " + fullyQualifiedClassName + " with "
+               + loadingCl, e);
+      }
+
+      // Delegate and return
+      return this.addClass(clazz);
+   }
+
    /* (non-Javadoc)
     * @see org.jboss.declarchive.api.container.ClassContainer#addClasses(java.lang.Class<?>[])
     */

Modified: shrinkwrap/trunk/impl-base/src/test/java/org/jboss/shrinkwrap/impl/base/test/DynamicContainerTestBase.java
===================================================================
--- shrinkwrap/trunk/impl-base/src/test/java/org/jboss/shrinkwrap/impl/base/test/DynamicContainerTestBase.java	2009-12-01 12:13:25 UTC (rev 3816)
+++ shrinkwrap/trunk/impl-base/src/test/java/org/jboss/shrinkwrap/impl/base/test/DynamicContainerTestBase.java	2009-12-02 19:56:15 UTC (rev 3817)
@@ -401,6 +401,48 @@
    }
 
    /**
+    * Ensure classes can be added to containers by name and ClassLoader
+    * 
+    * @throws Exception
+    */
+   @Test
+   @ArchiveType(ClassContainer.class)
+   public void testAddClassesByFqnAndClassLoader() throws Exception
+   {
+      // Attempt to load using the TCCL
+      this.ensureCanAddClassByNameAndClassLoader(Thread.currentThread().getContextClassLoader());
+   }
+
+   /**
+    * Ensure classes can be added to containers by name and TCCL
+    * 
+    * @throws Exception
+    */
+   @Test
+   @ArchiveType(ClassContainer.class)
+   public void testAddClassesByFqnAndTccl() throws Exception
+   {
+      // Using a null CL should signal to default to TCCL
+      this.ensureCanAddClassByNameAndClassLoader(null);
+   }
+
+   /**
+    * Ensures that a Class may be added to the ClassContainer by FQN
+    * and the specified ClassLoader
+    * @param cl
+    */
+   private void ensureCanAddClassByNameAndClassLoader(final ClassLoader cl)
+   {
+      final Class<?> classToAdd = DummyClassUsedForClassResourceTest.class;
+
+      getClassContainer().addClass(classToAdd.getName(), cl);
+
+      Path expectedPath = new BasicPath(getClassPath(), AssetUtil.getFullPathForClassResource(classToAdd));
+
+      Assert.assertTrue("A class should be located at " + expectedPath.get(), getArchive().contains(expectedPath));
+   }
+
+   /**
     * Ensure a package can be added to a container
     * 
     * @throws Exception



More information about the jboss-svn-commits mailing list