| /* |
| * Copyright (c) 2001-2004 World Wide Web Consortium, |
| * (Massachusetts Institute of Technology, Institut National de |
| * Recherche en Informatique et en Automatique, Keio University). All |
| * Rights Reserved. This program is distributed under the W3C's Software |
| * Intellectual Property License. This program is distributed in the |
| * hope that it will be useful, but WITHOUT ANY WARRANTY; without even |
| * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR |
| * PURPOSE. |
| * See W3C License http://www.w3.org/Consortium/Legal/ for more details. |
| */ |
| |
| package org.w3c.domts; |
| |
| import java.io.InputStream; |
| import javax.xml.parsers.DocumentBuilder; |
| import javax.xml.parsers.DocumentBuilderFactory; |
| import javax.xml.parsers.ParserConfigurationException; |
| |
| import org.w3c.dom.DOMImplementation; |
| import org.w3c.dom.Document; |
| import org.xml.sax.SAXException; |
| import org.xml.sax.SAXParseException; |
| |
| /** |
| * This class implements the generic parser and configuation |
| * abstract class for JAXP supporting parsers. |
| */ |
| public class JAXPDOMTestDocumentBuilderFactory |
| extends DOMTestDocumentBuilderFactory { |
| |
| private DocumentBuilderFactory factory; |
| private DocumentBuilder builder; |
| |
| /** |
| * Creates a JAXP implementation of DOMTestDocumentBuilderFactory. |
| * @param factory null for default JAXP provider. If not null, |
| * factory will be mutated in constructor and should be released |
| * by calling code upon return. |
| * @param settings array of settings, may be null. |
| */ |
| public JAXPDOMTestDocumentBuilderFactory( |
| DocumentBuilderFactory baseFactory, |
| DocumentBuilderSetting[] settings) throws DOMTestIncompatibleException { |
| super(settings); |
| if (baseFactory == null) { |
| factory = DocumentBuilderFactory.newInstance(); |
| } |
| else { |
| factory = baseFactory; |
| } |
| // |
| // apply settings to selected document builder |
| // may throw exception if incompatible |
| if (settings != null) { |
| for (int i = 0; i < settings.length; i++) { |
| settings[i].applySetting(factory); |
| } |
| } |
| try { |
| this.builder = factory.newDocumentBuilder(); |
| } |
| catch (ParserConfigurationException ex) { |
| throw new DOMTestIncompatibleException(ex, null); |
| } |
| } |
| |
| protected DOMTestDocumentBuilderFactory createInstance(DocumentBuilderFactory |
| newFactory, |
| DocumentBuilderSetting[] mergedSettings) throws |
| DOMTestIncompatibleException { |
| return new JAXPDOMTestDocumentBuilderFactory(newFactory, mergedSettings); |
| } |
| |
| public DOMTestDocumentBuilderFactory newInstance(DocumentBuilderSetting[] |
| newSettings) throws DOMTestIncompatibleException { |
| if (newSettings == null) { |
| return this; |
| } |
| DocumentBuilderSetting[] mergedSettings = mergeSettings(newSettings); |
| DocumentBuilderFactory newFactory = factory.newInstance(); |
| return createInstance(newFactory, mergedSettings); |
| } |
| |
| private class LoadErrorHandler |
| implements org.xml.sax.ErrorHandler { |
| private SAXException parseException; |
| private int errorCount; |
| private int warningCount; |
| public LoadErrorHandler() { |
| parseException = null; |
| errorCount = 0; |
| warningCount = 0; |
| } |
| |
| public void error(SAXParseException ex) { |
| errorCount++; |
| if (parseException == null) { |
| parseException = ex; |
| } |
| } |
| |
| public void warning(SAXParseException ex) { |
| warningCount++; |
| } |
| |
| public void fatalError(SAXParseException ex) { |
| if (parseException == null) { |
| parseException = ex; |
| } |
| } |
| |
| public SAXException getFirstException() { |
| return parseException; |
| } |
| } |
| |
| public Document load(java.net.URL url) throws DOMTestLoadException { |
| Document doc = null; |
| Exception parseException = null; |
| try { |
| LoadErrorHandler errorHandler = new LoadErrorHandler(); |
| builder.setErrorHandler(errorHandler); |
| InputStream stream = url.openStream(); |
| doc = builder.parse(stream, url.toString()); |
| stream.close(); |
| parseException = errorHandler.getFirstException(); |
| } |
| catch (Exception ex) { |
| parseException = ex; |
| } |
| builder.setErrorHandler(null); |
| if (parseException != null) { |
| throw new DOMTestLoadException(parseException); |
| } |
| return doc; |
| } |
| |
| public DOMImplementation getDOMImplementation() { |
| return builder.getDOMImplementation(); |
| } |
| |
| public boolean hasFeature(String feature, String version) { |
| return builder.getDOMImplementation().hasFeature(feature, version); |
| } |
| |
| public boolean isCoalescing() { |
| return factory.isCoalescing(); |
| } |
| |
| public boolean isExpandEntityReferences() { |
| return factory.isExpandEntityReferences(); |
| } |
| |
| public boolean isIgnoringElementContentWhitespace() { |
| return factory.isIgnoringElementContentWhitespace(); |
| } |
| |
| public boolean isNamespaceAware() { |
| return factory.isNamespaceAware(); |
| } |
| |
| public boolean isValidating() { |
| return factory.isValidating(); |
| } |
| |
| public static DocumentBuilderSetting[] getConfiguration1() { |
| return new DocumentBuilderSetting[] { |
| DocumentBuilderSetting.notCoalescing, |
| DocumentBuilderSetting.notExpandEntityReferences, |
| DocumentBuilderSetting.notIgnoringElementContentWhitespace, |
| DocumentBuilderSetting.notNamespaceAware, |
| DocumentBuilderSetting.notValidating}; |
| } |
| |
| public static DocumentBuilderSetting[] getConfiguration2() { |
| return new DocumentBuilderSetting[] { |
| DocumentBuilderSetting.notCoalescing, |
| DocumentBuilderSetting.expandEntityReferences, |
| DocumentBuilderSetting.ignoringElementContentWhitespace, |
| DocumentBuilderSetting.namespaceAware, |
| DocumentBuilderSetting.validating}; |
| |
| } |
| |
| } |