blob: 8d6acdd67625367b380293161e7706403223264a [file] [log] [blame]
/*
* Copyright (c) 2001-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.
*/
/*
$Log: DOM4JTestDocumentBuilderFactory.java,v $
Revision 1.2 2004/03/11 01:44:21 dom-ts-4
Checkstyle fixes (bug 592)
Revision 1.1 2002/02/03 07:47:51 dom-ts-4
More missing files
*/
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;
import org.xml.sax.XMLReader;
/**
* This class implements the generic parser and configuation
* abstract class for JAXP supporting parsers.
*/
public class DOM4JTestDocumentBuilderFactory
extends DOMTestDocumentBuilderFactory {
private final Object domFactory;
private final Object saxReader;
private final org.xml.sax.XMLReader xmlReader;
private org.w3c.dom.DOMImplementation domImpl;
private final Method readMethod;
/**
* Creates a JAXP implementation of DOMTestDocumentBuilderFactory.
* @param factory null for default JAXP provider. If not null,
* factory will be mutated in constructor and should be released
* by calling code upon return.
* @param XMLReader if null use default XMLReader. If provided,
* it may be mutated and should be released by the caller immediately
* after the constructor.
* @param settings array of settings, may be null.
*/
public DOM4JTestDocumentBuilderFactory(DocumentBuilderSetting[] settings) throws
DOMTestIncompatibleException {
super(settings);
try {
//
// The following reflection code is trying to accomplish
//
//domFactory = org.dom4j.dom.DOMDocumentFactory.getInstance();
//domImpl = (DOMImplementation) domFactory;
//saxReader = new org.dom4j.io.SAXReader(domFactory);
//xmlReader = saxReader.getXMLReader();
ClassLoader classLoader = ClassLoader.getSystemClassLoader();
Class domFactoryClass = classLoader.loadClass(
"org.dom4j.dom.DOMDocumentFactory");
Method getInstance = domFactoryClass.getMethod("getInstance", new Class[] {});
domFactory = getInstance.invoke(null, new Object[] {});
domImpl = (DOMImplementation) domFactory;
Class saxReaderClass = classLoader.loadClass("org.dom4j.io.SAXReader");
Constructor saxReaderConstructor = saxReaderClass.getConstructor(
new Class[] {classLoader.loadClass("org.dom4j.DocumentFactory")});
saxReader = saxReaderConstructor.newInstance(new Object[] {domFactory});
Method getReaderMethod = saxReaderClass.getMethod("getXMLReader",
new Class[] {});
xmlReader = (XMLReader) getReaderMethod.invoke(saxReader, new Object[0]);
readMethod = saxReaderClass.getMethod("read", new Class[] {java.net.URL.class});
}
catch (InvocationTargetException ex) {
throw new DOMTestIncompatibleException(ex.getTargetException(), null);
}
catch (Exception ex) {
throw new DOMTestIncompatibleException(ex, null);
}
//
// TODO: Process settings
//
}
public DOMTestDocumentBuilderFactory newInstance(DocumentBuilderSetting[]
newSettings) throws DOMTestIncompatibleException {
if (newSettings == null) {
return this;
}
DocumentBuilderSetting[] mergedSettings = mergeSettings(newSettings);
return new DOM4JTestDocumentBuilderFactory(mergedSettings);
}
public Document load(java.net.URL url) throws DOMTestLoadException {
if (url == null) {
throw new NullPointerException("url");
}
if (saxReader == null) {
throw new NullPointerException("saxReader");
}
try {
return (org.w3c.dom.Document) readMethod.invoke(saxReader,
new Object[] {url});
}
catch (InvocationTargetException ex) {
ex.getTargetException().printStackTrace();
throw new DOMTestLoadException(ex.getTargetException());
}
catch (Exception ex) {
ex.printStackTrace();
throw new DOMTestLoadException(ex);
}
}
public DOMImplementation getDOMImplementation() {
return domImpl;
}
public boolean hasFeature(String feature, String version) {
return domImpl.hasFeature(feature, version);
}
public boolean isCoalescing() {
return false;
}
public boolean isExpandEntityReferences() {
return false;
}
public boolean isIgnoringElementContentWhitespace() {
return false;
}
public boolean isNamespaceAware() {
return true;
}
public boolean isValidating() {
return false;
}
}