jochen      2005/04/08 17:42:43

  Modified:    .        .cvsignore status.xml
               src/jaxme/org/apache/ws/jaxme/generator/sg/impl
                        JAXBSchemaSG.java
  Log:
  The ObjectFactory does now contain methods for creating implementations
  of anonymous content interfaces, like JAXB's does.
  
  Revision  Changes    Path
  1.5       +1 -0      ws-jaxme/.cvsignore
  
  Index: .cvsignore
  ===================================================================
  RCS file: /home/cvs/ws-jaxme/.cvsignore,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- .cvsignore        8 Apr 2005 10:14:57 -0000       1.4
  +++ .cvsignore        9 Apr 2005 00:42:43 -0000       1.5
  @@ -3,3 +3,4 @@
   dist
   jaxme.properties
   *.log
  +xjc
  
  
  
  1.44      +4 -0      ws-jaxme/status.xml
  
  Index: status.xml
  ===================================================================
  RCS file: /home/cvs/ws-jaxme/status.xml,v
  retrieving revision 1.43
  retrieving revision 1.44
  diff -u -r1.43 -r1.44
  --- status.xml        8 Apr 2005 23:10:45 -0000       1.43
  +++ status.xml        9 Apr 2005 00:42:43 -0000       1.44
  @@ -31,6 +31,10 @@
     <changes>
       <release version="0.4-dev" date="unreleased">
         <action dev="JW" type="enhancement" context="generator">
  +        The ObjectFactory does now contain methods for creating
  +        implementations of anonymous content interfaces.
  +      </action>
  +      <action dev="JW" type="enhancement" context="generator">
           Added support for collection type "indexed".
         </action>
         <action dev="JW" type="fix" context="generator">
  
  
  
  1.15      +73 -10    
ws-jaxme/src/jaxme/org/apache/ws/jaxme/generator/sg/impl/JAXBSchemaSG.java
  
  Index: JAXBSchemaSG.java
  ===================================================================
  RCS file: 
/home/cvs/ws-jaxme/src/jaxme/org/apache/ws/jaxme/generator/sg/impl/JAXBSchemaSG.java,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- JAXBSchemaSG.java 14 Mar 2005 02:16:09 -0000      1.14
  +++ JAXBSchemaSG.java 9 Apr 2005 00:42:43 -0000       1.15
  @@ -33,9 +33,12 @@
   import javax.xml.parsers.ParserConfigurationException;
   
   import org.apache.ws.jaxme.XMLWriter;
  +import org.apache.ws.jaxme.generator.sg.ComplexContentSG;
  +import org.apache.ws.jaxme.generator.sg.ComplexTypeSG;
   import org.apache.ws.jaxme.generator.sg.Context;
   import org.apache.ws.jaxme.generator.sg.GroupSG;
   import org.apache.ws.jaxme.generator.sg.ObjectSG;
  +import org.apache.ws.jaxme.generator.sg.ParticleSG;
   import org.apache.ws.jaxme.generator.sg.SGFactory;
   import org.apache.ws.jaxme.generator.sg.SchemaSG;
   import org.apache.ws.jaxme.generator.sg.SchemaSGChain;
  @@ -451,7 +454,9 @@
       }
     }
   
  -  protected JavaSource getObjectFactory(SchemaSG pController, String 
pPackageName, List pContextList) {
  +  protected JavaSource getObjectFactory(SchemaSG pController, String 
pPackageName,
  +                                                                             
List pContextList)
  +             throws SAXException {
       JavaQName qName = JavaQNameImpl.getInstance(pPackageName, 
"ObjectFactory");
       JavaSource js = pController.getJavaSourceFactory().newJavaSource(qName, 
"public");
       JavaField jf = js.newJavaField("jaxbContext", JAXBContextImpl.class, 
"private");
  @@ -494,7 +499,7 @@
         if (o instanceof ObjectSG) {
           ObjectSG objectSG = ((ObjectSG) o);
           typeSG = objectSG.getTypeSG();
  -        generateCreateMethod(js, objectSG.getClassContext());
  +        generateCreateMethod(js, null, objectSG.getClassContext());
           //NB: we don't have to check for duplicate element names since that 
would violate the XSD spec
         } else if (o instanceof TypeSG) {
           typeSG = (TypeSG) o;
  @@ -502,27 +507,85 @@
           continue;
         }
   
  -      if (typeSG.isComplex() && !contextSet.contains(typeSG)) {
  -        // many global elements may have the same global complex type so 
must check first
  -        generateCreateMethod(js, 
typeSG.getComplexTypeSG().getClassContext());
  -        contextSet.add(typeSG);
  -      }
  +       generateCreateMethod(js, contextSet, typeSG, null);
       }
       
       return js;
     }
   
  +  private void generateCreateMethod(JavaSource pJs, Set pContextSet,
  +                                                                     TypeSG 
pType, String pPrefix) throws SAXException {
  +       if (!pType.isComplex()  ||  pContextSet.contains(pType)) {
  +               return;
  +       }
  +       // many global elements may have the same global complex type so must 
check first
  +       String prefix = generateCreateMethod(pJs, pPrefix, 
pType.getComplexTypeSG().getClassContext());
  +       pContextSet.add(pType);
  +       generateCreateMethods(pJs, pType, prefix, pContextSet);
  +  }
  +
  +  /** Generate create methods for the given particles.
  +   */
  +  private void generateCreateMethods(JavaSource pJs, ParticleSG[] pParticles,
  +                                                                      String 
pName, Set pContextSet)
  +             throws SAXException {
  +       for (int i = 0;  i < pParticles.length;  i++) {
  +               ParticleSG particle = pParticles[i];
  +               if (particle.isGroup()) {
  +                       GroupSG group = particle.getGroupSG();
  +                       generateCreateMethods(pJs, group.getParticles(), 
pName, pContextSet);
  +               } else if (particle.isElement()) {
  +                       ObjectSG oSG = particle.getObjectSG();
  +                       if (oSG.isGlobal()) {
  +                               continue;  // Will be generated elsewhere
  +                       }
  +                       TypeSG tSG = oSG.getTypeSG();
  +                       if (tSG.isGlobalType()) {
  +                               continue;  // Will be generated elsewhere
  +                       }
  +                       generateCreateMethod(pJs, pContextSet, tSG, pName);
  +               } else if (particle.isWildcard()) {
  +                       throw new IllegalStateException("TODO: Add support 
for wildcards here.");
  +               } else {
  +                       throw new IllegalStateException("Invalid class type");
  +               }
  +       }
  +  }
  +
  +  /** Generate create methods for the content.
  +   */
  +  private void generateCreateMethods(JavaSource pJs, TypeSG pType,
  +                                                                      String 
pName, Set pContextSet)
  +             throws SAXException {
  +       ComplexTypeSG ctSG = pType.getComplexTypeSG();
  +       if (ctSG.hasSimpleContent()) {
  +               return; // No elements contained
  +       }
  +       ComplexContentSG ccSG = ctSG.getComplexContentSG();
  +       if (ccSG.isEmpty()) {
  +               return;
  +       }
  +       GroupSG group = ccSG.getGroupSG();
  +       generateCreateMethods(pJs, group.getParticles(), pName, pContextSet);
  +  }
  +
     /**
      * Generic util method for generating the create<NAME> methods for the 
object factory.
      * @param pSource the java source object to add the method
      * @param pContext the Class Context from either an ObjectSG or a TypeSG
      */
  -  private void generateCreateMethod(JavaSource pSource, Context pContext) {
  +  private String generateCreateMethod(JavaSource pSource, String pPrefix,
  +                                                                       
Context pContext) {
       JavaQName resultName = pContext.getXMLInterfaceName();
  -    String className = resultName.getClassName();
  -    String methodName = "create" + 
Character.toUpperCase(className.charAt(0)) + className.substring(1);
  +    String className = resultName.isInnerClass() ? 
resultName.getInnerClassName() : resultName.getClassName();
  +     String result = Character.toUpperCase(className.charAt(0)) + 
className.substring(1);
  +     if (pPrefix != null) {
  +             result = pPrefix + result;
  +     }
  +    String methodName = "create" + result;
       JavaMethod createMethod = pSource.newJavaMethod(methodName, resultName, 
"public");
       createMethod.addThrows(JAXBException.class);
       createMethod.addLine("return (", resultName, ") newInstance(", 
resultName, ".class);");
  +     return result;
     }
   }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to