diff options
Diffstat (limited to 'dom/src/test/java/org/w3c/domts/DOMTestDocumentBuilderFactory.java')
-rw-r--r-- | dom/src/test/java/org/w3c/domts/DOMTestDocumentBuilderFactory.java | 192 |
1 files changed, 192 insertions, 0 deletions
diff --git a/dom/src/test/java/org/w3c/domts/DOMTestDocumentBuilderFactory.java b/dom/src/test/java/org/w3c/domts/DOMTestDocumentBuilderFactory.java new file mode 100644 index 0000000..b24e70e --- /dev/null +++ b/dom/src/test/java/org/w3c/domts/DOMTestDocumentBuilderFactory.java @@ -0,0 +1,192 @@ +/* + * 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; + } + +} |