Home | History | Annotate | Download | only in domts
      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 
     23 package org.w3c.domts;
     24 
     25 import java.lang.reflect.Constructor;
     26 import java.lang.reflect.InvocationTargetException;
     27 import java.lang.reflect.Method;
     28 
     29 import org.w3c.dom.DOMImplementation;
     30 import org.w3c.dom.Document;
     31 import org.xml.sax.XMLReader;
     32 
     33 /**
     34  *   This class implements the generic parser and configuation
     35  *   abstract class for JAXP supporting parsers.
     36  */
     37 public 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