You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by ia...@apache.org on 2003/12/19 09:59:24 UTC

cvs commit: ws-axis/java/src/org/apache/axis/wsdl/toJava JavaGeneratorFactory.java

ias         2003/12/19 00:59:24

  Modified:    java/src/org/apache/axis/wsdl/toJava
                        JavaGeneratorFactory.java
  Log:
  Fix for Bug 25558 - Refactored javifyName to javifyTypeEntryName for recursive calling
  
  Revision  Changes    Path
  1.43      +126 -85   ws-axis/java/src/org/apache/axis/wsdl/toJava/JavaGeneratorFactory.java
  
  Index: JavaGeneratorFactory.java
  ===================================================================
  RCS file: /home/cvs/ws-axis/java/src/org/apache/axis/wsdl/toJava/JavaGeneratorFactory.java,v
  retrieving revision 1.42
  retrieving revision 1.43
  diff -u -r1.42 -r1.43
  --- JavaGeneratorFactory.java	29 Oct 2003 20:46:26 -0000	1.42
  +++ JavaGeneratorFactory.java	19 Dec 2003 08:59:24 -0000	1.43
  @@ -507,91 +507,7 @@
   
                   // Use the type or the referenced type's QName to generate the java name.
                   if (entry instanceof TypeEntry) {
  -                    TypeEntry tEntry = (TypeEntry) entry;
  -                    String dims = tEntry.getDimensions();
  -                    TypeEntry refType = tEntry.getRefType();
  -
  -                    while (refType != null) {
  -                        tEntry = refType;
  -                        dims += tEntry.getDimensions();
  -                        refType = tEntry.getRefType();
  -                    }
  -
  -                    // Need to javify the ref'd TypeEntry if it was not
  -                    // already processed
  -                    if (tEntry.getName() == null) {
  -
  -                        // Get the QName of the ref'd TypeEntry, which
  -                        // is will be used to javify the name
  -                        QName typeQName = tEntry.getQName();
  -
  -                        if ((typeQName.getLocalPart().indexOf(
  -                                SymbolTable.ANON_TOKEN) < 0)) {
  -
  -                            // Normal Case: The ref'd type is not anonymous
  -                            // Simply construct the java name from
  -                            // the qName
  -                            tEntry.setName(emitter.getJavaName(typeQName));
  -                        } else {
  -
  -                            // This is an anonymous type name.
  -                            // Axis uses '>' as a nesting token to generate
  -                            // unique qnames for anonymous types.
  -                            // Only consider the localName after the last '>'
  -                            // when generating the java name
  -                            // String localName = typeQName.getLocalPart();
  -                            // localName =
  -                            // localName.substring(
  -                            // localName.lastIndexOf(
  -                            // SymbolTable.ANON_TOKEN)+1);
  -                            // typeQName = new QName(typeQName.getNamespaceURI(),
  -                            // localName);
  -                            String localName = typeQName.getLocalPart();
  -
  -                            // Check to see if this is an anonymous type,
  -                            // if it is, replace Axis' ANON_TOKEN with
  -                            // an underscore to make sure we don't run
  -                            // into name collisions with similarly named
  -                            // non-anonymous types
  -                            StringBuffer sb = new StringBuffer(localName);
  -                            int aidx = -1;
  -
  -                            while ((aidx = sb.toString().indexOf(
  -                                    SymbolTable.ANON_TOKEN)) > -1) {
  -                                sb.replace(
  -                                        aidx,
  -                                        aidx + SymbolTable.ANON_TOKEN.length(),
  -                                        "_");
  -                            }
  -
  -                            localName = sb.toString();
  -                            typeQName = new QName(typeQName.getNamespaceURI(),
  -                                    localName);
  -
  -                            // If there is already an existing type,
  -                            // there will be a collision.
  -                            // If there is an existing anon type,
  -                            // there will be a  collision.
  -                            // In both cases, mangle the name.
  -                            symbolTable.getType(typeQName);
  -
  -                            if (anonQNames.get(typeQName) != null) {
  -                                localName += "Type" + uniqueNum++;
  -                                typeQName =
  -                                        new QName(typeQName.getNamespaceURI(),
  -                                                localName);
  -                            }
  -
  -                            anonQNames.put(typeQName, typeQName);
  -
  -                            // Now set the name with the constructed qname
  -                            tEntry.setName(emitter.getJavaName(typeQName));
  -                        }
  -                    }
  -
  -                    // Set the entry with the same name as the ref'd entry
  -                    // but add the appropriate amount of dimensions
  -                    entry.setName(tEntry.getName() + dims);
  +                    uniqueNum = javifyTypeEntryName(symbolTable, (TypeEntry) entry, anonQNames, uniqueNum);      
                   }
   
                   // If it is not a type, then use this entry's QName to
  @@ -603,6 +519,131 @@
           }
       }    // javifyNames
   
  +    /** Refactored to call recursively for JAX-RPC 1.1 spec 4.2.5. */
  +    protected int javifyTypeEntryName(SymbolTable symbolTable, TypeEntry entry, HashMap anonQNames, int uniqueNum) {        
  +        TypeEntry tEntry = (TypeEntry) entry;
  +        String dims = tEntry.getDimensions();
  +        TypeEntry refType = tEntry.getRefType();
  +        while (refType != null) {           
  +            tEntry = refType;
  +            dims += tEntry.getDimensions();
  +            refType = tEntry.getRefType();
  +        }
  +        
  +        TypeEntry te = tEntry;      
  +        while (te != null) {    
  +            TypeEntry base = SchemaUtils.getBaseType(te, symbolTable);
  +            if (base == null) 
  +                break;
  +            
  +            uniqueNum = javifyTypeEntryName(symbolTable, base, anonQNames, uniqueNum);
  +            
  +            if (Utils.getEnumerationBaseAndValues(te.getNode(), symbolTable) == null
  +                    &&SchemaUtils.getContainedAttributeTypes(te.getNode(), symbolTable) == null) {
  +                if (base.isSimpleType()) { 
  +                    // Case 1:
  +                    // <simpleType name="mySimpleStringType">
  +                    //   <restriction base="xs:string">
  +                    //   </restriction>
  +                    // </simpleType>
  +                    te.setSimpleType(true);
  +                    te.setName(base.getName());
  +                    te.setRefType(base);
  +                }
  +                
  +                if (base.isBaseType()) {
  +                    // Case 2:
  +                    // <simpleType name="FooString">
  +                    //   <restriction base="foo:mySimpleStringType">
  +                    //   </restriction>
  +                    // </simpleType>
  +                    te.setBaseType(true);
  +                    te.setName(base.getName());
  +                    te.setRefType(base);
  +                }
  +            }
  +            
  +            if (!te.isSimpleType()) 
  +                break;
  +
  +            te = base;          
  +        }
  +
  +        // Need to javify the ref'd TypeEntry if it was not
  +        // already processed
  +        if (tEntry.getName() == null) {
  +            // Get the QName of the ref'd TypeEntry, which
  +            // is will be used to javify the name
  +            QName typeQName = tEntry.getQName();
  +            
  +            if ((typeQName.getLocalPart().
  +                    indexOf(SymbolTable.ANON_TOKEN) < 0)) {
  +                // Normal Case: The ref'd type is not anonymous
  +                // Simply construct the java name from
  +                // the qName
  +                tEntry.setName(emitter.getJavaName(typeQName));
  +            } else {
  +                // This is an anonymous type name.
  +                // Axis uses '>' as a nesting token to generate
  +                // unique qnames for anonymous types.
  +                // Only consider the localName after the last '>'
  +                // when generating the java name
  +                // String localName = typeQName.getLocalPart();
  +                // localName =
  +                // localName.substring(
  +                // localName.lastIndexOf(
  +                // SymbolTable.ANON_TOKEN)+1);
  +                // typeQName = new QName(typeQName.getNamespaceURI(),
  +                // localName);
  +                String localName = typeQName.getLocalPart();
  +
  +                // Check to see if this is an anonymous type,
  +                // if it is, replace Axis' ANON_TOKEN with
  +                // an underscore to make sure we don't run
  +                // into name collisions with similarly named
  +                // non-anonymous types
  +                StringBuffer sb = new StringBuffer(localName);
  +                int aidx = -1;
  +
  +                while ((aidx = sb.toString().indexOf(
  +                        SymbolTable.ANON_TOKEN)) > -1) {
  +                    sb.replace(
  +                            aidx,
  +                            aidx + SymbolTable.ANON_TOKEN.length(),
  +                            "_");
  +                }
  +
  +                localName = sb.toString();
  +                typeQName = new QName(typeQName.getNamespaceURI(),
  +                        localName);
  +
  +                // If there is already an existing type,
  +                // there will be a collision.
  +                // If there is an existing anon type,
  +                // there will be a  collision.
  +                // In both cases, mangle the name.
  +                symbolTable.getType(typeQName);
  +
  +                if (anonQNames.get(typeQName) != null) {
  +                    localName += "Type" + uniqueNum++;
  +                    typeQName =
  +                    new QName(typeQName.getNamespaceURI(),
  +                            localName);
  +                }
  +
  +                anonQNames.put(typeQName, typeQName);
  +
  +                // Now set the name with the constructed qname
  +                tEntry.setName(emitter.getJavaName(typeQName));
  +            }
  +        }
  +        // Set the entry with the same name as the ref'd entry
  +        // but add the appropriate amount of dimensions
  +        entry.setName(tEntry.getName() + dims);
  +        
  +        return uniqueNum;
  +    }
  +    
       /**
        * setFaultContext:
        * Processes the symbol table and sets the COMPLEX_TYPE_FAULT