[jboss-cvs] JBossAS SVN: r106981 - in projects/jboss-reflect/trunk/src: main/java/org/jboss/reflect/plugins/bytecode/bytes/asm and 3 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Wed Jul 21 10:51:00 EDT 2010


Author: kabir.khan at jboss.com
Date: 2010-07-21 10:50:57 -0400 (Wed, 21 Jul 2010)
New Revision: 106981

Modified:
   projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/ConstructorInfoImpl.java
   projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/bytecode/bytes/asm/AsmBehaviourBytes.java
   projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistAnnotatedParameterInfo.java
   projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistConstructorInfo.java
   projects/jboss-reflect/trunk/src/test/java/org/jboss/test/classinfo/support/ClassInfoParameterAnnotationsNotAllParametersAnnotated.java
   projects/jboss-reflect/trunk/src/test/java/org/jboss/test/classinfo/test/AnnotatedClassInfoTest.java
Log:
[JBREFLECT-135] Fix parameter annotations non-static inner classes

Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/ConstructorInfoImpl.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/ConstructorInfoImpl.java	2010-07-21 13:56:15 UTC (rev 106980)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/ConstructorInfoImpl.java	2010-07-21 14:50:57 UTC (rev 106981)
@@ -91,8 +91,19 @@
       {
          this.parameterTypes = parameterTypes;
          this.parameters = new ParameterInfoImpl[parameterTypes.length];
-         for (int i = 0; i < parameterTypes.length; ++i)
-            this.parameters[i] = new ParameterInfoImpl(parameterAnnotations[i], null, parameterTypes[i]);
+
+         int ann = 0;
+         if (parameterAnnotations.length != parameterTypes.length)
+         {
+            if (parameterAnnotations.length == parameterTypes.length - 1 && declaring.getType().getDeclaringClass() != null)
+            //This will only happen for the constructors for non-static inner classes which take an extra 'this' parameter
+            ann = -1;
+         }
+         for (int i = 0 ; i < parameterTypes.length; ++i)
+         {
+            AnnotationValue[] val = i + ann >= 0 ? parameterAnnotations[i + ann] : null; 
+            this.parameters[i] = new ParameterInfoImpl(val, null, parameterTypes[i]);
+         }
       }
       if (exceptionTypes == null)
          this.exceptionTypes = MethodInfo.NO_EXCEPTIONS;

Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/bytecode/bytes/asm/AsmBehaviourBytes.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/bytecode/bytes/asm/AsmBehaviourBytes.java	2010-07-21 13:56:15 UTC (rev 106980)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/bytecode/bytes/asm/AsmBehaviourBytes.java	2010-07-21 14:50:57 UTC (rev 106981)
@@ -169,8 +169,16 @@
          @Override
          public AnnotationVisitor visitParameterAnnotation(int parameter, String desc, boolean visible)
          {
-            lastIndex = parameter;
-            return Util.createAnnotationVisitor(this, AsmBehaviourBytes.this.getClazz().getClassLoader(), desc);
+            try
+            {
+               lastIndex = parameter;
+               return Util.createAnnotationVisitor(this, AsmBehaviourBytes.this.getClazz().getClassLoader(), desc);
+            }
+            catch (Exception e)
+            {
+               //Annotation could not be read
+               return null;
+            }
          }
          
          public void setValueInParent(String name, Object value)

Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistAnnotatedParameterInfo.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistAnnotatedParameterInfo.java	2010-07-21 13:56:15 UTC (rev 106980)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistAnnotatedParameterInfo.java	2010-07-21 14:50:57 UTC (rev 106981)
@@ -188,15 +188,22 @@
       
    protected void setupParameterAnnotations(Object[][] annotations)
    {
+      int offset = isInnerClassConstructor(annotations) ? -1 : 0; 
+      
       for (int param = 0 ; param < annotations.length ; param++)
       {
-         AnnotationValue[] annotationValues = new AnnotationValue[annotations[param].length];
-         for (int ann = 0 ; ann < annotationValues.length ; ann++)
+         AnnotationValue[] annotationValues = null;
+         
+         if (offset + param >= 0)
          {
-            Class<?> clazz = ((Annotation)annotations[param][ann]).annotationType();
-
-            AnnotationInfo info = (AnnotationInfo)((JavassistTypeInfoFactoryImpl)annotationHelper).getTypeInfo(clazz);
-            annotationValues[ann] = annotationHelper.createAnnotationValue(info, annotations[param][ann]);
+            annotationValues = new AnnotationValue[annotations[param + offset].length];
+            for (int ann = 0 ; ann < annotationValues.length ; ann++)
+            {
+               Class<?> clazz = ((Annotation)annotations[param + offset][ann]).annotationType();
+   
+               AnnotationInfo info = (AnnotationInfo)((JavassistTypeInfoFactoryImpl)annotationHelper).getTypeInfo(clazz);
+               annotationValues[ann] = annotationHelper.createAnnotationValue(info, annotations[param + offset][ann]);
+            }
          }
          ((JavassistParameterInfo)parameters[param]).setAnnotations(annotationValues);
       }
@@ -309,4 +316,13 @@
    {
       return ctBehavior.getSignature();
    }
+   
+   /**
+    * Returns false for methods. If a constructor, will return true if
+    * it is a constructor for a non-static inner class.
+    */
+   protected boolean isInnerClassConstructor(Object[][] annotations)
+   {
+      return false;
+   }
 }

Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistConstructorInfo.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistConstructorInfo.java	2010-07-21 13:56:15 UTC (rev 106980)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistConstructorInfo.java	2010-07-21 14:50:57 UTC (rev 106981)
@@ -21,9 +21,11 @@
 */
 package org.jboss.reflect.plugins.javassist;
 
+import java.lang.reflect.Modifier;
 import java.util.Arrays;
 
 import javassist.CtConstructor;
+import javassist.NotFoundException;
 import javassist.bytecode.MethodInfo;
 
 import org.jboss.reflect.plugins.AnnotationHelper;
@@ -134,4 +136,30 @@
    {
       return MethodInfo.nameInit;
    }
+   
+   @Override
+   protected boolean isInnerClassConstructor(Object[][] annotations)
+   {
+      try
+      {
+         if (annotations.length == parameterTypes.length)
+            return false;
+         
+         if (annotations.length != parameterTypes.length - 1)
+            throw new IllegalArgumentException("Bad inner class constructor parameter length");
+         
+         if (ctBehavior.getDeclaringClass().getDeclaringClass() == null)
+            throw new IllegalArgumentException("Not an inner class");
+         
+         if (Modifier.isStatic(ctBehavior.getDeclaringClass().getModifiers()))
+            throw new IllegalArgumentException("Inner class");
+         
+         return true;
+      }
+      catch (NotFoundException e)
+      {
+         throw new RuntimeException(e);
+      }
+         
+   }
 }

Modified: projects/jboss-reflect/trunk/src/test/java/org/jboss/test/classinfo/support/ClassInfoParameterAnnotationsNotAllParametersAnnotated.java
===================================================================
--- projects/jboss-reflect/trunk/src/test/java/org/jboss/test/classinfo/support/ClassInfoParameterAnnotationsNotAllParametersAnnotated.java	2010-07-21 13:56:15 UTC (rev 106980)
+++ projects/jboss-reflect/trunk/src/test/java/org/jboss/test/classinfo/support/ClassInfoParameterAnnotationsNotAllParametersAnnotated.java	2010-07-21 14:50:57 UTC (rev 106981)
@@ -35,6 +35,13 @@
    
    public void method(@SimpleAnnotation int i, int j)
    {
-      
    }
+   
+   public class InnerClass
+   {
+      public InnerClass(@SimpleAnnotation int i, int j)
+      {
+         
+      }
+   }
 }

Modified: projects/jboss-reflect/trunk/src/test/java/org/jboss/test/classinfo/test/AnnotatedClassInfoTest.java
===================================================================
--- projects/jboss-reflect/trunk/src/test/java/org/jboss/test/classinfo/test/AnnotatedClassInfoTest.java	2010-07-21 13:56:15 UTC (rev 106980)
+++ projects/jboss-reflect/trunk/src/test/java/org/jboss/test/classinfo/test/AnnotatedClassInfoTest.java	2010-07-21 14:50:57 UTC (rev 106981)
@@ -408,6 +408,20 @@
       assertSame(getTypeInfoFactory().getTypeInfo(SimpleAnnotation.class), methodParams[0].getAnnotations()[0].getAnnotationType());
    }
 
+   public void testInnerClassConstructorParameterAnnotationsNotAllParametersAnnotated() throws Throwable
+   {
+      ClassInfo info = assertInstanceOf(getTypeInfoFactory().getTypeInfo(ClassInfoParameterAnnotationsNotAllParametersAnnotated.InnerClass.class), ClassInfo.class);
+      
+      ConstructorInfo[] constructors = info.getDeclaredConstructors();
+      assertEquals(1, constructors.length);
+      ParameterInfo[] constructorParams = constructors[0].getParameters();
+      assertEquals(3, constructorParams.length);
+      assertEquals(0, constructorParams[2].getAnnotations().length);
+      assertEquals(0, constructorParams[0].getAnnotations().length);
+      assertEquals(1, constructorParams[1].getAnnotations().length);
+      assertSame(getTypeInfoFactory().getTypeInfo(SimpleAnnotation.class), constructorParams[1].getAnnotations()[0].getAnnotationType());
+   }
+
    private void checkNoAnnotations(AnnotatedInfo info)
    {
       assertNull(info.getAnnotation("x"));



More information about the jboss-cvs-commits mailing list