1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * you may not use this file except in compliance with the License.
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * You may obtain a copy of the License at
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License.
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage org.apache.harmony.xml.parsers;
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.HashMap;
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Map;
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport javax.xml.parsers.ParserConfigurationException;
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport javax.xml.parsers.SAXParser;
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport javax.xml.parsers.SAXParserFactory;
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.xml.sax.SAXNotRecognizedException;
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Provides a straightforward SAXParserFactory implementation based on
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Expat. The class is used internally only, thus only notable members
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * that are not already in the abstract superclass are documented.
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class SAXParserFactoryImpl extends SAXParserFactory {
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final String NAMESPACES
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            = "http://xml.org/sax/features/namespaces";
35f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final String VALIDATION
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            = "http://xml.org/sax/features/validation";
38f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private Map<String, Boolean> features = new HashMap<String, Boolean>();
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean getFeature(String name) throws SAXNotRecognizedException {
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (name == null) {
4486acc043d3334651ee26c65467d78d6cefedd397Kenny Root            throw new NullPointerException("name == null");
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
46f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!name.startsWith("http://xml.org/sax/features/")) {
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new SAXNotRecognizedException(name);
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
50f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return Boolean.TRUE.equals(features.get(name));
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isNamespaceAware() {
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return getFeature(NAMESPACES);
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (SAXNotRecognizedException ex) {
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new AssertionError(ex);
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isValidating() {
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return getFeature(VALIDATION);
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (SAXNotRecognizedException ex) {
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new AssertionError(ex);
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public SAXParser newSAXParser() throws ParserConfigurationException {
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (isValidating()) {
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new ParserConfigurationException(
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    "No validating SAXParser implementation available");
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
78f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return new SAXParserImpl(features);
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (Exception ex) {
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new ParserConfigurationException(ex.toString());
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setFeature(String name, boolean value) throws SAXNotRecognizedException {
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (name == null) {
8986acc043d3334651ee26c65467d78d6cefedd397Kenny Root            throw new NullPointerException("name == null");
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
91f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!name.startsWith("http://xml.org/sax/features/")) {
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new SAXNotRecognizedException(name);
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
95f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (value) {
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            features.put(name, Boolean.TRUE);
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else {
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // This is needed to disable features that are enabled by default.
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            features.put(name, Boolean.FALSE);
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setNamespaceAware(boolean value) {
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            setFeature(NAMESPACES, value);
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (SAXNotRecognizedException ex) {
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new AssertionError(ex);
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setValidating(boolean value) {
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            setFeature(VALIDATION, value);
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (SAXNotRecognizedException ex) {
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new AssertionError(ex);
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
122