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