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