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