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