[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