1 /*
2  * Copyright (C) 2007 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package org.apache.harmony.xml.parsers;
18 
19 import java.util.Collections;
20 import java.util.HashMap;
21 import java.util.Map;
22 import javax.xml.parsers.SAXParser;
23 import org.apache.harmony.xml.ExpatReader;
24 import org.xml.sax.Parser;
25 import org.xml.sax.SAXException;
26 import org.xml.sax.SAXNotRecognizedException;
27 import org.xml.sax.SAXNotSupportedException;
28 import org.xml.sax.XMLReader;
29 import org.xml.sax.helpers.XMLReaderAdapter;
30 
31 /**
32  * A SAX parser based on Expat.
33  */
34 final class SAXParserImpl extends SAXParser {
35 
36     private Map<String, Boolean> initialFeatures;
37     private XMLReader reader;
38     private Parser parser;
39 
SAXParserImpl(Map<String, Boolean> initialFeatures)40     SAXParserImpl(Map<String, Boolean> initialFeatures)
41             throws SAXNotRecognizedException, SAXNotSupportedException {
42         this.initialFeatures = initialFeatures.isEmpty()
43                 ? Collections.<String, Boolean>emptyMap()
44                 : new HashMap<String, Boolean>(initialFeatures);
45         resetInternal();
46     }
47 
resetInternal()48     private void resetInternal()
49             throws SAXNotSupportedException, SAXNotRecognizedException {
50         reader = new ExpatReader();
51         for (Map.Entry<String,Boolean> entry : initialFeatures.entrySet()) {
52             reader.setFeature(entry.getKey(), entry.getValue());
53         }
54     }
55 
reset()56     @Override public void reset() {
57         /*
58          * The exceptions are impossible. If any features are unrecognized or
59          * unsupported, construction of this instance would have failed.
60          */
61         try {
62             resetInternal();
63         } catch (SAXNotRecognizedException e) {
64             throw new AssertionError();
65         } catch (SAXNotSupportedException e) {
66             throw new AssertionError();
67         }
68     }
69 
70     @Override
getParser()71     public Parser getParser() {
72         if (parser == null) {
73             parser = new XMLReaderAdapter(reader);
74         }
75 
76         return parser;
77     }
78 
79     @Override
getProperty(String name)80     public Object getProperty(String name) throws SAXNotRecognizedException,
81             SAXNotSupportedException {
82         return reader.getProperty(name);
83     }
84 
85     @Override
getXMLReader()86     public XMLReader getXMLReader() {
87         return reader;
88     }
89 
90     @Override
isNamespaceAware()91     public boolean isNamespaceAware() {
92         try {
93             return reader.getFeature("http://xml.org/sax/features/namespaces");
94         } catch (SAXException ex) {
95             return false;
96         }
97     }
98 
99     @Override
isValidating()100     public boolean isValidating() {
101         return false;
102     }
103 
104     @Override
setProperty(String name, Object value)105     public void setProperty(String name, Object value)
106             throws SAXNotRecognizedException, SAXNotSupportedException {
107         reader.setProperty(name, value);
108     }
109 }
110