/*
 * reserved comment block
 * DO NOT REMOVE OR ALTER!
 */
/*
 * Copyright 2001, 2002,2004 The Apache Software Foundation.
 *
 * Licensed 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 com.sun.org.apache.xerces.internal.parsers;

import com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl;
import com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl;
import com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator;
import com.sun.org.apache.xerces.internal.impl.dtd.XMLNSDTDValidator;
import com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator;
import com.sun.org.apache.xerces.internal.impl.xs.XSMessageFormatter;
import com.sun.org.apache.xerces.internal.util.SymbolTable;
import com.sun.org.apache.xerces.internal.xni.grammars.XMLGrammarPool;
import com.sun.org.apache.xerces.internal.xni.parser.XMLComponent;
import com.sun.org.apache.xerces.internal.xni.parser.XMLComponentManager;
import com.sun.org.apache.xerces.internal.xni.parser.XMLDocumentScanner;

/**
 * This is configuration uses a scanner that integrates both scanning of the document
 * and binding namespaces.
 *
 * If namespace feature is turned on, the pipeline is constructured with the
 * following components:
 * XMLNSDocumentScannerImpl -> XMLNSDTDValidator -> (optional) XMLSchemaValidator
 *
 * If the namespace feature is turned off the default document scanner implementation
 * is used (XMLDocumentScannerImpl).
 * <p>
 * In addition to the features and properties recognized by the base
 * parser configuration, this class recognizes these additional
 * features and properties:
 * <ul>
 * <li>Features
 *  <ul>
 *  <li>http://apache.org/xml/features/validation/schema</li>
 *  <li>http://apache.org/xml/features/validation/schema-full-checking</li>
 *  <li>http://apache.org/xml/features/validation/schema/normalized-value</li>
 *  <li>http://apache.org/xml/features/validation/schema/element-default</li>
 *  </ul>
 * <li>Properties
 *  <ul>
 *   <li>http://apache.org/xml/properties/internal/error-reporter</li>
 *   <li>http://apache.org/xml/properties/internal/entity-manager</li>
 *   <li>http://apache.org/xml/properties/internal/document-scanner</li>
 *   <li>http://apache.org/xml/properties/internal/dtd-scanner</li>
 *   <li>http://apache.org/xml/properties/internal/grammar-pool</li>
 *   <li>http://apache.org/xml/properties/internal/validator/dtd</li>
 *   <li>http://apache.org/xml/properties/internal/datatype-validator-factory</li>
 *  </ul>
 * </ul>
 *
 * @author Elena Litani, IBM
 *
 */
public class IntegratedParserConfiguration
extends StandardParserConfiguration {


    //
    // REVISIT: should this configuration depend on the others
    //          like DTD/Standard one?
    //

    /** Document scanner that does namespace binding. */
    protected XMLNSDocumentScannerImpl fNamespaceScanner;

    /** Default Xerces implementation of scanner */
    protected XMLDocumentScannerImpl fNonNSScanner;

    /** DTD Validator that does not bind namespaces */
    protected XMLDTDValidator fNonNSDTDValidator;

    //
    // Constructors
    //

    /** Default constructor. */
    public IntegratedParserConfiguration() {
        this(null, null, null);
    } // <init>()

    /**
     * Constructs a parser configuration using the specified symbol table.
     *
     * @param symbolTable The symbol table to use.
     */
    public IntegratedParserConfiguration(SymbolTable symbolTable) {
        this(symbolTable, null, null);
    } // <init>(SymbolTable)

    /**
     * Constructs a parser configuration using the specified symbol table and
     * grammar pool.
     * <p>
     * <strong>REVISIT:</strong>
     * Grammar pool will be updated when the new validation engine is
     * implemented.
     *
     * @param symbolTable The symbol table to use.
     * @param grammarPool The grammar pool to use.
     */
    public IntegratedParserConfiguration(SymbolTable symbolTable,
                                         XMLGrammarPool grammarPool) {
        this(symbolTable, grammarPool, null);
    } // <init>(SymbolTable,XMLGrammarPool)

    /**
     * Constructs a parser configuration using the specified symbol table,
     * grammar pool, and parent settings.
     * <p>
     * <strong>REVISIT:</strong>
     * Grammar pool will be updated when the new validation engine is
     * implemented.
     *
     * @param symbolTable    The symbol table to use.
     * @param grammarPool    The grammar pool to use.
     * @param parentSettings The parent settings.
     */
    public IntegratedParserConfiguration(SymbolTable symbolTable,
                                         XMLGrammarPool grammarPool,
                                         XMLComponentManager parentSettings) {
        super(symbolTable, grammarPool, parentSettings);

        // create components
        fNonNSScanner = new XMLDocumentScannerImpl();
        fNonNSDTDValidator = new XMLDTDValidator();

        // add components
        addComponent((XMLComponent)fNonNSScanner);
        addComponent((XMLComponent)fNonNSDTDValidator);

    } // <init>(SymbolTable,XMLGrammarPool)


    /** Configures the pipeline. */
        protected void configurePipeline() {

                // use XML 1.0 datatype library
                setProperty(DATATYPE_VALIDATOR_FACTORY, fDatatypeValidatorFactory);

                // setup DTD pipeline
                configureDTDPipeline();

                // setup document pipeline
                if (fFeatures.get(NAMESPACES) == Boolean.TRUE) {
            fProperties.put(NAMESPACE_BINDER, fNamespaceBinder);
                        fScanner = fNamespaceScanner;
                        fProperties.put(DOCUMENT_SCANNER, fNamespaceScanner);
                        if (fDTDValidator != null) {
                                fProperties.put(DTD_VALIDATOR, fDTDValidator);
                                fNamespaceScanner.setDTDValidator(fDTDValidator);
                                fNamespaceScanner.setDocumentHandler(fDTDValidator);
                                fDTDValidator.setDocumentSource(fNamespaceScanner);
                                fDTDValidator.setDocumentHandler(fDocumentHandler);
                                if (fDocumentHandler != null) {
                                        fDocumentHandler.setDocumentSource(fDTDValidator);
                                }
                                fLastComponent = fDTDValidator;
                        }
                        else {
                                fNamespaceScanner.setDocumentHandler(fDocumentHandler);
                fNamespaceScanner.setDTDValidator(null);
                                if (fDocumentHandler != null) {
                                        fDocumentHandler.setDocumentSource(fNamespaceScanner);
                                }
                                fLastComponent = fNamespaceScanner;
                        }
                }
                else {
                        fScanner = fNonNSScanner;
                        fProperties.put(DOCUMENT_SCANNER, fNonNSScanner);
                        if (fNonNSDTDValidator != null) {
                                fProperties.put(DTD_VALIDATOR, fNonNSDTDValidator);
                                fNonNSScanner.setDocumentHandler(fNonNSDTDValidator);
                                fNonNSDTDValidator.setDocumentSource(fNonNSScanner);
                                fNonNSDTDValidator.setDocumentHandler(fDocumentHandler);
                                if (fDocumentHandler != null) {
                                        fDocumentHandler.setDocumentSource(fNonNSDTDValidator);
                                }
                                fLastComponent = fNonNSDTDValidator;
                        }
                        else {
                                fScanner.setDocumentHandler(fDocumentHandler);
                                if (fDocumentHandler != null) {
                                        fDocumentHandler.setDocumentSource(fScanner);
                                }
                                fLastComponent = fScanner;
                        }
                }

                // setup document pipeline
                if (fFeatures.get(XMLSCHEMA_VALIDATION) == Boolean.TRUE) {
                        // If schema validator was not in the pipeline insert it.
                        if (fSchemaValidator == null) {
                                fSchemaValidator = new XMLSchemaValidator();

                                // add schema component
                                fProperties.put(SCHEMA_VALIDATOR, fSchemaValidator);
                                addComponent(fSchemaValidator);
                                // add schema message formatter
                                if (fErrorReporter.getMessageFormatter(XSMessageFormatter.SCHEMA_DOMAIN) == null) {
                                        XSMessageFormatter xmft = new XSMessageFormatter();
                                        fErrorReporter.putMessageFormatter(XSMessageFormatter.SCHEMA_DOMAIN, xmft);
                                }

                        }

                        fLastComponent.setDocumentHandler(fSchemaValidator);
                        fSchemaValidator.setDocumentSource(fLastComponent);
                        fSchemaValidator.setDocumentHandler(fDocumentHandler);
                        if (fDocumentHandler != null) {
                                fDocumentHandler.setDocumentSource(fSchemaValidator);
                        }
                        fLastComponent = fSchemaValidator;
                }
        } // configurePipeline()



    /** Create a document scanner: this scanner performs namespace binding
      */
    protected XMLDocumentScanner createDocumentScanner() {
        fNamespaceScanner = new XMLNSDocumentScannerImpl();
        return fNamespaceScanner;
    } // createDocumentScanner():XMLDocumentScanner


    /** Create a DTD validator: this validator performs namespace binding.
      */
    protected XMLDTDValidator createDTDValidator() {
        return new XMLNSDTDValidator();
    } // createDTDValidator():XMLDTDValidator

} // class IntegratedParserConfiguration
