1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (c) 2001-2004 World Wide Web Consortium,
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * (Massachusetts Institute of Technology, Institut National de
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Recherche en Informatique et en Automatique, Keio University). All
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Rights Reserved. This program is distributed under the W3C's Software
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Intellectual Property License. This program is distributed in the
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * PURPOSE.
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  $Log: DOM4JTestDocumentBuilderFactory.java,v $
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  Revision 1.2  2004/03/11 01:44:21  dom-ts-4
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  Checkstyle fixes (bug 592)
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  Revision 1.1  2002/02/03 07:47:51  dom-ts-4
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  More missing files
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage org.w3c.domts;
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.lang.reflect.Constructor;
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.lang.reflect.InvocationTargetException;
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.lang.reflect.Method;
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.w3c.dom.DOMImplementation;
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.w3c.dom.Document;
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.xml.sax.XMLReader;
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *   This class implements the generic parser and configuation
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *   abstract class for JAXP supporting parsers.
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class DOM4JTestDocumentBuilderFactory
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    extends DOMTestDocumentBuilderFactory {
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  private final Object domFactory;
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  private final Object saxReader;
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  private final org.xml.sax.XMLReader xmlReader;
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  private org.w3c.dom.DOMImplementation domImpl;
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  private final Method readMethod;
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  /**
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   * Creates a JAXP implementation of DOMTestDocumentBuilderFactory.
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   * @param factory null for default JAXP provider.  If not null,
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   * factory will be mutated in constructor and should be released
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   * by calling code upon return.
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   * @param XMLReader if null use default XMLReader.  If provided,
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   * it may be mutated and should be released by the caller immediately
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   * after the constructor.
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   * @param settings array of settings, may be null.
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   */
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  public DOM4JTestDocumentBuilderFactory(DocumentBuilderSetting[] settings) throws
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project      DOMTestIncompatibleException {
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    super(settings);
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    try {
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project      //
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project      //   The following reflection code is trying to accomplish
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project      //
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project      //domFactory = org.dom4j.dom.DOMDocumentFactory.getInstance();
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project      //domImpl = (DOMImplementation) domFactory;
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project      //saxReader = new org.dom4j.io.SAXReader(domFactory);
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project      //xmlReader = saxReader.getXMLReader();
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project      ClassLoader classLoader = ClassLoader.getSystemClassLoader();
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project      Class domFactoryClass = classLoader.loadClass(
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project          "org.dom4j.dom.DOMDocumentFactory");
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project      Method getInstance = domFactoryClass.getMethod("getInstance", new Class[] {});
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project      domFactory = getInstance.invoke(null, new Object[] {});
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project      domImpl = (DOMImplementation) domFactory;
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project      Class saxReaderClass = classLoader.loadClass("org.dom4j.io.SAXReader");
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project      Constructor saxReaderConstructor = saxReaderClass.getConstructor(
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project          new Class[] {classLoader.loadClass("org.dom4j.DocumentFactory")});
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project      saxReader = saxReaderConstructor.newInstance(new Object[] {domFactory});
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project      Method getReaderMethod = saxReaderClass.getMethod("getXMLReader",
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project          new Class[] {});
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project      xmlReader = (XMLReader) getReaderMethod.invoke(saxReader, new Object[0]);
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project      readMethod = saxReaderClass.getMethod("read", new Class[] {java.net.URL.class});
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    catch (InvocationTargetException ex) {
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project      throw new DOMTestIncompatibleException(ex.getTargetException(), null);
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    catch (Exception ex) {
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project      throw new DOMTestIncompatibleException(ex, null);
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    //
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    //   TODO: Process settings
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    //
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  }
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  public DOMTestDocumentBuilderFactory newInstance(DocumentBuilderSetting[]
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project      newSettings) throws DOMTestIncompatibleException {
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (newSettings == null) {
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project      return this;
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    DocumentBuilderSetting[] mergedSettings = mergeSettings(newSettings);
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return new DOM4JTestDocumentBuilderFactory(mergedSettings);
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  }
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  public Document load(java.net.URL url) throws DOMTestLoadException {
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (url == null) {
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project      throw new NullPointerException("url");
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (saxReader == null) {
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project      throw new NullPointerException("saxReader");
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    try {
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project      return (org.w3c.dom.Document) readMethod.invoke(saxReader,
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project          new Object[] {url});
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    catch (InvocationTargetException ex) {
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project      ex.getTargetException().printStackTrace();
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project      throw new DOMTestLoadException(ex.getTargetException());
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    catch (Exception ex) {
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project      ex.printStackTrace();
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project      throw new DOMTestLoadException(ex);
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  }
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  public DOMImplementation getDOMImplementation() {
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return domImpl;
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  }
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  public boolean hasFeature(String feature, String version) {
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return domImpl.hasFeature(feature, version);
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  }
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  public boolean isCoalescing() {
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return false;
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  }
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  public boolean isExpandEntityReferences() {
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return false;
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  }
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  public boolean isIgnoringElementContentWhitespace() {
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return false;
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  }
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  public boolean isNamespaceAware() {
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return true;
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  }
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  public boolean isValidating() {
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return false;
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  }
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
155