| /* |
| * 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.lang.reflect.Method; |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| import org.w3c.dom.DOMImplementation; |
| import org.w3c.dom.Document; |
| |
| /** |
| * This class represents a particular parser and configuration |
| * (such as entity-expanding, non-validating, whitespace ignoring) |
| * for a test session. Individual tests or suites within a |
| * session can override the session properties on a call to |
| * createBuilderFactory. |
| * |
| * @author Curt Arnold |
| */ |
| public abstract class DOMTestDocumentBuilderFactory { |
| /** |
| * Parser configuration |
| */ |
| private final DocumentBuilderSetting[] settings; |
| |
| /** |
| * Constructor |
| * @param properties Array of parser settings, may be null. |
| */ |
| public DOMTestDocumentBuilderFactory(DocumentBuilderSetting[] settings) throws |
| DOMTestIncompatibleException { |
| if (settings == null) { |
| this.settings = new DocumentBuilderSetting[0]; |
| } |
| else { |
| this.settings = (DocumentBuilderSetting[]) settings.clone(); |
| } |
| } |
| |
| /** |
| * Returns an instance of DOMTestDocumentBuilderFactory |
| * with the settings from the argument list |
| * and any non-revoked settings from the current object. |
| * @param settings array of settings, may be null. |
| */ |
| public abstract DOMTestDocumentBuilderFactory newInstance( |
| DocumentBuilderSetting[] settings) throws DOMTestIncompatibleException; |
| |
| public abstract DOMImplementation getDOMImplementation(); |
| |
| public abstract boolean hasFeature(String feature, String version); |
| |
| public abstract Document load(java.net.URL url) throws DOMTestLoadException; |
| |
| /** |
| * Creates XPath evaluator |
| * @param doc DOM document, may not be null |
| */ |
| public Object createXPathEvaluator(Document doc) { |
| try { |
| Method getFeatureMethod = doc.getClass().getMethod("getFeature", |
| new Class[] {String.class, String.class}); |
| if (getFeatureMethod != null) { |
| return getFeatureMethod.invoke(doc, new Object[] {"XPath", null}); |
| } |
| } |
| catch (Exception ex) { |
| } |
| return doc; |
| } |
| |
| /** |
| * Merges the settings from the specific test case or suite |
| * with the existing (typically session) settings. |
| * @param settings new settings, may be null which will |
| * return clone of existing settings. |
| */ |
| protected DocumentBuilderSetting[] mergeSettings(DocumentBuilderSetting[] |
| newSettings) { |
| if (newSettings == null) { |
| return (DocumentBuilderSetting[]) settings.clone(); |
| } |
| List mergedSettings = new ArrayList(settings.length + newSettings.length); |
| // |
| // all new settings are respected |
| // |
| for (int i = 0; i < newSettings.length; i++) { |
| mergedSettings.add(newSettings[i]); |
| } |
| // |
| // for all previous settings, take only those that |
| // do not conflict with existing settings |
| for (int i = 0; i < settings.length; i++) { |
| DocumentBuilderSetting setting = settings[i]; |
| boolean hasConflict = false; |
| for (int j = 0; j < newSettings.length; j++) { |
| DocumentBuilderSetting newSetting = newSettings[j]; |
| if (newSetting.hasConflict(setting) || setting.hasConflict(newSetting)) { |
| hasConflict = true; |
| break; |
| } |
| } |
| if (!hasConflict) { |
| mergedSettings.add(setting); |
| } |
| } |
| |
| DocumentBuilderSetting[] mergedArray = |
| new DocumentBuilderSetting[mergedSettings.size()]; |
| for (int i = 0; i < mergedSettings.size(); i++) { |
| mergedArray[i] = (DocumentBuilderSetting) mergedSettings.get(i); |
| } |
| return mergedArray; |
| } |
| |
| public String addExtension(String testFileName) { |
| String contentType = getContentType(); |
| if ("text/html".equals(contentType)) { |
| return testFileName + ".html"; |
| } |
| if ("image/svg+xml".equals(contentType)) { |
| return testFileName + ".svg"; |
| } |
| if ("application/xhtml+xml".equals(contentType)) { |
| return testFileName + ".xhtml"; |
| } |
| return testFileName + ".xml"; |
| } |
| |
| public abstract boolean isCoalescing(); |
| |
| public abstract boolean isExpandEntityReferences(); |
| |
| public abstract boolean isIgnoringElementContentWhitespace(); |
| |
| public abstract boolean isNamespaceAware(); |
| |
| public abstract boolean isValidating(); |
| |
| public String getContentType() { |
| return System.getProperty("org.w3c.domts.contentType", "text/xml"); |
| } |
| |
| /** |
| * Creates an array of all determinable settings for the DocumentBuilder |
| * including those at implementation defaults. |
| * @param builder must not be null |
| */ |
| public final DocumentBuilderSetting[] getActualSettings() { |
| |
| DocumentBuilderSetting[] allSettings = new DocumentBuilderSetting[] { |
| DocumentBuilderSetting.coalescing, |
| DocumentBuilderSetting.expandEntityReferences, |
| DocumentBuilderSetting.hasNullString, |
| DocumentBuilderSetting.ignoringElementContentWhitespace, |
| DocumentBuilderSetting.namespaceAware, |
| DocumentBuilderSetting.signed, |
| DocumentBuilderSetting.validating, |
| DocumentBuilderSetting.notCoalescing, |
| DocumentBuilderSetting.notExpandEntityReferences, |
| DocumentBuilderSetting.notHasNullString, |
| DocumentBuilderSetting.notIgnoringElementContentWhitespace, |
| DocumentBuilderSetting.notNamespaceAware, |
| DocumentBuilderSetting.notSigned, |
| DocumentBuilderSetting.notValidating |
| }; |
| |
| List list = new ArrayList(allSettings.length / 2); |
| for (int i = 0; i < allSettings.length; i++) { |
| if (allSettings[i].hasSetting(this)) { |
| list.add(allSettings[i]); |
| } |
| } |
| DocumentBuilderSetting[] settings = new DocumentBuilderSetting[list.size()]; |
| for (int i = 0; i < settings.length; i++) { |
| settings[i] = (DocumentBuilderSetting) list.get(i); |
| } |
| return settings; |
| } |
| |
| } |