1 /*
   2  * reserved comment block
   3  * DO NOT REMOVE OR ALTER!
   4  */
   5 /*
   6  * Licensed to the Apache Software Foundation (ASF) under one or more
   7  * contributor license agreements.  See the NOTICE file distributed with
   8  * this work for additional information regarding copyright ownership.
   9  * The ASF licenses this file to You under the Apache License, Version 2.0
  10  * (the "License"); you may not use this file except in compliance with
  11  * the License.  You may obtain a copy of the License at
  12  *
  13  *      http://www.apache.org/licenses/LICENSE-2.0
  14  *
  15  * Unless required by applicable law or agreed to in writing, software
  16  * distributed under the License is distributed on an "AS IS" BASIS,
  17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  18  * See the License for the specific language governing permissions and
  19  * limitations under the License.
  20  */
  21 
  22 package com.sun.org.apache.xerces.internal.parsers;
  23 
  24 import com.sun.org.apache.xerces.internal.impl.Constants;
  25 import com.sun.org.apache.xerces.internal.util.SymbolTable;
  26 import com.sun.org.apache.xerces.internal.xinclude.XIncludeHandler;
  27 import com.sun.org.apache.xerces.internal.xinclude.XIncludeNamespaceSupport;
  28 import com.sun.org.apache.xerces.internal.xni.XMLDocumentHandler;
  29 import com.sun.org.apache.xerces.internal.xni.grammars.XMLGrammarPool;
  30 import com.sun.org.apache.xerces.internal.xni.parser.XMLComponentManager;
  31 import com.sun.org.apache.xerces.internal.xni.parser.XMLConfigurationException;
  32 import com.sun.org.apache.xerces.internal.xni.parser.XMLDocumentSource;
  33 
  34 /**
  35  * This parser configuration includes an <code>XIncludeHandler</code> in the pipeline
  36  * before the schema validator, or as the last component in the pipeline if there is
  37  * no schema validator.  Using this pipeline will enable processing according to the
  38  * XML Inclusions specification, to the conformance level described in
  39  * <code>XIncludeHandler</code>.
  40  *
  41  * @author Peter McCracken, IBM
  42  * @see com.sun.org.apache.xerces.internal.xinclude.XIncludeHandler
  43  */
  44 public class XIncludeParserConfiguration extends XML11Configuration {
  45 
  46     private XIncludeHandler fXIncludeHandler;
  47 
  48     /** Feature identifier: allow notation and unparsed entity events to be sent out of order. */
  49     protected static final String ALLOW_UE_AND_NOTATION_EVENTS =
  50         Constants.SAX_FEATURE_PREFIX + Constants.ALLOW_DTD_EVENTS_AFTER_ENDDTD_FEATURE;
  51 
  52     /** Feature identifier: fixup base URIs. */
  53     protected static final String XINCLUDE_FIXUP_BASE_URIS =
  54         Constants.XERCES_FEATURE_PREFIX + Constants.XINCLUDE_FIXUP_BASE_URIS_FEATURE;
  55 
  56     /** Feature identifier: fixup language. */
  57     protected static final String XINCLUDE_FIXUP_LANGUAGE =
  58         Constants.XERCES_FEATURE_PREFIX + Constants.XINCLUDE_FIXUP_LANGUAGE_FEATURE;
  59 
  60     /** Property identifier: error reporter. */
  61     protected static final String XINCLUDE_HANDLER =
  62         Constants.XERCES_PROPERTY_PREFIX + Constants.XINCLUDE_HANDLER_PROPERTY;
  63 
  64     /** Property identifier: error reporter. */
  65     protected static final String NAMESPACE_CONTEXT =
  66         Constants.XERCES_PROPERTY_PREFIX + Constants.NAMESPACE_CONTEXT_PROPERTY;
  67 
  68     /** Default constructor. */
  69     public XIncludeParserConfiguration() {
  70         this(null, null, null);
  71     } // <init>()
  72 
  73     /**
  74      * Constructs a parser configuration using the specified symbol table.
  75      *
  76      * @param symbolTable The symbol table to use.
  77      */
  78     public XIncludeParserConfiguration(SymbolTable symbolTable) {
  79         this(symbolTable, null, null);
  80     } // <init>(SymbolTable)
  81 
  82     /**
  83      * Constructs a parser configuration using the specified symbol table and
  84      * grammar pool.
  85      * <p>
  86      *
  87      * @param symbolTable The symbol table to use.
  88      * @param grammarPool The grammar pool to use.
  89      */
  90     public XIncludeParserConfiguration(
  91         SymbolTable symbolTable,
  92         XMLGrammarPool grammarPool) {
  93         this(symbolTable, grammarPool, null);
  94     } // <init>(SymbolTable,XMLGrammarPool)
  95 
  96     /**
  97      * Constructs a parser configuration using the specified symbol table,
  98      * grammar pool, and parent settings.
  99      * <p>
 100      *
 101      * @param symbolTable    The symbol table to use.
 102      * @param grammarPool    The grammar pool to use.
 103      * @param parentSettings The parent settings.
 104      */
 105     public XIncludeParserConfiguration(
 106         SymbolTable symbolTable,
 107         XMLGrammarPool grammarPool,
 108         XMLComponentManager parentSettings) {
 109         super(symbolTable, grammarPool, parentSettings);
 110 
 111         fXIncludeHandler = new XIncludeHandler();
 112         addCommonComponent(fXIncludeHandler);
 113 
 114         final String[] recognizedFeatures = {
 115             ALLOW_UE_AND_NOTATION_EVENTS,
 116             XINCLUDE_FIXUP_BASE_URIS,
 117             XINCLUDE_FIXUP_LANGUAGE
 118         };
 119         addRecognizedFeatures(recognizedFeatures);
 120 
 121         // add default recognized properties
 122         final String[] recognizedProperties =
 123             { XINCLUDE_HANDLER, NAMESPACE_CONTEXT };
 124         addRecognizedProperties(recognizedProperties);
 125 
 126         setFeature(ALLOW_UE_AND_NOTATION_EVENTS, true);
 127         setFeature(XINCLUDE_FIXUP_BASE_URIS, true);
 128         setFeature(XINCLUDE_FIXUP_LANGUAGE, true);
 129 
 130         setProperty(XINCLUDE_HANDLER, fXIncludeHandler);
 131         setProperty(NAMESPACE_CONTEXT, new XIncludeNamespaceSupport());
 132     } // <init>(SymbolTable,XMLGrammarPool)}
 133 
 134 
 135         /** Configures the pipeline. */
 136     protected void configurePipeline() {
 137         super.configurePipeline();
 138 
 139         //configure DTD pipeline
 140         fDTDScanner.setDTDHandler(fDTDProcessor);
 141         fDTDProcessor.setDTDSource(fDTDScanner);
 142         fDTDProcessor.setDTDHandler(fXIncludeHandler);
 143         fXIncludeHandler.setDTDSource(fDTDProcessor);
 144                 fXIncludeHandler.setDTDHandler(fDTDHandler);
 145         if (fDTDHandler != null) {
 146             fDTDHandler.setDTDSource(fXIncludeHandler);
 147         }
 148 
 149         // configure XML document pipeline: insert after DTDValidator and
 150         // before XML Schema validator
 151         XMLDocumentSource prev = null;
 152         if (fFeatures.get(XMLSCHEMA_VALIDATION) == Boolean.TRUE) {
 153             // we don't have to worry about fSchemaValidator being null, since
 154             // super.configurePipeline() instantiated it if the feature was set
 155             prev = fSchemaValidator.getDocumentSource();
 156         }
 157         // Otherwise, insert after the last component in the pipeline
 158         else {
 159             prev = fLastComponent;
 160             fLastComponent = fXIncludeHandler;
 161         }
 162 
 163          if (prev != null) {
 164             XMLDocumentHandler next = prev.getDocumentHandler();
 165             prev.setDocumentHandler(fXIncludeHandler);
 166             fXIncludeHandler.setDocumentSource(prev);
 167             if (next != null) {
 168                 fXIncludeHandler.setDocumentHandler(next);
 169                 next.setDocumentSource(fXIncludeHandler);
 170             }
 171          }
 172          else {
 173             setDocumentHandler(fXIncludeHandler);
 174          }
 175 
 176     } // configurePipeline()
 177 
 178         protected void configureXML11Pipeline() {
 179                 super.configureXML11Pipeline();
 180 
 181         // configure XML 1.1. DTD pipeline
 182                 fXML11DTDScanner.setDTDHandler(fXML11DTDProcessor);
 183                 fXML11DTDProcessor.setDTDSource(fXML11DTDScanner);
 184                 fXML11DTDProcessor.setDTDHandler(fXIncludeHandler);
 185                 fXIncludeHandler.setDTDSource(fXML11DTDProcessor);
 186                 fXIncludeHandler.setDTDHandler(fDTDHandler);
 187                 if (fDTDHandler != null) {
 188                         fDTDHandler.setDTDSource(fXIncludeHandler);
 189                 }
 190 
 191                 // configure XML document pipeline: insert after DTDValidator and
 192                 // before XML Schema validator
 193                 XMLDocumentSource prev = null;
 194                 if (fFeatures.get(XMLSCHEMA_VALIDATION) == Boolean.TRUE) {
 195                         // we don't have to worry about fSchemaValidator being null, since
 196                         // super.configurePipeline() instantiated it if the feature was set
 197                         prev = fSchemaValidator.getDocumentSource();
 198                 }
 199                 // Otherwise, insert after the last component in the pipeline
 200                 else {
 201                         prev = fLastComponent;
 202                         fLastComponent = fXIncludeHandler;
 203                 }
 204 
 205                 XMLDocumentHandler next = prev.getDocumentHandler();
 206                 prev.setDocumentHandler(fXIncludeHandler);
 207                 fXIncludeHandler.setDocumentSource(prev);
 208                 if (next != null) {
 209                         fXIncludeHandler.setDocumentHandler(next);
 210                         next.setDocumentSource(fXIncludeHandler);
 211                 }
 212 
 213         } // configureXML11Pipeline()
 214 
 215     public void setProperty(String propertyId, Object value)
 216         throws XMLConfigurationException {
 217 
 218         if (propertyId.equals(XINCLUDE_HANDLER)) {
 219         }
 220 
 221         super.setProperty(propertyId, value);
 222     } // setProperty(String,Object)
 223 }