You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by ne...@apache.org on 2001/10/16 18:00:35 UTC
cvs commit: xml-xerces/java/src/org/apache/xerces/impl/v2 XSAttributeChecker.java XSDHandler.java XSDocumentInfo.java
neilg 01/10/16 09:00:35
Modified: java/src/org/apache/xerces/impl/v2 XSAttributeChecker.java
XSDHandler.java XSDocumentInfo.java
Log:
several fixes:
1. Applied a patch from Rahul Srivastava to handle an error condition more gracefully.
2. Clean up valid redefine cases (we now pass all 19 cases in our internal valid <redefine> bucket).
3. Handle chameleon includes correctly.
Revision Changes Path
1.29 +8 -4 xml-xerces/java/src/org/apache/xerces/impl/v2/XSAttributeChecker.java
Index: XSAttributeChecker.java
===================================================================
RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/v2/XSAttributeChecker.java,v
retrieving revision 1.28
retrieving revision 1.29
diff -u -r1.28 -r1.29
--- XSAttributeChecker.java 2001/10/16 15:11:38 1.28
+++ XSAttributeChecker.java 2001/10/16 16:00:35 1.29
@@ -89,7 +89,7 @@
* - use symbol table instead of many hashtables
*
* @author Sandy Gao, IBM
- * @version $Id: XSAttributeChecker.java,v 1.28 2001/10/16 15:11:38 elena Exp $
+ * @version $Id: XSAttributeChecker.java,v 1.29 2001/10/16 16:00:35 neilg Exp $
*/
public class XSAttributeChecker {
@@ -1092,7 +1092,7 @@
// the object representation of the value.
switch (oneAttr.dvIndex) {
case DT_QNAME:
- retValue = resolveQName(attrVal, schemaDoc.fNamespaceSupport);
+ retValue = resolveQName(attrVal, schemaDoc);
break;
default:
retValue = attrVal;
@@ -1302,7 +1302,7 @@
retValue = fExtraDVs[DT_QNAME].validate(token, null);
// REVISIT: should have the datatype validators return
// the object representation of the value.
- retValue = resolveQName(token, schemaDoc.fNamespaceSupport);
+ retValue = resolveQName(token, schemaDoc);
memberType.addElement(retValue);
}
retValue = memberType;
@@ -1526,7 +1526,8 @@
return sb.toString();
}
- protected QName resolveQName (String attrVal, SchemaNamespaceSupport nsSupport) {
+ protected QName resolveQName (String attrVal, XSDocumentInfo currSchema) {
+ SchemaNamespaceSupport nsSupport = currSchema.fNamespaceSupport;
String prefix = fSchemaHandler.EMPTY_STRING;
String localpart = attrVal;
int colonptr = attrVal.indexOf(":");
@@ -1535,6 +1536,9 @@
localpart = attrVal.substring(colonptr+1);
}
String uri = nsSupport.getURI(prefix);
+ // kludge to handle chameleon includes/redefines...
+ if(prefix == fSchemaHandler.EMPTY_STRING && uri == null && currSchema.fIsChameleonSchema)
+ uri = currSchema.fTargetNamespace;
return new QName(prefix, localpart, attrVal, uri);
}
1.41 +43 -21 xml-xerces/java/src/org/apache/xerces/impl/v2/XSDHandler.java
Index: XSDHandler.java
===================================================================
RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/v2/XSDHandler.java,v
retrieving revision 1.40
retrieving revision 1.41
diff -u -r1.40 -r1.41
--- XSDHandler.java 2001/10/15 22:55:16 1.40
+++ XSDHandler.java 2001/10/16 16:00:35 1.41
@@ -97,7 +97,7 @@
* schema, other grammars may be constructed as a side-effect.
*
* @author Neil Graham, IBM
- * @version $Id: XSDHandler.java,v 1.40 2001/10/15 22:55:16 sandygao Exp $
+ * @version $Id: XSDHandler.java,v 1.41 2001/10/16 16:00:35 neilg Exp $
*/
class XSDHandler {
@@ -341,6 +341,7 @@
// only set if we were included or redefined in.
if(currSchemaInfo.fTargetNamespace == null) {
currSchemaInfo.fTargetNamespace = callerTNS;
+ currSchemaInfo.fIsChameleonSchema = true;
} else if(callerTNS != currSchemaInfo.fTargetNamespace) {
fElementTraverser.reportSchemaError("src-include.2", new Object [] {callerTNS, currSchemaInfo.fTargetNamespace});
}
@@ -458,13 +459,13 @@
} else if(DOMUtil.getLocalName(globalComp).equals(SchemaSymbols.ELT_INCLUDE) ||
DOMUtil.getLocalName(globalComp).equals(SchemaSymbols.ELT_IMPORT)) {
if(!dependenciesCanOccur) {
- fElementTraverser.reportSchemaError("schema-props-correct.1", new Object [] {DOMUtil.getLocalName(globalComp)});
+ fElementTraverser.reportSchemaError("sch-props-correct.1", new Object [] {DOMUtil.getLocalName(globalComp)});
}
// we've dealt with this; mark as traversed
DOMUtil.setHidden(globalComp);
} else if(DOMUtil.getLocalName(globalComp).equals(SchemaSymbols.ELT_REDEFINE)) {
if(!dependenciesCanOccur) {
- fElementTraverser.reportSchemaError("schema-props-correct.1", new Object [] {DOMUtil.getLocalName(globalComp)});
+ fElementTraverser.reportSchemaError("sch-props-correct.1", new Object [] {DOMUtil.getLocalName(globalComp)});
}
for(Element redefineComp = DOMUtil.getFirstChildElement(globalComp);
redefineComp != null;
@@ -533,7 +534,7 @@
} else if(componentType.equals(SchemaSymbols.ELT_NOTATION)) {
checkForDuplicateNames(qName, fUnparsedNotationRegistry, globalComp, currSchemaDoc);
} else {
- fElementTraverser.reportSchemaError("schema-props-correct.1", new Object [] {DOMUtil.getLocalName(globalComp)});
+ fElementTraverser.reportSchemaError("sch-props-correct.1", new Object [] {DOMUtil.getLocalName(globalComp)});
}
}
} // end for
@@ -742,8 +743,13 @@
if (retObj != null)
return retObj;
- // decl must not be null if we're here...
- if (DOMUtil.isHidden(decl)) {
+ // decl can be null, if the grammar picked was SG_SchemaNS
+ if (decl == null) {
+ fElementTraverser.reportGenericSchemaError("Could not locate a component corresponding to " +declToTraverse.uri+":"+declToTraverse.localpart);
+ return null;
+ }
+ else if (DOMUtil.isHidden(decl)) {
+ // decl must not be null if we're here...
//REVISIT: report an error: circular reference
fElementTraverser.reportGenericSchemaError("Circular reference detected in schema component named " + declToTraverse.prefix+":"+declToTraverse.localpart);
return null;
@@ -1037,27 +1043,39 @@
XSDocumentInfo redefinedSchema = null;
// case where we've collided with a redefining element
// (the parent of the colliding element is a redefine)
+ boolean collidedWithRedefine = true;
if((DOMUtil.getLocalName((elemParent = DOMUtil.getParent(collidingElem))).equals(SchemaSymbols.ELT_REDEFINE))) {
redefinedSchema = (XSDocumentInfo)(fRedefine2XSDMap.get(elemParent));
// case where we're a redefining element.
} else if((DOMUtil.getLocalName(DOMUtil.getParent(currComp)).equals(SchemaSymbols.ELT_REDEFINE))){
redefinedSchema = (XSDocumentInfo)(fDoc2XSDocumentMap.get(DOMUtil.getDocument(collidingElem)));
+ collidedWithRedefine = false;
}
if(redefinedSchema != null) { //redefinition involved somehow
+ String newName = qName.substring(qName.lastIndexOf(',')+1)+REDEF_IDENTIFIER;
if(redefinedSchema == currSchema) { // object comp. okay here
// now have to do some renaming...
- String newName = qName.substring(qName.lastIndexOf(',')+1)+REDEF_IDENTIFIER;
currComp.setAttribute(SchemaSymbols.ATT_NAME, newName);
- registry.put(qName+REDEF_IDENTIFIER, currComp);
+ if(currSchema.fTargetNamespace == null)
+ registry.put(","+newName, currComp);
+ else
+ registry.put(currSchema.fTargetNamespace+","+newName, currComp);
// and take care of nested redefines by calling recursively:
if(currSchema.fTargetNamespace == null)
checkForDuplicateNames(","+newName, registry, currComp, currSchema);
else
checkForDuplicateNames(currSchema.fTargetNamespace+","+newName, registry, currComp, currSchema);
- } else { // we're apparently redefining the wrong schema
- // REVISIT: error that redefined element in wrong schema
- fElementTraverser.reportSchemaError("src-redefine.1", new Object [] {qName});
- }
+ } else { // we may be redefining the wrong schema
+ if(collidedWithRedefine) {
+ if(currSchema.fTargetNamespace == null)
+ checkForDuplicateNames(","+newName, registry, currComp, currSchema);
+ else
+ checkForDuplicateNames(currSchema.fTargetNamespace+","+newName, registry, currComp, currSchema);
+ } else {
+ // REVISIT: error that redefined element in wrong schema
+ fElementTraverser.reportSchemaError("src-redefine.1", new Object [] {qName});
+ }
+ }
} else { // we've just got a flat-out collision
fElementTraverser.reportSchemaError("sch-props-correct.2", new Object []{qName});
}
@@ -1112,7 +1130,7 @@
fElementTraverser.reportSchemaError("src-redefine.5", null);
} else {
String derivedBase = grandKid.getAttribute( SchemaSymbols.ATT_BASE );
- String processedDerivedBase = findQName(derivedBase, currNSMap);
+ String processedDerivedBase = findQName(derivedBase, currSchema);
if(!processedTypeName.equals(processedDerivedBase)) {
// fRedefineSucceeded = false;
fElementTraverser.reportSchemaError("src-redefine.5", null);
@@ -1163,7 +1181,7 @@
fElementTraverser.reportSchemaError("src-redefine.5", null);
} else {
String derivedBase = greatGrandKid.getAttribute( SchemaSymbols.ATT_BASE );
- String processedDerivedBase = findQName(derivedBase, currSchema.fNamespaceSupport);
+ String processedDerivedBase = findQName(derivedBase, currSchema);
if(!processedTypeName.equals(processedDerivedBase)) {
// fRedefineSucceeded = false;
fElementTraverser.reportSchemaError("src-redefine.5", null);
@@ -1185,7 +1203,7 @@
} else if (componentType.equals(SchemaSymbols.ELT_ATTRIBUTEGROUP)) {
String processedBaseName = (currSchema.fTargetNamespace == null)?
","+oldName:currSchema.fTargetNamespace+","+oldName;
- int attGroupRefsCount = changeRedefineGroup(processedBaseName, componentType, newName, child, currSchema.fNamespaceSupport);
+ int attGroupRefsCount = changeRedefineGroup(processedBaseName, componentType, newName, child, currSchema);
if(attGroupRefsCount > 1) {
// fRedefineSucceeded = false;
fElementTraverser.reportSchemaError("src-redefine.7.1", new Object []{new Integer(attGroupRefsCount)});
@@ -1199,7 +1217,7 @@
} else if (componentType.equals(SchemaSymbols.ELT_GROUP)) {
String processedBaseName = (currSchema.fTargetNamespace == null)?
","+oldName:currSchema.fTargetNamespace+","+oldName;
- int groupRefsCount = changeRedefineGroup(processedBaseName, componentType, newName, child, currSchema.fNamespaceSupport);
+ int groupRefsCount = changeRedefineGroup(processedBaseName, componentType, newName, child, currSchema);
if(groupRefsCount > 1) {
// fRedefineSucceeded = false;
fElementTraverser.reportSchemaError("src-redefine.6.1.1", new Object []{new Integer(groupRefsCount)});
@@ -1224,17 +1242,20 @@
// to by a in the current SchemaNamespaceSupport object, and returns this
// information in the form (nsURI,b) suitable for lookups in the global
// decl Hashtables.
- private String findQName(String name, SchemaNamespaceSupport currNSMap) {
+ private String findQName(String name, XSDocumentInfo schemaDoc) {
+ SchemaNamespaceSupport currNSMap = schemaDoc.fNamespaceSupport;
int colonPtr = name.indexOf(':');
String prefix = EMPTY_STRING;
if (colonPtr > 0)
prefix = name.substring(0, colonPtr);
String uri = currNSMap.getURI(fSymbolTable.addSymbol(prefix));
String localpart = (colonPtr == 0)?name:name.substring(colonPtr+1);
+ if(prefix == this.EMPTY_STRING && uri == null && schemaDoc.fIsChameleonSchema)
+ uri = schemaDoc.fTargetNamespace;
if(uri == null)
return ","+localpart;
return uri+","+localpart;
- } // findQName(String, SchemaNamespaceSupport): String
+ } // findQName(String, XSDocumentInfo): String
// This function looks among the children of curr for an element of type elementSought.
// If it finds one, it evaluates whether its ref attribute contains a reference
@@ -1244,17 +1265,18 @@
// It also resets the value of ref so that it will refer to the renamed type from the schema
// being redefined.
private int changeRedefineGroup(String originalQName, String elementSought,
- String newName, Element curr, SchemaNamespaceSupport currNSMap) {
+ String newName, Element curr, XSDocumentInfo schemaDoc) {
+ SchemaNamespaceSupport currNSMap = schemaDoc.fNamespaceSupport;
int result = 0;
for (Element child = DOMUtil.getFirstChildElement(curr);
child != null; child = DOMUtil.getNextSiblingElement(child)) {
String name = child.getLocalName();
if (!name.equals(elementSought))
- result += changeRedefineGroup(originalQName, elementSought, newName, child, currNSMap);
+ result += changeRedefineGroup(originalQName, elementSought, newName, child, schemaDoc);
else {
String ref = child.getAttribute( SchemaSymbols.ATT_REF );
if (ref.length() != 0) {
- String processedRef = findQName(ref, currNSMap);
+ String processedRef = findQName(ref, schemaDoc);
if(originalQName.equals(processedRef)) {
String prefix = EMPTY_STRING;
String localpart = ref;
1.15 +5 -1 xml-xerces/java/src/org/apache/xerces/impl/v2/XSDocumentInfo.java
Index: XSDocumentInfo.java
===================================================================
RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/v2/XSDocumentInfo.java,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- XSDocumentInfo.java 2001/10/16 15:11:38 1.14
+++ XSDocumentInfo.java 2001/10/16 16:00:35 1.15
@@ -74,7 +74,7 @@
* affect the contents of that schema document alone.
*
* @author Neil Graham, IBM
- * @version $Id: XSDocumentInfo.java,v 1.14 2001/10/16 15:11:38 elena Exp $
+ * @version $Id: XSDocumentInfo.java,v 1.15 2001/10/16 16:00:35 neilg Exp $
*/
class XSDocumentInfo {
@@ -98,6 +98,9 @@
// targetNamespace
protected String fTargetNamespace;
+ // represents whether this is a chameleon schema (i.e., whether its TNS is natural or comes from without)
+ protected boolean fIsChameleonSchema;
+
// the root of the schema Document tree itself
protected Document fSchemaDoc;
@@ -108,6 +111,7 @@
XSDocumentInfo (Document schemaDoc, XSAttributeChecker attrChecker, SymbolTable symbolTable) {
fSchemaDoc = schemaDoc;
fNamespaceSupport = new SchemaNamespaceSupport();
+ fIsChameleonSchema = false;
if(schemaDoc != null) {
Element root = DOMUtil.getRoot(schemaDoc);
---------------------------------------------------------------------
To unsubscribe, e-mail: xerces-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-cvs-help@xml.apache.org