1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Copyright (c) 2001-2004 World Wide Web Consortium, 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (Massachusetts Institute of Technology, Institut National de 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Recherche en Informatique et en Automatique, Keio University). All 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Rights Reserved. This program is distributed under the W3C's Software 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Intellectual Property License. This program is distributed in the 7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * hope that it will be useful, but WITHOUT ANY WARRANTY; without even 8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * PURPOSE. 10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See W3C License http://www.w3.org/Consortium/Legal/ for more details. 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage org.w3c.domts; 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 15ccd79e2bb784cdbd89e90a0e4301a707091d446dJesse Wilsonimport java.io.InputStream; 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport javax.xml.parsers.DocumentBuilder; 17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport javax.xml.parsers.DocumentBuilderFactory; 18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport javax.xml.parsers.ParserConfigurationException; 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.w3c.dom.DOMImplementation; 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.w3c.dom.Document; 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.xml.sax.SAXException; 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.xml.sax.SAXParseException; 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This class implements the generic parser and configuation 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * abstract class for JAXP supporting parsers. 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class JAXPDOMTestDocumentBuilderFactory 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project extends DOMTestDocumentBuilderFactory { 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private DocumentBuilderFactory factory; 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private DocumentBuilder builder; 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates a JAXP implementation of DOMTestDocumentBuilderFactory. 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param factory null for default JAXP provider. If not null, 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * factory will be mutated in constructor and should be released 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * by calling code upon return. 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param settings array of settings, may be null. 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public JAXPDOMTestDocumentBuilderFactory( 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project DocumentBuilderFactory baseFactory, 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project DocumentBuilderSetting[] settings) throws DOMTestIncompatibleException { 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(settings); 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (baseFactory == null) { 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project factory = DocumentBuilderFactory.newInstance(); 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project else { 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project factory = baseFactory; 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // apply settings to selected document builder 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // may throw exception if incompatible 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (settings != null) { 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = 0; i < settings.length; i++) { 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project settings[i].applySetting(factory); 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.builder = factory.newDocumentBuilder(); 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project catch (ParserConfigurationException ex) { 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new DOMTestIncompatibleException(ex, null); 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected DOMTestDocumentBuilderFactory createInstance(DocumentBuilderFactory 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project newFactory, 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project DocumentBuilderSetting[] mergedSettings) throws 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project DOMTestIncompatibleException { 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new JAXPDOMTestDocumentBuilderFactory(newFactory, mergedSettings); 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public DOMTestDocumentBuilderFactory newInstance(DocumentBuilderSetting[] 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project newSettings) throws DOMTestIncompatibleException { 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (newSettings == null) { 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return this; 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project DocumentBuilderSetting[] mergedSettings = mergeSettings(newSettings); 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project DocumentBuilderFactory newFactory = factory.newInstance(); 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return createInstance(newFactory, mergedSettings); 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private class LoadErrorHandler 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project implements org.xml.sax.ErrorHandler { 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private SAXException parseException; 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private int errorCount; 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private int warningCount; 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public LoadErrorHandler() { 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project parseException = null; 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project errorCount = 0; 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project warningCount = 0; 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void error(SAXParseException ex) { 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project errorCount++; 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (parseException == null) { 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project parseException = ex; 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void warning(SAXParseException ex) { 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project warningCount++; 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void fatalError(SAXParseException ex) { 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (parseException == null) { 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project parseException = ex; 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public SAXException getFirstException() { 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return parseException; 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Document load(java.net.URL url) throws DOMTestLoadException { 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Document doc = null; 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Exception parseException = null; 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project LoadErrorHandler errorHandler = new LoadErrorHandler(); 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project builder.setErrorHandler(errorHandler); 124ccd79e2bb784cdbd89e90a0e4301a707091d446dJesse Wilson InputStream stream = url.openStream(); 125ccd79e2bb784cdbd89e90a0e4301a707091d446dJesse Wilson doc = builder.parse(stream, url.toString()); 126ccd79e2bb784cdbd89e90a0e4301a707091d446dJesse Wilson stream.close(); 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project parseException = errorHandler.getFirstException(); 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project catch (Exception ex) { 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project parseException = ex; 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project builder.setErrorHandler(null); 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (parseException != null) { 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new DOMTestLoadException(parseException); 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return doc; 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public DOMImplementation getDOMImplementation() { 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return builder.getDOMImplementation(); 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean hasFeature(String feature, String version) { 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return builder.getDOMImplementation().hasFeature(feature, version); 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean isCoalescing() { 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return factory.isCoalescing(); 149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean isExpandEntityReferences() { 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return factory.isExpandEntityReferences(); 153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean isIgnoringElementContentWhitespace() { 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return factory.isIgnoringElementContentWhitespace(); 157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean isNamespaceAware() { 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return factory.isNamespaceAware(); 161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean isValidating() { 164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return factory.isValidating(); 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static DocumentBuilderSetting[] getConfiguration1() { 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new DocumentBuilderSetting[] { 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project DocumentBuilderSetting.notCoalescing, 170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project DocumentBuilderSetting.notExpandEntityReferences, 171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project DocumentBuilderSetting.notIgnoringElementContentWhitespace, 172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project DocumentBuilderSetting.notNamespaceAware, 173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project DocumentBuilderSetting.notValidating}; 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static DocumentBuilderSetting[] getConfiguration2() { 177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new DocumentBuilderSetting[] { 178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project DocumentBuilderSetting.notCoalescing, 179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project DocumentBuilderSetting.expandEntityReferences, 180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project DocumentBuilderSetting.ignoringElementContentWhitespace, 181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project DocumentBuilderSetting.namespaceAware, 182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project DocumentBuilderSetting.validating}; 183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 187