/*
* 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.parsers;
import java.util.Vector;
import com.sun.org.apache.xerces.internal.dom.ASModelImpl;
import com.sun.org.apache.xerces.internal.dom3.as.ASModel;
import com.sun.org.apache.xerces.internal.dom3.as.DOMASBuilder;
import com.sun.org.apache.xerces.internal.dom3.as.DOMASException;
import com.sun.org.apache.xerces.internal.impl.Constants;
import com.sun.org.apache.xerces.internal.impl.xs.SchemaGrammar;
import com.sun.org.apache.xerces.internal.impl.xs.XSGrammarBucket;
import com.sun.org.apache.xerces.internal.util.SymbolTable;
import com.sun.org.apache.xerces.internal.util.XMLGrammarPoolImpl;
import com.sun.org.apache.xerces.internal.xni.XNIException;
import com.sun.org.apache.xerces.internal.xni.grammars.Grammar;
import com.sun.org.apache.xerces.internal.xni.grammars.XMLGrammarPool;
import com.sun.org.apache.xerces.internal.xni.parser.XMLInputSource;
import org.w3c.dom.ls.LSInput;
/**
* This is Abstract Schema DOM Builder class. It extends the DOMParserImpl
* class. Provides support for preparsing schemas.
*
* @deprecated
* @author Pavani Mukthipudi, Sun Microsystems Inc.
* @author Neil Graham, IBM
* @version $Id: DOMASBuilderImpl.java,v 1.24 2003/11/17 13:48:41 venu Exp $
*
*/
public class DOMASBuilderImpl
extends DOMParserImpl implements DOMASBuilder {
//
// Constants
//
// Feature ids
protected static final String SCHEMA_FULL_CHECKING =
Constants.XERCES_FEATURE_PREFIX + Constants.SCHEMA_FULL_CHECKING;
// Property ids
protected static final String ERROR_REPORTER =
Constants.XERCES_PROPERTY_PREFIX + Constants.ERROR_REPORTER_PROPERTY;
protected static final String SYMBOL_TABLE =
Constants.XERCES_PROPERTY_PREFIX + Constants.SYMBOL_TABLE_PROPERTY;
protected static final String ENTITY_MANAGER =
Constants.XERCES_PROPERTY_PREFIX + Constants.ENTITY_MANAGER_PROPERTY;
//
// Data
//
protected XSGrammarBucket fGrammarBucket;
protected ASModelImpl fAbstractSchema;
//
// Constructors
//
/**
* Constructs a DOM Builder using the dtd/xml schema parser configuration.
*/
public DOMASBuilderImpl() {
super(new XMLGrammarCachingConfiguration());
} //
/**
* Constructs a DOM Builder using the specified parser configuration.
* We must demand that the configuration extend XMLGrammarCachingConfiguration to make
* sure all relevant methods/features are available.
*/
public DOMASBuilderImpl(XMLGrammarCachingConfiguration config) {
super(config);
} // (XMLParserConfiguration)
/**
* Constructs a DOM Builder using the specified symbol table.
*/
public DOMASBuilderImpl(SymbolTable symbolTable) {
super(new XMLGrammarCachingConfiguration(symbolTable));
} // (SymbolTable)
/**
* Constructs a DOM Builder using the specified symbol table and
* grammar pool.
* The grammarPool implementation should extent the default
* implementation; otherwise, correct functioning of this class may
* not occur.
*/
public DOMASBuilderImpl(SymbolTable symbolTable, XMLGrammarPool grammarPool) {
super(new XMLGrammarCachingConfiguration(symbolTable, grammarPool));
}
//
// DOMASBuilder methods
//
/**
* Associate an ASModel
with a document instance. This
* ASModel
will be used by the "
* validate-if-schema
" and "
* datatype-normalization
" options during the load of a new
* Document
.
*/
public ASModel getAbstractSchema() {
return fAbstractSchema;
}
/**
* Associate an ASModel
with a document instance. This
* ASModel
will be used by the "
* validate-if-schema
" and "
* datatype-normalization
" options during the load of a new
* Document
.
*/
public void setAbstractSchema(ASModel abstractSchema) {
// since the ASModel associated with this object is an attribute
// according to the DOM IDL, we must obliterate anything
// that was set before, rather than adding to it.
// REVISIT: so shouldn't we attempt to clear the
// grammarPool before adding stuff to it? - NG
fAbstractSchema = (ASModelImpl)abstractSchema;
// make sure the GrammarPool is properly initialized.
XMLGrammarPool grammarPool = (XMLGrammarPool)fConfiguration.getProperty(StandardParserConfiguration.XMLGRAMMAR_POOL);
// if there is no grammar pool, create one
// REVISIT: ASBuilder should always create one.
if (grammarPool == null) {
// something's not right in this situation...
grammarPool = new XMLGrammarPoolImpl();
fConfiguration.setProperty(StandardParserConfiguration.XMLGRAMMAR_POOL,
grammarPool);
}
if (fAbstractSchema != null) {
initGrammarPool(fAbstractSchema, grammarPool);
}
}
/**
* Parse a Abstract Schema from a location identified by an URI.
*
* @param uri The location of the Abstract Schema to be read.
* @return The newly created Abstract Schema
.
* @exception DOMASException
* Exceptions raised by parseASURI()
originate with the
* installed ErrorHandler, and thus depend on the implementation of
* the DOMErrorHandler
interfaces. The default error
* handlers will raise a DOMASException
if any form of
* Abstract Schema inconsistencies or warning occurs during the parse,
* but application defined errorHandlers are not required to do so.
*
WRONG_MIME_TYPE_ERR: Raised when mimeTypeCheck
is
* true
and the inputsource has an incorrect MIME Type.
* See attribute mimeTypeCheck
.
* @exception DOMSystemException
* Exceptions raised by parseURI()
originate with the
* installed ErrorHandler, and thus depend on the implementation of
* the DOMErrorHandler
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 ASModel parseASURI(String uri)
throws DOMASException, Exception {
XMLInputSource source = new XMLInputSource(null, uri, null);
return parseASInputSource(source);
}
/**
* Parse a Abstract Schema from a location identified by an
* LSInput
.
*
* @param is The LSInput
from which the source
* Abstract Schema is to be read.
* @return The newly created ASModel
.
* @exception DOMASException
* Exceptions raised by parseASURI()
originate with the
* installed ErrorHandler, and thus depend on the implementation of
* the DOMErrorHandler
interfaces. The default error
* handlers will raise a DOMASException
if any form of
* Abstract Schema inconsistencies or warning occurs during the parse,
* but application defined errorHandlers are not required to do so.
*
WRONG_MIME_TYPE_ERR: Raised when mimeTypeCheck
is
* true and the inputsource has an incorrect MIME Type. See attribute
* mimeTypeCheck
.
* @exception DOMSystemException
* Exceptions raised by parseURI()
originate with the
* installed ErrorHandler, and thus depend on the implementation of
* the DOMErrorHandler
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 ASModel parseASInputSource(LSInput is)
throws DOMASException, Exception {
// need to wrap the LSInput with an XMLInputSource
XMLInputSource xis = this.dom2xmlInputSource(is);
try {
return parseASInputSource(xis);
}
catch (XNIException e) {
Exception ex = e.getException();
throw ex;
}
}
ASModel parseASInputSource(XMLInputSource is) throws Exception {
if (fGrammarBucket == null) {
fGrammarBucket = new XSGrammarBucket();
}
initGrammarBucket();
// actually do the parse:
// save some casting
XMLGrammarCachingConfiguration gramConfig = (XMLGrammarCachingConfiguration)fConfiguration;
// ensure grammarPool doesn't absorb grammars while it's parsing
gramConfig.lockGrammarPool();
SchemaGrammar grammar = gramConfig.parseXMLSchema(is);
gramConfig.unlockGrammarPool();
ASModelImpl newAsModel = null;
if (grammar != null) {
newAsModel = new ASModelImpl();
fGrammarBucket.putGrammar (grammar, true);
addGrammars(newAsModel, fGrammarBucket);
}
return newAsModel;
}
// put all the grammars we have access to in the GrammarBucket
private void initGrammarBucket() {
fGrammarBucket.reset();
if (fAbstractSchema != null)
initGrammarBucketRecurse(fAbstractSchema);
}
private void initGrammarBucketRecurse(ASModelImpl currModel) {
if(currModel.getGrammar() != null) {
fGrammarBucket.putGrammar(currModel.getGrammar());
}
for(int i = 0; i < currModel.getInternalASModels().size(); i++) {
ASModelImpl nextModel = (ASModelImpl)(currModel.getInternalASModels().elementAt(i));
initGrammarBucketRecurse(nextModel);
}
}
private void addGrammars(ASModelImpl model, XSGrammarBucket grammarBucket) {
SchemaGrammar [] grammarList = grammarBucket.getGrammars();
for(int i=0; i