View Javadoc
1   /*
2    * reserved comment block
3    * DO NOT REMOVE OR ALTER!
4    */
5   /*
6    * Copyright 2000-2005 The Apache Software Foundation.
7    *
8    * Licensed under the Apache License, Version 2.0 (the "License");
9    * you may not use this file except in compliance with the License.
10   * You may obtain a copy of the License at
11   *
12   *      http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing, software
15   * distributed under the License is distributed on an "AS IS" BASIS,
16   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17   * See the License for the specific language governing permissions and
18   * limitations under the License.
19   */
20  
21  package com.sun.org.apache.xerces.internal.parsers;
22  
23  import com.sun.org.apache.xerces.internal.impl.Constants;
24  import com.sun.org.apache.xerces.internal.util.SymbolTable;
25  import com.sun.org.apache.xerces.internal.utils.XMLSecurityManager;
26  import com.sun.org.apache.xerces.internal.utils.XMLSecurityPropertyManager;
27  import com.sun.org.apache.xerces.internal.xni.grammars.XMLGrammarPool;
28  import com.sun.org.apache.xerces.internal.xni.parser.XMLParserConfiguration;
29  import org.xml.sax.SAXNotRecognizedException;
30  import org.xml.sax.SAXNotSupportedException;
31  
32  /**
33   * This is the main Xerces SAX parser class. It uses the abstract SAX
34   * parser with a document scanner, a dtd scanner, and a validator, as
35   * well as a grammar pool.
36   *
37   * @author Arnaud  Le Hors, IBM
38   * @author Andy Clark, IBM
39   *
40   * @version $Id: SAXParser.java,v 1.7 2010-11-01 04:40:09 joehw Exp $
41   */
42  public class SAXParser
43      extends AbstractSAXParser {
44  
45      //
46      // Constants
47      //
48  
49      // features
50  
51      /** Feature identifier: notify built-in refereces. */
52      protected static final String NOTIFY_BUILTIN_REFS =
53          Constants.XERCES_FEATURE_PREFIX + Constants.NOTIFY_BUILTIN_REFS_FEATURE;
54  
55      protected static final String REPORT_WHITESPACE =
56              Constants.SUN_SCHEMA_FEATURE_PREFIX + Constants.SUN_REPORT_IGNORED_ELEMENT_CONTENT_WHITESPACE;
57  
58      /** Recognized features. */
59      private static final String[] RECOGNIZED_FEATURES = {
60          NOTIFY_BUILTIN_REFS,
61          REPORT_WHITESPACE
62      };
63  
64      // properties
65  
66      /** Property identifier: symbol table. */
67      protected static final String SYMBOL_TABLE =
68          Constants.XERCES_PROPERTY_PREFIX + Constants.SYMBOL_TABLE_PROPERTY;
69  
70      /** Property identifier: XML grammar pool. */
71      protected static final String XMLGRAMMAR_POOL =
72          Constants.XERCES_PROPERTY_PREFIX+Constants.XMLGRAMMAR_POOL_PROPERTY;
73  
74      /** Recognized properties. */
75      private static final String[] RECOGNIZED_PROPERTIES = {
76          SYMBOL_TABLE,
77          XMLGRAMMAR_POOL,
78      };
79  
80  
81      //
82      // Constructors
83      //
84  
85      /**
86       * Constructs a SAX parser using the specified parser configuration.
87       */
88      public SAXParser(XMLParserConfiguration config) {
89          super(config);
90      } // <init>(XMLParserConfiguration)
91  
92      /**
93       * Constructs a SAX parser using the dtd/xml schema parser configuration.
94       */
95      public SAXParser() {
96          this(null, null);
97      } // <init>()
98  
99      /**
100      * Constructs a SAX parser using the specified symbol table.
101      */
102     public SAXParser(SymbolTable symbolTable) {
103         this(symbolTable, null);
104     } // <init>(SymbolTable)
105 
106     /**
107      * Constructs a SAX parser using the specified symbol table and
108      * grammar pool.
109      */
110     public SAXParser(SymbolTable symbolTable, XMLGrammarPool grammarPool) {
111         super(new XIncludeAwareParserConfiguration());
112 
113         // set features
114         fConfiguration.addRecognizedFeatures(RECOGNIZED_FEATURES);
115         fConfiguration.setFeature(NOTIFY_BUILTIN_REFS, true);
116 
117         // set properties
118         fConfiguration.addRecognizedProperties(RECOGNIZED_PROPERTIES);
119         if (symbolTable != null) {
120             fConfiguration.setProperty(SYMBOL_TABLE, symbolTable);
121         }
122         if (grammarPool != null) {
123             fConfiguration.setProperty(XMLGRAMMAR_POOL, grammarPool);
124         }
125 
126     } // <init>(SymbolTable,XMLGrammarPool)
127 
128     /**
129      * Sets the particular property in the underlying implementation of
130      * org.xml.sax.XMLReader.
131      */
132     public void setProperty(String name, Object value)
133         throws SAXNotRecognizedException, SAXNotSupportedException {
134         /**
135          * It's possible for users to set a security manager through the interface.
136          * If it's the old SecurityManager, convert it to the new XMLSecurityManager
137          */
138         if (name.equals(Constants.SECURITY_MANAGER)) {
139             securityManager = XMLSecurityManager.convert(value, securityManager);
140             super.setProperty(Constants.SECURITY_MANAGER, securityManager);
141             return;
142         }
143         if (name.equals(Constants.XML_SECURITY_PROPERTY_MANAGER)) {
144             if (value == null) {
145                 securityPropertyManager = new XMLSecurityPropertyManager();
146             } else {
147                 securityPropertyManager = (XMLSecurityPropertyManager)value;
148             }
149             super.setProperty(Constants.XML_SECURITY_PROPERTY_MANAGER, securityPropertyManager);
150             return;
151         }
152 
153         if (securityManager == null) {
154             securityManager = new XMLSecurityManager(true);
155             super.setProperty(Constants.SECURITY_MANAGER, securityManager);
156         }
157 
158         if (securityPropertyManager == null) {
159             securityPropertyManager = new XMLSecurityPropertyManager();
160             super.setProperty(Constants.XML_SECURITY_PROPERTY_MANAGER, securityPropertyManager);
161         }
162 
163         int index = securityPropertyManager.getIndex(name);
164         if (index > -1) {
165             /**
166              * this is a direct call to this parser, not a subclass since
167              * internally the support of this property is done through
168              * XMLSecurityPropertyManager
169              */
170             securityPropertyManager.setValue(index, XMLSecurityPropertyManager.State.APIPROPERTY, (String)value);
171         } else {
172             //check if the property is managed by security manager
173             if (!securityManager.setLimit(name, XMLSecurityManager.State.APIPROPERTY, value)) {
174                 //fall back to the default configuration to handle the property
175                 super.setProperty(name, value);
176             }
177         }
178     }
179 } // class SAXParser