blob: 7dd8f26a0df4a2bbacfed6cef72232ee657251ee [file] [log] [blame]
/*
* 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", (Class<?>) null);
Object uri = method.invoke(tempFile, (Class<?>) 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;
}
}