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