/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.apache.xerces.parsers;

import java.util.Vector;

import org.apache.xerces.dom.ASModelImpl;
import org.apache.xerces.dom3.as.ASModel;
import org.apache.xerces.dom3.as.DOMASBuilder;
import org.apache.xerces.dom3.as.DOMASException;
import org.apache.xerces.impl.Constants;
import org.apache.xerces.impl.xs.SchemaGrammar;
import org.apache.xerces.impl.xs.XSGrammarBucket;
import org.apache.xerces.util.SymbolTable;
import org.apache.xerces.util.XMLGrammarPoolImpl;
import org.apache.xerces.xni.XNIException;
import org.apache.xerces.xni.grammars.Grammar;
import org.apache.xerces.xni.grammars.XMLGrammarPool;
import org.apache.xerces.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.
Author:Pavani Mukthipudi, Sun Microsystems Inc., Neil Graham, IBM
Deprecated:
Version:$Id: DOMASBuilderImpl.java 447239 2006-09-18 05:08:26Z mrglavas $
/** * 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 447239 2006-09-18 05:08:26Z mrglavas $ * */
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.
/** * Constructs a DOM Builder using the dtd/xml schema parser configuration. */
public DOMASBuilderImpl() { super(new XMLGrammarCachingConfiguration()); } // <init>
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.
/** * 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); } // <init>(XMLParserConfiguration)
Constructs a DOM Builder using the specified symbol table.
/** * Constructs a DOM Builder using the specified symbol table. */
public DOMASBuilderImpl(SymbolTable symbolTable) { super(new XMLGrammarCachingConfiguration(symbolTable)); } // <init>(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.
/** * 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.
/** * Associate an <code>ASModel</code> with a document instance. This * <code>ASModel</code> will be used by the " * <code>validate-if-schema</code>" and " * <code>datatype-normalization</code>" options during the load of a new * <code>Document</code>. */
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.
/** * Associate an <code>ASModel</code> with a document instance. This * <code>ASModel</code> will be used by the " * <code>validate-if-schema</code>" and " * <code>datatype-normalization</code>" options during the load of a new * <code>Document</code>. */
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.
Params:
  • uri – The location of the Abstract Schema to be read.
Throws:
  • 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.
  • 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.
Returns:The newly created Abstract Schema.
/** * 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 <code>Abstract Schema</code>. * @exception DOMASException * Exceptions raised by <code>parseASURI()</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 <code>DOMASException</code> if any form of * Abstract Schema inconsistencies or warning occurs during the parse, * but application defined errorHandlers are not required to do so. * <br> WRONG_MIME_TYPE_ERR: Raised when <code>mimeTypeCheck</code> is * <code>true</code> and the inputsource has an incorrect MIME Type. * See attribute <code>mimeTypeCheck</code>. * @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 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.
Params:
  • is – The LSInput from which the source Abstract Schema is to be read.
Throws:
  • 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.
  • 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.
Returns:The newly created ASModel.
/** * Parse a Abstract Schema from a location identified by an * <code>LSInput</code>. * * @param is The <code>LSInput</code> from which the source * Abstract Schema is to be read. * @return The newly created <code>ASModel</code>. * @exception DOMASException * Exceptions raised by <code>parseASURI()</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 <code>DOMASException</code> if any form of * Abstract Schema inconsistencies or warning occurs during the parse, * but application defined errorHandlers are not required to do so. * <br> WRONG_MIME_TYPE_ERR: Raised when <code>mimeTypeCheck</code> is * true and the inputsource has an incorrect MIME Type. See attribute * <code>mimeTypeCheck</code>. * @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 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<grammarList.length; i++) { ASModelImpl newModel = new ASModelImpl(); newModel.setGrammar(grammarList[i]); model.addASModel(newModel); } } // addGrammars private void initGrammarPool(ASModelImpl currModel, XMLGrammarPool grammarPool) { // put all the grammars in fAbstractSchema into the grammar pool. // grammarPool must never be null! Grammar[] grammars = new Grammar[1]; if ((grammars[0] = (Grammar)currModel.getGrammar()) != null) { grammarPool.cacheGrammars(grammars[0].getGrammarDescription().getGrammarType(), grammars); } Vector modelStore = currModel.getInternalASModels(); for (int i = 0; i < modelStore.size(); i++) { initGrammarPool((ASModelImpl)modelStore.elementAt(i), grammarPool); } } } // class DOMASBuilderImpl