/*
* Copyright (c) 2002-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.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;
/**
* This class implements the generic parser builder
* for JTidy (http://sf.net/projects/JTidy) which reads HTML
* and supports the fundamental DOM interfaces but not either HTML L1 DOM
* or HTML L2 DOM
*/
public class JTidyDocumentBuilderFactory
extends DOMTestDocumentBuilderFactory {
private final Constructor tidyConstructor;
private final Method parseDOMMethod;
private final DOMImplementation domImpl;
private static final Class[] NO_CLASSES = new Class[0];
private static final Object[] NO_OBJECTS = new Object[0];
/**
* Creates a implementation of DOMTestDocumentBuilderFactory
* using JTidy's HTML parser and DOM implementation
* @param settings array of settings, may be null.
*/
public JTidyDocumentBuilderFactory(
DocumentBuilderSetting[] settings) throws DOMTestIncompatibleException {
super(settings);
try {
ClassLoader classLoader = ClassLoader.getSystemClassLoader();
Class tidyClass = classLoader.loadClass("org.w3c.tidy.Tidy");
tidyConstructor =
tidyClass.getConstructor(NO_CLASSES);
parseDOMMethod =
tidyClass.getMethod("parseDOM",
new Class[] {java.io.InputStream.class,
java.io.OutputStream.class});
//
// JTidy doesn't implement DOMImplementation so
// we will do it here
domImpl = new JTidyDOMImplementation();
}
catch (Exception ex) {
throw new DOMTestIncompatibleException(ex, null);
}
//
// apply settings to selected document builder
// may throw exception if incompatible
if (settings != null) {
for (int i = 0; i < settings.length; i++) {
// settings[i].applySetting(factory);
}
}
}
public DOMTestDocumentBuilderFactory newInstance(DocumentBuilderSetting[]
newSettings) throws DOMTestIncompatibleException {
if (newSettings == null) {
return this;
}
DocumentBuilderSetting[] mergedSettings = mergeSettings(newSettings);
return new JTidyDocumentBuilderFactory(mergedSettings);
}
public Document load(java.net.URL url) throws DOMTestLoadException {
Document doc = null;
try {
java.io.InputStream stream = url.openStream();
Object tidyObj = tidyConstructor.newInstance(new Object[0]);
doc = (Document) parseDOMMethod.invoke(tidyObj,
new Object[] {stream, null});
}
catch (InvocationTargetException ex) {
throw new DOMTestLoadException(ex.getTargetException());
}
catch (Exception ex) {
throw new DOMTestLoadException(ex);
}
return doc;
}
public DOMImplementation getDOMImplementation() {
return domImpl;
}
public boolean hasFeature(String feature, String version) {
return domImpl.hasFeature(feature, version);
}
public String getContentType() {
return "text/html";
}
public boolean isCoalescing() {
return false;
}
public boolean isExpandEntityReferences() {
return false;
}
public boolean isIgnoringElementContentWhitespace() {
return false;
}
public boolean isNamespaceAware() {
return false;
}
public boolean isValidating() {
return false;
}
}