1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Copyright (c) 2002-2004 World Wide Web Consortium, 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (Massachusetts Institute of Technology, Institut National de 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Recherche en Informatique et en Automatique, Keio University). All 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Rights Reserved. This program is distributed under the W3C's Software 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Intellectual Property License. This program is distributed in the 7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * hope that it will be useful, but WITHOUT ANY WARRANTY; without even 8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * PURPOSE. 10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See W3C License http://www.w3.org/Consortium/Legal/ for more details. 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage org.w3c.domts; 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.lang.reflect.Constructor; 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.lang.reflect.InvocationTargetException; 17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.lang.reflect.Method; 18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.w3c.dom.DOMImplementation; 20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.w3c.dom.Document; 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This class implements the generic parser builder 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * for JTidy (http://sf.net/projects/JTidy) which reads HTML 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * and supports the fundamental DOM interfaces but not either HTML L1 DOM 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * or HTML L2 DOM 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class JTidyDocumentBuilderFactory 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project extends DOMTestDocumentBuilderFactory { 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final Constructor tidyConstructor; 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final Method parseDOMMethod; 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final DOMImplementation domImpl; 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final Class[] NO_CLASSES = new Class[0]; 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final Object[] NO_OBJECTS = new Object[0]; 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates a implementation of DOMTestDocumentBuilderFactory 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * using JTidy's HTML parser and DOM implementation 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param settings array of settings, may be null. 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public JTidyDocumentBuilderFactory( 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project DocumentBuilderSetting[] settings) throws DOMTestIncompatibleException { 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(settings); 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ClassLoader classLoader = ClassLoader.getSystemClassLoader(); 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Class tidyClass = classLoader.loadClass("org.w3c.tidy.Tidy"); 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project tidyConstructor = 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project tidyClass.getConstructor(NO_CLASSES); 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project parseDOMMethod = 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project tidyClass.getMethod("parseDOM", 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project new Class[] {java.io.InputStream.class, 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project java.io.OutputStream.class}); 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // JTidy doesn't implement DOMImplementation so 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // we will do it here 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project domImpl = new JTidyDOMImplementation(); 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project catch (Exception ex) { 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new DOMTestIncompatibleException(ex, null); 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // apply settings to selected document builder 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // may throw exception if incompatible 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (settings != null) { 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = 0; i < settings.length; i++) { 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// settings[i].applySetting(factory); 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public DOMTestDocumentBuilderFactory newInstance(DocumentBuilderSetting[] 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project newSettings) throws DOMTestIncompatibleException { 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (newSettings == null) { 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return this; 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project DocumentBuilderSetting[] mergedSettings = mergeSettings(newSettings); 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new JTidyDocumentBuilderFactory(mergedSettings); 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Document load(java.net.URL url) throws DOMTestLoadException { 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Document doc = null; 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project java.io.InputStream stream = url.openStream(); 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Object tidyObj = tidyConstructor.newInstance(new Object[0]); 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project doc = (Document) parseDOMMethod.invoke(tidyObj, 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project new Object[] {stream, null}); 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project catch (InvocationTargetException ex) { 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new DOMTestLoadException(ex.getTargetException()); 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project catch (Exception ex) { 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new DOMTestLoadException(ex); 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return doc; 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public DOMImplementation getDOMImplementation() { 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return domImpl; 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean hasFeature(String feature, String version) { 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return domImpl.hasFeature(feature, version); 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String getContentType() { 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return "text/html"; 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean isCoalescing() { 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return false; 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean isExpandEntityReferences() { 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return false; 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean isIgnoringElementContentWhitespace() { 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return false; 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean isNamespaceAware() { 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return false; 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean isValidating() { 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return false; 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 136