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
22package com.sun.org.apache.xerces.internal.parsers;
23
24import com.sun.org.apache.xerces.internal.impl.Constants;
25import com.sun.org.apache.xerces.internal.util.SymbolTable;
26import com.sun.org.apache.xerces.internal.utils.XMLSecurityManager;
27import com.sun.org.apache.xerces.internal.utils.XMLSecurityPropertyManager;
28import com.sun.org.apache.xerces.internal.xni.grammars.XMLGrammarPool;
29import com.sun.org.apache.xerces.internal.xni.parser.XMLParserConfiguration;
30import org.xml.sax.SAXNotRecognizedException;
31import org.xml.sax.SAXNotSupportedException;
32
33/**
34 * This is the main Xerces SAX parser class. It uses the abstract SAX
35 * parser with a document scanner, a dtd scanner, and a validator, as
36 * well as a grammar pool.
37 *
38 * @author Arnaud  Le Hors, IBM
39 * @author Andy Clark, IBM
40 *
41 */
42public 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
180