You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by el...@apache.org on 2003/05/28 17:01:15 UTC
cvs commit: xml-xerces/java/src/org/apache/xerces/impl/xs/traversers XSDHandler.java
elena 2003/05/28 08:01:15
Modified: java/src/org/apache/xerces/impl/xs XMLSchemaLoader.java
java/src/org/apache/xerces/impl/xs/traversers
XSDHandler.java
Log:
Fix code for handling JAXP schema-source property. Given that target namespaces
are not specified, when we load schemas XSDDescriptions do not have a target
namespace set. Therefore, we should not attempt to find a schema in the local
cache first, because if a schema with no namespace was loaded first, findSchema
method will always find no namespace schema for any attemp to load more schemas.
This is realated to the following bug:
http://nagoya.apache.org/bugzilla/show_bug.cgi?id=19106
Revision Changes Path
1.18 +15 -2 xml-xerces/java/src/org/apache/xerces/impl/xs/XMLSchemaLoader.java
Index: XMLSchemaLoader.java
===================================================================
RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/xs/XMLSchemaLoader.java,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -r1.17 -r1.18
--- XMLSchemaLoader.java 3 Mar 2003 19:15:31 -0000 1.17
+++ XMLSchemaLoader.java 28 May 2003 15:01:15 -0000 1.18
@@ -488,6 +488,11 @@
*/
public Grammar loadGrammar(XMLInputSource source)
throws IOException, XNIException {
+
+ // REVISIT: this method should have a namespace parameter specified by
+ // user. In this case we can easily detect if a schema asked to be loaded
+ // is already in the local cache.
+
reset();
XSDDescription desc = new XSDDescription();
desc.fContextType = XSDDescription.CONTEXT_PREPARSE;
@@ -667,6 +672,7 @@
sid = xis.getSystemId();
fXSDDescription.fContextType = XSDDescription.CONTEXT_PREPARSE;
if (sid != null) {
+ fXSDDescription.setBaseSystemId(xis.getBaseSystemId());
fXSDDescription.setLiteralSystemId(sid);
fXSDDescription.setExpandedSystemId(sid);
fXSDDescription.fLocationHints = new String[]{sid};
@@ -711,12 +717,19 @@
sid = xis.getSystemId();
fXSDDescription.fContextType = XSDDescription.CONTEXT_PREPARSE;
if (sid != null) {
+ fXSDDescription.setBaseSystemId(xis.getBaseSystemId());
fXSDDescription.setLiteralSystemId(sid);
fXSDDescription.setExpandedSystemId(sid);
fXSDDescription.fLocationHints = new String[]{sid};
}
String targetNamespace = null ;
- SchemaGrammar grammar = loadSchema(fXSDDescription, xis, locationPairs);
+ // load schema
+ SchemaGrammar grammar = fSchemaHandler.parseSchema(xis,fXSDDescription, locationPairs);
+ // is full-checking enabled? If so, if we're preparsing we'll
+ // need to let XSConstraints have a go at the new grammar.
+ if(fIsCheckedFully) {
+ XSConstraints.fullSchemaChecking(fGrammarBucket, fSubGroupHandler, fCMBuilder, fErrorReporter);
+ }
if(grammar != null){
targetNamespace = grammar.getTargetNamespace() ;
if(jaxpSchemaSourceNamespaces.contains(targetNamespace)){
1.66 +58 -37 xml-xerces/java/src/org/apache/xerces/impl/xs/traversers/XSDHandler.java
Index: XSDHandler.java
===================================================================
RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/xs/traversers/XSDHandler.java,v
retrieving revision 1.65
retrieving revision 1.66
diff -u -r1.65 -r1.66
--- XSDHandler.java 29 Apr 2003 13:58:00 -0000 1.65
+++ XSDHandler.java 28 May 2003 15:01:15 -0000 1.66
@@ -334,23 +334,31 @@
public SchemaGrammar parseSchema(XMLInputSource is, XSDDescription desc,
Hashtable locationPairs)
throws IOException {
-
fLocationPairs = locationPairs;
-
- // first try to find it in the bucket/pool, return if one is found
- SchemaGrammar grammar = findGrammar(desc);
- if (grammar != null)
- return grammar;
-
- if (fSchemaParser != null) {
- fSchemaParser.resetNodePool();
- }
-
- short referType = desc.getContextType();
- String schemaNamespace = desc.getTargetNamespace();
- // handle empty string URI as null
- if (schemaNamespace != null) {
- schemaNamespace = fSymbolTable.addSymbol(schemaNamespace);
+
+ if (fSchemaParser != null) {
+ fSchemaParser.resetNodePool();
+ }
+
+ SchemaGrammar grammar = null;
+ String schemaNamespace = null;
+ short referType = desc.getContextType();
+ // if loading using JAXP schemaSource property, or using grammar caching loadGrammar
+ // the desc.targetNamespace is always null.
+ // Therefore we should not attempt to find out if
+ // the schema is already in the bucket, since in the case we have
+ // no namespace schema in the bucket, findGrammar will always return the
+ // no namespace schema.
+ if (referType != XSDDescription.CONTEXT_PREPARSE){
+ // first try to find it in the bucket/pool, return if one is found
+ grammar = findGrammar(desc);
+ if (grammar != null)
+ return grammar;
+ schemaNamespace = desc.getTargetNamespace();
+ // handle empty string URI as null
+ if (schemaNamespace != null) {
+ schemaNamespace = fSymbolTable.addSymbol(schemaNamespace);
+ }
}
// before parsing a schema, need to clear registries associated with
@@ -365,19 +373,27 @@
// something went wrong right off the hop
return null;
}
- if ( schemaNamespace == null && referType == XSDDescription.CONTEXT_PREPARSE) {
+ if ( referType == XSDDescription.CONTEXT_PREPARSE) {
Element schemaElem = DOMUtil.getRoot(schemaRoot);
schemaNamespace = DOMUtil.getAttrValue(schemaElem, SchemaSymbols.ATT_TARGETNAMESPACE);
- if(schemaNamespace != null && schemaNamespace.length() > 0) {
- schemaNamespace = fSymbolTable.addSymbol(schemaNamespace);
- desc.setTargetNamespace(schemaNamespace);
- String schemaId = XMLEntityManager.expandSystemId(desc.getLiteralSystemId(), desc.getBaseSystemId(), false);
- XSDKey key = new XSDKey(schemaId, referType, schemaNamespace);
- fTraversed.put(key, schemaRoot );
- if (schemaId != null) {
- fDoc2SystemId.put(schemaRoot, schemaId );
- }
- }
+ if(schemaNamespace != null && schemaNamespace.length() > 0) {
+ // Since now we've discovered a namespace, we need to update xsd key
+ // and store this schema in traversed schemas bucket
+ schemaNamespace = fSymbolTable.addSymbol(schemaNamespace);
+ desc.setTargetNamespace(schemaNamespace);
+ }
+ else {
+ schemaNamespace = null;
+ }
+ grammar = findGrammar(desc);
+ if (grammar != null)
+ return grammar;
+ String schemaId = XMLEntityManager.expandSystemId(is.getSystemId(), is.getBaseSystemId(), false);
+ XSDKey key = new XSDKey(schemaId, referType, schemaNamespace);
+ fTraversed.put(key, schemaRoot );
+ if (schemaId != null) {
+ fDoc2SystemId.put(schemaRoot, schemaId );
+ }
}
// before constructing trees and traversing a schema, need to reset
@@ -1355,13 +1371,16 @@
// expand it, and check whether the same document has been
// parsed before. If so, return the document corresponding to
// that system id.
- String schemaId = XMLEntityManager.expandSystemId(schemaSource.getSystemId(), schemaSource.getBaseSystemId(), false);
- XSDKey key = new XSDKey(schemaId, referType, schemaNamespace);
- if ((schemaDoc = (Document)fTraversed.get(key)) != null) {
- fLastSchemaWasDuplicate = true;
- return schemaDoc;
- }
-
+ XSDKey key = null;
+ String schemaId = null;
+ if (referType != XSDDescription.CONTEXT_PREPARSE){
+ schemaId = XMLEntityManager.expandSystemId(schemaSource.getSystemId(), schemaSource.getBaseSystemId(), false);
+ key = new XSDKey(schemaId, referType, schemaNamespace);
+ if ((schemaDoc = (Document)fTraversed.get(key)) != null) {
+ fLastSchemaWasDuplicate = true;
+ return schemaDoc;
+ }
+ }
// If this is the first schema this Handler has
// parsed, it has to construct a DOMParser
if (fSchemaParser == null) {
@@ -1371,10 +1390,12 @@
}
fSchemaParser.parse(schemaSource);
schemaDoc = fSchemaParser.getDocument();
+
// now we need to store the mapping information from system id
// to the document. also from the document to the system id.
- fTraversed.put(key, schemaDoc );
- if (schemaId != null)
+ if (key != null)
+ fTraversed.put(key, schemaDoc );
+ if (schemaId != null)
fDoc2SystemId.put(schemaDoc, schemaId );
fLastSchemaWasDuplicate = false;
return schemaDoc;
---------------------------------------------------------------------
To unsubscribe, e-mail: xerces-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-cvs-help@xml.apache.org