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
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.lang.reflect.Method;
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.ArrayList;
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.List;
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.w3c.dom.DOMImplementation;
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.w3c.dom.Document;
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This class represents a particular parser and configuration
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (such as entity-expanding, non-validating, whitespace ignoring)
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * for a test session.  Individual tests or suites within a
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * session can override the session properties on a call to
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * createBuilderFactory.
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @author Curt Arnold
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic abstract class DOMTestDocumentBuilderFactory {
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project  /**
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project   *   Parser configuration
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project   */
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project  private final DocumentBuilderSetting[] settings;
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project  /**
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project   *   Constructor
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project   *   @param properties Array of parser settings, may be null.
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project   */
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project  public DOMTestDocumentBuilderFactory(DocumentBuilderSetting[] settings) throws
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project      DOMTestIncompatibleException {
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    if (settings == null) {
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project      this.settings = new DocumentBuilderSetting[0];
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    else {
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project      this.settings = (DocumentBuilderSetting[]) settings.clone();
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project  }
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project  /**
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project   *   Returns an instance of DOMTestDocumentBuilderFactory
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project   *   with the settings from the argument list
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project   *   and any non-revoked settings from the current object.
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project   *   @param settings array of settings, may be null.
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project   */
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project  public abstract DOMTestDocumentBuilderFactory newInstance(
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project      DocumentBuilderSetting[] settings) throws DOMTestIncompatibleException;
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project  public abstract DOMImplementation getDOMImplementation();
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project  public abstract boolean hasFeature(String feature, String version);
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project  public abstract Document load(java.net.URL url) throws DOMTestLoadException;
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project  /**
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project   *  Creates XPath evaluator
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project   *  @param doc DOM document, may not be null
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project   */
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project  public Object createXPathEvaluator(Document doc) {
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    try {
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project      Method getFeatureMethod = doc.getClass().getMethod("getFeature",
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project          new Class[] {String.class, String.class});
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project      if (getFeatureMethod != null) {
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getFeatureMethod.invoke(doc, new Object[] {"XPath", null});
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project      }
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    catch (Exception ex) {
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    return doc;
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project  }
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project  /**
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project   *   Merges the settings from the specific test case or suite
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project   *   with the existing (typically session) settings.
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project   *   @param settings new settings, may be null which will
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project   *   return clone of existing settings.
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project   */
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project  protected DocumentBuilderSetting[] mergeSettings(DocumentBuilderSetting[]
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project      newSettings) {
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    if (newSettings == null) {
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project      return (DocumentBuilderSetting[]) settings.clone();
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    List mergedSettings = new ArrayList(settings.length + newSettings.length);
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    //
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    //    all new settings are respected
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    //
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    for (int i = 0; i < newSettings.length; i++) {
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project      mergedSettings.add(newSettings[i]);
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    //
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    //    for all previous settings, take only those that
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    //       do not conflict with existing settings
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    for (int i = 0; i < settings.length; i++) {
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project      DocumentBuilderSetting setting = settings[i];
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project      boolean hasConflict = false;
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project      for (int j = 0; j < newSettings.length; j++) {
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        DocumentBuilderSetting newSetting = newSettings[j];
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (newSetting.hasConflict(setting) || setting.hasConflict(newSetting)) {
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project          hasConflict = true;
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project          break;
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project      }
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project      if (!hasConflict) {
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        mergedSettings.add(setting);
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project      }
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    DocumentBuilderSetting[] mergedArray =
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        new DocumentBuilderSetting[mergedSettings.size()];
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    for (int i = 0; i < mergedSettings.size(); i++) {
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project      mergedArray[i] = (DocumentBuilderSetting) mergedSettings.get(i);
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    return mergedArray;
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project  }
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project  public String addExtension(String testFileName) {
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    String contentType = getContentType();
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    if ("text/html".equals(contentType)) {
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project      return testFileName + ".html";
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    if ("image/svg+xml".equals(contentType)) {
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project      return testFileName + ".svg";
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    if ("application/xhtml+xml".equals(contentType)) {
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project      return testFileName + ".xhtml";
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    return testFileName + ".xml";
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project  }
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project  public abstract boolean isCoalescing();
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project  public abstract boolean isExpandEntityReferences();
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project  public abstract boolean isIgnoringElementContentWhitespace();
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project  public abstract boolean isNamespaceAware();
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project  public abstract boolean isValidating();
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project  public String getContentType() {
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    return System.getProperty("org.w3c.domts.contentType", "text/xml");
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project  }
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project  /**
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project   * Creates an array of all determinable settings for the DocumentBuilder
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project   * including those at implementation defaults.
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project   * @param builder must not be null
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project   */
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project  public final DocumentBuilderSetting[] getActualSettings() {
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    DocumentBuilderSetting[] allSettings = new DocumentBuilderSetting[] {
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        DocumentBuilderSetting.coalescing,
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        DocumentBuilderSetting.expandEntityReferences,
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        DocumentBuilderSetting.hasNullString,
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        DocumentBuilderSetting.ignoringElementContentWhitespace,
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        DocumentBuilderSetting.namespaceAware,
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        DocumentBuilderSetting.signed,
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        DocumentBuilderSetting.validating,
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        DocumentBuilderSetting.notCoalescing,
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        DocumentBuilderSetting.notExpandEntityReferences,
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        DocumentBuilderSetting.notHasNullString,
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        DocumentBuilderSetting.notIgnoringElementContentWhitespace,
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        DocumentBuilderSetting.notNamespaceAware,
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        DocumentBuilderSetting.notSigned,
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        DocumentBuilderSetting.notValidating
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    };
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    List list = new ArrayList(allSettings.length / 2);
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    for (int i = 0; i < allSettings.length; i++) {
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project      if (allSettings[i].hasSetting(this)) {
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        list.add(allSettings[i]);
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project      }
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    DocumentBuilderSetting[] settings = new DocumentBuilderSetting[list.size()];
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    for (int i = 0; i < settings.length; i++) {
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project      settings[i] = (DocumentBuilderSetting) list.get(i);
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    return settings;
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project  }
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
193