neeraj 2002/10/27 21:06:30
Modified: java/src/org/apache/xerces/impl/xs XMLSchemaLoader.java
Log:
Fixing bug. When an array of Objects is used as the value of JAXP SCHEMA_SOURCE
property it
is illegal to have two schemas that share the same target namespace.
Revision Changes Path
1.11 +56 -36
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.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- XMLSchemaLoader.java 8 Oct 2002 21:45:45 -0000 1.10
+++ XMLSchemaLoader.java 28 Oct 2002 05:06:30 -0000 1.11
@@ -2,7 +2,7 @@
* The Apache Software License, Version 1.1
*
*
- * Copyright (c) 2000-2002 The Apache Software Foundation.
+ * Copyright (c) 2000-2002 The Apache Software Foundation.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -10,7 +10,7 @@
* are met:
*
* 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
+ * notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
@@ -18,7 +18,7 @@
* distribution.
*
* 3. The end-user documentation included with the redistribution,
- * if any, must include the following acknowledgment:
+ * if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
@@ -26,7 +26,7 @@
*
* 4. The names "Xerces" and "Apache Software Foundation" must
* not be used to endorse or promote products derived from this
- * software without prior written permission. For written
+ * software without prior written permission. For written
* permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache",
@@ -87,17 +87,17 @@
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
-
+import java.util.Vector;
/**
* This class implements XMLGrammarLoader. It is designed to interact
* either with a proxy for a user application which wants to preparse schemas,
* or with our own Schema validator. It is hoped that none of these "external"
* classes will therefore need to communicate directly
* with XSDHandler in future.
- * <p>This class only knows how to make XSDHandler do its thing.
+ * <p>This class only knows how to make XSDHandler do its thing.
* The caller must ensure that all its properties (schemaLocation, JAXPSchemaSource
- * etc.) have been properly set.
- *
+ * etc.) have been properly set.
+ *
* @author Neil Graham, IBM
* @version $Id$
*/
@@ -180,12 +180,12 @@
private boolean fAllowJavaEncodings = false;
private SymbolTable fSymbolTable = null;
- private XMLErrorReporter fErrorReporter = new XMLErrorReporter ();
+ private XMLErrorReporter fErrorReporter = new XMLErrorReporter ();
private XMLEntityResolver fEntityResolver = null;
private XMLGrammarPool fGrammarPool = null;
private String fExternalSchemas = null;
private String fExternalNoNSSchema = null;
- private Object fJAXPSource = null;
+ private Object fJAXPSource = null;
private Locale fLocale = Locale.getDefault();
private XSDHandler fSchemaHandler;
@@ -197,6 +197,7 @@
// boolean that tells whether we've tested the JAXP property.
private boolean fJAXPProcessed = false;
+
// containers
private XSDDescription fXSDDescription = new XSDDescription();
@@ -210,19 +211,19 @@
}
XMLSchemaLoader(XMLErrorReporter errorReporter,
- XSGrammarBucket grammarBucket,
+ XSGrammarBucket grammarBucket,
SubstitutionGroupHandler sHandler, CMBuilder builder) {
this(null, errorReporter, null, grammarBucket, sHandler, builder);
}
- XMLSchemaLoader(SymbolTable symbolTable,
+ XMLSchemaLoader(SymbolTable symbolTable,
XMLErrorReporter errorReporter,
XMLEntityResolver entityResolver,
XSGrammarBucket grammarBucket,
SubstitutionGroupHandler sHandler,
CMBuilder builder) {
fSymbolTable = symbolTable;
- if(errorReporter == null) {
+ if(errorReporter == null) {
errorReporter = new XMLErrorReporter ();
errorReporter.setProperty(ERROR_HANDLER, new DefaultErrorHandler());
}
@@ -255,12 +256,12 @@
/**
* Returns the state of a feature.
- *
+ *
* @param featureId The feature identifier.
- *
+ *
* @throws XMLConfigurationException Thrown on configuration error.
*/
- public boolean getFeature(String featureId)
+ public boolean getFeature(String featureId)
throws XMLConfigurationException {
if(featureId.equals(SCHEMA_FULL_CHECKING)) {
return fIsCheckedFully;
@@ -271,7 +272,7 @@
} // getFeature (String): boolean
/**
- * Sets the state of a feature.
+ * Sets the state of a feature.
*
* @param featureId The feature identifier.
* @param state The state of the feature.
@@ -303,12 +304,12 @@
/**
* Returns the state of a property.
- *
+ *
* @param propertyId The property identifier.
- *
+ *
* @throws XMLConfigurationException Thrown on configuration error.
*/
- public Object getProperty(String propertyId)
+ public Object getProperty(String propertyId)
throws XMLConfigurationException {
if(propertyId.equals( SYMBOL_TABLE)) {
return fSymbolTable;
@@ -331,8 +332,8 @@
} // getProperty(String): Object
/**
- * Sets the state of a property.
- *
+ * Sets the state of a property.
+ *
* @param propertyId The property identifier.
* @param state The state of the property.
*
@@ -358,7 +359,7 @@
} else if(propertyId.equals( JAXP_SCHEMA_SOURCE)) {
fJAXPSource = state;
fJAXPProcessed = false;
- } else
+ } else
throw new
XMLConfigurationException(XMLConfigurationException.NOT_RECOGNIZED, propertyId);
} // setProperty(String, Object)
@@ -409,14 +410,14 @@
// reset all objects that "belong" to this one.
public void reset () {
- fGrammarBucket.reset();
+ fGrammarBucket.reset();
//we should retreive the initial grammar set given by the application
//to the parser and put it in local grammar bucket.
// make sure error reporter knows about schemas...
if(fErrorReporter.getMessageFormatter(XSMessageFormatter.SCHEMA_DOMAIN) ==
null) {
fErrorReporter.putMessageFormatter(XSMessageFormatter.SCHEMA_DOMAIN,
new XSMessageFormatter());
- }
+ }
if(fGrammarPool != null) {
@@ -479,17 +480,17 @@
noNs.addLocation(fExternalNoNSSchema);
locationPairs.put(XMLSymbols.EMPTY_STRING, noNs);
}
- SchemaGrammar grammar = loadSchema(desc, source, locationPairs);
+ SchemaGrammar grammar = loadSchema(desc, source, locationPairs);
if(grammar != null && fGrammarPool != null) {
fGrammarPool.cacheGrammars(XMLGrammarDescription.XML_SCHEMA,
fGrammarBucket.getGrammars());
}
return grammar;
} // loadGrammar(XMLInputSource): Grammar
- SchemaGrammar loadSchema(XSDDescription desc,
+ SchemaGrammar loadSchema(XSDDescription desc,
XMLInputSource source,
Hashtable locationPairs) throws IOException, XNIException {
-
+
// this should only be done once per invocation of this object;
// unless application alters JAXPSource in the mean time.
if(!fJAXPProcessed) {
@@ -509,8 +510,8 @@
// namespace of absent namespace). when resolving an entity, we first try
// to find in the hashtable whether there is a value for that namespace,
// if so, pass that location value to the user-defined entity resolver.
- public static XMLInputSource resolveDocument(XSDDescription desc, Hashtable
locationPairs,
- XMLEntityResolver entityResolver) throws IOException {
+ public static XMLInputSource resolveDocument(XSDDescription desc, Hashtable
locationPairs,
+ XMLEntityResolver entityResolver) throws IOException {
String loc = null;
// we consider the schema location properties for import
if (desc.getContextType() == XSDDescription.CONTEXT_IMPORT ||
@@ -520,7 +521,7 @@
String ns = namespace == null ? XMLSymbols.EMPTY_STRING : namespace;
// get the location hint for that namespace
LocationArray tempLA = (LocationArray)locationPairs.get(ns);
- if(tempLA != null)
+ if(tempLA != null)
loc = tempLA.getFirstLocation();
}
@@ -545,7 +546,7 @@
// @param schemaStr The schemaLocation string to tokenize
// @param locations Hashtable mapping namespaces to LocationArray objects
holding lists of locaitons
// @return true if no problems; false if string could not be tokenized
- public static boolean tokenizeSchemaLocationStr(String schemaStr, Hashtable
locations) {
+ public static boolean tokenizeSchemaLocationStr(String schemaStr, Hashtable
locations) {
if (schemaStr!= null) {
StringTokenizer t = new StringTokenizer(schemaStr, " \n\t\r");
String namespace, location;
@@ -610,10 +611,12 @@
"InputStream, InputSource.");
}
- // JAXP spec. allow []s of type String, File, InputStream,
+ // JAXP spec. allow []s of type String, File, InputStream,
// InputSource also, apart from [] of type Object.
Object[] objArr = (Object[]) fJAXPSource;
fJAXPProcessed = true;
+ //make local vector for storing targetn namespaces of schemasources
specified in object arrays.
+ Vector jaxpSchemaSourceNamespaces = new Vector() ;
for (int i = 0; i < objArr.length; i++) {
fXSDDescription.reset();
xis = xsdToXMLInputSource(objArr[i]);
@@ -624,9 +627,26 @@
fXSDDescription.setExpandedSystemId(sid);
fXSDDescription.fLocationHints = new String[]{sid};
}
- fGrammarBucket.putGrammar(loadSchema(fXSDDescription, xis,
locationPairs));
+ String targetNamespace = null ;
+ SchemaGrammar grammar = loadSchema(fXSDDescription, xis, locationPairs);
+ if(grammar != null){
+ targetNamespace = grammar.getTargetNamespace() ;
+ if(jaxpSchemaSourceNamespaces.contains(targetNamespace)){
+ //when an array of objects is passed it is illegal to have two
schemas that share same namespace.
+ throw new java.lang.IllegalArgumentException(
+ " When using array of Objects as the value of SCHEMA_SOURCE
property , " +
+ "no two Schemas should share the same targetNamespace. " );
+ }
+ else{
+ jaxpSchemaSourceNamespaces.add(targetNamespace) ;
+ }
+ fGrammarBucket.putGrammar(grammar);
+ }
+ else{
+ //REVISIT: What should be the acutal behavior if grammar can't be
loaded as specified in schema source?
+ }
}
- }
+ }//processJAXPSchemaSource
private XMLInputSource xsdToXMLInputSource(
Object val)
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]