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 da...@apache.org on 2004/06/11 20:37:54 UTC

cvs commit: xml-xmlbeans/v2/test/src/xmlobject/checkin RedefineTest.java

daveremy    2004/06/11 11:37:54

  Modified:    v2       testbuild.xml
               v2/src/typeimpl/org/apache/xmlbeans/impl/schema
                        SchemaTypeCodePrinter.java
                        SchemaTypeSystemImpl.java
                        StscComplexTypeResolver.java StscImporter.java
                        StscSimpleTypeResolver.java StscState.java
                        StscTranslator.java
               v2/src/xmlcomp/org/apache/xmlbeans/impl/tool XMLBean.java
               v2/test/cases/xbean/xmlobject redefine2.xsd
               v2/test/src/xmlobject/checkin RedefineTest.java
  Added:       v2/bin   xstc
               v2/test/cases/xbean/xmlobject redefine1.xsddonotcompile
                        version1.xsddonotcompile version2.xsddonotcompile
                        version3.xsd
  Removed:     v2/test/cases/xbean/xmlobject redefine1.xsd
  Log:
  Rework of the <xs:redefine> support in the Schema Compiler.
  Contributed by Radu Preotiuc.
  
  Revision  Changes    Path
  1.9       +2 -1      xml-xmlbeans/v2/testbuild.xml
  
  Index: testbuild.xml
  ===================================================================
  RCS file: /home/cvs/xml-xmlbeans/v2/testbuild.xml,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- testbuild.xml	11 Jun 2004 02:16:55 -0000	1.8
  +++ testbuild.xml	11 Jun 2004 18:37:53 -0000	1.9
  @@ -159,6 +159,7 @@
   
       <fileset id="schema.files.copy" dir="${xbeans.test.cases.test.files}">
           <include name="**/*.xsd"/>
  +        <include name="**/*.xsddonotcompile"/>
           <include name="**/*.txt"/>
           <include name="**/*.xml"/>
           <include name="**/*.xsdconfig"/>
  @@ -314,7 +315,7 @@
       </target>
   
       <target name="scomp" unless="jar.uptodate">
  -        <echo message="Using compiler from: ${schema.compiler}"/>
  +        <echo message="Compiling ${schemasrc} using compiler from: ${schema.compiler}"/>
           <!--
           Lets make this target easy to call as a standalone. To call it standalone
           ant scomp -Dschemasrc=file|schema dir
  
  
  
  1.1                  xml-xmlbeans/v2/bin/xstc
  
  Index: xstc
  ===================================================================
  #!/bin/sh
  
  # Invokes XSTC
  
  cp=
  cp=$cp:$XMLBEANS_HOME/build/ar/xbean.jar:$XMLBEANS_HOME/build/lib/jsr173_api.jar
  
  java -classpath $cp org.apache.xmlbeans.impl.tool.XSTCTester $*
  
  
  
  1.9       +25 -2     xml-xmlbeans/v2/src/typeimpl/org/apache/xmlbeans/impl/schema/SchemaTypeCodePrinter.java
  
  Index: SchemaTypeCodePrinter.java
  ===================================================================
  RCS file: /home/cvs/xml-xmlbeans/v2/src/typeimpl/org/apache/xmlbeans/impl/schema/SchemaTypeCodePrinter.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- SchemaTypeCodePrinter.java	5 May 2004 00:45:38 -0000	1.8
  +++ SchemaTypeCodePrinter.java	11 Jun 2004 18:37:53 -0000	1.9
  @@ -17,6 +17,8 @@
   
   import java.io.Writer;
   import java.io.IOException;
  +import java.util.ArrayList;
  +import java.util.Arrays;
   import java.util.Map;
   import java.util.HashMap;
   import java.util.List;
  @@ -306,7 +308,8 @@
           }
           else
           {
  -            SchemaProperty[] props = sType.getDerivedProperties();
  +            SchemaProperty[] props = getDerivedProperties(sType);
  +
               for (int i = 0; i < props.length; i++)
               {
                   SchemaProperty prop = props[i];
  @@ -2178,7 +2181,7 @@
                   // complex content type implementations derive from base type impls
                   // so derived property impls can be reused
                   
  -                properties = sType.getDerivedProperties();
  +                properties = getDerivedProperties(sType);
               }
               
               Map qNameMap = printStaticFields(properties);
  @@ -2232,6 +2235,26 @@
           printNestedTypeImpls(sType, system);
   
           endBlock();
  +    }
  +
  +    private SchemaProperty[] getDerivedProperties(SchemaType sType)
  +    {
  +        // We have to see if this is redefined, because if it is we have
  +        // to include all properties associated to its supertypes
  +        QName name = sType.getName();
  +        if (name != null && name.equals(sType.getBaseType().getName()))
  +        {
  +            SchemaType sType2 = sType.getBaseType();
  +            List allProps = new ArrayList(Arrays.asList(sType.getDerivedProperties()));
  +            while (sType2 != null && name.equals(sType2.getName()))
  +            {
  +                allProps.addAll(Arrays.asList(sType2.getDerivedProperties()));
  +                sType2 = sType2.getBaseType();
  +            }
  +            return (SchemaProperty[]) allProps.toArray(new SchemaProperty[allProps.size()]);
  +        }
  +        else
  +            return sType.getDerivedProperties();
       }
   
       private void printExtensionImplMethods(SchemaType sType) throws IOException
  
  
  
  1.9       +33 -12    xml-xmlbeans/v2/src/typeimpl/org/apache/xmlbeans/impl/schema/SchemaTypeSystemImpl.java
  
  Index: SchemaTypeSystemImpl.java
  ===================================================================
  RCS file: /home/cvs/xml-xmlbeans/v2/src/typeimpl/org/apache/xmlbeans/impl/schema/SchemaTypeSystemImpl.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- SchemaTypeSystemImpl.java	12 May 2004 18:44:53 -0000	1.8
  +++ SchemaTypeSystemImpl.java	11 Jun 2004 18:37:53 -0000	1.9
  @@ -309,9 +309,9 @@
               // support for redefine, at the end of the file
               if (reader.atLeast(2, 15, 0))
               {
  -                _redefinedGlobalTypes = reader.readQNameRefMap();
  -                _redefinedModelGroups = reader.readQNameRefMap();
  -                _redefinedAttributeGroups = reader.readQNameRefMap();
  +                _redefinedGlobalTypes = reader.readQNameRefMapAsList();
  +                _redefinedModelGroups = reader.readQNameRefMapAsList();
  +                _redefinedAttributeGroups = reader.readQNameRefMapAsList();
               }
               if (reader.atLeast(2, 19, 0))
               {
  @@ -429,6 +429,14 @@
           return result;
       }
   
  +    private static List buildComponentRefList(SchemaComponent[] components)
  +    {
  +        List result = new ArrayList();
  +        for (int i = 0; i < components.length; i++)
  +            result.add(components[i].getComponentRef());
  +        return result;
  +    }
  +
       private static Map buildDocumentMap(SchemaType[] types)
       {
           Map result = new LinkedHashMap();
  @@ -563,11 +571,11 @@
           _globalElements = buildComponentRefMap(state.globalElements());
           _globalAttributes = buildComponentRefMap(state.globalAttributes());
           _modelGroups = buildComponentRefMap(state.modelGroups());
  -        _redefinedModelGroups = buildComponentRefMap(state.redefinedModelGroups());
  +        _redefinedModelGroups = buildComponentRefList(state.redefinedModelGroups());
           _attributeGroups = buildComponentRefMap(state.attributeGroups());
  -        _redefinedAttributeGroups = buildComponentRefMap(state.redefinedAttributeGroups());
  +        _redefinedAttributeGroups = buildComponentRefList(state.redefinedAttributeGroups());
           _globalTypes = buildComponentRefMap(state.globalTypes());
  -        _redefinedGlobalTypes = buildComponentRefMap(state.redefinedGlobalTypes());
  +        _redefinedGlobalTypes = buildComponentRefList(state.redefinedGlobalTypes());
           _documentTypes = buildDocumentMap(state.documentTypes());
           _attributeTypes = buildAttributeTypeMap(state.attributeTypes());
           _typeRefsByClassname = buildTypeRefsByClassname(state.typesByClassname());
  @@ -860,9 +868,9 @@
       private List _annotations;
   
       // actual type system data, map QNames -> SchemaComponent.Ref
  -    private Map _redefinedModelGroups;
  -    private Map _redefinedAttributeGroups;
  -    private Map _redefinedGlobalTypes;
  +    private List _redefinedModelGroups;
  +    private List _redefinedAttributeGroups;
  +    private List _redefinedGlobalTypes;
   
       private Map _globalElements;
       private Map _globalAttributes;
  @@ -1673,6 +1681,19 @@
               return result;
           }
   
  +        List readQNameRefMapAsList()
  +        {
  +            int size = readShort();
  +            List result = new ArrayList(size);
  +            for (int i = 0; i < size; i++)
  +            {
  +                readQName();
  +                SchemaComponent.Ref obj = readHandle();
  +                result.add(obj);
  +            }
  +            return result;
  +        }
  +
           void writeQNameMap(SchemaComponent[] components)
           {
               writeShort(components.length);
  @@ -3107,7 +3128,7 @@
   
           SchemaType[] result = new SchemaType[_redefinedGlobalTypes.size()];
           int j = 0;
  -        for (Iterator i = _redefinedGlobalTypes.values().iterator(); i.hasNext(); j++)
  +        for (Iterator i = _redefinedGlobalTypes.iterator(); i.hasNext(); j++)
               result[j] = ((SchemaType.Ref)i.next()).get();
           return result;
       }
  @@ -3187,7 +3208,7 @@
   
           SchemaModelGroup[] result = new SchemaModelGroup[_redefinedModelGroups.size()];
           int j = 0;
  -        for (Iterator i = _redefinedModelGroups.values().iterator(); i.hasNext(); j++)
  +        for (Iterator i = _redefinedModelGroups.iterator(); i.hasNext(); j++)
               result[j] = ((SchemaModelGroup.Ref)i.next()).get();
           return result;
       }
  @@ -3211,7 +3232,7 @@
   
           SchemaAttributeGroup[] result = new SchemaAttributeGroup[_redefinedAttributeGroups.size()];
           int j = 0;
  -        for (Iterator i = _redefinedAttributeGroups.values().iterator(); i.hasNext(); j++)
  +        for (Iterator i = _redefinedAttributeGroups.iterator(); i.hasNext(); j++)
               result[j] = ((SchemaAttributeGroup.Ref)i.next()).get();
           return result;
       }
  
  
  
  1.4       +21 -16    xml-xmlbeans/v2/src/typeimpl/org/apache/xmlbeans/impl/schema/StscComplexTypeResolver.java
  
  Index: StscComplexTypeResolver.java
  ===================================================================
  RCS file: /home/cvs/xml-xmlbeans/v2/src/typeimpl/org/apache/xmlbeans/impl/schema/StscComplexTypeResolver.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- StscComplexTypeResolver.java	15 Apr 2004 20:49:17 -0000	1.3
  +++ StscComplexTypeResolver.java	11 Jun 2004 18:37:53 -0000	1.4
  @@ -357,7 +357,7 @@
           {
               if (sImpl.isRedefinition())
               {
  -                baseType = state.findRedefinedGlobalType(parseTree.getBase(), sImpl.getChameleonNamespace(), sImpl.getName());
  +                baseType = state.findRedefinedGlobalType(parseTree.getBase(), sImpl.getChameleonNamespace(), sImpl);
                   if (baseType != null && !baseType.getName().equals(sImpl.getName()))
                       state.error("A type redefinition must extend the original type definition", XmlErrorContext.GENERIC_ERROR, parseTree);
               }
  @@ -476,7 +476,7 @@
           {
               if (sImpl.isRedefinition())
               {
  -                baseType = state.findRedefinedGlobalType(parseTree.getBase(), sImpl.getChameleonNamespace(), sImpl.getName());
  +                baseType = state.findRedefinedGlobalType(parseTree.getBase(), sImpl.getChameleonNamespace(), sImpl);
                   if (baseType != null && !baseType.getName().equals(sImpl.getName()))
                       state.error("A type redefinition must extend the original type definition", XmlErrorContext.GENERIC_ERROR, parseTree);
               }
  @@ -609,7 +609,7 @@
           {
               if (sImpl.isRedefinition())
               {
  -                baseType = state.findRedefinedGlobalType(parseTree.getBase(), sImpl.getChameleonNamespace(), sImpl.getName());
  +                baseType = state.findRedefinedGlobalType(parseTree.getBase(), sImpl.getChameleonNamespace(), sImpl);
                   if (baseType != null && !baseType.getName().equals(sImpl.getName()))
                       state.error("A type redefinition must restrict the original type definition", XmlErrorContext.GENERIC_ERROR, parseTree);
               }
  @@ -707,7 +707,7 @@
           {
               if (sImpl.isRedefinition())
               {
  -                baseType = state.findRedefinedGlobalType(parseTree.getBase(), sImpl.getChameleonNamespace(), sImpl.getName());
  +                baseType = state.findRedefinedGlobalType(parseTree.getBase(), sImpl.getChameleonNamespace(), sImpl);
                   if (baseType != null && !baseType.getName().equals(sImpl.getName()))
                       state.error("A type redefinition must extend the original type definition", XmlErrorContext.GENERIC_ERROR, parseTree);
               }
  @@ -834,7 +834,9 @@
       static void translateAttributeModel(
               XmlObject parseTree, String targetNamespace, boolean chameleon,
               List anonymousTypes, SchemaType outerType,
  -            Set seenAttributes, SchemaAttributeModelImpl result, SchemaType baseType, boolean extension, QName redefinitionFor)
  +            Set seenAttributes, SchemaAttributeModelImpl result,
  +            SchemaType baseType, boolean extension,
  +            SchemaAttributeGroupImpl redefinitionFor)
       {
           StscState state = StscState.get();
           if (seenAttributes == null)
  @@ -976,7 +978,8 @@
                       if (redefinitionFor != null)
                       {
                           group = state.findRedefinedAttributeGroup(ref, chameleon ? targetNamespace : null, redefinitionFor);
  -                        if (group != null && redefinitionFor.equals(group.getName()))
  +                        if (group != null &&
  +                            redefinitionFor.getName().equals(group.getName()))
                           {
                               if (seenRedefinition)
                                   state.error("An attribute group redefinition must include at most one reference to the original definition.", XmlErrorContext.GENERIC_ERROR, xsdag);
  @@ -1005,9 +1008,9 @@
                       }
   
                       state.startProcessing(group);
  -                    QName nestedRedefinitionFor = null;
  +                    SchemaAttributeGroupImpl nestedRedefinitionFor = null;
                       if (group.isRedefinition())
  -                        nestedRedefinitionFor = group.getName();
  +                        nestedRedefinitionFor = group;
                       translateAttributeModel(group.getParseObject(), subTargetNamespace, chameleon, anonymousTypes, outerType, seenAttributes, result, baseType, extension, nestedRedefinitionFor);
                       state.finishProcessing(group);
                       break;
  @@ -1070,17 +1073,17 @@
       
       private static class RedefinitionForGroup
       {
  -        private QName groupName;
  +        private SchemaModelGroupImpl group;
           private boolean seenRedefinition = false;
   
  -        public RedefinitionForGroup(QName groupName)
  +        public RedefinitionForGroup(SchemaModelGroupImpl group)
           {
  -            this.groupName = groupName;
  +            this.group = group;
           }
   
  -        public QName getGroupName()
  +        public SchemaModelGroupImpl getGroup()
           {
  -            return groupName;
  +            return group;
           }
   
           public boolean isSeenRedefinition()
  @@ -1180,8 +1183,8 @@
                   
                   if (redefinitionFor != null)
                   {
  -                    group = state.findRedefinedModelGroup(ref, chameleon ? targetNamespace : null, redefinitionFor.getGroupName());
  -                    if (group != null && group.getName().equals(redefinitionFor.getGroupName()))
  +                    group = state.findRedefinedModelGroup(ref, chameleon ? targetNamespace : null, redefinitionFor.getGroup());
  +                    if (group != null && group.getName().equals(redefinitionFor.getGroup().getName()))
                       {
                           if (redefinitionFor.isSeenRedefinition())
                               state.error("Group redefinition must refer to the original definition at most once", XmlErrorContext.GENERIC_ERROR, parseTree);
  @@ -1254,6 +1257,8 @@
   
           if (maxOccurs != null && maxOccurs.compareTo(BigInteger.ONE) < 0)
           {
  +            // remove from the list of anonymous types if it was added
  +            anonymousTypes.remove(sPart.getType());
               return null; // maxOccurs == minOccurs == 0, same as no particle at all.
           }
   
  @@ -1265,7 +1270,7 @@
               state.startProcessing(group);
               redefinitionFor = null;
               if (group.isRedefinition())
  -                redefinitionFor = new RedefinitionForGroup(group.getName());
  +                redefinitionFor = new RedefinitionForGroup(group);
           }
   
           if (hasChildren)
  
  
  
  1.7       +21 -2     xml-xmlbeans/v2/src/typeimpl/org/apache/xmlbeans/impl/schema/StscImporter.java
  
  Index: StscImporter.java
  ===================================================================
  RCS file: /home/cvs/xml-xmlbeans/v2/src/typeimpl/org/apache/xmlbeans/impl/schema/StscImporter.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- StscImporter.java	8 Jun 2004 20:15:01 -0000	1.6
  +++ StscImporter.java	11 Jun 2004 18:37:53 -0000	1.7
  @@ -71,12 +71,23 @@
           private Schema schema;
           private String chameleonNamespace;
           private Redefine redefine;
  +        private int redefinedBy;
   
           public SchemaToProcess(Schema schema, String chameleonNamespace, Redefine redefine)
           {
               this.schema = schema;
               this.chameleonNamespace = chameleonNamespace;
               this.redefine = redefine;
  +            this.redefinedBy = -1;
  +        }
  +
  +        // This makes sense only when part of a list, which is always the case
  +        public SchemaToProcess(Schema schema, String chameleonNamespace, Redefine redefine, int redefinedBy)
  +        {
  +            this.schema = schema;
  +            this.chameleonNamespace = chameleonNamespace;
  +            this.redefine = redefine;
  +            this.redefinedBy = redefinedBy;
           }
   
           /**
  @@ -104,6 +115,14 @@
           }
   
           /**
  +         * The index of the redefining schema if processed via redefine
  +         */
  +        public int getRedefinedBy()
  +        {
  +            return redefinedBy;
  +        }
  +
  +        /**
            * The chameleon namespace. Null if this schema is not being treated
            * as a chameleon. (The ordinary targetNamespace will just be extracted
            * from the syntax of the schema.)
  @@ -714,7 +733,7 @@
                               if (emptyStringIfNull(redefined.getTargetNamespace()).equals(sourceNamespace))
                               {
                                   // non-chameleon case
  -                                addScanNeeded(new SchemaToProcess(redefined, null, redefines[i]));
  +                                addScanNeeded(new SchemaToProcess(redefined, null, redefines[i], result.size()-1));
                               }
                               else if (redefined.getTargetNamespace() != null)
                               {
  @@ -724,7 +743,7 @@
                               else
                               {
                                   // chameleon redefine
  -                                addScanNeeded(new SchemaToProcess(redefined, sourceNamespace, redefines[i]));
  +                                addScanNeeded(new SchemaToProcess(redefined, sourceNamespace, redefines[i], result.size()-1));
                                   usedEmptyNamespaceSchema(redefined);
                               }
                           }
  
  
  
  1.4       +1 -1      xml-xmlbeans/v2/src/typeimpl/org/apache/xmlbeans/impl/schema/StscSimpleTypeResolver.java
  
  Index: StscSimpleTypeResolver.java
  ===================================================================
  RCS file: /home/cvs/xml-xmlbeans/v2/src/typeimpl/org/apache/xmlbeans/impl/schema/StscSimpleTypeResolver.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- StscSimpleTypeResolver.java	12 Feb 2004 20:06:21 -0000	1.3
  +++ StscSimpleTypeResolver.java	11 Jun 2004 18:37:53 -0000	1.4
  @@ -377,7 +377,7 @@
           {
               if (sImpl.isRedefinition())
               {
  -                baseImpl = state.findRedefinedGlobalType(parseRestr.getBase(), sImpl.getChameleonNamespace(), sImpl.getName());
  +                baseImpl = state.findRedefinedGlobalType(parseRestr.getBase(), sImpl.getChameleonNamespace(), sImpl);
                   if (baseImpl != null && !baseImpl.getName().equals(sImpl.getName()))
                       state.error("A type redefinition must restrict the original type definition", XmlErrorContext.GENERIC_ERROR, parseRestr);
               }
  
  
  
  1.7       +21 -18    xml-xmlbeans/v2/src/typeimpl/org/apache/xmlbeans/impl/schema/StscState.java
  
  Index: StscState.java
  ===================================================================
  RCS file: /home/cvs/xml-xmlbeans/v2/src/typeimpl/org/apache/xmlbeans/impl/schema/StscState.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- StscState.java	27 May 2004 18:37:48 -0000	1.6
  +++ StscState.java	11 Jun 2004 18:37:53 -0000	1.7
  @@ -443,12 +443,13 @@
           return result;
       }
       
  -    SchemaTypeImpl findRedefinedGlobalType(QName name, String chameleonNamespace, QName redefinedName)
  +    SchemaTypeImpl findRedefinedGlobalType(QName name, String chameleonNamespace, SchemaTypeImpl redefinedBy)
       {
  +        QName redefinedName = redefinedBy.getName();
           name = compatName(name, chameleonNamespace);
           if (name.equals(redefinedName))
           {
  -            return (SchemaTypeImpl)_redefinedGlobalTypes.get(name);
  +            return (SchemaTypeImpl)_redefinedGlobalTypes.get(redefinedBy);
               // BUGBUG: should also link against _importingLoader.findRedefinedType
           }
           SchemaTypeImpl result = (SchemaTypeImpl)_globalTypes.get(name);
  @@ -457,21 +458,21 @@
           return result;
       }
   
  -    void addGlobalType(SchemaTypeImpl type, boolean redefined)
  +    void addGlobalType(SchemaTypeImpl type, SchemaTypeImpl redefined)
       {
           if (type != null)
           {
               QName name = type.getName();
               
  -            if (redefined)
  +            if (redefined != null)
               {
  -                if (_redefinedGlobalTypes.containsKey(name))
  +                if (_redefinedGlobalTypes.containsKey(redefined))
                   {
                       if (!ignoreMdef(name))
                           error("Duplicate global type: " + QNameHelper.pretty(name), XmlErrorContext.DUPLICATE_GLOBAL_TYPE, null);
                   }
                   else
  -                    _redefinedGlobalTypes.put(name, type);
  +                    _redefinedGlobalTypes.put(redefined, type);
               }
               else
               {
  @@ -609,12 +610,13 @@
           return result;
       }
   
  -    SchemaAttributeGroupImpl findRedefinedAttributeGroup(QName name, String chameleonNamespace, QName redefinitionFor)
  +    SchemaAttributeGroupImpl findRedefinedAttributeGroup(QName name, String chameleonNamespace, SchemaAttributeGroupImpl redefinedBy)
       {
  +        QName redefinitionFor = redefinedBy.getName();
           name = compatName(name, chameleonNamespace);
           if (name.equals(redefinitionFor))
           {
  -            return (SchemaAttributeGroupImpl)_redefinedAttributeGroups.get(name);
  +            return (SchemaAttributeGroupImpl)_redefinedAttributeGroups.get(redefinedBy);
               // BUGBUG: should also link against _importingLoader.findRedefinedAttributeGroup
           }
           SchemaAttributeGroupImpl result = (SchemaAttributeGroupImpl)_attributeGroups.get(name);
  @@ -623,20 +625,20 @@
           return result;
       }
   
  -    void addAttributeGroup(SchemaAttributeGroupImpl attributeGroup, boolean redefined)
  +    void addAttributeGroup(SchemaAttributeGroupImpl attributeGroup, SchemaAttributeGroupImpl redefined)
       {
           if (attributeGroup != null)
           {
               QName name = attributeGroup.getName();
  -            if (redefined)
  +            if (redefined != null)
               {
  -                if (_redefinedAttributeGroups.containsKey(name))
  +                if (_redefinedAttributeGroups.containsKey(redefined))
                   {
                       if (!ignoreMdef(name))
                           error("Duplicate attribute group: " + QNameHelper.pretty(name), XmlErrorContext.DUPLICATE_GLOBAL_TYPE, null);
                   }
                   else
  -                    _redefinedAttributeGroups.put(name, attributeGroup);
  +                    _redefinedAttributeGroups.put(redefined, attributeGroup);
                   
               }
               else
  @@ -672,12 +674,13 @@
           return result;
       }
   
  -    SchemaModelGroupImpl findRedefinedModelGroup(QName name, String chameleonNamespace, QName redefinitionFor)
  +    SchemaModelGroupImpl findRedefinedModelGroup(QName name, String chameleonNamespace, SchemaModelGroupImpl redefinedBy)
       {
  +        QName redefinitionFor = redefinedBy.getName();
           name = compatName(name, chameleonNamespace);
           if (name.equals(redefinitionFor))
           {
  -            return (SchemaModelGroupImpl)_redefinedModelGroups.get(name);
  +            return (SchemaModelGroupImpl)_redefinedModelGroups.get(redefinedBy);
               // BUGBUG: should also link against _importingLoader.findRedefinedModelGroup
           }
           SchemaModelGroupImpl result = (SchemaModelGroupImpl)_modelGroups.get(name);
  @@ -686,20 +689,20 @@
           return result;
       }
   
  -    void addModelGroup(SchemaModelGroupImpl modelGroup, boolean redefined)
  +    void addModelGroup(SchemaModelGroupImpl modelGroup, SchemaModelGroupImpl redefined)
       {
           if (modelGroup != null)
           {
               QName name = modelGroup.getName();
  -            if (redefined)
  +            if (redefined != null)
               {
  -                if (_redefinedModelGroups.containsKey(name))
  +                if (_redefinedModelGroups.containsKey(redefined))
                   {
                       if (!ignoreMdef(name))
                           error("Duplicate model group: " + QNameHelper.pretty(name), XmlErrorContext.DUPLICATE_GLOBAL_TYPE, null);
                   }
                   else
  -                    _redefinedModelGroups.put(name, modelGroup);
  +                    _redefinedModelGroups.put(redefined, modelGroup);
               }
               else
               {
  
  
  
  1.7       +108 -25   xml-xmlbeans/v2/src/typeimpl/org/apache/xmlbeans/impl/schema/StscTranslator.java
  
  Index: StscTranslator.java
  ===================================================================
  RCS file: /home/cvs/xml-xmlbeans/v2/src/typeimpl/org/apache/xmlbeans/impl/schema/StscTranslator.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- StscTranslator.java	27 May 2004 18:37:48 -0000	1.6
  +++ StscTranslator.java	11 Jun 2004 18:37:53 -0000	1.7
  @@ -55,18 +55,17 @@
   
       public static void addAllDefinitions(StscImporter.SchemaToProcess[] schemasAndChameleons)
       {
  +        // Build all redefine objects
  +        RedefinitionHolder redefinitions[] =
  +            new RedefinitionHolder[schemasAndChameleons.length];
           for (int i = 0; i < schemasAndChameleons.length; i++)
  -        {
  -            addAllDefinitions(
  -                schemasAndChameleons[i].getSchema(),
  -                schemasAndChameleons[i].getChameleonNamespace(),
  -                schemasAndChameleons[i].getRedefine());
  -        }
  -    }
  +            redefinitions[i] = new RedefinitionHolder(schemasAndChameleons[i].getRedefine());
   
  -    public static void addAllDefinitions(Schema schema, String givenTargetNamespace, Redefine redefine)
  -    {
           StscState state = StscState.get();
  +        for (int j = 0; j < schemasAndChameleons.length; j++)
  +        {
  +            Schema schema = schemasAndChameleons[j].getSchema();
  +            String givenTargetNamespace = schemasAndChameleons[j].getChameleonNamespace();
   
           // quick check for a few unsupported features
   
  @@ -88,25 +87,65 @@
           
           state.addNamespace(targetNamespace);
   
  -        // make a note of all redefinitions
  -        RedefinitionHolder redefinitions = new RedefinitionHolder(redefine);
  -
  +        List redefChain = new ArrayList();
           TopLevelComplexType[] complexTypes = schema.getComplexTypeArray();
           for (int i = 0; i < complexTypes.length; i++)
           {
  -            TopLevelComplexType redef = redefinitions.redefineComplexType(complexTypes[i].getName());
  -            state.addGlobalType(translateGlobalComplexType(complexTypes[i], targetNamespace, chameleon, false), redef != null);
  +            TopLevelComplexType type = complexTypes[i];
  +            TopLevelComplexType redef= redefinitions[j].redefineComplexType(type.getName());
  +
               if (redef != null)
  -                state.addGlobalType(translateGlobalComplexType(redef, targetNamespace, chameleon, true), false);
  +            {
  +                int p = schemasAndChameleons[j].getRedefinedBy();
  +                while (redef != null)
  +                {
  +                    redefChain.add(type);
  +                    type = redef;
  +                    redef = redefinitions[p].redefineComplexType(type.getName());
  +                    p = schemasAndChameleons[p].getRedefinedBy();
  +                }
  +            }
  +
  +            SchemaTypeImpl t = translateGlobalComplexType(type, targetNamespace, chameleon, redefChain.size() > 0);
  +            state.addGlobalType(t, null);
  +            SchemaTypeImpl r;
  +            for (int k = redefChain.size()-1; k >= 0; k--)
  +            {
  +                redef = (TopLevelComplexType) redefChain.remove(k);
  +                r = translateGlobalComplexType(redef, targetNamespace, chameleon, k > 0);
  +                state.addGlobalType(r, t);
  +                t = r;
  +            }
           }
   
           TopLevelSimpleType[] simpleTypes = schema.getSimpleTypeArray();
           for (int i = 0; i < simpleTypes.length; i++)
           {
  -            TopLevelSimpleType redef = redefinitions.redefineSimpleType(simpleTypes[i].getName());
  -            state.addGlobalType(translateGlobalSimpleType(simpleTypes[i], targetNamespace, chameleon, false), redef != null);
  +            TopLevelSimpleType type = simpleTypes[i];
  +            TopLevelSimpleType redef = redefinitions[j].redefineSimpleType(type.getName());
  +
               if (redef != null)
  -                state.addGlobalType(translateGlobalSimpleType(redef, targetNamespace, chameleon, true), false);
  +            {
  +                int p = schemasAndChameleons[j].getRedefinedBy();
  +                while (redef != null)
  +                {
  +                    redefChain.add(type);
  +                    type = redef;
  +                    redef = redefinitions[p].redefineSimpleType(type.getName());
  +                    p = schemasAndChameleons[p].getRedefinedBy();
  +                }
  +            }
  +
  +            SchemaTypeImpl t = translateGlobalSimpleType(type, targetNamespace, chameleon,redefChain.size() > 0);
  +            state.addGlobalType(t, null);
  +            SchemaTypeImpl r;
  +            for (int k = redefChain.size()-1; k >= 0; k--)
  +            {
  +                redef = (TopLevelSimpleType) redefChain.remove(k);
  +                r = translateGlobalSimpleType(redef, targetNamespace, chameleon, k > 0);
  +                state.addGlobalType(r, t);
  +                t = r;
  +            }
           }
   
           TopLevelElement[] elements = schema.getElementArray();
  @@ -126,26 +165,70 @@
           NamedGroup[] modelgroups = schema.getGroupArray();
           for (int i = 0; i < modelgroups.length; i++)
           {
  -            NamedGroup redef = redefinitions.redefineModelGroup(modelgroups[i].getName());
  -            state.addModelGroup(translateModelGroup(modelgroups[i], targetNamespace, chameleon, false), redef != null);
  +            NamedGroup group = modelgroups[i];
  +            NamedGroup redef = redefinitions[j].redefineModelGroup(group.getName());
  +
               if (redef != null)
  -                state.addModelGroup(translateModelGroup(redef, targetNamespace, chameleon, true), false);
  +            {
  +                int p = schemasAndChameleons[j].getRedefinedBy();
  +                while (redef != null)
  +                {
  +                    redefChain.add(group);
  +                    group = redef;
  +                    redef = redefinitions[p].redefineModelGroup(group.getName());
  +                    p = schemasAndChameleons[p].getRedefinedBy();
  +                }
  +            }
  +
  +            SchemaModelGroupImpl g = translateModelGroup(group, targetNamespace, chameleon, redefChain.size() > 0);
  +            state.addModelGroup(g, null);
  +            SchemaModelGroupImpl r;
  +            for (int k = redefChain.size()-1; k >= 0; k--)
  +            {
  +                redef = (NamedGroup) redefChain.remove(k);
  +                r = translateModelGroup(redef, targetNamespace, chameleon, k > 0);
  +                state.addModelGroup(r, g);
  +                g = r;
  +            }
           }
   
           NamedAttributeGroup[] attrgroups = schema.getAttributeGroupArray();
           for (int i = 0; i < attrgroups.length; i++)
           {
  -            NamedAttributeGroup redef = redefinitions.redefineAttributeGroup(attrgroups[i].getName());
  -            state.addAttributeGroup(translateAttributeGroup(attrgroups[i], targetNamespace, chameleon, false), redef != null);
  +            NamedAttributeGroup group = attrgroups[i];
  +            NamedAttributeGroup redef = redefinitions[j].redefineAttributeGroup(group.getName());
  +
               if (redef != null)
  -                state.addAttributeGroup(translateAttributeGroup(redef, targetNamespace, chameleon, true), false);
  +            {
  +                int p = schemasAndChameleons[j].getRedefinedBy();
  +                while (redef != null)
  +                {
  +                    redefChain.add(group);
  +                    group = redef;
  +                    redef = redefinitions[p].redefineAttributeGroup(group.getName());
  +                    p = schemasAndChameleons[p].getRedefinedBy();
  +                }
  +            }
  +
  +            SchemaAttributeGroupImpl g = translateAttributeGroup(group, targetNamespace, chameleon, redefChain.size() > 0);
  +            state.addAttributeGroup(g, null);
  +            SchemaAttributeGroupImpl r;
  +            for (int k = redefChain.size()-1; k >= 0; k--)
  +            {
  +                redef = (NamedAttributeGroup) redefChain.remove(k);
  +                r = translateAttributeGroup(redef, targetNamespace, chameleon, k > 0);
  +                state.addAttributeGroup(r, g);
  +                g = r;
  +            }
           }
   
           AnnotationDocument.Annotation[] annotations = schema.getAnnotationArray();
           for (int i = 0; i < annotations.length; i++)
               state.addAnnotation(SchemaAnnotationImpl.getAnnotation(state.sts(), schema, annotations[i]));
  +        }
   
  -        redefinitions.complainAboutMissingDefinitions();
  +        for (int i = 0; i < redefinitions.length; i++)
  +            redefinitions[i].complainAboutMissingDefinitions();
       }
       
       private static class RedefinitionHolder
  
  
  
  1.7       +1 -1      xml-xmlbeans/v2/src/xmlcomp/org/apache/xmlbeans/impl/tool/XMLBean.java
  
  Index: XMLBean.java
  ===================================================================
  RCS file: /home/cvs/xml-xmlbeans/v2/src/xmlcomp/org/apache/xmlbeans/impl/tool/XMLBean.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- XMLBean.java	3 Jun 2004 21:28:36 -0000	1.6
  +++ XMLBean.java	11 Jun 2004 18:37:54 -0000	1.7
  @@ -649,7 +649,7 @@
           this.includeJavaRuntime = includeJavaRuntime;
       }
   
  -    public boolean isIncrementalSrcGen()
  +    public boolean isNoSrcRegen()
       {
           return noSrcRegen;
       }
  
  
  
  1.2       +1 -1      xml-xmlbeans/v2/test/cases/xbean/xmlobject/redefine2.xsd
  
  Index: redefine2.xsd
  ===================================================================
  RCS file: /home/cvs/xml-xmlbeans/v2/test/cases/xbean/xmlobject/redefine2.xsd,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- redefine2.xsd	8 Jun 2004 19:37:59 -0000	1.1
  +++ redefine2.xsd	11 Jun 2004 18:37:54 -0000	1.2
  @@ -2,7 +2,7 @@
       xmlns="http://example.org/prod"
       targetNamespace="http://example.org/prod" >
   
  -    <xsd:redefine schemaLocation="redefine1.xsd">
  +    <xsd:redefine schemaLocation="redefine1.xsddonotcompile">
           <xsd:simpleType name="DressSizeType">
               <xsd:restriction base="DressSizeType">
                   <xsd:minInclusive value="2" />
  
  
  
  1.1                  xml-xmlbeans/v2/test/cases/xbean/xmlobject/redefine1.xsddonotcompile
  
  Index: redefine1.xsddonotcompile
  ===================================================================
  <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:simpleType name="DressSizeType" >
        <xsd:restriction base="xsd:integer" />
    </xsd:simpleType>
  
      <xsd:element name="size" type="DressSizeType" />
      <xsd:element name="color" type="xsd:string" />
  </xsd:schema>
  
  
  1.1                  xml-xmlbeans/v2/test/cases/xbean/xmlobject/version1.xsddonotcompile
  
  Index: version1.xsddonotcompile
  ===================================================================
  <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
      targetNamespace="http://openuri.org/versionstest"
      xmlns:tns="http://openuri.org/versionstest">
  
    <xs:complexType name="typeX">
      <xs:complexContent>
      <xs:extension base="tns:type">
      <xs:sequence>
        <xs:element name="a" type="xs:string"/>
      </xs:sequence>
      </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  
    <xs:complexType name="type">
      <xs:sequence>
        <xs:element name="aa" type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
  </xs:schema>
  
  
  
  1.1                  xml-xmlbeans/v2/test/cases/xbean/xmlobject/version2.xsddonotcompile
  
  Index: version2.xsddonotcompile
  ===================================================================
  <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
      targetNamespace="http://openuri.org/versionstest"
      xmlns:tns="http://openuri.org/versionstest">
  
    <xs:redefine schemaLocation="version1.xsddonotcompile">
      <xs:complexType name="typeX">
        <xs:complexContent>
          <xs:extension base="tns:typeX">
            <xs:sequence>
              <xs:element name="b" type="xs:string"/>
            </xs:sequence>
          </xs:extension>
        </xs:complexContent>
      </xs:complexType>
    </xs:redefine>
    
  </xs:schema>
  
  
  
  1.1                  xml-xmlbeans/v2/test/cases/xbean/xmlobject/version3.xsd
  
  Index: version3.xsd
  ===================================================================
  <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
      targetNamespace="http://openuri.org/versionstest"
      xmlns:tns="http://openuri.org/versionstest">
  
    <xs:redefine schemaLocation="version2.xsddonotcompile">
      <xs:complexType name="typeX">
        <xs:complexContent>
          <xs:extension base="tns:typeX">
            <xs:sequence>
              <xs:element name="c" type="xs:string"/>
            </xs:sequence>
          </xs:extension>
        </xs:complexContent>
      </xs:complexType>
    </xs:redefine>
  
    <xs:element name="element" type="tns:typeX"/>
  
  </xs:schema>
  
  
  
  1.2       +32 -1     xml-xmlbeans/v2/test/src/xmlobject/checkin/RedefineTest.java
  
  Index: RedefineTest.java
  ===================================================================
  RCS file: /home/cvs/xml-xmlbeans/v2/test/src/xmlobject/checkin/RedefineTest.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- RedefineTest.java	8 Jun 2004 19:38:07 -0000	1.1
  +++ RedefineTest.java	11 Jun 2004 18:37:54 -0000	1.2
  @@ -22,10 +22,16 @@
   import org.apache.xmlbeans.XmlOptions;
   import org.apache.xmlbeans.XmlError;
   import org.apache.xmlbeans.XmlObject;
  +
   import org.example.prod.NewSizeDocument;
  +import org.openuri.versionstest.ElementDocument;
  +import org.openuri.versionstest.Type;
  +import org.openuri.versionstest.TypeX;
   
   import java.util.List;
   import java.util.ArrayList;
  +import java.io.PrintWriter;
  +import java.io.StringWriter;
   
   /**
    * @author Cezar Andrei (cezar.andrei at bea.com)
  @@ -69,7 +75,32 @@
           }
           catch (XmlException e)
           {
  -            Assert.assertTrue(false);
  +            StringWriter w = new StringWriter();
  +            e.printStackTrace(new PrintWriter(w));
  +            Assert.fail(w.toString());
  +        }
  +    }
  +
  +    public void testMultipleRedefine()
  +    {
  +        try
  +        {
  +            String xml = "<v:element xmlns:v='http://openuri.org/versionstest'>" +
  +                "<aa>AA</aa><a>A</a><b>B</b><c>C</c>" + "</v:element>";
  +            ElementDocument doc = ElementDocument.Factory.parse(xml);
  +            TypeX tx = doc.getElement();
  +
  +            Assert.assertTrue(tx.validate());
  +            Assert.assertEquals("A", tx.getA());
  +            Assert.assertEquals("B", tx.getB());
  +            Assert.assertEquals("C", tx.getC());
  +            Assert.assertEquals("AA", ((Type) tx).getAa());
  +        }
  +        catch (XmlException e)
  +        {
  +            StringWriter w = new StringWriter();
  +            e.printStackTrace(new PrintWriter(w));
  +            Assert.fail(w.toString());
           }
       }
   
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: xmlbeans-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xmlbeans-cvs-help@xml.apache.org