[jboss-cvs] JBossAS SVN: r83573 - in projects/aop/trunk: asintegration-mc/src/main/java/org/jboss/aop/classpool/jbosscl and 1 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Wed Jan 28 13:06:55 EST 2009


Author: kabir.khan at jboss.com
Date: 2009-01-28 13:06:55 -0500 (Wed, 28 Jan 2009)
New Revision: 83573

Modified:
   projects/aop/trunk/aop/src/main/java/org/jboss/aop/util/ClassLoaderUtils.java
   projects/aop/trunk/asintegration-mc/src/main/java/org/jboss/aop/classpool/jbosscl/JBossClClassPoolDomain.java
   projects/aop/trunk/asintegration-mc/src/test/java/org/jboss/test/aop/classpool/jbosscl/test/ClassPoolWithRepositoryTestCase.java
Log:
[JBAOP-666] Test primitive arrays in jboss-cl pools

Modified: projects/aop/trunk/aop/src/main/java/org/jboss/aop/util/ClassLoaderUtils.java
===================================================================
--- projects/aop/trunk/aop/src/main/java/org/jboss/aop/util/ClassLoaderUtils.java	2009-01-28 17:49:03 UTC (rev 83572)
+++ projects/aop/trunk/aop/src/main/java/org/jboss/aop/util/ClassLoaderUtils.java	2009-01-28 18:06:55 UTC (rev 83573)
@@ -21,6 +21,13 @@
 */ 
 package org.jboss.aop.util;
 
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+import javassist.CtClass;
+import javassist.bytecode.Descriptor;
+
 /**
  * 
  * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
@@ -28,6 +35,22 @@
  */
 public class ClassLoaderUtils
 {
+   private static final Set<String> primitiveNames;
+   static
+   {
+      Set<String> temp = new HashSet<String>();
+      temp.add(CtClass.booleanType.getName());
+      temp.add(CtClass.byteType.getName());
+      temp.add(CtClass.charType.getName());
+      temp.add(CtClass.doubleType.getName());
+      temp.add(CtClass.floatType.getName());
+      temp.add(CtClass.intType.getName());
+      temp.add(CtClass.longType.getName());
+      temp.add(CtClass.shortType.getName());
+      temp.add(CtClass.voidType.getName());
+      primitiveNames = Collections.unmodifiableSet(temp); 
+   }
+   
    public static String getResourceName(String classname)
    {
       final String name = stripArrayFromClassName(classname);
@@ -57,10 +80,20 @@
    
    public static String stripArrayFromClassName(String classname)
    {
+      if (classname.charAt(0) == '[')
+      {
+         return Descriptor.toClassName(classname);
+      }
       if (classname.endsWith("[]"))
       {
          return classname.substring(0, classname.indexOf("[]"));
       }
       return classname;
    }
+   
+   public static boolean isPrimitiveType(String classname)
+   {
+      final String name = stripArrayFromClassName(classname);
+      return primitiveNames.contains(name);
+   }
 }

Modified: projects/aop/trunk/asintegration-mc/src/main/java/org/jboss/aop/classpool/jbosscl/JBossClClassPoolDomain.java
===================================================================
--- projects/aop/trunk/asintegration-mc/src/main/java/org/jboss/aop/classpool/jbosscl/JBossClClassPoolDomain.java	2009-01-28 17:49:03 UTC (rev 83572)
+++ projects/aop/trunk/asintegration-mc/src/main/java/org/jboss/aop/classpool/jbosscl/JBossClClassPoolDomain.java	2009-01-28 18:06:55 UTC (rev 83573)
@@ -32,6 +32,7 @@
 
 import javassist.ClassPool;
 import javassist.CtClass;
+import javassist.CtPrimitiveType;
 import javassist.NotFoundException;
 
 import org.jboss.aop.AspectManager;
@@ -119,45 +120,69 @@
    protected CtClass getCachedOrCreate(DelegatingClassPool initiatingPool, String classname, String resourceName, boolean create, boolean trace)
    {
       if (trace) logger.trace(this + " looking for " + classname);
-      Module module = getModuleForPool(initiatingPool);
-      if (module != null && module.isImportAll())
-      {
-         //Use the old "big ball of mud" model
-         if (trace) logger.trace(this + " isImportAll");
-         return super.getCachedOrCreate(initiatingPool, classname, resourceName, create, trace);
-      }
       
-      //Attempt OSGi style loading
-      CtClass clazz = null;
-      if (isParentBefore(classname))
+      CtClass clazz = getCheckPrimitive(classname);
+      if (clazz != null)
       {
-         if (trace) logger.trace(this + " checking parent first for " + classname);
-         clazz = getCachedOrCreateFromParent(null, classname, resourceName, create, trace);
+         if (trace) logger.trace(this + " isPrimitive " + classname);
       }
-      
-      //Check imports first
-      if (clazz == null && module != null)
+      else
       {
-         if (trace) logger.trace(this + " checking imports for " + classname);
-         clazz = getCtClassFromModule(module, classname, trace);
+         Module module = getModuleForPool(initiatingPool);
+         if (module != null && module.isImportAll())
+         {
+            //Use the old "big ball of mud" model
+            if (trace) logger.trace(this + " isImportAll");
+            return super.getCachedOrCreate(initiatingPool, classname, resourceName, create, trace);
+         }
+         
+         //Attempt OSGi style loading
+         if (isParentBefore(classname))
+         {
+            if (trace) logger.trace(this + " checking parent first for " + classname);
+            clazz = getCachedOrCreateFromParent(null, classname, resourceName, create, trace);
+         }
+         
+         //Check imports first
+         if (clazz == null && module != null)
+         {
+            if (trace) logger.trace(this + " checking imports for " + classname);
+            clazz = getCtClassFromModule(module, classname, trace);
+         }
+         
+         //Try to check the initiating pool itself
+         if (clazz == null && initiatingPool != null)
+         {
+            if (trace) logger.trace(this + " checking pool " + initiatingPool + " locally for " + classname);
+            clazz = initiatingPool.loadLocally(classname, resourceName, create);
+         }
+         
+         if (clazz == null && isParentAfter(classname))
+         {
+            if (trace) logger.trace(this + " checking parent last for " + classname);
+            clazz = getCachedOrCreateFromParent(null, classname, resourceName, create, trace);
+         }
       }
-      
-      //Try to check the initiating pool itself
-      if (clazz == null && initiatingPool != null)
-      {
-         if (trace) logger.trace(this + " checking pool " + initiatingPool + " locally for " + classname);
-         clazz = initiatingPool.loadLocally(classname, resourceName, create);
-      }
-      
-      if (clazz == null && isParentAfter(classname))
-      {
-         if (trace) logger.trace(this + " checking parent last for " + classname);
-         clazz = getCachedOrCreateFromParent(null, classname, resourceName, create, trace);
-      }
       if (trace) logger.trace(this + " found " + classname + " in " + (clazz == null ? "null" : clazz.getClassPool()));
       return clazz;
    }
    
+   private CtClass getCheckPrimitive(String classname)
+   {
+      if (ClassLoaderUtils.isPrimitiveType(classname))
+      {
+         try
+         {
+            return ClassPool.getDefault().get(classname);
+         }
+         catch(NotFoundException e)
+         {
+            throw new RuntimeException(classname + " should have been a primitive", e);
+         }
+      }
+      return null;
+   }
+   
    private Module getModuleForPool(DelegatingClassPool pool)
    {
       if (pool == null)

Modified: projects/aop/trunk/asintegration-mc/src/test/java/org/jboss/test/aop/classpool/jbosscl/test/ClassPoolWithRepositoryTestCase.java
===================================================================
--- projects/aop/trunk/asintegration-mc/src/test/java/org/jboss/test/aop/classpool/jbosscl/test/ClassPoolWithRepositoryTestCase.java	2009-01-28 17:49:03 UTC (rev 83572)
+++ projects/aop/trunk/asintegration-mc/src/test/java/org/jboss/test/aop/classpool/jbosscl/test/ClassPoolWithRepositoryTestCase.java	2009-01-28 18:06:55 UTC (rev 83573)
@@ -21,6 +21,7 @@
 */ 
 package org.jboss.test.aop.classpool.jbosscl.test;
 
+import org.jboss.aop.classpool.ClassPoolDomain;
 import org.jboss.classloader.spi.ClassLoaderDomain;
 
 import javassist.ClassPool;
@@ -672,6 +673,55 @@
       }
    }
    
+   public void testCanLoadArrrayCtClass() throws Exception
+   {
+      ClassPool poolA = null;
+      ClassPool poolB = null;
+      try
+      {
+         poolA = createClassPool("A", true, JAR_A_1);
+         poolB = createClassPool("B", true, JAR_B_1);
+         accessCanLoadCtArray(poolA, poolB);
+         accessCanLoadCtArray(poolA, poolB);
+      }
+      finally
+      {
+         unregisterClassPool(poolA);
+         unregisterClassPool(poolB);
+      }
+   }
+   
+   private void accessCanLoadCtArray(ClassPool poolA, ClassPool poolB) throws Exception
+   {
+      CtClass x = poolA.get(String.class.getName() + "[][]");
+      CtClass a = poolA.get(CLASS_A);
+      CtClass aArray = poolA.get(CLASS_A + "[]");
+      CtClass bArray = poolA.get(CLASS_B + "[][]");
+      CtClass b = poolA.get(CLASS_B);
+      
+      CtClass byteClassA = poolA.get("byte");
+      CtClass byteClassB = poolB.get("byte");
+      assertSame(byteClassA, byteClassB);
+      assertNotSame(poolA, byteClassA.getClassPool());
+      assertNotSame(poolB, byteClassA.getClassPool());
+      CtClass intArrayClass = poolA.get("int[]");
+      CtClass intClass = poolB.get("int");
+      assertSame(intClass, intArrayClass.getComponentType());
+      assertSame(byteClassA.getClassPool(), intClass.getClassPool());
+      
+      
+      
+      assertTrue(aArray.isArray());
+      assertSame(a, aArray.getComponentType());
+      assertTrue(bArray.isArray());
+      assertTrue(bArray.getComponentType().isArray());
+      assertSame(b, bArray.getComponentType().getComponentType());
+      assertNotSame(aArray.getClassPool(), bArray.getClassPool());
+      assertSame(poolA, aArray.getClassPool());
+      assertSame(poolB, bArray.getClassPool());
+      assertSame(a.getClassPool(), aArray.getClassPool());
+      assertSame(b.getClassPool(), bArray.getClassPool());
+   }
 
 /* 
    The folllowing two tests are probably not very realistic http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4195022#4195022




More information about the jboss-cvs-commits mailing list