[jboss-svn-commits] JBoss Common SVN: r3698 - shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Sat Nov 14 12:56:02 EST 2009
Author: ALRubinger
Date: 2009-11-14 12:56:01 -0500 (Sat, 14 Nov 2009)
New Revision: 3698
Removed:
shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/ReflectionUtil.java
Modified:
shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/Archives.java
shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/Paths.java
shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/SecurityActions.java
Log:
[SHRINKWRAP-57][SHRINKWRAP-74] Cleanup of ReflectionUtil; put stuff in security checks and centralized into SecurityActions
Modified: shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/Archives.java
===================================================================
--- shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/Archives.java 2009-11-13 19:17:21 UTC (rev 3697)
+++ shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/Archives.java 2009-11-14 17:56:01 UTC (rev 3698)
@@ -47,10 +47,11 @@
{
throw new IllegalArgumentException("Type must be specified");
}
- Archive<?> archive = (Archive<?>)ReflectionUtil.createInstance(
+ Archive<?> archive = (Archive<?>)SecurityActions.newInstance(
ARCHIVE_IMPL,
new Class<?>[]{String.class},
- new Object[]{archiveName});
+ new Object[]{archiveName},
+ Archive.class);
return archive.as(type);
}
Modified: shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/Paths.java
===================================================================
--- shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/Paths.java 2009-11-13 19:17:21 UTC (rev 3697)
+++ shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/Paths.java 2009-11-14 17:56:01 UTC (rev 3698)
@@ -99,7 +99,7 @@
private static Path createInstance(Class<?>[] argumentTypes, Object[] arguments)
{
- return (Path) ReflectionUtil.createInstance(PATH_IMPL, argumentTypes, arguments);
+ return SecurityActions.newInstance(PATH_IMPL, argumentTypes, arguments, Path.class);
}
//-------------------------------------------------------------------------------------||
Deleted: shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/ReflectionUtil.java
===================================================================
--- shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/ReflectionUtil.java 2009-11-13 19:17:21 UTC (rev 3697)
+++ shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/ReflectionUtil.java 2009-11-14 17:56:01 UTC (rev 3698)
@@ -1,103 +0,0 @@
-/*
- * 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.shrinkwrap.api;
-
-import java.lang.reflect.Constructor;
-
-import com.sun.xml.internal.txw2.IllegalAnnotationException;
-
-/**
- * ReflectionUtil
- *
- * Helper class for creating new instances of a class
- *
- * @author <a href="mailto:aslak at conduct.no">Aslak Knutsen</a>
- * @version $Revision: $
- */
-final class ReflectionUtil
-{
- /**
- * Create a new instance by finding a constructor that matches the argumentTypes signature
- * using the arguments for instantiation.
- *
- * @param className Full classname of class to create
- * @param argumentTypes The constructor argument types
- * @param arguments The constructor arguments
- * @return a new instance
- * @throws IllegalArgumentException if className is null
- * @throws IllegalArgumentException if argumentTypes is null
- * @throws IllegalArgumentException if arguments is null
- * @throws RuntimeException if any exceptions during creation
- */
- public static Object createInstance(String className, Class<?>[] argumentTypes, Object[] arguments)
- {
- if(className == null)
- {
- throw new IllegalArgumentException("ClassName must be specified");
- }
- if(argumentTypes == null)
- {
- throw new IllegalAnnotationException("ArgumentTypes must be specified. Use empty array if no arguments");
- }
- if(arguments == null)
- {
- throw new IllegalAnnotationException("Arguments must be specified. Use empty array if no arguments");
- }
- try
- {
- Class<?> implClass = loadClass(className);
- Constructor<?> constructor = findConstructor(implClass, argumentTypes);
- return constructor.newInstance(arguments);
- }
- catch (Exception e)
- {
- throw new RuntimeException(
- "Could not create new instance of " + className + ", missing package from classpath?", e);
- }
- }
-
- //-------------------------------------------------------------------------------------||
- // Class Members - Internal Helpers ---------------------------------------------------||
- //-------------------------------------------------------------------------------------||
-
- /**
- * Load the specified class using Thread Current Class Loader in a privileged block.
- */
- private static Class<?> loadClass(String archiveImplClassName) throws Exception
- {
- return SecurityActions.getThreadContextClassLoader().loadClass(archiveImplClassName);
- }
-
- /**
- * Find a constructor that match the signature of given argumentTypes.
- */
- private static Constructor<?> findConstructor(Class<?> archiveImplClazz, Class<?>... argumentTypes) throws Exception
- {
- return archiveImplClazz.getConstructor(argumentTypes);
- }
-
- //-------------------------------------------------------------------------------------||
- // Constructor ------------------------------------------------------------------------||
- //-------------------------------------------------------------------------------------||
-
- /**
- * No instantiation
- */
- private ReflectionUtil()
- {
- }
-}
Modified: shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/SecurityActions.java
===================================================================
--- shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/SecurityActions.java 2009-11-13 19:17:21 UTC (rev 3697)
+++ shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/SecurityActions.java 2009-11-14 17:56:01 UTC (rev 3698)
@@ -16,8 +16,11 @@
*/
package org.jboss.shrinkwrap.api;
+import java.lang.reflect.Constructor;
import java.security.AccessController;
import java.security.PrivilegedAction;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
/**
* SecurityActions
@@ -36,11 +39,11 @@
//-------------------------------------------------------------------------------||
/**
- * No external instantiation
+ * No instantiation
*/
private SecurityActions()
{
-
+ throw new UnsupportedOperationException("No instantiation");
}
//-------------------------------------------------------------------------------||
@@ -52,12 +55,126 @@
*/
static ClassLoader getThreadContextClassLoader()
{
- return AccessController.doPrivileged(new PrivilegedAction<ClassLoader>()
+ return AccessController.doPrivileged(GetTcclAction.INSTANCE);
+ }
+
+ /**
+ * Obtains the Constructor specified from the given Class and argument types
+ * @param clazz
+ * @param argumentTypes
+ * @return
+ * @throws NoSuchMethodException
+ */
+ static Constructor<?> getConstructor(final Class<?> clazz, final Class<?>... argumentTypes)
+ throws NoSuchMethodException
+ {
+ try
{
- public ClassLoader run()
+ return AccessController.doPrivileged(new PrivilegedExceptionAction<Constructor<?>>()
{
- return Thread.currentThread().getContextClassLoader();
+ @Override
+ public Constructor<?> run() throws NoSuchMethodException
+ {
+ return clazz.getConstructor(argumentTypes);
+ }
+ });
+ }
+ // Unwrap
+ catch (final PrivilegedActionException pae)
+ {
+ final Throwable t = pae.getCause();
+ // Rethrow
+ if (t instanceof NoSuchMethodException)
+ {
+ throw (NoSuchMethodException) t;
}
- });
+ else
+ {
+ // No other checked Exception thrown by Class.getConstructor
+ try
+ {
+ throw (RuntimeException) t;
+ }
+ // Just in case we've really messed up
+ catch (final ClassCastException cce)
+ {
+ throw new RuntimeException("Obtained unchecked Exception; this code should never be reached", t);
+ }
+ }
+ }
}
+
+ /**
+ * Create a new instance by finding a constructor that matches the argumentTypes signature
+ * using the arguments for instantiation.
+ *
+ * @param className Full classname of class to create
+ * @param argumentTypes The constructor argument types
+ * @param arguments The constructor arguments
+ * @return a new instance
+ * @throws IllegalArgumentException if className, argumentTypes, or arguments are null
+ * @throws RuntimeException if any exceptions during creation
+ * @author <a href="mailto:aslak at conduct.no">Aslak Knutsen</a>
+ * @author <a href="mailto:andrew.rubinger at jboss.org">ALR</a>
+ */
+ static <T> T newInstance(final String className, final Class<?>[] argumentTypes, final Object[] arguments,
+ final Class<T> expectedType)
+ {
+ if (className == null)
+ {
+ throw new IllegalArgumentException("ClassName must be specified");
+ }
+ if (argumentTypes == null)
+ {
+ throw new IllegalArgumentException("ArgumentTypes must be specified. Use empty array if no arguments");
+ }
+ if (arguments == null)
+ {
+ throw new IllegalArgumentException("Arguments must be specified. Use empty array if no arguments");
+ }
+ final Object obj;
+ try
+ {
+ final ClassLoader tccl = getThreadContextClassLoader();
+ final Class<?> implClass = Class.forName(className, false, tccl);
+ Constructor<?> constructor = getConstructor(implClass, argumentTypes);
+ obj = constructor.newInstance(arguments);
+ }
+ catch (Exception e)
+ {
+ throw new RuntimeException("Could not create new instance of " + className
+ + ", missing package from classpath?", e);
+ }
+
+ // Cast
+ try
+ {
+ return expectedType.cast(obj);
+ }
+ catch (final ClassCastException cce)
+ {
+ // Reconstruct so we get some useful information
+ throw new ClassCastException("Incorrect expected type, " + expectedType.getName() + ", defined for "
+ + obj.getClass().getName());
+ }
+ }
+
+ //-------------------------------------------------------------------------------||
+ // Inner Classes ----------------------------------------------------------------||
+ //-------------------------------------------------------------------------------||
+
+ /**
+ * Single instance to get the TCCL
+ */
+ private enum GetTcclAction implements PrivilegedAction<ClassLoader> {
+ INSTANCE;
+
+ @Override
+ public ClassLoader run()
+ {
+ return Thread.currentThread().getContextClassLoader();
+ }
+
+ }
+
}
More information about the jboss-svn-commits
mailing list