[jboss-cvs] JBossAS SVN: r103926 - projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Tue Apr 13 13:28:02 EDT 2010


Author: kabir.khan at jboss.com
Date: 2010-04-13 13:28:02 -0400 (Tue, 13 Apr 2010)
New Revision: 103926

Modified:
   projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/AbstractJavassistBody.java
   projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/DefaultJavassistBody.java
   projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/InsertAfterJavassistBody.java
   projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/InsertBeforeJavassistBody.java
   projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistAnnotatedInfo.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/JavassistAnnotationInfo.java
   projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistArrayInfoImpl.java
   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/JavassistEnumInfo.java
   projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistFieldInfo.java
   projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistInheritableAnnotationHolder.java
   projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistMethodInfo.java
   projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistParameterInfo.java
   projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistTypeInfo.java
   projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistTypeInfoFactoryImpl.java
Log:
[JBREFLECT-5] Make fields final/volatile in the javassist implementation. Fix obvious concurrency issues, and eliminate some duplicate code

Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/AbstractJavassistBody.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/AbstractJavassistBody.java	2010-04-13 16:50:29 UTC (rev 103925)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/AbstractJavassistBody.java	2010-04-13 17:28:02 UTC (rev 103926)
@@ -33,7 +33,7 @@
  */
 public abstract class AbstractJavassistBody implements Body
 {
-   String body;
+   private final String body;
 
    AbstractJavassistBody(String body)
    {
@@ -44,6 +44,6 @@
       return body;
    }
    
-    abstract void createBody(CtBehavior behaviour);
+   abstract void createBody(CtBehavior behaviour);
    
 }

Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/DefaultJavassistBody.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/DefaultJavassistBody.java	2010-04-13 16:50:29 UTC (rev 103925)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/DefaultJavassistBody.java	2010-04-13 17:28:02 UTC (rev 103926)
@@ -39,7 +39,7 @@
    }
 
    @Override
-    void createBody(CtBehavior behavior)
+   void createBody(CtBehavior behavior)
    {
       try
       {

Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/InsertAfterJavassistBody.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/InsertAfterJavassistBody.java	2010-04-13 16:50:29 UTC (rev 103925)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/InsertAfterJavassistBody.java	2010-04-13 17:28:02 UTC (rev 103926)
@@ -39,7 +39,7 @@
    }
    
    @Override
-    void createBody(CtBehavior behavior)
+   void createBody(CtBehavior behavior)
    {
       try
       {

Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/InsertBeforeJavassistBody.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/InsertBeforeJavassistBody.java	2010-04-13 16:50:29 UTC (rev 103925)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/InsertBeforeJavassistBody.java	2010-04-13 17:28:02 UTC (rev 103926)
@@ -37,8 +37,9 @@
    {
       super(body);
    }
+   
    @Override
-    void createBody(CtBehavior behavior)
+   void createBody(CtBehavior behavior)
    {
       try
       {

Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistAnnotatedInfo.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistAnnotatedInfo.java	2010-04-13 16:50:29 UTC (rev 103925)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistAnnotatedInfo.java	2010-04-13 17:28:02 UTC (rev 103926)
@@ -46,12 +46,12 @@
    private static final HashMap<String, AnnotationValue> EMPTY_ANNOTATION_MAP = new HashMap<String, AnnotationValue>();
 
    /** The annotations */
-   protected AnnotationValue[] annotationsArray = NOT_CONFIGURED;
+   protected volatile AnnotationValue[] annotationsArray = NOT_CONFIGURED;
 
    /** Annotations map Map<String, AnnotationValue> */
-   protected HashMap<String, AnnotationValue> annotationMap;
+   protected volatile HashMap<String, AnnotationValue> annotationMap;
 
-   protected AnnotationHelper annotationHelper;
+   protected final AnnotationHelper annotationHelper;
    
    public JavassistAnnotatedInfo(AnnotationHelper annotationHelper)
    {

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-04-13 16:50:29 UTC (rev 103925)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistAnnotatedParameterInfo.java	2010-04-13 17:28:02 UTC (rev 103926)
@@ -22,11 +22,20 @@
 package org.jboss.reflect.plugins.javassist;
 
 import java.lang.annotation.Annotation;
+import java.lang.reflect.Modifier;
 
+import javassist.CannotCompileException;
+import javassist.CtBehavior;
+import javassist.CtClass;
+import javassist.NotFoundException;
+import javassist.bytecode.SignatureAttribute.MethodSignature;
+
 import org.jboss.reflect.plugins.AnnotationHelper;
 import org.jboss.reflect.spi.AnnotationInfo;
 import org.jboss.reflect.spi.AnnotationValue;
+import org.jboss.reflect.spi.Body;
 import org.jboss.reflect.spi.ClassInfo;
+import org.jboss.reflect.spi.ModifierInfo;
 import org.jboss.reflect.spi.ParameterInfo;
 import org.jboss.reflect.spi.TypeInfo;
 
@@ -41,22 +50,122 @@
    private static final long serialVersionUID = -494071110672611729L;
 
    /** The parameters */
-   protected transient ParameterInfo[] parameters;
+   protected transient volatile ParameterInfo[] parameters;
    
    /** The parameter types */
-   protected transient TypeInfo[] parameterTypes;
+   protected transient volatile TypeInfo[] parameterTypes;
    
    /** The exception types */
-   protected transient ClassInfo[] exceptionTypes;
+   protected transient volatile ClassInfo[] exceptionTypes;
    
    /** The type info */
-   protected JavassistTypeInfo typeInfo;
+   protected final JavassistTypeInfo typeInfo;
+   
+   /** The constructor or method */
+   protected final CtBehavior ctBehavior;
 
-   public JavassistAnnotatedParameterInfo(AnnotationHelper annotationHelper)
+
+   public JavassistAnnotatedParameterInfo(AnnotationHelper annotationHelper, JavassistTypeInfo typeInfo, CtBehavior ctBehavior)
    {
       super(annotationHelper);
+      this.typeInfo = typeInfo;
+      this.ctBehavior = ctBehavior;
    }
 
+   public int getModifiers()
+   {
+      return ctBehavior.getModifiers();
+   }
+
+   public boolean isPublic()
+   {
+      return Modifier.isPublic(ctBehavior.getModifiers());
+   }
+
+   public boolean isStatic()
+   {
+      return Modifier.isStatic(ctBehavior.getModifiers());
+   }
+
+   public boolean isVolatile()
+   {
+      return Modifier.isVolatile(ctBehavior.getModifiers());
+   }
+
+   public ClassInfo getDeclaringClass()
+   {
+      return typeInfo;
+   }
+
+   public ClassInfo[] getExceptionTypes()
+   {
+      if (exceptionTypes == null)
+      {
+         try
+         {
+            CtClass[] types = ctBehavior.getExceptionTypes();
+            ClassInfo[] exceptionTypes = new ClassInfo[types.length];
+            for (int i = 0; i < types.length; ++i)
+               exceptionTypes[i] = (ClassInfo) typeInfo.getFactory().getTypeInfo(types[i]);
+            
+            this.exceptionTypes = exceptionTypes;
+         }
+         catch (NotFoundException e)
+         {
+            throw JavassistTypeInfoFactoryImpl.raiseClassNotFound("for exception types of constructor", e);
+         }
+      }
+      return exceptionTypes;
+   }
+
+   protected synchronized void generateParameters()
+   {
+      if (parameters != null)
+         return;
+      
+      try
+      {
+         MethodSignature sig = JavassistHelper.getMethodSignature(ctBehavior);
+         if (sig != null && sig.getParameterTypes().length == ctBehavior.getParameterTypes().length)
+         {
+            parameterTypes = JavassistHelper.createParameterTypes(ctBehavior, sig, typeInfo);
+         }
+         else
+         {
+            CtClass[] types = ctBehavior.getParameterTypes();
+            parameterTypes = new TypeInfo[types.length];
+            for (int i = 0; i < types.length; ++i)
+               parameterTypes[i] = typeInfo.getFactory().getTypeInfo(types[i]);
+         }
+         parameters = new ParameterInfo[parameterTypes.length];
+         for (int i = 0; i < parameterTypes.length; ++i)
+            parameters[i] = new JavassistParameterInfo(annotationHelper, this, i, parameterTypes[i]);
+      }
+      catch (NotFoundException e)
+      {
+         throw JavassistTypeInfoFactoryImpl.raiseClassNotFound("for parameters of constructor", e);
+      }
+   }
+
+   public ParameterInfo[] getParameters()
+   {
+      if (parameters == null)
+         generateParameters();
+      return parameters;
+   }
+
+   public TypeInfo[] getParameterTypes()
+   {
+      if (parameterTypes == null)
+         generateParameters();
+      return parameterTypes;
+   }
+
+   public AnnotationValue[] getAnnotations()
+   {
+      return getAnnotations(ctBehavior);
+   }
+      
    protected void setupParameterAnnotations(Object[][] annotations)
    {
       for (int param = 0 ; param < annotations.length ; param++)
@@ -73,6 +182,92 @@
       }
    }
    
-   protected abstract void createParameterAnnotations();
+   protected void createParameterAnnotations()
+   {
+      try
+      {
+         Object[][] parameterAnnotations = ctBehavior.getParameterAnnotations();
+         setupParameterAnnotations(parameterAnnotations);
+      }
+      catch (ClassNotFoundException e)
+      {
+         // AutoGenerated
+         throw new RuntimeException(e);
+      }
+   }
 
+   public void setBody(Body body)
+   {
+      typeInfo.clearMethodCache();
+      if (body instanceof AbstractJavassistBody == false)
+      {
+         throw new IllegalArgumentException("Body is not an instance of AbstractJavassistBody");
+      }
+      ((AbstractJavassistBody)body).createBody(ctBehavior);
+   }
+
+   public void setExceptions(String[] exceptions)
+   {
+      typeInfo.clearMethodCache();
+      try
+      {
+         ctBehavior.setExceptionTypes(JavassistUtil.toCtClass(typeInfo.getCtClass().getClassPool(), exceptions));
+      }
+      catch (NotFoundException e)
+      {
+         throw new org.jboss.reflect.spi.NotFoundException(e.toString());
+      }
+   }
+
+   public void setExceptions(ClassInfo[] exceptions)
+   {
+      try
+      {
+         ctBehavior.setExceptionTypes(JavassistUtil.toCtClass(exceptions));
+      }
+      catch (NotFoundException e)
+      {
+         throw new org.jboss.reflect.spi.NotFoundException(e.toString());
+      }
+      typeInfo.clearMethodCache();
+   }
+
+   public void setModifier(ModifierInfo mi)
+   {
+      ctBehavior.setModifiers(mi.getModifiers());
+     typeInfo.clearMethodCache();
+   }
+
+   public void setParameters(String[] parameters)
+   {
+      for(String p : parameters)
+      {
+         try
+         {
+            ctBehavior.addParameter(JavassistUtil.toCtClass(typeInfo.getCtClass().getClassPool(), p));
+         }
+         catch (CannotCompileException e)
+         {
+            throw new org.jboss.reflect.spi.CannotCompileException(e.toString());
+         }
+      }
+      typeInfo.clearMethodCache();
+   }
+
+   public void setParameters(ClassInfo[] parameters)
+   {
+      for(ClassInfo clazz : parameters)
+      {
+         try
+         {
+            ctBehavior.addParameter(JavassistUtil.toCtClass(clazz));
+         }
+         catch (CannotCompileException e)
+         {
+            throw new org.jboss.reflect.spi.CannotCompileException(e.toString());
+         }
+      }
+      typeInfo.clearMethodCache();
+   }
+
 }

Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistAnnotationInfo.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistAnnotationInfo.java	2010-04-13 16:50:29 UTC (rev 103925)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistAnnotationInfo.java	2010-04-13 17:28:02 UTC (rev 103926)
@@ -41,10 +41,10 @@
    private static final long serialVersionUID = 3546645408219542832L;
    
    /** The attributes */
-   protected AnnotationAttribute[] attributes;
+   protected volatile AnnotationAttribute[] attributes;
    
    /** Attribute Map<String, AnnotationAttribute> */
-   protected HashMap<String, AnnotationAttribute> attributeMap;
+   protected volatile HashMap<String, AnnotationAttribute> attributeMap;
 
    public JavassistAnnotationInfo(JavassistTypeInfoFactoryImpl factory, CtClass ctClass, Class<? extends Object> clazz)
    {

Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistArrayInfoImpl.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistArrayInfoImpl.java	2010-04-13 16:50:29 UTC (rev 103925)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistArrayInfoImpl.java	2010-04-13 17:28:02 UTC (rev 103926)
@@ -50,10 +50,10 @@
    private volatile int modifiers;
 
    /** The component type */
-   protected TypeInfo componentType;
+   protected final TypeInfo componentType;
    
    /** The hash code */
-   protected int hash = -1;
+   protected final int hash;
 
    private static String getName(TypeInfo componentType)
    {
@@ -90,7 +90,7 @@
    {
       super(factory, getName(componentType), ctClass, clazz);
       this.componentType = componentType;
-      calculateHash();
+      hash = calculateHash();
    }
 
    @Override
@@ -137,11 +137,11 @@
    /**
     * Calculate the hash code
     */
-   protected void calculateHash()
+   protected int calculateHash()
    {
       int result = super.hashCode();
       result = 29 * result + componentType.hashCode();
-      hash = result;
+      return result;
    }
 
    @Override

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-04-13 16:50:29 UTC (rev 103925)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistConstructorInfo.java	2010-04-13 17:28:02 UTC (rev 103926)
@@ -21,24 +21,13 @@
 */
 package org.jboss.reflect.plugins.javassist;
 
-import java.lang.reflect.Modifier;
 import java.util.Arrays;
 
-import javassist.CannotCompileException;
-import javassist.CtClass;
 import javassist.CtConstructor;
-import javassist.NotFoundException;
-import javassist.bytecode.SignatureAttribute.MethodSignature;
 
 import org.jboss.reflect.plugins.AnnotationHelper;
-import org.jboss.reflect.spi.AnnotationValue;
-import org.jboss.reflect.spi.Body;
-import org.jboss.reflect.spi.ClassInfo;
 import org.jboss.reflect.spi.ConstructorInfo;
-import org.jboss.reflect.spi.ModifierInfo;
 import org.jboss.reflect.spi.MutableConstructorInfo;
-import org.jboss.reflect.spi.ParameterInfo;
-import org.jboss.reflect.spi.TypeInfo;
 import org.jboss.util.JBossStringBuilder;
 
 /**
@@ -62,11 +51,8 @@
    /** The reflection factory */
    private static final JavassistReflectionFactory reflectionFactory = new JavassistReflectionFactory(true);
  
-   /** The constructor */
-   private CtConstructor ctConstructor;
-   
    /** The constructor implementation */
-   private transient JavassistConstructor constructor;
+   private transient volatile JavassistConstructor constructor;
 
    /**
     * Create a new JavassistConstructorInfo.
@@ -77,73 +63,17 @@
     */
    public JavassistConstructorInfo(AnnotationHelper annotationHelper, JavassistTypeInfo typeInfo, CtConstructor ctConstructor)
    {
-      super(annotationHelper);
-      this.typeInfo = typeInfo;
-      this.ctConstructor = ctConstructor;
+      super(annotationHelper, typeInfo, ctConstructor);
    }
 
-   public int getModifiers()
-   {
-      return ctConstructor.getModifiers();
-   }
-
-   public boolean isPublic()
-   {
-      return Modifier.isPublic(ctConstructor.getModifiers());
-   }
-
-   public boolean isStatic()
-   {
-      return Modifier.isStatic(ctConstructor.getModifiers());
-   }
-
-   public boolean isVolatile()
-   {
-      return Modifier.isVolatile(ctConstructor.getModifiers());
-   }
-
-   public ClassInfo getDeclaringClass()
-   {
-      return typeInfo;
-   }
-
-   public ClassInfo[] getExceptionTypes()
-   {
-      if (exceptionTypes == null)
-      {
-         try
-         {
-            CtClass[] types = ctConstructor.getExceptionTypes();
-            exceptionTypes = new ClassInfo[types.length];
-            for (int i = 0; i < types.length; ++i)
-               exceptionTypes[i] = (ClassInfo) typeInfo.getFactory().getTypeInfo(types[i]);
-         }
-         catch (NotFoundException e)
-         {
-            throw JavassistTypeInfoFactoryImpl.raiseClassNotFound("for exception types of constructor", e);
-         }
-      }
-      return exceptionTypes;
-   }
-
-   public ParameterInfo[] getParameters()
-   {
-      if (parameters == null)
-         generateParameters();
-      return parameters;
-   }
-
-   public TypeInfo[] getParameterTypes()
-   {
-      if (parameterTypes == null)
-         generateParameters();
-      return parameterTypes;
-   }
-
    public Object newInstance(Object[] args) throws Throwable
    {
       if (constructor == null)
-         constructor = reflectionFactory.createConstructor(ctConstructor);
+      {
+         JavassistConstructor ctor = reflectionFactory.createConstructor((CtConstructor)ctBehavior);
+         if (constructor == null)
+            constructor = ctor; 
+      }
       
       JavassistAccessController.checkAccess(this);
       
@@ -154,7 +84,8 @@
    protected int getHashCode()
    {
       int result = getDeclaringClass().hashCode();
-      generateParameters();
+      if (parameters == null)
+         generateParameters();
       if (parameterTypes != null)
       {
          for (int i = 0; i < parameterTypes.length; i++)
@@ -186,131 +117,8 @@
       super.toString(buffer);
    }
    
-   /**
-    * Generate parameters
-    */
-   protected void generateParameters()
-   {
-      try
-      {
-         MethodSignature sig = JavassistHelper.getMethodSignature(ctConstructor);
-         if (sig != null && sig.getParameterTypes().length == ctConstructor.getParameterTypes().length)
-         {
-            parameterTypes = JavassistHelper.createParameterTypes(ctConstructor, sig, typeInfo);
-         }
-         else
-         {
-            CtClass[] types = ctConstructor.getParameterTypes();
-            parameterTypes = new TypeInfo[types.length];
-            for (int i = 0; i < types.length; ++i)
-               parameterTypes[i] = typeInfo.getFactory().getTypeInfo(types[i]);
-         }
-         parameters = new ParameterInfo[parameterTypes.length];
-         for (int i = 0; i < parameterTypes.length; ++i)
-            parameters[i] = new JavassistParameterInfo(annotationHelper, this, i, parameterTypes[i]);
-      }
-      catch (NotFoundException e)
-      {
-         throw JavassistTypeInfoFactoryImpl.raiseClassNotFound("for parameters of constructor", e);
-      }
-   }
-
-   public AnnotationValue[] getAnnotations()
-   {
-      return getAnnotations(ctConstructor);
-   }
-
-   @Override
-   protected void createParameterAnnotations()
-   {
-      try
-      {
-         Object[][] parameterAnnotations = ctConstructor.getParameterAnnotations();
-         super.setupParameterAnnotations(parameterAnnotations);
-      }
-      catch (ClassNotFoundException e)
-      {
-         // AutoGenerated
-         throw new RuntimeException(e);
-      }
-   }
-   
    protected CtConstructor getCtConstructor()
    {
-      return ctConstructor;
+      return (CtConstructor)ctBehavior;
    }
-
-   public void setBody(Body body)
-   {
-      if (body instanceof AbstractJavassistBody == false)
-      {
-         throw new IllegalArgumentException("Body is not an instance of AbstractJavassistBody");
-      }
-      ((AbstractJavassistBody)body).createBody(ctConstructor);
-      typeInfo.clearConstructorCache();
-   }
-
-   public void setExceptions(String[] exceptions)
-   {
-      try
-      {
-         ctConstructor.setExceptionTypes(JavassistUtil.toCtClass(typeInfo.getCtClass().getClassPool(), exceptions));
-      }
-      catch (NotFoundException e)
-      {
-         throw new org.jboss.reflect.spi.NotFoundException(e.toString());
-      }
-      typeInfo.clearConstructorCache();
-   }
-
-   public void setExceptions(ClassInfo[] exceptions)
-   {
-      try
-      {
-         ctConstructor.setExceptionTypes(JavassistUtil.toCtClass(exceptions));
-      }
-      catch (NotFoundException e)
-      {
-         throw new org.jboss.reflect.spi.NotFoundException(e.toString());
-      }
-      typeInfo.clearConstructorCache();
-   }
-
-   public void setModifier(ModifierInfo mi)
-   {
-      typeInfo.clearMethodCache();
-      ctConstructor.setModifiers(mi.getModifiers());
-   }
-
-   public void setParameters(String[] parameters)
-   {
-      for(String p : parameters)
-      {
-         try
-         {
-            ctConstructor.addParameter(JavassistUtil.toCtClass(typeInfo.getCtClass().getClassPool(), p));
-         }
-         catch (CannotCompileException e)
-         {
-            throw new org.jboss.reflect.spi.CannotCompileException(e.toString());
-         }
-      }
-      typeInfo.clearConstructorCache();
-   }
-
-   public void setParameters(ClassInfo[] parameters)
-   {
-      for(ClassInfo clazz : parameters)
-      {
-         try
-         {
-            ctConstructor.addParameter(JavassistUtil.toCtClass(clazz));
-         }
-         catch (CannotCompileException e)
-         {
-            throw new org.jboss.reflect.spi.CannotCompileException(e.toString());
-         }
-      }
-      typeInfo.clearConstructorCache();
-   }
 }

Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistEnumInfo.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistEnumInfo.java	2010-04-13 16:50:29 UTC (rev 103925)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistEnumInfo.java	2010-04-13 17:28:02 UTC (rev 103926)
@@ -40,10 +40,10 @@
    private static final long serialVersionUID = 3546645408219542832L;
    
    /** Enumeration constants */
-   protected EnumConstantInfoImpl[] enumConstants;
+   protected volatile EnumConstantInfoImpl[] enumConstants;
    
    /** The constants */
-   protected HashMap<String, EnumConstantInfo> constants = new HashMap<String, EnumConstantInfo>();
+   protected final HashMap<String, EnumConstantInfo> constants = new HashMap<String, EnumConstantInfo>();
 
    /**
     * Create a new JavassistEnumInfo.

Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistFieldInfo.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistFieldInfo.java	2010-04-13 16:50:29 UTC (rev 103925)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistFieldInfo.java	2010-04-13 17:28:02 UTC (rev 103926)
@@ -60,16 +60,16 @@
    private static final JavassistReflectionFactory reflectionFactory = new JavassistReflectionFactory(true);
 
    /** The field */
-   private CtField ctField;
+   private final CtField ctField;
    
    /** The field implementation */
-   private transient JavassistField field;
+   private transient volatile JavassistField field;
 
    /** The type */
-   private transient TypeInfo fieldType;
+   private transient volatile TypeInfo fieldType;
    
    /** The type info */
-   protected JavassistTypeInfo typeInfo;
+   protected final JavassistTypeInfo typeInfo;
 
    /**
     * Create a new JavassistFieldInfo.
@@ -125,11 +125,13 @@
          if (type != null)
          {
             ClassSignature sig = JavassistHelper.getClassSignature(ctField.getDeclaringClass());
-            return typeInfo.getFactory().getTypeInfo(typeInfo.getClassLoaderInternal(), type, JavassistTypeVariableSpy.createForField(sig));
+            fieldType = typeInfo.getFactory().getTypeInfo(typeInfo.getClassLoaderInternal(), type, JavassistTypeVariableSpy.createForField(sig));
          }
-         
-         CtClass clazz = ctField.getType();
-         fieldType = typeInfo.getFactory().getTypeInfo(clazz);
+         else
+         {
+            CtClass clazz = ctField.getType();
+            fieldType = typeInfo.getFactory().getTypeInfo(clazz);
+         }
          return fieldType;
       }
       catch (NotFoundException e)

Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistInheritableAnnotationHolder.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistInheritableAnnotationHolder.java	2010-04-13 16:50:29 UTC (rev 103925)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistInheritableAnnotationHolder.java	2010-04-13 17:28:02 UTC (rev 103926)
@@ -44,12 +44,14 @@
    private static final String INHERITED_NAME = Inherited.class.getName();//This 
 
    /** All annotations Map<String, AnnotationValue> */
-   protected Map<String, AnnotationValue> allAnnotations;
+   protected volatile Map<String, AnnotationValue> allAnnotations;
 
    /** All annotations */
-   protected AnnotationValue[] allAnnotationsArray = NOT_CONFIGURED;
+   protected volatile AnnotationValue[] allAnnotationsArray = NOT_CONFIGURED;
+   
+   protected boolean initialized;
 
-   protected CtClass ctClass;
+   protected final CtClass ctClass;
 
    public JavassistInheritableAnnotationHolder(CtClass ctClass, AnnotationHelper annotationHelper)
    {
@@ -67,13 +69,17 @@
    @Override
    protected AnnotationValue[] getAnnotations(Object obj)
    {
-      synchronized (this)
+      if (!initialized)
       {
-         if (allAnnotationsArray == NOT_CONFIGURED)
+         synchronized (this)
          {
-            allAnnotationsArray = annotationHelper.getAnnotations(obj);
-            setupAnnotations(allAnnotationsArray);
-
+            if (!initialized)
+            {
+               AnnotationValue[] allAnnotations = annotationHelper.getAnnotations(obj);
+               allAnnotationsArray = allAnnotations;
+               setupAnnotations(allAnnotations);
+               initialized = true;
+            }
          }
       }
       return allAnnotationsArray;

Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistMethodInfo.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistMethodInfo.java	2010-04-13 16:50:29 UTC (rev 103925)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistMethodInfo.java	2010-04-13 17:28:02 UTC (rev 103926)
@@ -21,11 +21,8 @@
 */
 package org.jboss.reflect.plugins.javassist;
 
-import java.lang.reflect.Modifier;
 import java.util.Arrays;
 
-import javassist.CannotCompileException;
-import javassist.CtBehavior;
 import javassist.CtClass;
 import javassist.CtMethod;
 import javassist.NotFoundException;
@@ -33,14 +30,10 @@
 import javassist.bytecode.SignatureAttribute.MethodSignature;
 
 import org.jboss.reflect.plugins.AnnotationHelper;
-import org.jboss.reflect.spi.AnnotationValue;
-import org.jboss.reflect.spi.Body;
 import org.jboss.reflect.spi.ClassInfo;
 import org.jboss.reflect.spi.MethodInfo;
-import org.jboss.reflect.spi.ModifierInfo;
 import org.jboss.reflect.spi.MutableMethodInfo;
 import org.jboss.reflect.spi.MutableMethodInfoCommand;
-import org.jboss.reflect.spi.ParameterInfo;
 import org.jboss.reflect.spi.TypeInfo;
 import org.jboss.util.JBossStringBuilder;
 
@@ -66,11 +59,8 @@
    /** The reflection factory */
    private static final JavassistReflectionFactory reflectionFactory = new JavassistReflectionFactory(true);
    
-   /** The method */
-   private CtMethod ctMethod;
-   
    /** The method implementation */
-   private transient JavassistMethod method;
+   private transient volatile JavassistMethod method;
    
    /** The return type */
    private transient TypeInfo returnType;
@@ -84,14 +74,13 @@
     */
    public JavassistMethodInfo(AnnotationHelper annotationHelper, JavassistTypeInfo typeInfo, CtMethod ctMethod)
    {
-      super(annotationHelper);
-      this.typeInfo = typeInfo;
-      this.ctMethod = ctMethod;
+      super(annotationHelper, typeInfo, ctMethod);
+      //this.ctMethod = ctMethod;
    }
 
    public String getName()
    {
-      return ctMethod.getName();
+      return ((CtMethod)ctBehavior).getName();
    }
 
    public ClassInfo getDeclaringClass()
@@ -99,51 +88,13 @@
       return typeInfo;
    }
 
-   public int getModifiers()
-   {
-      return ctMethod.getModifiers();
-   }
-
-   public boolean isPublic()
-   {
-      return Modifier.isPublic(getModifiers());
-   }
-
-   public boolean isStatic()
-   {
-      return Modifier.isStatic(getModifiers());
-   }
-
-   public boolean isVolatile()
-   {
-      return Modifier.isVolatile(getModifiers());
-   }
-
-   public ClassInfo[] getExceptionTypes()
-   {
-      if (exceptionTypes == null)
-      {
-         try
-         {
-            CtClass[] types = ctMethod.getExceptionTypes();
-            exceptionTypes = new ClassInfo[types.length];
-            for (int i = 0; i < types.length; ++i)
-               exceptionTypes[i] = (ClassInfo) typeInfo.getFactory().getTypeInfo(types[i]);
-         }
-         catch (NotFoundException e)
-         {
-            throw JavassistTypeInfoFactoryImpl.raiseClassNotFound("for exception types of method " + getName(), e);
-         }
-      }
-      return exceptionTypes;
-   }
-
    public TypeInfo getReturnType()
    {
       if (returnType != null)
          return returnType;
       try
       {
+         CtMethod ctMethod = (CtMethod)ctBehavior;
          MethodSignature sig = JavassistHelper.getMethodSignature(ctMethod);
          if (sig != null)
          {
@@ -160,24 +111,10 @@
       }
    }
 
-   public ParameterInfo[] getParameters()
-   {
-      if (parameters == null)
-         generateParameters();
-      return parameters;
-   }
-
-   public TypeInfo[] getParameterTypes()
-   {
-      if (parameterTypes == null)
-         generateParameters();
-      return parameterTypes;
-   }
-
    public Object invoke(Object target, Object[] args) throws Throwable
    {
       if (method == null)
-         method = reflectionFactory.createMethod(ctMethod);
+         method = reflectionFactory.createMethod((CtMethod)ctBehavior);
       
       JavassistAccessController.checkAccess(this);
       
@@ -221,61 +158,7 @@
       buffer.append("name=").append(getName());
       super.toString(buffer);
    }
-   
-   /**
-    * Generate parameters
-    */
-   protected void generateParameters()
-   {
-      try
-      {
-         MethodSignature sig = JavassistHelper.getMethodSignature(ctMethod);
-         if (sig != null && sig.getParameterTypes().length == ctMethod.getParameterTypes().length)
-         {
-            parameterTypes = JavassistHelper.createParameterTypes(ctMethod, sig, typeInfo);
-         }
-         else
-         {
-            CtClass[] types = ctMethod.getParameterTypes();
-            parameterTypes = new TypeInfo[types.length];
-            for (int i = 0; i < types.length; ++i)
-               parameterTypes[i] = typeInfo.getFactory().getTypeInfo(types[i]);
-         }
-         parameters = new ParameterInfo[parameterTypes.length];
-         for (int i = 0; i < parameterTypes.length; ++i)
-            parameters[i] = new JavassistParameterInfo(annotationHelper, this, i, parameterTypes[i]);
-      }
-      catch (NotFoundException e)
-      {
-         throw JavassistTypeInfoFactoryImpl.raiseClassNotFound("for parameters of " + getName(), e);
-      }
-   }
-   
-   public AnnotationValue[] getAnnotations()
-   {
-      return getAnnotations(ctMethod);
-   }
 
-   protected CtBehavior getParameterizedObject()
-   {
-      return ctMethod;
-   }
-
-   @Override
-   protected void createParameterAnnotations()
-   {
-      try
-      {
-         Object[][] parameterAnnotations = ctMethod.getParameterAnnotations();
-         super.setupParameterAnnotations(parameterAnnotations);
-      }
-      catch (ClassNotFoundException e)
-      {
-         // AutoGenerated
-         throw new RuntimeException(e);
-      }
-   }
-
    //TODO: need to be implemented...
    public void executeCommand(MutableMethodInfoCommand mmc)
    {
@@ -283,89 +166,15 @@
    
    public CtMethod getCtMethod()
    {
-      return ctMethod;
+      return (CtMethod)ctBehavior;
    }
 
-   public void setBody(Body body)
-   {
-      typeInfo.clearMethodCache();
-      if (body instanceof AbstractJavassistBody == false)
-      {
-         throw new IllegalArgumentException("Body is not an instance of AbstractJavassistBody");
-      }
-      ((AbstractJavassistBody)body).createBody(ctMethod);
-   }
-
-   public void setExceptions(String[] exceptions)
-   {
-      typeInfo.clearMethodCache();
-      try
-      {
-         ctMethod.setExceptionTypes(JavassistUtil.toCtClass(typeInfo.getCtClass().getClassPool(), exceptions));
-      }
-      catch (NotFoundException e)
-      {
-         throw new org.jboss.reflect.spi.NotFoundException(e.toString());
-      }
-   }
-
-   public void setExceptions(ClassInfo[] exceptions)
-   {
-      try
-      {
-         ctMethod.setExceptionTypes(JavassistUtil.toCtClass(exceptions));
-      }
-      catch (NotFoundException e)
-      {
-         throw new org.jboss.reflect.spi.NotFoundException(e.toString());
-      }
-      typeInfo.clearMethodCache();
-   }
-
-   public void setModifier(ModifierInfo mi)
-   {
-     ctMethod.setModifiers(mi.getModifiers());
-     typeInfo.clearMethodCache();
-   }
-
    public void setName(String name)
    {
-      ctMethod.setName(name);
+      ((CtMethod)ctBehavior).setName(name);
       typeInfo.clearMethodCache();
    }
 
-   public void setParameters(String[] parameters)
-   {
-      for(String p : parameters)
-      {
-         try
-         {
-            ctMethod.addParameter(JavassistUtil.toCtClass(typeInfo.getCtClass().getClassPool(), p));
-         }
-         catch (CannotCompileException e)
-         {
-            throw new org.jboss.reflect.spi.CannotCompileException(e.toString());
-         }
-      }
-      typeInfo.clearMethodCache();
-   }
-
-   public void setParameters(ClassInfo[] parameters)
-   {
-      for(ClassInfo clazz : parameters)
-      {
-         try
-         {
-            ctMethod.addParameter(JavassistUtil.toCtClass(clazz));
-         }
-         catch (CannotCompileException e)
-         {
-            throw new org.jboss.reflect.spi.CannotCompileException(e.toString());
-         }
-      }
-      typeInfo.clearMethodCache();
-   }
-
    public void setReturnType(String returnType)
    {
       throw new RuntimeException("Method not supported by Javassist");

Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistParameterInfo.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistParameterInfo.java	2010-04-13 16:50:29 UTC (rev 103925)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistParameterInfo.java	2010-04-13 17:28:02 UTC (rev 103926)
@@ -39,13 +39,13 @@
    private static final long serialVersionUID = 7388866103874412735L;
 
    /** The annotated info */
-   private JavassistAnnotatedParameterInfo annotated;
+   private final JavassistAnnotatedParameterInfo annotated;
    
    /** The name */
-   private String name;
+   private final String name;
    
    /** The paramter type */
-   private TypeInfo parameterType;
+   private final TypeInfo parameterType;
    
    /**
     * Create a new JavassistParameterInfo.

Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistTypeInfo.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistTypeInfo.java	2010-04-13 16:50:29 UTC (rev 103925)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistTypeInfo.java	2010-04-13 17:28:02 UTC (rev 103926)
@@ -34,7 +34,6 @@
 import java.util.concurrent.CopyOnWriteArrayList;
 
 import javassist.CannotCompileException;
-import javassist.ClassPool;
 import javassist.CtClass;
 import javassist.CtConstructor;
 import javassist.CtField;
@@ -80,36 +79,36 @@
    private JavassistTypeInfoFactoryImpl factory;
 
    /** The name */
-   private String name;
+   private final String name;
    
    /** The class */
-   private Class<? extends Object> clazz;
+   private volatile Class<? extends Object> clazz;
 
    /** The constructors */
-   private Map<SignatureKey, JavassistConstructorInfo> constructors = new ConcurrentHashMap<SignatureKey, JavassistConstructorInfo>();
+   private final Map<SignatureKey, JavassistConstructorInfo> constructors = new ConcurrentHashMap<SignatureKey, JavassistConstructorInfo>();
 
    /** The constructors */
-   private MutableConstructorInfo[] constructorArray;
+   private volatile MutableConstructorInfo[] constructorArray;
 
    /** The fields */
-   private Map<String, JavassistFieldInfo> fields = new ConcurrentHashMap<String, JavassistFieldInfo>();
+   private final Map<String, JavassistFieldInfo> fields = new ConcurrentHashMap<String, JavassistFieldInfo>();
 
    /** The fields */
-   private MutableFieldInfo[] fieldArray;
+   private volatile MutableFieldInfo[] fieldArray;
 
    /** The methods */
-   private Map<SignatureKey, JavassistMethodInfo> methods = new ConcurrentHashMap<SignatureKey, JavassistMethodInfo>();
+   private final Map<SignatureKey, JavassistMethodInfo> methods = new ConcurrentHashMap<SignatureKey, JavassistMethodInfo>();
    
-   private Map<SignatureKey, List<JavassistMethodInfo>> volatileMethods = new HashMap<SignatureKey, List<JavassistMethodInfo>>(); 
+   private final Map<SignatureKey, List<JavassistMethodInfo>> volatileMethods = new HashMap<SignatureKey, List<JavassistMethodInfo>>(); 
 
    /** The methods */
-   private MutableMethodInfo[] methodArray;
+   private volatile MutableMethodInfo[] methodArray;
 
    /** The package info */
-   private PackageInfo packageInfo;
+   private volatile PackageInfo packageInfo;
    
    /** The attachments */
-   private transient TypeInfoAttachments attachments;
+   private transient volatile TypeInfoAttachments attachments;
    
    /** The generic super class */
    private volatile ClassInfo genericSuperClass = ClassInfoImpl.UNKNOWN_CLASS;

Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistTypeInfoFactoryImpl.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistTypeInfoFactoryImpl.java	2010-04-13 16:50:29 UTC (rev 103925)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistTypeInfoFactoryImpl.java	2010-04-13 17:28:02 UTC (rev 103926)
@@ -41,7 +41,6 @@
 import javassist.bytecode.SignatureAttribute.ArrayType;
 import javassist.bytecode.SignatureAttribute.BaseType;
 import javassist.bytecode.SignatureAttribute.ClassType;
-import javassist.bytecode.SignatureAttribute.NestedClassType;
 import javassist.bytecode.SignatureAttribute.ObjectType;
 import javassist.bytecode.SignatureAttribute.TypeArgument;
 




More information about the jboss-cvs-commits mailing list