/*
* The Apache Software License, Version 1.1
*
*
* Copyright (c) 2000-2002 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) 1999, International
* Business Machines, Inc., http://www.apache.org. For more
* information on the Apache Software Foundation, please see
* .
*/
package com.sun.org.apache.xerces.internal.impl.xs.dom;
import com.sun.org.apache.xerces.internal.parsers.NonValidatingConfiguration;
import com.sun.org.apache.xerces.internal.impl.Constants;
import com.sun.org.apache.xerces.internal.impl.XMLErrorReporter;
import com.sun.org.apache.xerces.internal.impl.xs.SchemaSymbols;
import com.sun.org.apache.xerces.internal.impl.xs.XSMessageFormatter;
import com.sun.org.apache.xerces.internal.xni.XMLLocator;
import com.sun.org.apache.xerces.internal.xni.NamespaceContext;
import com.sun.org.apache.xerces.internal.xni.QName;
import com.sun.org.apache.xerces.internal.xni.Augmentations;
import com.sun.org.apache.xerces.internal.xni.XMLAttributes;
import com.sun.org.apache.xerces.internal.xni.XMLString;
import com.sun.org.apache.xerces.internal.xni.XNIException;
import com.sun.org.apache.xerces.internal.util.XMLChar;
import org.w3c.dom.Element;
/**
* A dom parser used to parse schema documents into DOM trees
*
* @author Sandy Gao, IBM
*
* @version $Id: DOMParser.java,v 1.9 2002/12/11 16:01:18 sandygao Exp $
*/
public class DOMParser extends com.sun.org.apache.xerces.internal.parsers.DOMParser {
/** Property identifier: entity manager. */
protected static final String ENTITY_MANAGER =
Constants.XERCES_PROPERTY_PREFIX + Constants.ENTITY_MANAGER_PROPERTY;
/** Property identifier: DOM document class name. */
protected static final String DOCUMENT_CLASS =
Constants.XERCES_PROPERTY_PREFIX + Constants.DOCUMENT_CLASS_NAME_PROPERTY;
/** Feature identifier: DOM Defer node expansion. */
protected static final String DEFER_EXPANSION =
Constants.XERCES_FEATURE_PREFIX + Constants.DEFER_NODE_EXPANSION_FEATURE;
/** Property identifier: error reporter. */
public static final String ERROR_REPORTER =
Constants.XERCES_PROPERTY_PREFIX + Constants.ERROR_REPORTER_PROPERTY;
// the locator containing line/column information
protected XMLLocator fLocator;
// our own document implementation, which knows how to create Element
// with line/column information
public DocumentImpl fDocumentImpl;
private DOMNodePool fNodePool;
//
// Constructors
//
/**
* Constructs a DOM parser using the dtd/xml schema parser configuration.
*/
public DOMParser() {
// REVISIT: should we use a new configuration with scannerNS->dom API with
// no dtd scanners/valitors..?
//
super(new NonValidatingConfiguration());
try {
// use our own document implementation
setProperty(DOCUMENT_CLASS, "com.sun.org.apache.xerces.internal.impl.xs.dom.DocumentImpl");
// don't defer DOM expansion
setFeature(DEFER_EXPANSION, false);
}
catch (Exception e) {
}
fNodePool = new DOMNodePool();
} // ()
/**
* Resets the node pool.
*/
public void resetNodePool() {
fNodePool.reset();
}
/**
* The start of the document.
*
* @param locator The system identifier of the entity if the entity
* is external, null otherwise.
* @param encoding The auto-detected IANA encoding name of the entity
* stream. This value will be null in those situations
* where the entity encoding is not auto-detected (e.g.
* internal entities or a document entity that is
* parsed from a java.io.Reader).
* @param namespaceContext
* The namespace context in effect at the
* start of this document.
* This object represents the current context.
* Implementors of this class are responsible
* for copying the namespace bindings from the
* the current context (and its parent contexts)
* if that information is important.
* @param augs Additional information that may include infoset augmentations
*
* @throws XNIException Thrown by handler to signal an error.
*/
public void startDocument(XMLLocator locator, String encoding,
NamespaceContext namespaceContext, Augmentations augs)
throws XNIException {
super.startDocument(locator, encoding, namespaceContext, augs);
// get a handle to the document created
fDocumentImpl = (DocumentImpl)super.fDocumentImpl;
fDocumentImpl.fNodePool=fNodePool;
fLocator = locator;
} // startDocument(XMLLocator,String,Augmentations)
// Where xs:appinfo or xs:documentation starts;
// -1 means not in the scope of either of the two elements.
private int fAnnotationDepth = -1;
// The current element depth
private int fDepth = -1;
// Use to report the error when characters are not allowed.
XMLErrorReporter fErrorReporter;
// override startElement method to check whether it's one of
// xs:appinfo or xs:documentation
public void startElement(QName element, XMLAttributes attributes, Augmentations augs)
throws XNIException {
super.startElement(element, attributes, augs);
fDepth++;
// if it's not within either element, check whether it's one of them
// if so, record the current depth, so that any element with larger
// depth is allowed to have character data.
if (fAnnotationDepth == -1) {
if (element.uri == SchemaSymbols.URI_SCHEMAFORSCHEMA &&
(element.localpart == SchemaSymbols.ELT_APPINFO ||
element.localpart == SchemaSymbols.ELT_DOCUMENTATION)) {
fAnnotationDepth = fDepth;
}
}
}
// override this method to check whether there are non-whitespace characters
public void characters(XMLString text, Augmentations augs) throws XNIException {
// when it's not within xs:appinfo or xs:documentation
if (fAnnotationDepth == -1) {
for (int i=text.offset; i