You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by mu...@apache.org on 2012/09/03 17:23:58 UTC
svn commit: r1380272 -
/xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/traversers/XSDHandler.java
Author: mukulg
Date: Mon Sep 3 15:23:58 2012
New Revision: 1380272
URL: http://svn.apache.org/viewvc?rev=1380272&view=rev
Log:
committing a fix for latest issue reported for Jira issue, XERCESJ-1578.
Modified:
xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/traversers/XSDHandler.java
Modified: xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/traversers/XSDHandler.java
URL: http://svn.apache.org/viewvc/xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/traversers/XSDHandler.java?rev=1380272&r1=1380271&r2=1380272&view=diff
==============================================================================
--- xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/traversers/XSDHandler.java (original)
+++ xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/traversers/XSDHandler.java Mon Sep 3 15:23:58 2012
@@ -861,7 +861,7 @@ public class XSDHandler {
// This method does several things:
// It constructs an instance of an XSDocumentInfo object using the
- // schemaRoot node. Then, for each <include>,
+ // schemaRoot node. Then, for each <include>, <override>,
// <redefine>, and <import> children, it attempts to resolve the
// requested schema document, initiates a DOM parse, and calls
// itself recursively on that document's root. It also records in
@@ -1181,7 +1181,6 @@ public class XSDHandler {
}
// pass the systemId of the current document as the base systemId
boolean mustResolve = false;
- boolean isOverride = false;
refType = XSDDescription.CONTEXT_INCLUDE;
if (localName.equals(SchemaSymbols.ELT_REDEFINE)) {
mustResolve = nonAnnotationContent(child);
@@ -1190,7 +1189,6 @@ public class XSDHandler {
else if (localName.equals(SchemaSymbols.ELT_OVERRIDE)){
mustResolve = nonAnnotationContent(child);
refType = XSDDescription.CONTEXT_OVERRIDE;
- isOverride = true;
}
fSchemaGrammarDescription.reset();
fSchemaGrammarDescription.setContextType(refType);
@@ -1215,30 +1213,35 @@ public class XSDHandler {
newSchemaRoot = resolveSchema(schemaSource, fSchemaGrammarDescription, mustResolve, child);
schemaNamespace = currSchemaInfo.fTargetNamespace;
if (fSchemaVersion == Constants.SCHEMA_VERSION_1_1) {
- if (isOverride && newSchemaRoot != null && isValidTargetUriForOverride(schemaSource, locationHint)) {
- final Element transformedSchemaRoot = (Element) fOverrideHandler.transform(schemaId, child, newSchemaRoot);
+ if (refType == XSDDescription.CONTEXT_OVERRIDE) {
+ if (newSchemaRoot != null && isValidTargetUriForIncludeOrOverride(schemaSource, locationHint)) {
+ final Element transformedSchemaRoot = (Element) fOverrideHandler.transform(schemaId, child, newSchemaRoot);
+
+ // Either we had a collision where the transformed
+ // schema has global components or we hit a
+ // transformation cycle
+ if (transformedSchemaRoot == null) {
+ fLastSchemaWasDuplicate = true;
+ }
+ // In case of a collision where the transformed
+ // schema has no global components, the override
+ // transformer will return the new transformed
+ // schema. We need to process that new schema,
+ // so we set the duplicate schema flag to false
- // Either we had a collision where the transformed
- // schema has global components or we hit a
- // transformation cycle
- if (transformedSchemaRoot == null) {
- fLastSchemaWasDuplicate = true;
- }
- // In case of a collision where the transformed
- // schema has no global components, the override
- // transformer will return the new transformed
- // schema. We need to process that new schema,
- // so we set the duplicate schema flag to false
+ else if (fLastSchemaWasDuplicate && transformedSchemaRoot != newSchemaRoot) {
+ fLastSchemaWasDuplicate = false;
+ }
- else if (fLastSchemaWasDuplicate && transformedSchemaRoot != newSchemaRoot) {
- fLastSchemaWasDuplicate = false;
+ newSchemaRoot = transformedSchemaRoot;
+ }
+ else {
+ // check for override collision
+ fOverrideHandler.checkSchemaRoot(schemaId, child, newSchemaRoot);
}
-
- newSchemaRoot = transformedSchemaRoot;
}
- else {
- // check for override collision
- fOverrideHandler.checkSchemaRoot(schemaId, child, newSchemaRoot);
+ else if (refType == XSDDescription.CONTEXT_INCLUDE && !isValidTargetUriForIncludeOrOverride(schemaSource, locationHint)) {
+ fLastSchemaWasDuplicate = true;
}
}
}
@@ -1280,12 +1283,23 @@ public class XSDHandler {
} // end constructTrees
/*
- * Check if the target URI for <override> is correct. It must not be absent, and it should not point to the parent
- * schema document (otherwise, this would result in an un-terminating recursion).
+ * Check if the target URI for <include> or <override> is correct. It must not be absent, and it should not point
+ * to the parent schema document.
*/
- private boolean isValidTargetUriForOverride(XMLInputSource schemaSource, String locationHint) {
- return schemaSource.getSystemId() != "" && ((locationHint != null) ? (schemaSource.getSystemId() != locationHint) : true);
- }
+ private boolean isValidTargetUriForIncludeOrOverride(XMLInputSource schemaSource, String locationHint) {
+ boolean isUriValid = true;
+
+ try {
+ String expandedSystemId = XMLEntityManager.expandSystemId(schemaSource.getSystemId(), schemaSource.getBaseSystemId(), false);
+ String expandedLoctionHint = XMLEntityManager.expandSystemId(locationHint, locationHint, false);
+ isUriValid = !("".equals(expandedSystemId) || ((expandedLoctionHint != null) ? expandedLoctionHint.equals(expandedSystemId) : true));
+ }
+ catch (MalformedURIException ex) {
+ isUriValid = false;
+ }
+
+ return isUriValid;
+ } // isValidTargetUriForIncludeOrOverride
private boolean isExistingGrammar(XSDDescription desc, boolean ignoreConflict) {
SchemaGrammar sg = fGrammarBucket.getGrammar(desc.getTargetNamespace());
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@xerces.apache.org
For additional commands, e-mail: commits-help@xerces.apache.org