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 2001/11/30 00:08:14 UTC

cvs commit: xml-xerces/java/src/org/apache/xerces/parsers DOMBuilderImpl.java AbstractDOMParser.java

elena       01/11/29 15:08:14

  Modified:    java/src/org/apache/xerces/impl Constants.java
               java/src/org/apache/xerces/parsers AbstractDOMParser.java
  Added:       java/src/org/apache/xerces/parsers DOMBuilderImpl.java
  Log:
  Implementation DOMBuilder (including new feature "include-comments")
  Submitted by: Pavani Mukthipudi
  Reviewed by: Elena Litani
  
  Revision  Changes    Path
  1.6       +8 -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.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- Constants.java	2001/11/13 20:32:31	1.5
  +++ Constants.java	2001/11/29 23:08:13	1.6
  @@ -65,7 +65,7 @@
    *
    * @author Andy Clark, IBM
    *
  - * @version $Id: Constants.java,v 1.5 2001/11/13 20:32:31 sandygao Exp $
  + * @version $Id: Constants.java,v 1.6 2001/11/29 23:08:13 elena Exp $
    */
   public final class Constants {
   
  @@ -112,6 +112,13 @@
   
       /** XML string property ("xml-string"). */
       public static final String XML_STRING_PROPERTY = "xml-string";
  +
  +    //
  +    // DOM features
  +    //
  +
  +    /** Comments feature ("include-comments"). */
  +    public static final String INCLUDE_COMMENTS_FEATURE = "include-comments";
   
       // xerces features
   
  
  
  
  1.18      +16 -3     xml-xerces/java/src/org/apache/xerces/parsers/AbstractDOMParser.java
  
  Index: AbstractDOMParser.java
  ===================================================================
  RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/parsers/AbstractDOMParser.java,v
  retrieving revision 1.17
  retrieving revision 1.18
  diff -u -r1.17 -r1.18
  --- AbstractDOMParser.java	2001/11/26 21:45:51	1.17
  +++ AbstractDOMParser.java	2001/11/29 23:08:13	1.18
  @@ -102,7 +102,7 @@
    * @author Arnaud Le Hors, IBM
    * @author Andy Clark, IBM
    *
  - * @version $Id: AbstractDOMParser.java,v 1.17 2001/11/26 21:45:51 elena Exp $
  + * @version $Id: AbstractDOMParser.java,v 1.18 2001/11/29 23:08:13 elena Exp $
    */
   public abstract class AbstractDOMParser
       extends AbstractXMLDocumentParser {
  @@ -121,6 +121,9 @@
       protected static final String NAMESPACES =
           Constants.SAX_FEATURE_PREFIX+Constants.NAMESPACES_FEATURE;
   
  +    /** Feature id: include comments. */
  +    protected static final String INCLUDE_COMMENTS_FEATURE = Constants.INCLUDE_COMMENTS_FEATURE;
  +
       /** Feature id: include ignorable whitespace. */
       protected static final String INCLUDE_IGNORABLE_WHITESPACE =
           "http://apache.org/xml/features/dom/include-ignorable-whitespace";
  @@ -161,6 +164,9 @@
       /** Include ignorable whitespace. */
       protected boolean fIncludeIgnorableWhitespace;
   
  +    /** Include Comments. */
  +    protected boolean fIncludeComments;
  +
       // dom information
   
       /** The document. */
  @@ -218,7 +224,8 @@
           final String[] recognizedFeatures = {
               CREATE_ENTITY_REF_NODES,
               INCLUDE_IGNORABLE_WHITESPACE,
  -            DEFER_NODE_EXPANSION
  +            DEFER_NODE_EXPANSION,
  +            INCLUDE_COMMENTS_FEATURE
           };
           fConfiguration.addRecognizedFeatures(recognizedFeatures);
   
  @@ -226,6 +233,7 @@
           fConfiguration.setFeature(CREATE_ENTITY_REF_NODES, true);
           fConfiguration.setFeature(INCLUDE_IGNORABLE_WHITESPACE, true);
           fConfiguration.setFeature(DEFER_NODE_EXPANSION, true);
  +        fConfiguration.setFeature(INCLUDE_COMMENTS_FEATURE, true);
   
           // add recognized properties
           final String[] recognizedProperties = {
  @@ -322,6 +330,8 @@
   
           fNamespaceAware = fConfiguration.getFeature(NAMESPACES);
   
  +        fIncludeComments = fConfiguration.getFeature(INCLUDE_COMMENTS_FEATURE);
  +
           // get property
           setDocumentClassName((String)
                                fConfiguration.getProperty(DOCUMENT_CLASS_NAME));
  @@ -399,7 +409,10 @@
        * @throws XNIException Thrown by application to signal an error.
        */
       public void comment(XMLString text, Augmentations augs) throws XNIException {
  -
  +        
  +        if (!fIncludeComments) {
  +              return;
  +        }
           if (!fDeferNodeExpansion) {
               Comment comment = fDocument.createComment(text.toString());
               fCurrentNode.appendChild(comment);
  
  
  
  1.1                  xml-xerces/java/src/org/apache/xerces/parsers/DOMBuilderImpl.java
  
  Index: DOMBuilderImpl.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   *
   * Copyright (c) 2000,2001 The Apache Software Foundation.  All rights 
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    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
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    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,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 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 
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation and was
   * originally based on software copyright (c) 2001, International
   * Business Machines, Inc., http://www.apache.org.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  
  package org.apache.xerces.parsers;
  
  import java.io.InputStream;
  import java.io.IOException;
  import java.io.Reader;
  import java.util.Hashtable;
  import java.util.Stack;
  import java.util.Vector;
  
  import org.w3c.dom.DOMException;
  import org.w3c.dom.Document;
  import org.w3c.dom.Node;
  
  import org.apache.xerces.dom3.DOMErrorHandler;
  import org.apache.xerces.dom3.ls.DOMBuilder;
  import org.apache.xerces.dom3.ls.DOMEntityResolver;
  import org.apache.xerces.dom3.ls.DOMBuilderFilter;
  import org.apache.xerces.dom3.ls.DOMInputSource;
  
  import org.apache.xerces.util.DOMEntityResolverWrapper;
  import org.apache.xerces.util.SymbolTable;
  import org.apache.xerces.util.DOMErrorHandlerWrapper;
  import org.apache.xerces.impl.Constants;
  import org.apache.xerces.impl.validation.GrammarPool;
  import org.apache.xerces.xni.XNIException;
  import org.apache.xerces.xni.parser.XMLConfigurationException;
  import org.apache.xerces.xni.parser.XMLInputSource;
  import org.apache.xerces.xni.parser.XMLParserConfiguration;
  
  
  /**
   * This is Xerces DOM Builder class. It uses the abstract DOM
   * parser with a document scanner, a dtd scanner, and a validator, as 
   * well as a grammar pool.
   *
   * @author Pavani Mukthipudi, Sun Microsystems Inc.
   * @author Elena Litani, IBM
   *
   */
  
  // REVISIT: 
  // 1. "load-as-infoset" should be implemented
  // 2. why do we need so many fields in this class (why don't we use AbstractDomParser fields)
  // 3. implementation of setFeature method (we are going via switch several times)
  // 4. include-comments - I've defined a constant for DOM feature in Constants. 
  //    I don't think we need to define corresponding feature for Xerces parser 
  //    (with Xerces prefix).
  //    We probably should define all DOM Feature constants in Constants.java
  //  --el
   
  public class DOMBuilderImpl
      extends AbstractDOMParser implements DOMBuilder {
      
      //
      // Constants
      //
  
      // feature ids
  
      /** Feature id: namespace declarations. */
      protected static final String NAMESPACE_DECLARATIONS =
          "namespace-declarations";
          
      /** Feature id: validation. */
      protected static final String VALIDATION =
          "validation";
          
      /** Feature id: external parameter entities. */
      protected static final String EXTERNAL_PARAMETER_ENTITIES =
          "external-parameter-entities";
          
      /** Feature id: external general entities. */
      protected static final String EXTERNAL_GENERAL_ENTITIES =
          "external-general-entities";
          
      /** Feature id: external dtd subset. */
      protected static final String EXTERNAL_DTD_SUBSET =
          "external-dtd-subset";
          
      /** Feature id: validate if schema. */
      protected static final String VALIDATE_IF_SCHEMA =
          "validate-if-schema";
          
      /** Feature id: validate against dtd. */
      protected static final String VALIDATE_AGAINST_DTD =
          "validate-against-dtd";  
          
      /** Feature id: datatype normalization. */
      protected static final String DATATYPE_NORMALIZATION =
          "datatype-normalization"; 
          
      /** Feature id: create entity ref nodes. */
      protected static final String CREATE_ENTITY_REFERENCE_NODES =
          "create-entity-ref-nodes"; 
          
      /** Feature id: create entity nodes. */
      protected static final String CREATE_ENTITY_NODES =
          "create-entity-nodes";
             
      /** Feature id: whitespace in element content. */
      protected static final String WHITESPACE_IN_ELEMENT_CONTENT =
          "whitespace-in-element-content"; 
      
      /** Feature id: create cdata nodes. */
      protected static final String CREATE_CDATA_NODES =
          "create-cdata-nodes";   
      
      /** Feature id: comments. */
      protected static final String COMMENTS =
          "comments";  
          
      /** Feature id: charset overrides xml encoding. */
      protected static final String CHARSET_OVERRIDES_XML_ENCODING =
          "charset-overrides-xml-encoding";  
          
      /** Feature id: load as infoset. */
      protected static final String LOAD_AS_INFOSET =
          "load-as-infoset";  
          
      /** Feature id: supported mediatypes only. */
      protected static final String SUPPORTED_MEDIATYPES_ONLY =
          "supported-mediatypes-only";
          
      // SAX & Xerces feature ids
  
      /** Feature id: validation. */
      protected static final String VALIDATION_FEATURE =
          Constants.SAX_FEATURE_PREFIX+Constants.VALIDATION_FEATURE;
          
      /** Feature id: external parameter entities. */
      protected static final String EXTERNAL_PARAMETER_ENTITIES_FEATURE =
          Constants.SAX_FEATURE_PREFIX+Constants.EXTERNAL_PARAMETER_ENTITIES_FEATURE;
          
      /** Feature id: external general entities. */
      protected static final String EXTERNAL_GENERAL_ENTITIES_FEATURE =
          Constants.SAX_FEATURE_PREFIX+Constants.EXTERNAL_GENERAL_ENTITIES_FEATURE;
          
      /** Feature id: load external dtd. */
      protected static final String LOAD_EXTERNAL_DTD_FEATURE =
          Constants.XERCES_FEATURE_PREFIX+Constants.LOAD_EXTERNAL_DTD_FEATURE;
          
      //
      // Data
      //
      
      // features
  
      /** Namespace declarations. */
      protected boolean fNamespaceDeclarations;
      
      /** Validate if schema */
      protected boolean fValidateIfSchema;
      
      /** Validate against DTD */
      protected boolean fValidateAgainstDTD;
      
      /** Datatype normalization */
      protected boolean fDatatypeNormalization;
      
      /** Create entity nodes */
      protected boolean fCreateEntityNodes;
          
      /** Whitespace in element content */
      protected boolean fWhitespaceInElementContent;
      
      /** Create CDATA nodes */
      protected boolean fCreateCdataNodes;
      
      /** Charset overrides xml encoding */
      protected boolean fCharsetOverridesXmlEncoding;
      
      /** Load as infoset */
      protected boolean fLoadAsInfoset;
      
      /** Supported mediatypes only */
      protected boolean fSupportedMediatypesOnly;
      
      //
      // Constructors
      //
  
      /**
       * Constructs a DOM Builder using the dtd/xml schema parser configuration.
       */
      public DOMBuilderImpl() {
          this(new DTDXSParserConfiguration());
      } // <init>
  
      /**
       * Constructs a DOM Builder using the specified parser configuration.
       */
      public DOMBuilderImpl(XMLParserConfiguration config) {
          super(config);
          
          // add recognized features
          final String[] domRecognizedFeatures = {
              NAMESPACE_DECLARATIONS,
              VALIDATE_IF_SCHEMA,
              VALIDATE_AGAINST_DTD,
              DATATYPE_NORMALIZATION,
              CREATE_ENTITY_NODES,
              WHITESPACE_IN_ELEMENT_CONTENT,
              CREATE_CDATA_NODES,
              CHARSET_OVERRIDES_XML_ENCODING,
              LOAD_AS_INFOSET,
              SUPPORTED_MEDIATYPES_ONLY
          };
          
          fConfiguration.addRecognizedFeatures(domRecognizedFeatures);
  
          // set default values
          fConfiguration.setFeature(NAMESPACE_DECLARATIONS, true);
          fConfiguration.setFeature(VALIDATE_IF_SCHEMA, false);
          fConfiguration.setFeature(VALIDATE_AGAINST_DTD, false);
          fConfiguration.setFeature(DATATYPE_NORMALIZATION, false);
          fConfiguration.setFeature(CREATE_ENTITY_NODES, true);
          fConfiguration.setFeature(WHITESPACE_IN_ELEMENT_CONTENT, true);
          fConfiguration.setFeature(CREATE_CDATA_NODES, true);
          fConfiguration.setFeature(CHARSET_OVERRIDES_XML_ENCODING, true);
          fConfiguration.setFeature(LOAD_AS_INFOSET, false);
          fConfiguration.setFeature(SUPPORTED_MEDIATYPES_ONLY, false);
          
      } // <init>(XMLParserConfiguration)
      
      /**
       * Constructs a DOM Builder using the specified symbol table.
       */
      public DOMBuilderImpl(SymbolTable symbolTable) {
          this(new DTDXSParserConfiguration(symbolTable));
      } // <init>(SymbolTable)
  
  
      /**
       * Constructs a DOM Builder using the specified symbol table and
       * grammar pool.
       */
      public DOMBuilderImpl(SymbolTable symbolTable, GrammarPool grammarPool) {
          this(new DTDXSParserConfiguration(symbolTable, grammarPool));
      }
      
      /**
       * Resets the parser state.
       *
       * @throws SAXException Thrown on initialization error.
       */
      public void reset() {
          super.reset();
  	try {
              fNamespaceDeclarations = fConfiguration.getFeature(NAMESPACE_DECLARATIONS);
              fValidateIfSchema = fConfiguration.getFeature(VALIDATE_IF_SCHEMA);
              fValidateAgainstDTD = fConfiguration.getFeature(VALIDATE_AGAINST_DTD);
              fDatatypeNormalization = fConfiguration.getFeature(DATATYPE_NORMALIZATION);
              fWhitespaceInElementContent = fConfiguration.getFeature(WHITESPACE_IN_ELEMENT_CONTENT);
              fCreateCdataNodes = fConfiguration.getFeature(CREATE_CDATA_NODES);
              fCharsetOverridesXmlEncoding = fConfiguration.getFeature(CHARSET_OVERRIDES_XML_ENCODING);
              fLoadAsInfoset = fConfiguration.getFeature(LOAD_AS_INFOSET);
              fSupportedMediatypesOnly = fConfiguration.getFeature(SUPPORTED_MEDIATYPES_ONLY);
          }
          catch (XMLConfigurationException e) {
              if (e.getType() == XMLConfigurationException.NOT_RECOGNIZED) {
                  throw new DOMException(DOMException.NOT_FOUND_ERR, e.getMessage());
              }
              else {
                  throw new DOMException(DOMException.NOT_SUPPORTED_ERR, e.getMessage());
              }
          }
  
      } // reset() 
      
      //
      // DOMBuilder methods
      //
  
      /**
       * If a <code>DOMEntityResolver</code> has been specified, each time a 
       * reference to an external entity is encountered the 
       * <code>DOMBuilder</code> will pass the public and system IDs to the 
       * entity resolver, which can then specify the actual source of the 
       * entity.
       */
      public DOMEntityResolver getEntityResolver() {
      	DOMEntityResolver domEntityResolver = null;
          try {
              DOMEntityResolver entityResolver = (DOMEntityResolver)fConfiguration.getProperty(ENTITY_RESOLVER);
              if (entityResolver != null && 
                  entityResolver instanceof DOMEntityResolverWrapper) {
                  domEntityResolver = ((DOMEntityResolverWrapper)entityResolver).getEntityResolver();
              }
          }
          catch (XMLConfigurationException e) {
              
          }
          return domEntityResolver;
      }
      
      /**
       * If a <code>DOMEntityResolver</code> has been specified, each time a 
       * reference to an external entity is encountered the 
       * <code>DOMBuilder</code> will pass the public and system IDs to the 
       * entity resolver, which can then specify the actual source of the 
       * entity.
       */
      public void setEntityResolver(DOMEntityResolver entityResolver) {
      	try {
              fConfiguration.setProperty(ENTITY_RESOLVER, 
              				new DOMEntityResolverWrapper(entityResolver));
          }
          catch (XMLConfigurationException e) {
              
          }
      }
  
      /**
       *  In the event that an error is encountered in the XML document being 
       * parsed, the <code>DOMDcoumentBuilder</code> will call back to the 
       * <code>errorHandler</code> with the error information. When the 
       * document loading process calls the error handler the node closest to 
       * where the error occured is passed to the error handler if the 
       * implementation, if the implementation is unable to pass the node 
       * where the error occures the document Node is passed to the error 
       * handler. Mutations to the document from within an error handler will 
       * result in implementation dependent behavour. 
       */
      public DOMErrorHandler getErrorHandler() {
      	DOMErrorHandler errorHandler = null;
          try {
              DOMErrorHandler domErrorHandler = 
                  (DOMErrorHandler)fConfiguration.getProperty(ERROR_HANDLER);
              if (domErrorHandler != null && 
                  domErrorHandler instanceof DOMErrorHandlerWrapper) {
                  errorHandler = ((DOMErrorHandlerWrapper)domErrorHandler).getErrorHandler();
              }
          }
          catch (XMLConfigurationException e) {
              
          }
          return errorHandler;
      }
      
      /**
       *  In the event that an error is encountered in the XML document being 
       * parsed, the <code>DOMDcoumentBuilder</code> will call back to the 
       * <code>errorHandler</code> with the error information. When the 
       * document loading process calls the error handler the node closest to 
       * where the error occured is passed to the error handler if the 
       * implementation, if the implementation is unable to pass the node 
       * where the error occures the document Node is passed to the error 
       * handler. Mutations to the document from within an error handler will 
       * result in implementation dependent behavour. 
       */
      public void setErrorHandler(DOMErrorHandler errorHandler) {
      	try {
              fConfiguration.setProperty(ERROR_HANDLER, 
                                         new DOMErrorHandlerWrapper(errorHandler));
          }
          catch (XMLConfigurationException e) {
              
          }
      }
  
      /**
       *  When the application provides a filter, the parser will call out to 
       * the filter at the completion of the construction of each 
       * <code>Element</code> node. The filter implementation can choose to 
       * remove the element from the document being constructed (unless the 
       * element is the document element) or to terminate the parse early. If 
       * the document is being validated when it's loaded the validation 
       * happens before the filter is called. 
       */
      public DOMBuilderFilter getFilter() {
      	throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "Not supported");
      }
      
      /**
       *  When the application provides a filter, the parser will call out to 
       * the filter at the completion of the construction of each 
       * <code>Element</code> node. The filter implementation can choose to 
       * remove the element from the document being constructed (unless the 
       * element is the document element) or to terminate the parse early. If 
       * the document is being validated when it's loaded the validation 
       * happens before the filter is called. 
       */
      public void setFilter(DOMBuilderFilter filter) {
      	throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "Not supported");
      }
  
      /**
       * Set the state of a feature.
       * 
       * <br>The feature name has the same form as a DOM hasFeature string.
       * <br>It is possible for a <code>DOMBuilder</code> to recognize a feature 
       * name but to be unable to set its value.
       * 
       * @param name The feature name.
       * @param state The requested state of the feature (<code>true</code> or 
       *   <code>false</code>).
       * @exception DOMException
       *   Raise a NOT_SUPPORTED_ERR exception when the <code>DOMBuilder</code> 
       *   recognizes the feature name but cannot set the requested value. 
       *   <br>Raise a NOT_FOUND_ERR When the <code>DOMBuilder</code> does not 
       *   recognize the feature name.
       */
      public void setFeature(String name, boolean state) throws DOMException {
          try {
      	    if (canSetFeature(name, state)) {
              	if (name.equals(VALIDATION)) {
              	    fConfiguration.setFeature(VALIDATION_FEATURE, state);
              	}
              	else if (name.equals(EXTERNAL_PARAMETER_ENTITIES)) {
              	    fConfiguration.setFeature(EXTERNAL_PARAMETER_ENTITIES_FEATURE, state);
              	}
              	else if (name.equals(EXTERNAL_GENERAL_ENTITIES)) {
              	    fConfiguration.setFeature(EXTERNAL_GENERAL_ENTITIES_FEATURE, state);
              	}
              	else if (name.equals(EXTERNAL_DTD_SUBSET)) {
              	    fConfiguration.setFeature(LOAD_EXTERNAL_DTD_FEATURE, state);
              	}
              	else if (name.equals(COMMENTS)) {
              	    fConfiguration.setFeature(INCLUDE_COMMENTS_FEATURE, state);
              	}
              	else if(name.equals(CREATE_ENTITY_REFERENCE_NODES)) {
              	    fConfiguration.setFeature(CREATE_ENTITY_REF_NODES, state);
              	}
              	else {
              	    fConfiguration.setFeature(name, state);
              	}
              }
              else {
              	throw new DOMException(DOMException.NOT_SUPPORTED_ERR,"Feature \""+name+"\" cannot be set to \""+state+"\"");
              }
          }
          catch (XMLConfigurationException e) {
              if (e.getType() == XMLConfigurationException.NOT_RECOGNIZED) {
                  throw new DOMException(DOMException.NOT_FOUND_ERR,"Feature \""+name+"\" not recognized");
              }
              else {
                  throw new DOMException(DOMException.NOT_SUPPORTED_ERR,"Feature \""+name+"\" not supported");
              }
          }
      }
  
      /**
       * Query whether setting a feature to a specific value is supported.
       * <br>The feature name has the same form as a DOM hasFeature string.
       * 
       * @param name The feature name, which is a DOM has-feature style string.
       * @param state The requested state of the feature (<code>true</code> or 
       *   <code>false</code>).
       * @return <code>true</code> if the feature could be successfully set to 
       *   the specified value, or <code>false</code> if the feature is not 
       *   recognized or the requested value is not supported. The value of 
       *   the feature itself is not changed.
       */
      public boolean canSetFeature(String name, boolean state) {
      	if (name.equals(NAMESPACE_DECLARATIONS) && !state) {
      	    return false;
      	}
      	else if(name.equals(VALIDATE_IF_SCHEMA) && state) {
      	    return false;
      	}
      	else if(name.equals(VALIDATE_AGAINST_DTD) && state) {
      	    return false;
      	}
      	else if(name.equals(CREATE_ENTITY_NODES) && !state) {
      	    return false;
      	}
      	else if(name.equals(CREATE_CDATA_NODES) && !state) {
      	    return false;
      	}
      	else if(name.equals(WHITESPACE_IN_ELEMENT_CONTENT) && !state) {
      	    return false;
      	}
      	else if(name.equals(LOAD_AS_INFOSET) && state) {
      	    return false;
      	}
      	else if(name.equals(SUPPORTED_MEDIATYPES_ONLY) && state) {
      	    return false;
      	}
      	
      	return true;
      }
  
      /**
       * Look up the value of a feature.
       * <br>The feature name has the same form as a DOM hasFeature string
       * 
       * @param name The feature name, which is a string with DOM has-feature 
       *   syntax.
       * @return The current state of the feature (<code>true</code> or 
       *   <code>false</code>).
       * @exception DOMException
       *   Raise a NOT_FOUND_ERR When the <code>DOMBuilder</code> does not 
       *   recognize the feature name.
       */
      public boolean getFeature(String name) throws DOMException {
      	try {
              if (name.equals(VALIDATION)) {
                  return fConfiguration.getFeature(VALIDATION_FEATURE);
              }
              else if (name.equals(EXTERNAL_PARAMETER_ENTITIES)) {
                  return fConfiguration.getFeature(EXTERNAL_PARAMETER_ENTITIES_FEATURE);
              }
              else if (name.equals(EXTERNAL_GENERAL_ENTITIES)) {
                  return fConfiguration.getFeature(EXTERNAL_GENERAL_ENTITIES_FEATURE);
              }
              else if (name.equals(EXTERNAL_DTD_SUBSET)) {
                  return fConfiguration.getFeature(LOAD_EXTERNAL_DTD_FEATURE);
              }
              else if (name.equals(COMMENTS)) {
                  return fConfiguration.getFeature(INCLUDE_COMMENTS_FEATURE);
              }
              else if(name.equals(CREATE_ENTITY_REFERENCE_NODES)) {
                  return fConfiguration.getFeature(CREATE_ENTITY_REF_NODES);
              }
              else {
                  return fConfiguration.getFeature(name);
              }
          }
          catch (XMLConfigurationException e) {
              if (e.getType() == XMLConfigurationException.NOT_RECOGNIZED) {
                  throw new DOMException(DOMException.NOT_FOUND_ERR,"Feature \""+name+"\" not recognized");
              }
              else {
                  throw new DOMException(DOMException.NOT_SUPPORTED_ERR,"Feature \""+name+"\" not supported");
              }
          }
      }
      
      /**
       * Parse an XML document from a location identified by an URI reference. 
       * If the URI contains a fragment identifier (see section 4.1 in ), the 
       * behavior is not defined by this specification.
       *  
       * @param uri The location of the XML document to be read.
       * @return If the <code>DOMBuilder</code> is a synchronous 
       *   <code>DOMBuilder</code> the newly created and populated 
       *   <code>Document</code> is returned. If the <code>DOMBuilder</code> 
       *   is asynchronous then <code>null</code> is returned since the 
       *   document object is not yet parsed when this method returns.
       * @exception DOMSystemException
       *   Exceptions raised by <code>parseURI</code> originate with the 
       *   installed ErrorHandler, and thus depend on the implementation of 
       *   the <code>DOMErrorHandler</code> interfaces. The default error 
       *   handlers will raise a DOMSystemException if any form I/O or other 
       *   system error occurs during the parse, but application defined error 
       *   handlers are not required to do so. 
       */
      public Document parseURI(String uri) throws Exception {
          XMLInputSource source = new XMLInputSource(null, uri, null);
          try {
              parse(source);
          }
  
          catch (XNIException e) {
              Exception ex = e.getException();
              throw ex;
          }
              	
          // close stream opened by the parser
          finally {
              try {
                  Reader reader = source.getCharacterStream();
                  if (reader != null) {
                      reader.close();
                  }
                  else {
                      InputStream is = source.getByteStream();
                      if (is != null) {
                          is.close();
                      }
                  }
              }
              catch (IOException e) {
                  // ignore
              }
          }
          return getDocument();
      }
  
      /**
       * Parse an XML document from a resource identified by an 
       * <code>DOMInputSource</code>.
       * 
       * @param is The <code>DOMInputSource</code> from which the source 
       *   document is to be read. 
       * @return If the <code>DOMBuilder</code> is a synchronous 
       *   <code>DOMBuilder</code> the newly created and populated 
       *   <code>Document</code> is returned. If the <code>DOMBuilder</code> 
       *   is asynchronous then <code>null</code> is returned since the 
       *   document object is not yet parsed when this method returns.
       * @exception DOMSystemException
       *   Exceptions raised by <code>parse</code> originate with the installed 
       *   ErrorHandler, and thus depend on the implementation of the 
       *   <code>DOMErrorHandler</code> interfaces. The default ErrorHandlers 
       *   will raise a <code>DOMSystemException</code> if any form I/O or 
       *   other system error occurs during the parse, but application defined 
       *   ErrorHandlers are not required to do so. 
       */
      public Document parse(DOMInputSource is) throws Exception {
      	
      	try {
              XMLInputSource xmlInputSource = 
                  new XMLInputSource(is.getPublicId(), is.getSystemId(), is.getBaseURI());
              xmlInputSource.setByteStream(is.getByteStream());
              xmlInputSource.setCharacterStream(is.getCharacterStream());
              xmlInputSource.setEncoding(is.getEncoding());
              parse(xmlInputSource);
          }
          catch (XNIException e) {
              Exception ex = e.getException();
              throw ex;
          }
                  
      	return getDocument();
      }
                            
      /**
       *  Parse an XML document or fragment from a resource identified by an 
       * <code>DOMInputSource</code> and insert the content into an existing 
       * document at the position epcified with the <code>contextNode</code> 
       * and <code>action</code> arguments. When parsing the input stream the 
       * context node is used for resolving unbound namespace prefixes.
       *  
       * @param is  The <code>DOMInputSource</code> from which the source 
       *   document is to be read. 
       * @param cnode  The <code>Node</code> that is used as the context for 
       *   the data that is being parsed. 
       * @param action This parameter describes which action should be taken 
       *   between the new set of node being inserted and the existing 
       *   children of the context node. The set of possible actions is 
       *   defined above. 
       * @exception DOMException
       *   HIERARCHY_REQUEST_ERR: Thrown if this action results in an invalid 
       *   hierarchy (i.e. a Document with more than one document element). 
       */
      public void parseWithContext(DOMInputSource is, Node cnode, 
                                   short action) throws DOMException {
          // REVISIT: need to implement.
  	throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "Not supported");
      }
      
          
  } // class DOMASBuilderImpl
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: xerces-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-cvs-help@xml.apache.org