[jboss-cvs] JBossAS SVN: r100211 - in projects/jboss-reflect/trunk/src: main/java/org/jboss/reflect/plugins/introspection and 3 other directories.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Mon Feb 1 09:16:41 EST 2010
Author: alesj
Date: 2010-02-01 09:16:40 -0500 (Mon, 01 Feb 2010)
New Revision: 100211
Added:
projects/jboss-reflect/trunk/src/test/java/org/jboss/test/classinfo/support/NonPublicAnnotation.java
projects/jboss-reflect/trunk/src/test/java/org/jboss/test/classinfo/support/SimpleAnnotatedClass.java
projects/jboss-reflect/trunk/src/test/java/org/jboss/test/classinfo/test/NonPublicAnnotationTestCase.java
Removed:
projects/jboss-reflect/trunk/src/test/java/org/jboss/test/classinfo/annotation/
Modified:
projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/AnnotationValueFactory.java
projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/introspection/ReflectMethodInfoImpl.java
Log:
[JBREFLECT-93]; allow access of non-public class methods.
Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/AnnotationValueFactory.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/AnnotationValueFactory.java 2010-02-01 14:10:02 UTC (rev 100210)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/AnnotationValueFactory.java 2010-02-01 14:16:40 UTC (rev 100211)
@@ -22,8 +22,13 @@
package org.jboss.reflect.plugins;
import java.lang.annotation.Annotation;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.security.PrivilegedExceptionAction;
import java.util.HashMap;
+import java.util.Map;
+import org.jboss.beans.info.spi.BeanInfo;
import org.jboss.reflect.spi.AnnotationInfo;
import org.jboss.reflect.spi.AnnotationValue;
import org.jboss.reflect.spi.ArrayInfo;
@@ -37,13 +42,22 @@
import org.jboss.reflect.spi.Value;
/**
- *
+ * The annotation value factory.
+ *
* @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @author <a href="ales.justin at jboss.org">Ales Justin</a>
* @version $Revision$
*/
public class AnnotationValueFactory
{
-
+ /**
+ * Create value.
+ *
+ * @param annotationHelper annotation helper
+ * @param type the type
+ * @param value the raw value
+ * @return new value instance
+ */
public static Value createValue(AnnotationHelper annotationHelper, TypeInfo type, Object value)
{
Value rtnValue = null;
@@ -61,7 +75,7 @@
{
rtnValue = new PrimitiveValue(value.toString(), (PrimitiveInfo)type);
}
- else if (type.getName().equals("java.lang.String"))
+ else if ("java.lang.String".equals(type.getName()))
{
rtnValue = new StringValueImpl((String)value, type);
}
@@ -82,14 +96,22 @@
return rtnValue;
}
- public static AnnotationValue createAnnotationValue(TypeInfoFactory typeInfoFactory, AnnotationHelper annotationHelper, AnnotationInfo info, Object ann)
+ /**
+ * Create annotation value.
+ *
+ * @param typeInfoFactory the type info factory
+ * @param annotationHelper the annotation helper
+ * @param info the annotation info
+ * @param ann the actual annotation instance
+ * @return the annotation value instance
+ */
+ public static AnnotationValue createAnnotationValue(TypeInfoFactory typeInfoFactory, final AnnotationHelper annotationHelper, AnnotationInfo info, Object ann)
{
Annotation annotation = (Annotation)ann;
Class<?> clazz = annotation.annotationType();
ClassInfo clazzInfo = (ClassInfo) typeInfoFactory.getTypeInfo(clazz);
-
+
HashMap<String, Value> attributes = new HashMap<String, Value>();
-
MethodInfo[] methods = clazzInfo.getDeclaredMethods();
if (methods != null)
{
@@ -111,7 +133,13 @@
return new AnnotationValueImpl(info, attributes, annotation);
}
-
+ /**
+ * Unwrap array value.
+ *
+ * @param arrayInfo the array info
+ * @param value the wrapped value
+ * @return unwrapped array value
+ */
private static Object[] getArray(ArrayInfo arrayInfo, Object value)
{
TypeInfo componentType = arrayInfo.getComponentType();
Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/introspection/ReflectMethodInfoImpl.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/introspection/ReflectMethodInfoImpl.java 2010-02-01 14:10:02 UTC (rev 100210)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/introspection/ReflectMethodInfoImpl.java 2010-02-01 14:16:40 UTC (rev 100211)
@@ -101,12 +101,17 @@
*/
public void setMethod(Method method)
{
+ boolean isDeclaringClassPublic = true;
if (method != null)
+ {
accessCheck(Modifier.isPublic(method.getModifiers()));
+ isDeclaringClassPublic = isDeclaringClassPublic(method);
+ accessCheck(isDeclaringClassPublic);
+ }
this.method = method;
- if (isPublic() == false && method != null)
+ if (method != null && (isPublic() == false || isDeclaringClassPublic == false))
setAccessible();
}
@@ -120,13 +125,25 @@
accessCheck();
return method;
}
-
+
/**
+ * Is declaring class public.
+ *
+ * @param method the method
+ * @return if declaring class is public return true, else false
+ */
+ protected static boolean isDeclaringClassPublic(Method method)
+ {
+ Class<?> owner = method.getDeclaringClass();
+ return Modifier.isPublic(owner.getModifiers());
+ }
+
+ /**
* Check access permission.
*/
protected final void accessCheck() // final because we don't want subclasses to disable it
{
- accessCheck(isPublic());
+ accessCheck(isPublic() && (method == null || isDeclaringClassPublic(method)));
}
/**
Copied: projects/jboss-reflect/trunk/src/test/java/org/jboss/test/classinfo/support/NonPublicAnnotation.java (from rev 100205, projects/jboss-reflect/trunk/src/test/java/org/jboss/test/classinfo/annotation/test/NonPublicAnnotation.java)
===================================================================
--- projects/jboss-reflect/trunk/src/test/java/org/jboss/test/classinfo/support/NonPublicAnnotation.java (rev 0)
+++ projects/jboss-reflect/trunk/src/test/java/org/jboss/test/classinfo/support/NonPublicAnnotation.java 2010-02-01 14:16:40 UTC (rev 100211)
@@ -0,0 +1,31 @@
+/**
+ *
+ */
+package org.jboss.test.classinfo.support;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * NonPublicAnnotation
+ *
+ * A non-public annotation.
+ *
+ * NOTE: This {@link NonPublicAnnotation}, {@link org.jboss.test.classinfo.support.SimpleAnnotatedClass} and
+ * even the {@link org.jboss.test.classinfo.test.NonPublicAnnotationTestCase} are all placed in the same package
+ * *intentionally*, so that this annotation is accessible for the {@link org.jboss.test.classinfo.support.SimpleAnnotatedClass}
+ * as well as {@link org.jboss.test.classinfo.test.NonPublicAnnotationTestCase} during the tests.
+ *
+ * @author Jaikiran Pai
+ * @version $Revision: $
+ */
+ at Target (ElementType.TYPE)
+ at Retention (RetentionPolicy.RUNTIME)
+ at interface NonPublicAnnotation
+{
+ public abstract String name();
+
+ public abstract boolean isTest();
+}
Copied: projects/jboss-reflect/trunk/src/test/java/org/jboss/test/classinfo/support/SimpleAnnotatedClass.java (from rev 100205, projects/jboss-reflect/trunk/src/test/java/org/jboss/test/classinfo/annotation/test/SimpleAnnotatedClass.java)
===================================================================
--- projects/jboss-reflect/trunk/src/test/java/org/jboss/test/classinfo/support/SimpleAnnotatedClass.java (rev 0)
+++ projects/jboss-reflect/trunk/src/test/java/org/jboss/test/classinfo/support/SimpleAnnotatedClass.java 2010-02-01 14:16:40 UTC (rev 100211)
@@ -0,0 +1,25 @@
+/**
+ *
+ */
+package org.jboss.test.classinfo.support;
+
+
+/**
+ * SimpleAnnotatedClass
+ *
+ * A simple class used in tests
+ *
+ * NOTE: The {@link org.jboss.test.classinfo.support.NonPublicAnnotation}, {@link SimpleAnnotatedClass} and
+ * even the {@link org.jboss.test.classinfo.test.NonPublicAnnotationTestCase} are all placed in the same package
+ * *intentionally*, so that this annotation is accessible for the {@link SimpleAnnotatedClass}
+ * as well as {@link org.jboss.test.classinfo.test.NonPublicAnnotationTestCase} during the tests.
+ *
+ * @author Jaikiran Pai
+ * @version $Revision: $
+ */
+ at NonPublicAnnotation(name=SimpleAnnotatedClass.ANNOTATION_ELEMENT_NAME, isTest=true)
+public class SimpleAnnotatedClass
+{
+
+ public static final String ANNOTATION_ELEMENT_NAME = "SomeName";
+}
Copied: projects/jboss-reflect/trunk/src/test/java/org/jboss/test/classinfo/test/NonPublicAnnotationTestCase.java (from rev 100205, projects/jboss-reflect/trunk/src/test/java/org/jboss/test/classinfo/annotation/test/NonPublicAnnotationTestCase.java)
===================================================================
--- projects/jboss-reflect/trunk/src/test/java/org/jboss/test/classinfo/test/NonPublicAnnotationTestCase.java (rev 0)
+++ projects/jboss-reflect/trunk/src/test/java/org/jboss/test/classinfo/test/NonPublicAnnotationTestCase.java 2010-02-01 14:16:40 UTC (rev 100211)
@@ -0,0 +1,86 @@
+/**
+ *
+ */
+package org.jboss.test.classinfo.test;
+
+import java.lang.annotation.Annotation;
+
+import junit.framework.Test;
+
+import org.jboss.reflect.plugins.introspection.IntrospectionTypeInfoFactory;
+import org.jboss.reflect.spi.ClassInfo;
+import org.jboss.reflect.spi.TypeInfo;
+import org.jboss.reflect.spi.TypeInfoFactory;
+import org.jboss.test.ContainerTest;
+import org.jboss.test.classinfo.support.SimpleAnnotatedClass;
+
+/**
+ * NonPublicAnnotationTestCase
+ *
+ * Tests that a Class annotated with a non-public annotation is
+ * correctly parsed for annotations.
+ * <p>
+ * This test is responsible the testing fix for the bug in JBREFLECT
+ * which causes the following exception:
+ * </p>
+ * <p>
+ * Caused by: java.lang.IllegalAccessException: Class org.jboss.reflect.plugins.introspection.ReflectionUtils can not access a member of class org.jboss.test.classinfo.annotation.test.NonPublicAnnotation with modifiers "public abstract"
+ * at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:65)
+ * at java.lang.reflect.Method.invoke(Method.java:588)
+ * at org.jboss.reflect.plugins.introspection.ReflectionUtils.invoke(ReflectionUtils.java:59)
+ * at org.jboss.reflect.plugins.introspection.ReflectMethodInfoImpl.invoke(ReflectMethodInfoImpl.java:151)
+ * at org.jboss.reflect.plugins.AnnotationValueFactory.createAnnotationValue(AnnotationValueFactory.java:100)
+ * ... 33 more
+ *
+ * </p>
+ * @author Jaikiran Pai
+ * @author Ales Justin
+ * @version $Revision: $
+ */
+public class NonPublicAnnotationTestCase extends ContainerTest
+{
+ /**
+ * Constructor
+ * @param name the test class name
+ */
+ public NonPublicAnnotationTestCase(String name)
+ {
+ super(name);
+ }
+
+ public static Test suite()
+ {
+ return suite(NonPublicAnnotationTestCase.class);
+ }
+
+ /**
+ * Test that the {@link org.jboss.test.classinfo.support.NonPublicAnnotation} when applied to {@link org.jboss.test.classinfo.support.SimpleAnnotatedClass}
+ * is correctly parsed and is available through {@link ClassInfo#getUnderlyingAnnotations()}
+ *
+ * @throws Exception for any error
+ */
+ public void testNonPublicAnnotationOnClass() throws Exception
+ {
+ ClassInfo info = getClassInfo(SimpleAnnotatedClass.class);
+ Annotation[] annotations = info.getUnderlyingAnnotations();
+ assertEquals("Incorrect number of annotations found on " + SimpleAnnotatedClass.class, 1, annotations.length);
+ Annotation annotation = annotations[0];
+ assertEquals("Incorrect annotation type found on " + SimpleAnnotatedClass.class, "NonPublicAnnotation", annotation.annotationType().getSimpleName());
+ }
+
+ /**
+ * Utitlity method
+ * @param clazz the class
+ * @return class info
+ */
+ private ClassInfo getClassInfo(Class<?> clazz)
+ {
+ TypeInfoFactory factory = new IntrospectionTypeInfoFactory();
+ TypeInfo info = factory.getTypeInfo(clazz);
+ assertNotNull(info);
+ assertTrue(info instanceof ClassInfo);
+ ClassInfo cinfo = (ClassInfo) info;
+ getLog().debug(cinfo);
+ return cinfo;
+ }
+}
More information about the jboss-cvs-commits
mailing list