You are viewing a plain text version of this content. The canonical link for it is here.
Posted to xmlbeans-cvs@xml.apache.org by pc...@apache.org on 2004/07/31 02:14:17 UTC
cvs commit: xml-xmlbeans/v2/jam/test/tests/org/apache/xmlbeans/test/jam JamTestBase.java
pcal 2004/07/30 17:14:17
Modified: v2/jam/src/org/apache/xmlbeans/impl/jam/internal
JamClassLoaderImpl.java
v2/jam/src/org/apache/xmlbeans/impl/jam/internal/elements
ArrayClassImpl.java
v2/jam/src/org/apache/xmlbeans/impl/jam/provider
JamClassBuilder.java
v2/jam/test/tests/org/apache/xmlbeans/test/jam
JamTestBase.java
Log:
jam: handle 'fully-qualified' array names as well as field descriptors
Revision Changes Path
1.15 +19 -7 xml-xmlbeans/v2/jam/src/org/apache/xmlbeans/impl/jam/internal/JamClassLoaderImpl.java
Index: JamClassLoaderImpl.java
===================================================================
RCS file: /home/cvs/xml-xmlbeans/v2/jam/src/org/apache/xmlbeans/impl/jam/internal/JamClassLoaderImpl.java,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- JamClassLoaderImpl.java 22 Jun 2004 21:45:57 -0000 1.14
+++ JamClassLoaderImpl.java 31 Jul 2004 00:14:16 -0000 1.15
@@ -63,10 +63,18 @@
public final JClass loadClass(String fd)
{
- MClass out = cacheGet(fd);
+ fd = fd.trim();
+ JClass out = cacheGet(fd);
if (out != null) return out;
- if (fd.startsWith("[")) {
- return ArrayClassImpl.createClassForFD(fd,this);
+ if (fd.indexOf('[') != -1) { // must be some kind of array name
+ String normalFd = ArrayClassImpl.normalizeArrayName(fd);
+ out = cacheGet(normalFd); // an array by any other name?
+ if (out == null) {
+ out = ArrayClassImpl.createClassForFD(normalFd,this);
+ cachePut(out,normalFd);
+ }
+ cachePut(out,fd); // so we know it by the requested name as well
+ return out;
}
{
// check for loading inner class by name. if it's not in the cache
@@ -142,22 +150,26 @@
mFd2ClassCache.put("void",new VoidClassImpl(mContext));
}
- private void cachePut(MClass clazz) {
+ private void cachePut(JClass clazz) {
mFd2ClassCache.put(new String(clazz.getFieldDescriptor().trim()),
new WeakReference(clazz));
}
- private MClass cacheGet(String fd) {
+ private void cachePut(JClass clazz, String cachedName) {
+ mFd2ClassCache.put(cachedName, new WeakReference(clazz));
+ }
+
+ private JClass cacheGet(String fd) {
Object out = mFd2ClassCache.get(fd.trim());
if (out == null) return null;
- if (out instanceof MClass) return (MClass)out;
+ if (out instanceof JClass) return (JClass)out;
if (out instanceof WeakReference) {
out = ((WeakReference)out).get();
if (out == null) {
mFd2ClassCache.remove(fd.trim());
return null;
} else {
- return (MClass)out;
+ return (JClass)out;
}
}
throw new IllegalStateException();
1.4 +31 -0 xml-xmlbeans/v2/jam/src/org/apache/xmlbeans/impl/jam/internal/elements/ArrayClassImpl.java
Index: ArrayClassImpl.java
===================================================================
RCS file: /home/cvs/xml-xmlbeans/v2/jam/src/org/apache/xmlbeans/impl/jam/internal/elements/ArrayClassImpl.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- ArrayClassImpl.java 10 Mar 2004 11:42:08 -0000 1.3
+++ ArrayClassImpl.java 31 Jul 2004 00:14:16 -0000 1.4
@@ -20,6 +20,7 @@
import org.apache.xmlbeans.impl.jam.JProperty;
import java.io.StringWriter;
+import java.util.StringTokenizer;
/**
@@ -74,6 +75,36 @@
return new ArrayClassImpl(primType,dims);
}
}
+
+ /**
+ * Returns the normal form for a given array name. This is a trimmed,
+ * unspaced field descriptor, e.g. '[[[Ljava.lang.String;' for a three
+ * dimensional array of strings. This method will also normalize
+ * understands declaration-style array names, e.g. 'java.lang.String[][][]'.
+ */
+ public static String normalizeArrayName(String declaration) {
+ //REVIEW should we worry about internal spaces?
+ if (declaration.startsWith("[")) return declaration;
+ if (declaration.endsWith("]")) {
+ int bracket = declaration.indexOf('[');
+ if (bracket != -1) {
+ String typeName = declaration.substring(0,bracket);
+ String fd = PrimitiveClassImpl.getPrimitiveClassForName(typeName);
+ if (fd == null) fd = 'L'+typeName+';';
+ StringWriter out = new StringWriter();
+ do {
+ out.write('[');
+ bracket = declaration.indexOf('[',bracket+1);
+ } while(bracket != -1);
+ out.write(fd);
+ return out.toString();
+ }
+ }
+ throw new IllegalArgumentException("'"+declaration+
+ "' does not name an array");
+ }
+
+
// ========================================================================
// Constructors - use factory method
1.17 +6 -3 xml-xmlbeans/v2/jam/src/org/apache/xmlbeans/impl/jam/provider/JamClassBuilder.java
Index: JamClassBuilder.java
===================================================================
RCS file: /home/cvs/xml-xmlbeans/v2/jam/src/org/apache/xmlbeans/impl/jam/provider/JamClassBuilder.java,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -r1.16 -r1.17
--- JamClassBuilder.java 19 Jul 2004 18:23:42 -0000 1.16
+++ JamClassBuilder.java 31 Jul 2004 00:14:16 -0000 1.17
@@ -86,9 +86,12 @@
* class to create
* @param className simple name of the class to create.
* @param importSpecs array of import specs to be used in the class,
- * or null if not known or relevant. Import specs are only needed if
- * the builder is planning on setting any unqualified type references
- * on the class.
+ * or null if not known or relevant. Import specs are only strictly
+ * required if the builder is planning on setting any unqualified type
+ * references on the class. The importspec values will be used in
+ * determining what is retuned by JClass.getImportedPackages() and
+ * getImportedClasses(). Note that an importSpec does not include the
+ * word 'import' - e.g. it should only be 'java.util.List' or 'java.util.*'
*/
protected MClass createClassToBuild(String packageName,
String className,
1.30 +23 -0 xml-xmlbeans/v2/jam/test/tests/org/apache/xmlbeans/test/jam/JamTestBase.java
Index: JamTestBase.java
===================================================================
RCS file: /home/cvs/xml-xmlbeans/v2/jam/test/tests/org/apache/xmlbeans/test/jam/JamTestBase.java,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -r1.29 -r1.30
--- JamTestBase.java 22 Jun 2004 21:45:57 -0000 1.29
+++ JamTestBase.java 31 Jul 2004 00:14:17 -0000 1.30
@@ -267,6 +267,24 @@
// ========================================================================
// Test methods
+
+ public void testArrayNames() {
+ doOneArrayTest("int[]","[I");
+ doOneArrayTest("boolean[][]","[[Z");
+ doOneArrayTest("java.lang.Object[]","[Ljava.lang.Object;");
+ doOneArrayTest("java.lang.String[][][]","[[[Ljava.lang.String;");
+ }
+
+ private void doOneArrayTest(String decl, String fd) {
+ JClass a = mLoader.loadClass(decl);
+ JClass b = mLoader.loadClass(fd);
+ assertTrue("didn't get same array class for int array", a == b);
+ assertTrue("it isn't an array!", a.isArrayType());
+ assertTrue("wrong name ", a.getQualifiedName().equals(decl));
+ assertTrue("wrong fd ", a.getFieldDescriptor().equals(fd));
+ }
+
+
public void testInnerClasses() {
// make sure we can load it by name this way
resolved(mLoader.loadClass(INNER_A));
@@ -333,6 +351,7 @@
}
}
+
public void testAnnotationValuesById() {
if (!isAnnotationsAvailable()) return;
JClass clazz = resolved(mLoader.loadClass(DUMMY+".ValuesById"));
@@ -464,6 +483,8 @@
String[] akas = aka.asStringArray();
assertTrue("akas is null",akas != null);
assertTrue("akas length is "+akas.length, akas.length == 3);
+ assertTrue("akas type is not an array ", type.isArrayType());
+
for(int i=0; i<akas.length; i++) {
assertTrue("akas "+i+" is empty '"+akas[i]+"'",
(akas[i] != null && akas[i].trim().length() > 0));
@@ -505,6 +526,8 @@
assertTrue("specialDigits type is "+specialDigitsType.getFieldDescriptor()+
", expecting "+int[].class.getName(),
specialDigitsType.getFieldDescriptor().equals(int[].class.getName()));
+ assertTrue("specialDigits type is not an array ",
+ specialDigitsType.isArrayType());
}
{
JAnnotationValue addressValue = boog.getValue("address");
---------------------------------------------------------------------
To unsubscribe, e-mail: xmlbeans-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xmlbeans-cvs-help@xml.apache.org