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