View Javadoc

    1   /*
    2    * Copyright 2001-2005 (C) MetaStuff, Ltd. All Rights Reserved.
    3    *
    4    * This software is open source.
    5    * See the bottom of this file for the licence.
    6    */
    7
    8   package org.dom4j.io;
    9
    10  import javax.xml.transform.sax.SAXSource;
    11
    12  import org.dom4j.Document;
    13  import org.dom4j.Node;
    14
    15  import org.xml.sax.InputSource;
    16  import org.xml.sax.XMLFilter;
    17  import org.xml.sax.XMLReader;
    18
    19  /***
    20   * <p>
    21   * <code>DocumentSource</code> implements a JAXP {@link SAXSource}for a
    22   * {@linkDocument}.
    23   * </p>
    24   *
    25   * @author <a href="mailto:james.strachan@metastuff.com">James Strachan </a>
    26   * @version $Revision: 1.10 $
    27   */
    28  public class DocumentSource extends SAXSource {
    29      /***
    30       * If {@link javax.xml.transform.TransformerFactory#getFeature}returns
    31       * <code>true</code> when passed this value as an argument then the
    32       * Transformer natively supports <i>dom4j </i>.
    33       */
    34      public static final String DOM4J_FEATURE
    35              = "http://org.dom4j.io.DoucmentSource/feature";
    36
    37      /*** The XMLReader to use */
    38      private XMLReader xmlReader = new SAXWriter();
    39
    40      /***
    41       * Creates a JAXP {@link SAXSource}for the given {@link Node}.
    42       *
    43       * @param node
    44       *            DOCUMENT ME!
    45       */
    46      public DocumentSource(Node node) {
    47          setDocument(node.getDocument());
    48      }
    49
    50      /***
    51       * Creates a JAXP {@link SAXSource}for the given {@link Document}.
    52       *
    53       * @param document
    54       *            DOCUMENT ME!
    55       */
    56      public DocumentSource(Document document) {
    57          setDocument(document);
    58      }
    59
    60      // Properties
    61      // -------------------------------------------------------------------------
    62
    63      /***
    64       * DOCUMENT ME!
    65       *
    66       * @return the document which is being used as the JAXP {@link SAXSource}
    67       */
    68      public Document getDocument() {
    69          DocumentInputSource source = (DocumentInputSource) getInputSource();
    70          return source.getDocument();
    71      }
    72
    73      /***
    74       * Sets the document used as the JAXP {@link SAXSource}
    75       *
    76       * @param document
    77       *            DOCUMENT ME!
    78       */
    79      public void setDocument(Document document) {
    80          super.setInputSource(new DocumentInputSource(document));
    81      }
    82
    83      // Overloaded methods
    84      // -------------------------------------------------------------------------
    85
    86      /***
    87       * DOCUMENT ME!
    88       *
    89       * @return the XMLReader to be used for the JAXP {@link SAXSource}.
    90       */
    91      public XMLReader getXMLReader() {
    92          return xmlReader;
    93      }
    94
    95      /***
    96       * This method is not supported as this source is always a {@linkDocument}
    97       * instance.
    98       *
    99       * @param inputSource
    100      *            DOCUMENT ME!
    101      *
    102      * @throws UnsupportedOperationException
    103      *             as this method is unsupported
    104      */
    105     public void setInputSource(InputSource inputSource)
    106             throws UnsupportedOperationException {
    107         if (inputSource instanceof DocumentInputSource) {
    108             super.setInputSource((DocumentInputSource) inputSource);
    109         } else {
    110             throw new UnsupportedOperationException();
    111         }
    112     }
    113
    114     /***
    115      * Sets the XMLReader used for the JAXP {@link SAXSource}.
    116      *
    117      * @param reader
    118      *            DOCUMENT ME!
    119      *
    120      * @throws UnsupportedOperationException
    121      *             DOCUMENT ME!
    122      */
    123     public void setXMLReader(XMLReader reader)
    124             throws UnsupportedOperationException {
    125         if (reader instanceof SAXWriter) {
    126             this.xmlReader = (SAXWriter) reader;
    127         } else if (reader instanceof XMLFilter) {
    128             XMLFilter filter = (XMLFilter) reader;
    129
    130             while (true) {
    131                 XMLReader parent = filter.getParent();
    132
    133                 if (parent instanceof XMLFilter) {
    134                     filter = (XMLFilter) parent;
    135                 } else {
    136                     break;
    137                 }
    138             }
    139
    140             // install filter in SAXWriter....
    141             filter.setParent(xmlReader);
    142             xmlReader = filter;
    143         } else {
    144             throw new UnsupportedOperationException();
    145         }
    146     }
    147 }
    148
    149 /*
    150  * Redistribution and use of this software and associated documentation
    151  * ("Software"), with or without modification, are permitted provided that the
    152  * following conditions are met:
    153  *
    154  * 1. Redistributions of source code must retain copyright statements and
    155  * notices. Redistributions must also contain a copy of this document.
    156  *
    157  * 2. Redistributions in binary form must reproduce the above copyright notice,
    158  * this list of conditions and the following disclaimer in the documentation
    159  * and/or other materials provided with the distribution.
    160  *
    161  * 3. The name "DOM4J" must not be used to endorse or promote products derived
    162  * from this Software without prior written permission of MetaStuff, Ltd. For
    163  * written permission, please contact dom4j-info@metastuff.com.
    164  *
    165  * 4. Products derived from this Software may not be called "DOM4J" nor may
    166  * "DOM4J" appear in their names without prior written permission of MetaStuff,
    167  * Ltd. DOM4J is a registered trademark of MetaStuff, Ltd.
    168  *
    169  * 5. Due credit should be given to the DOM4J Project - http://www.dom4j.org
    170  *
    171  * THIS SOFTWARE IS PROVIDED BY METASTUFF, LTD. AND CONTRIBUTORS ``AS IS'' AND
    172  * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    173  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    174  * ARE DISCLAIMED. IN NO EVENT SHALL METASTUFF, LTD. OR ITS CONTRIBUTORS BE
    175  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
    176  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
    177  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
    178  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
    179  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    180  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
    181  * POSSIBILITY OF SUCH DAMAGE.
    182  *
    183  * Copyright 2001-2005 (C) MetaStuff, Ltd. All Rights Reserved.
    184  */