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