[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