[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