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