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