You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by ed...@apache.org on 2002/02/03 19:07:47 UTC
cvs commit: xml-xerces/java/src/org/apache/xerces/impl Constants.java
edwingo 02/02/03 10:07:47
Modified: java/src/org/apache/xerces/parsers
StandardParserConfiguration.java
java/src/org/apache/xerces/impl/xs/traversers
XSDHandler.java
java/src/org/apache/xerces/impl/xs XMLSchemaValidator.java
java/src/org/apache/xerces/impl Constants.java
Log:
First pass implementation of proposed JAXP 1.2 "schemaSource" property.
This code should not affect the way Xerces functions in any way unless a
certain JAXP "schemaSource" property is set. There is also duplicate code
in XSDHandler.java that needs to be cleaned up.
Revision Changes Path
1.19 +9 -1 xml-xerces/java/src/org/apache/xerces/parsers/StandardParserConfiguration.java
Index: StandardParserConfiguration.java
===================================================================
RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/parsers/StandardParserConfiguration.java,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -r1.18 -r1.19
--- StandardParserConfiguration.java 29 Jan 2002 23:16:43 -0000 1.18
+++ StandardParserConfiguration.java 3 Feb 2002 18:07:46 -0000 1.19
@@ -122,7 +122,7 @@
* @author Arnaud Le Hors, IBM
* @author Andy Clark, IBM
*
- * @version $Id: StandardParserConfiguration.java,v 1.18 2002/01/29 23:16:43 sandygao Exp $
+ * @version $Id: StandardParserConfiguration.java,v 1.19 2002/02/03 18:07:46 edwingo Exp $
*/
public class StandardParserConfiguration
extends BasicParserConfiguration
@@ -800,6 +800,14 @@
return;
}
if (property.equals(Constants.SCHEMA_NONS_LOCATION)) {
+ return;
+ }
+ }
+
+ if (propertyId.startsWith(Constants.JAXP_PROPERTY_PREFIX)) {
+ String property =
+ propertyId.substring(Constants.JAXP_PROPERTY_PREFIX.length());
+ if (property.equals(Constants.SCHEMA_SOURCE)) {
return;
}
}
1.21 +169 -2 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.20
retrieving revision 1.21
diff -u -r1.20 -r1.21
--- XSDHandler.java 29 Jan 2002 20:24:57 -0000 1.20
+++ XSDHandler.java 3 Feb 2002 18:07:46 -0000 1.21
@@ -69,11 +69,13 @@
import org.apache.xerces.impl.xs.XSDDescription;
import org.apache.xerces.impl.xs.XMLSchemaException;
import org.apache.xerces.parsers.StandardParserConfiguration;
+import org.apache.xerces.impl.Constants;
import org.apache.xerces.impl.XMLErrorReporter;
import org.apache.xerces.impl.XMLEntityManager;
import org.apache.xerces.parsers.DOMParser;
import org.apache.xerces.xni.QName;
import org.apache.xerces.xni.XMLResourceIdentifier;
+import org.apache.xerces.xni.parser.XMLConfigurationException;
import org.apache.xerces.xni.parser.XMLEntityResolver;
import org.apache.xerces.xni.parser.XMLInputSource;
import org.apache.xerces.util.XMLResourceIdentifierImpl;
@@ -86,11 +88,19 @@
import org.w3c.dom.Attr;
import org.w3c.dom.Element;
+import org.xml.sax.InputSource;
+
import java.util.Hashtable;
import java.util.Stack;
import java.util.Vector;
import java.util.StringTokenizer;
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.InputStream;
import java.io.IOException;
+import java.io.Reader;
/**
* The purpose of this class is to co-ordinate the construction of a
@@ -101,7 +111,7 @@
* schema, other grammars may be constructed as a side-effect.
*
* @author Neil Graham, IBM
- * @version $Id: XSDHandler.java,v 1.20 2002/01/29 20:24:57 sandygao Exp $
+ * @version $Id: XSDHandler.java,v 1.21 2002/02/03 18:07:46 edwingo Exp $
*/
public class XSDHandler {
@@ -401,6 +411,57 @@
return fGrammarBucket.getGrammar(schemaNamespace);
} // end parseSchema
+ /**
+ * REVISIT: Common code needs to be factored out and cleaned up.
+ * XXX Temporary duplicate code to get JAXP SchemaLocation working.
+ * Note: Does passing in null for target namespace cause any problems?
+ * Can schemaNamespace be interned after call to constructTrees()?
+ */
+ public SchemaGrammar parseSchemaJAXP(XMLInputSource is) {
+ short referType = XSDDescription.CONTEXT_PREPARSE;
+
+ // first phase: construct trees.
+ Document schemaRoot = getSchema(null, is, true, referType);
+ if (schemaRoot == null) {
+ // something went wrong right off the hop
+ return null;
+ }
+
+ fRoot = constructTrees(schemaRoot, is.getSystemId(), /* ns */ null,
+ referType);
+
+ if (fRoot == null) {
+ // REVISIT: something went wrong; print error about no schema found
+ return null;
+ }
+
+ String schemaNamespace = fRoot.fTargetNamespace;
+
+ // handle empty string URI as null
+ if (schemaNamespace != null) {
+ schemaNamespace = fSymbolTable.addSymbol(schemaNamespace);
+ }
+
+ // second phase: fill global registries.
+ buildGlobalNameRegistries();
+
+ // third phase: call traversers
+ traverseSchemas();
+
+ // fourth phase: handle local element decls
+ traverseLocalElements();
+
+ // fifth phase: handle Keyrefs
+ resolveKeyRefs();
+
+ // sixth phase: validate attribute of non-schema namespaces
+ // REVISIT: skip this for now. we reall don't want to do it.
+ //fAttributeChecker.checkNonSchemaAttributes(fGrammarBucket);
+
+ // and return.
+ return fGrammarBucket.getGrammar(schemaNamespace);
+ }
+
// may wish to have setter methods for ErrorHandler,
// EntityResolver...
@@ -1247,7 +1308,8 @@
XMLEntityResolver entityResolver,
SymbolTable symbolTable,
String externalSchemaLocation,
- String externalNoNSSchemaLocation) {
+ String externalNoNSSchemaLocation,
+ Object jaxpSchemaSource) {
fErrorReporter = errorReporter;
fSymbolTable = symbolTable;
@@ -1308,7 +1370,112 @@
fRedefinedRestrictedAttributeGroupRegistry.clear();
fRedefinedRestrictedGroupRegistry.clear();
+
+ processJAXPSchemaSource(jaxpSchemaSource, entityResolver);
} // reset(ErrorReporter, EntityResolver, SymbolTable)
+
+ /**
+ * Translate the various JAXP SchemaSource property types to XNI
+ * XMLInputSource. Valid types are: String, org.xml.sax.InputSource,
+ * InputStream, File, or Object[] of any of previous types.
+ */
+ private void processJAXPSchemaSource(Object val, XMLEntityResolver xer) {
+ if (val == null) {
+ return;
+ }
+
+ Class componentType = val.getClass().getComponentType();
+ if (componentType == null) {
+ // Not an array
+ parseSchemaJAXP(XSD2XMLInputSource(val, xer));
+ return ;
+ } else if (componentType != Object.class) {
+ // Not an Object[]
+ throw new XMLConfigurationException(
+ XMLConfigurationException.NOT_SUPPORTED,
+ Constants.JAXP_PROPERTY_PREFIX + Constants.SCHEMA_SOURCE);
+ }
+
+ Object[] objArr = (Object[]) val;
+ for (int i = 0; i < objArr.length; i++) {
+ parseSchemaJAXP(XSD2XMLInputSource(objArr[i], xer));
+ }
+ }
+
+ private XMLInputSource XSD2XMLInputSource(
+ Object val, XMLEntityResolver entityResolver)
+ {
+ if (val instanceof String) {
+ // String value is treated as a URI that is passed through the
+ // EntityResolver
+ String loc = (String) val;
+ if (entityResolver != null) {
+ String expandedLoc = XMLEntityManager.expandSystemId(loc);
+ fResourceIdentifier.setValues(null, loc, null, expandedLoc);
+ XMLInputSource xis = null;
+ try {
+ xis = entityResolver.resolveEntity(fResourceIdentifier);
+ } catch (IOException ex) {
+ short referType = XSDDescription.CONTEXT_PREPARSE;
+ fErrorReporter.reportError(
+ XSMessageFormatter.SCHEMA_DOMAIN,
+ DOC_ERROR_CODES[referType],
+ new Object[] { loc },
+ XMLErrorReporter.SEVERITY_ERROR);
+ }
+ if (xis == null) {
+ // REVISIT: can this happen?
+ // Treat value as a URI and pass in as systemId
+ return new XMLInputSource(null, loc, null);
+ }
+ return xis;
+ }
+ } else if (val instanceof InputSource) {
+ return SAX2XMLInputSource((InputSource) val);
+ } else if (val instanceof InputStream) {
+ return new XMLInputSource(null, null, null,
+ (InputStream) val, null);
+ } else if (val instanceof File) {
+ File file = (File) val;
+ InputStream is = null;
+ try {
+ is = new BufferedInputStream(new FileInputStream(file));
+ } catch (FileNotFoundException ex) {
+ short referType = XSDDescription.CONTEXT_PREPARSE;
+ fErrorReporter.reportError(
+ XSMessageFormatter.SCHEMA_DOMAIN,
+ DOC_ERROR_CODES[referType],
+ new Object[] { file.toString() },
+ XMLErrorReporter.SEVERITY_ERROR);
+ }
+ return new XMLInputSource(null, null, null, is, null);
+ }
+ throw new XMLConfigurationException(
+ XMLConfigurationException.NOT_SUPPORTED,
+ Constants.JAXP_PROPERTY_PREFIX + Constants.SCHEMA_SOURCE);
+ }
+
+ /**
+ * Convert a SAX InputSource to an equivalent XNI XMLInputSource
+ */
+ private static XMLInputSource SAX2XMLInputSource(InputSource sis) {
+ String publicId = sis.getPublicId();
+ String systemId = sis.getSystemId();
+
+ Reader charStream = sis.getCharacterStream();
+ if (charStream != null) {
+ return new XMLInputSource(publicId, systemId, null, charStream,
+ null);
+ }
+
+ InputStream byteStream = sis.getByteStream();
+ if (byteStream != null) {
+ return new XMLInputSource(publicId, systemId, null, byteStream,
+ sis.getEncoding());
+ }
+
+ return new XMLInputSource(publicId, systemId, null);
+ }
/**
* Traverse all the deferred local elements. This method should be called
1.41 +13 -3 xml-xerces/java/src/org/apache/xerces/impl/xs/XMLSchemaValidator.java
Index: XMLSchemaValidator.java
===================================================================
RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/xs/XMLSchemaValidator.java,v
retrieving revision 1.40
retrieving revision 1.41
diff -u -r1.40 -r1.41
--- XMLSchemaValidator.java 29 Jan 2002 01:15:14 -0000 1.40
+++ XMLSchemaValidator.java 3 Feb 2002 18:07:46 -0000 1.41
@@ -130,7 +130,7 @@
* @author Elena Litani IBM
* @author Andy Clark IBM
* @author Neeraj Bajaj, Sun Microsystems, inc.
- * @version $Id: XMLSchemaValidator.java,v 1.40 2002/01/29 01:15:14 lehors Exp $
+ * @version $Id: XMLSchemaValidator.java,v 1.41 2002/02/03 18:07:46 edwingo Exp $
*/
public class XMLSchemaValidator
implements XMLComponent, XMLDocumentFilter, FieldActivator {
@@ -205,6 +205,10 @@
protected static final String SCHEMA_NONS_LOCATION =
Constants.XERCES_PROPERTY_PREFIX + Constants.SCHEMA_NONS_LOCATION;
+ /** Property identifier: JAXP schema source. */
+ protected static final String JAXP_SCHEMA_SOURCE =
+ Constants.JAXP_PROPERTY_PREFIX + Constants.SCHEMA_SOURCE;
+
// recognized features and properties
/** Recognized features. */
@@ -223,7 +227,8 @@
ENTITY_RESOLVER,
VALIDATION_MANAGER,
SCHEMA_LOCATION,
- SCHEMA_NONS_LOCATION
+ SCHEMA_NONS_LOCATION,
+ JAXP_SCHEMA_SOURCE
};
//
@@ -1150,6 +1155,10 @@
fExternalSchemas = (String)componentManager.getProperty(SCHEMA_LOCATION);
fExternalNoNamespaceSchema = (String)componentManager.getProperty(SCHEMA_NONS_LOCATION);
+ // get JAXP schema source property
+ Object jaxpSchemaSource = componentManager.getProperty(
+ JAXP_SCHEMA_SOURCE);
+
// clear grammars, and put the one for schema namespace there
fGrammarBucket.reset();
fGrammarPool = (XMLGrammarPool)componentManager.getProperty(XMLGRAMMAR_POOL);
@@ -1167,7 +1176,8 @@
// reset schema handler and all traversal objects
fSchemaHandler.reset(fXSIErrorReporter.fErrorReporter,
fEntityResolver, fSymbolTable,
- fExternalSchemas, fExternalNoNamespaceSchema);
+ fExternalSchemas, fExternalNoNamespaceSchema,
+ jaxpSchemaSource);
// initialize state
fCurrentElemDecl = null;
1.12 +14 -1 xml-xerces/java/src/org/apache/xerces/impl/Constants.java
Index: Constants.java
===================================================================
RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/Constants.java,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- Constants.java 29 Jan 2002 01:15:09 -0000 1.11
+++ Constants.java 3 Feb 2002 18:07:46 -0000 1.12
@@ -65,7 +65,7 @@
*
* @author Andy Clark, IBM
*
- * @version $Id: Constants.java,v 1.11 2002/01/29 01:15:09 lehors Exp $
+ * @version $Id: Constants.java,v 1.12 2002/02/03 18:07:46 edwingo Exp $
*/
public final class Constants {
@@ -112,6 +112,19 @@
/** XML string property ("xml-string"). */
public static final String XML_STRING_PROPERTY = "xml-string";
+
+
+ //
+ // JAXP properties
+ //
+
+ /** JAXP property prefix ("http://xml.org/sax/properties/"). */
+ public static final String JAXP_PROPERTY_PREFIX =
+ "http://java.sun.com/xml/jaxp/properties/";
+
+ /** JAXP schemaSource property */
+ public static final String SCHEMA_SOURCE = "schemaSource";
+
//
// DOM features
---------------------------------------------------------------------
To unsubscribe, e-mail: xerces-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-cvs-help@xml.apache.org