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