/* * 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; } }