diff options
Diffstat (limited to 'dom/src/test/java/org/w3c/domts/DOMTest.java')
-rw-r--r-- | dom/src/test/java/org/w3c/domts/DOMTest.java | 289 |
1 files changed, 289 insertions, 0 deletions
diff --git a/dom/src/test/java/org/w3c/domts/DOMTest.java b/dom/src/test/java/org/w3c/domts/DOMTest.java new file mode 100644 index 0000000..b39ea67 --- /dev/null +++ b/dom/src/test/java/org/w3c/domts/DOMTest.java @@ -0,0 +1,289 @@ +/* + * Copyright (c) 2001-2003 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.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.Method; +import java.net.MalformedURLException; +import java.net.URL; + +import org.w3c.dom.DOMImplementation; +import org.w3c.dom.Document; + +/** + * This is an abstract base class for generated DOM tests + * + */ +public abstract class DOMTest /* wBM: implements EventListener */ { + private DOMTestDocumentBuilderFactory factory; + private int mutationCount = 0; + + /** + * This is the appropriate constructor for tests that make no requirements + * on the parser configuration. + * + * @param factory + * must not be null + */ + public DOMTest(DOMTestDocumentBuilderFactory factory) { + if (factory == null) { + throw new NullPointerException("factory"); + } + this.factory = factory; + } + + /** + * This constructor is used by tests that must create a modified document + * factory to meet requirements on the parser configuration. setFactory + * should be called within the test's constructor. + */ + public DOMTest() { + factory = null; + } + + /** + * Should only be called in the constructor of a derived type. + */ + protected void setFactory(DOMTestDocumentBuilderFactory factory) { + this.factory = factory; + } + + public boolean hasFeature(String feature, String version) { + return factory.hasFeature(feature, version); + } + + public boolean hasSetting(DocumentBuilderSetting setting) { + return setting.hasSetting(factory); + } + + protected DOMTestDocumentBuilderFactory getFactory() { + return factory; + } + + public DOMImplementation getImplementation() { + return factory.getDOMImplementation(); + } + + private URL resolveURI(String baseURI) throws DOMTestLoadException { + String docURI = factory.addExtension(baseURI); + + URL resolvedURI = null; + try { + resolvedURI = new URL(docURI); + if (resolvedURI.getProtocol() != null) { + return resolvedURI; + } + } + catch (MalformedURLException ex) { + // throw new DOMTestLoadException(ex); + } + // + // build a URL for a test file in the JAR + // + resolvedURI = getClass().getResource("/" + docURI); + if (resolvedURI == null) { + // + // see if it is an absolute URI + // + int firstSlash = docURI.indexOf('/'); + try { + if (firstSlash == 0 + || (firstSlash >= 1 + && docURI.charAt(firstSlash - 1) == ':')) { + resolvedURI = new URL(docURI); + } + else { + // + // try the files/level?/spec directory + // + String filename = getClass().getPackage().getName(); + filename = + "tests/" + + filename.substring(14).replace('.', '/') + + "/files/" + + docURI; + resolvedURI = new java.io.File(filename).toURL(); + } + } + catch (MalformedURLException ex) { + throw new DOMTestLoadException(ex); + } + } + + if (resolvedURI == null) { + throw new DOMTestLoadException( + new java.io.FileNotFoundException(docURI)); + } + return resolvedURI; + } + + public String getResourceURI(String href, String scheme, String contentType) throws + DOMTestLoadException { + if (scheme == null) { + throw new NullPointerException("scheme"); + } + if ("file".equals(scheme)) { + return resolveURI(href).toString(); + } + if ("http".equals(scheme)) { + StringBuffer httpURL = new StringBuffer( + System.getProperty("org.w3c.domts.httpbase", + "http://localhost:8080/webdav/")); + httpURL.append(href); + if ("application/pdf".equals(contentType)) { + httpURL.append(".pdf"); + } + else { + httpURL.append(".xml"); + } + return httpURL.toString(); + } + throw new DOMTestLoadException(new Exception("Unrecognized URI scheme " + + scheme)); + } + + public String createTempURI(String scheme) throws DOMTestLoadException { + if (scheme == null) { + throw new NullPointerException("scheme"); + } + if ("file".equals(scheme)) { + try { + File tempFile = File.createTempFile("domts", ".xml"); + try { + // + // if available use JDK 1.4's File.toURI().toString() + // + Method method = File.class.getMethod("toURI", null); + Object uri = method.invoke(tempFile, null); + return uri.toString(); + } + catch (NoSuchMethodException ex) { + // + // File.toURL is not as robust + // + URL url = tempFile.toURL(); + return url.toString(); + } + } + catch (Exception ex) { + throw new DOMTestLoadException(ex); + } + } + if ("http".equals(scheme)) { + String httpBase = System.getProperty("org.w3c.domts.httpbase", + "http://localhost:8080/webdav/"); + java.lang.StringBuffer buf = new StringBuffer(httpBase); + if (!httpBase.endsWith("/")) { + buf.append("/"); + } + buf.append("tmp"); + buf.append( (new java.util.Random()).nextInt(Integer.MAX_VALUE)); + buf.append(".xml"); + return buf.toString(); + } + throw new DOMTestLoadException(new Exception("Unrecognized URI scheme " + + scheme)); + } + + public Document load(String docURI, boolean willBeModified) throws + DOMTestLoadException { + Document doc = factory.load(resolveURI(docURI)); + // + // if will be modified is false and doc is an EventTarget + // + /* + * wBM: if (!willBeModified && doc instanceof EventTarget) { + * ((EventTarget) doc).addEventListener("DOMSubtreeModified", this, + * false); } + */ + return doc; + } + + public void preload(String contentType, String docURI, boolean willBeModified) throws + DOMTestIncompatibleException { + if ("text/html".equals(contentType) || + "application/xhtml+xml".equals(contentType)) { + if (docURI.startsWith("staff") || docURI.equals("datatype_normalization")) { + throw DOMTestIncompatibleException.incompatibleLoad(docURI, contentType); + } + } + } + + public Object createXPathEvaluator(Document doc) { + return factory.createXPathEvaluator(doc); + } + + public InputStream createStream(String bytes) throws DOMTestLoadException, + IOException { + int byteCount = bytes.length() / 2; + byte[] array = new byte[byteCount]; + for (int i = 0; i < byteCount; i++) { + array[i] = Byte.parseByte(bytes.substring(i * 2, i * 2 + 2), 16); + } + return new java.io.ByteArrayInputStream(array); + } + + abstract public String getTargetURI(); + + public final boolean isCoalescing() { + return factory.isCoalescing(); + } + + public final boolean isExpandEntityReferences() { + return factory.isExpandEntityReferences(); + } + + public final boolean isIgnoringElementContentWhitespace() { + return factory.isIgnoringElementContentWhitespace(); + } + + public final boolean isNamespaceAware() { + return factory.isNamespaceAware(); + } + + public final boolean isValidating() { + return factory.isValidating(); + } + + public final boolean isSigned() { + return true; + } + + public final boolean isHasNullString() { + return true; + } + + public final String getContentType() { + return factory.getContentType(); + } + + /** + * Implementation of EventListener.handleEvent + * + * This method is called when a mutation is reported for a document that + * was declared to not be modified during testing + * + * @param evt + * mutation event + */ + /* + * wBM: public final void handleEvent(Event evt) { mutationCount++; } + */ + + public final int getMutationCount() { + return mutationCount; + } + +} |