diff NGSrich_0.5.5/src/org/jdom/transform/JDOMSource.java @ 0:89ad0a9cca52 default tip

Uploaded
author pfrommolt
date Mon, 21 Nov 2011 08:12:19 -0500
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/NGSrich_0.5.5/src/org/jdom/transform/JDOMSource.java	Mon Nov 21 08:12:19 2011 -0500
@@ -0,0 +1,535 @@
+/*-- 
+
+ $Id: JDOMSource.java,v 1.20 2007/11/10 05:29:02 jhunter Exp $
+
+ Copyright (C) 2001-2007 Jason Hunter & Brett McLaughlin.
+ All rights reserved.
+ 
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 
+ 1. Redistributions of source code must retain the above copyright
+    notice, this list of conditions, and the following disclaimer.
+ 
+ 2. Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions, and the disclaimer that follows 
+    these conditions in the documentation and/or other materials 
+    provided with the distribution.
+
+ 3. The name "JDOM" must not be used to endorse or promote products
+    derived from this software without prior written permission.  For
+    written permission, please contact <request_AT_jdom_DOT_org>.
+ 
+ 4. Products derived from this software may not be called "JDOM", nor
+    may "JDOM" appear in their name, without prior written permission
+    from the JDOM Project Management <request_AT_jdom_DOT_org>.
+ 
+ In addition, we request (but do not require) that you include in the 
+ end-user documentation provided with the redistribution and/or in the 
+ software itself an acknowledgement equivalent to the following:
+     "This product includes software developed by the
+      JDOM Project (http://www.jdom.org/)."
+ Alternatively, the acknowledgment may be graphical using the logos 
+ available at http://www.jdom.org/images/logos.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED.  IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ This software consists of voluntary contributions made by many 
+ individuals on behalf of the JDOM Project and was originally 
+ created by Jason Hunter <jhunter_AT_jdom_DOT_org> and
+ Brett McLaughlin <brett_AT_jdom_DOT_org>.  For more information
+ on the JDOM Project, please see <http://www.jdom.org/>.
+ 
+ */
+
+package org.jdom.transform;
+
+import java.io.*;
+import java.util.*;
+
+import javax.xml.transform.sax.*;
+
+import org.jdom.*;
+import org.jdom.output.*;
+import org.xml.sax.*;
+
+/**
+ * A holder for an XML Transformation source: a Document, Element, or list of
+ * nodes.
+ * <p>
+ * The is provides input to a
+ * {@link javax.xml.transform.Transformer JAXP TrAX Transformer}.
+ * <p>
+ * The following example shows how to apply an XSL Transformation
+ * to a JDOM document and get the transformation result in the form
+ * of a list of JDOM nodes:
+ * <pre><code>
+ *   public static List transform(Document doc, String stylesheet)
+ *                                        throws JDOMException {
+ *     try {
+ *       Transformer transformer = TransformerFactory.newInstance()
+ *                             .newTransformer(new StreamSource(stylesheet));
+ *       JDOMSource in = new JDOMSource(doc);
+ *       JDOMResult out = new JDOMResult();
+ *       transformer.transform(in, out);
+ *       return out.getResult();
+ *     }
+ *     catch (TransformerException e) {
+ *       throw new JDOMException("XSLT Transformation failed", e);
+ *     }
+ *   }
+ * </code></pre>
+ *
+ * @see org.jdom.transform.JDOMResult
+ *
+ * @version $Revision: 1.20 $, $Date: 2007/11/10 05:29:02 $
+ * @author Laurent Bihanic
+ * @author Jason Hunter
+ */
+public class JDOMSource extends SAXSource {
+
+    private static final String CVS_ID =
+    "@(#) $RCSfile: JDOMSource.java,v $ $Revision: 1.20 $ $Date: 2007/11/10 05:29:02 $ $Name: jdom_1_1_1 $";
+
+  /**
+   * If {@link javax.xml.transform.TransformerFactory#getFeature}
+   * returns <code>true</code> when passed this value as an
+   * argument, the Transformer natively supports JDOM.
+   * <p>
+   * <strong>Note</strong>: This implementation does not override
+   * the {@link SAXSource#FEATURE} value defined by its superclass
+   * to be considered as a SAXSource by Transformer implementations
+   * not natively supporting JDOM.
+   * </p>
+   */
+  public final static String JDOM_FEATURE =
+                      "http://org.jdom.transform.JDOMSource/feature";
+
+  /**
+   * The XMLReader object associated to this source or
+   * <code>null</code> if no XMLReader has yet been requested.
+   *
+   * @see    #getXMLReader
+   */
+  private XMLReader xmlReader = null;
+  
+  /**
+   * Optional entity resolver associated to the source of
+   * this document or <code>null</code> if no EntityResolver
+   * was supplied with this JDOMSource. 
+   * 
+   * @see #buildDocumentReader()
+   */
+  private EntityResolver resolver = null;
+
+  /**
+   * Creates a JDOM TrAX source wrapping a JDOM document.
+   *
+   * @param  source   the JDOM document to use as source for the
+   *                  transformations
+   *
+   * @throws IllegalArgumentException   if <code>source</code> is
+   *                                    <code>null</code>.
+   */
+  public JDOMSource(Document source) {
+    setDocument(source);
+  }
+
+  /**
+   * Creates a JDOM TrAX source wrapping a list of JDOM nodes.
+   *
+   * @param  source   the JDOM nodes to use as source for the
+   *                  transformations
+   *
+   * @throws IllegalArgumentException   if <code>source</code> is
+   *                                    <code>null</code>.
+   */
+  public JDOMSource(List source) {
+    setNodes(source);
+  }
+
+  /**
+   * Creates a JDOM TrAX source wrapping a JDOM element.
+   *
+   * @param  source   the JDOM element to use as source for the
+   *                  transformations
+   *
+   * @throws IllegalArgumentException   if <code>source</code> is
+   *                                    <code>null</code>.
+   */
+  public JDOMSource(Element source) {
+    List nodes = new ArrayList();
+    nodes.add(source);
+
+    setNodes(nodes);
+  }
+
+  /**
+   * Creates a JDOM TrAX source wrapping a JDOM element with an
+   * associated EntityResolver to resolve external entities.
+   * 
+   * @param source 		The JDOM Element to use as source for the 
+   * 					transformations
+   * 
+   * @param resolver 	Entity resolver to use for the source 
+   * 					transformation
+   * 
+   * @throws IllegalArgumentException	if<code>source</code> is
+   * <code>null</code>
+   */
+  public JDOMSource(Document source, EntityResolver resolver) {
+	setDocument(source);
+	this.resolver = resolver;
+  }
+
+/**
+   * Sets the source document used by this TrAX source.
+   *
+   * @param  source   the JDOM document to use as source for the
+   *                  transformations
+   *
+   * @throws IllegalArgumentException   if <code>source</code> is
+   *                                    <code>null</code>.
+   *
+   * @see    #getDocument
+   */
+  public void setDocument(Document source) {
+    super.setInputSource(new JDOMInputSource(source));
+  }
+
+  /**
+   * Returns the source document used by this TrAX source.
+   *
+   * @return the source document used by this TrAX source or
+   *         <code>null</code> if the source is a node list.
+   *
+   * @see    #setDocument
+   */
+  public Document getDocument() {
+    Object   src = ((JDOMInputSource)getInputSource()).getSource();
+    Document doc = null;
+
+    if (src instanceof Document) {
+      doc = (Document)src;
+    }
+    return doc;
+  }
+
+  /**
+   * Sets the source node list used by this TrAX source.
+   *
+   * @param  source   the JDOM nodes to use as source for the
+   *                  transformations
+   *
+   * @throws IllegalArgumentException   if <code>source</code> is
+   *                                    <code>null</code>.
+   *
+   * @see    #getNodes
+   */
+  public void setNodes(List source) {
+    super.setInputSource(new JDOMInputSource(source));
+  }
+
+  /**
+   * Returns the source node list used by this TrAX source.
+   *
+   * @return the source node list used by this TrAX source or
+   *         <code>null</code> if the source is a JDOM document.
+   *
+   * @see    #setDocument
+   */
+  public List getNodes() {
+    Object   src   = ((JDOMInputSource)getInputSource()).getSource();
+    List     nodes = null;
+
+    if (src instanceof List) {
+      nodes = (List)src;
+    }
+    return nodes;
+  }
+
+
+  //-------------------------------------------------------------------------
+  // SAXSource overwritten methods
+  //-------------------------------------------------------------------------
+
+  /**
+   * Sets the SAX InputSource to be used for the Source.
+   * <p>
+   * As this implementation only supports JDOM document as data
+   * source, this method always throws an
+   * {@link UnsupportedOperationException}.
+   * </p>
+   *
+   * @param  inputSource   a valid InputSource reference.
+   *
+   * @throws UnsupportedOperationException   always!
+   */
+  public void setInputSource(InputSource inputSource)
+                                  throws UnsupportedOperationException {
+    throw new UnsupportedOperationException();
+  }
+
+  /**
+   * Set the XMLReader to be used for the Source.
+   * <p>
+   * As this implementation only supports JDOM document as data
+   * source, this method throws an
+   * {@link UnsupportedOperationException} if the provided reader
+   * object does not implement the SAX {@link XMLFilter}
+   * interface.  Otherwise, the JDOM document reader will be
+   * attached as parent of the filter chain.</p>
+   *
+   * @param  reader   a valid XMLReader or XMLFilter reference.
+   *
+   * @throws UnsupportedOperationException   if <code>reader</code>
+   *                                         is not a SAX
+   *                                         {@link XMLFilter}.
+   * @see    #getXMLReader
+   */
+  public void setXMLReader(XMLReader reader)
+                              throws UnsupportedOperationException {
+    if (reader instanceof XMLFilter) {
+      // Connect the filter chain to a document reader.
+      XMLFilter filter = (XMLFilter)reader;
+      while (filter.getParent() instanceof XMLFilter) {
+        filter = (XMLFilter)(filter.getParent());
+      }
+      filter.setParent(buildDocumentReader());
+
+      // Read XML data from filter chain.
+      this.xmlReader = reader;
+    }
+    else {
+      throw new UnsupportedOperationException();
+    }
+  }
+
+  /**
+   * Returns the XMLReader to be used for the Source.
+   * <p>
+   * This implementation returns a specific XMLReader reading
+   * the XML data from the source JDOM document.
+   * </p>
+   *
+   * @return an XMLReader reading the XML data from the source
+   *         JDOM document.
+   */
+  public XMLReader getXMLReader() {
+    if (this.xmlReader == null) {
+      this.xmlReader = buildDocumentReader();
+    }
+    return this.xmlReader;
+  }
+  
+  /**
+   * Build an XMLReader to be used for the source. This will
+   * create a new instance of DocumentReader with an 
+   * EntityResolver instance if available.
+   * 
+   * @return XMLReader reading the XML data from the source
+   * 		JDOM document with an optional EntityResolver
+   */
+  private XMLReader buildDocumentReader() {
+	  DocumentReader reader = new DocumentReader();
+	  if (resolver != null)
+		  reader.setEntityResolver(resolver);
+	  return reader;
+  }
+
+  //=========================================================================
+  // JDOMInputSource nested class
+  //=========================================================================
+
+  /**
+   * A subclass of the SAX InputSource interface that wraps a JDOM
+   * Document.
+   * <p>
+   * This class is nested in JDOMSource as it is not intented to
+   * be used independently of its friend: DocumentReader.
+   * </p>
+   *
+   * @see    org.jdom.Document
+   */
+  private static class JDOMInputSource extends InputSource {
+    /**
+     * The source as a JDOM document or a list of JDOM nodes.
+     */
+    private Object source = null;
+
+    /**
+     * Builds a InputSource wrapping the specified JDOM Document.
+     *
+     * @param  document   the source document.
+     */
+    public JDOMInputSource(Document document) {
+      this.source = document;
+    }
+
+    /**
+     * Builds a InputSource wrapping a list of JDOM nodes.
+     *
+     * @param  nodes   the source JDOM nodes.
+     */
+    public JDOMInputSource(List nodes) {
+      this.source = nodes;
+    }
+
+    /**
+     * Returns the source.
+     *
+     * @return the source as a JDOM document or a list of JDOM nodes.
+     */
+    public Object getSource() {
+      return source;
+    }
+
+    //-------------------------------------------------------------------------
+    // InputSource overwritten methods
+    //-------------------------------------------------------------------------
+
+    /**
+     * Sets the character stream for this input source.
+     * <p>
+     * This implementation always throws an
+     * {@link UnsupportedOperationException} as the only source
+     * stream supported is the source JDOM document.
+     * </p>
+     *
+     * @param  characterStream   a character stream containing
+     *                           an XML document.
+     *
+     * @throws UnsupportedOperationException  always!
+     */
+    public void setCharacterStream(Reader characterStream)
+                                      throws UnsupportedOperationException {
+      throw new UnsupportedOperationException();
+    }
+
+    /**
+     * Gets the character stream for this input source.
+     * <p>
+     * Note that this method is only provided to make this
+     * InputSource implementation acceptable by any XML
+     * parser.  As it generates an in-memory string representation
+     * of the JDOM document, it is quite inefficient from both
+     * speed and memory consumption points of view.
+     * </p>
+     *
+     * @return a Reader to a string representation of the
+     *         source JDOM document.
+     */
+    public Reader getCharacterStream() {
+      Object src    = this.getSource();
+      Reader reader = null;
+
+      if (src instanceof Document) {
+        // Get an in-memory string representation of the document
+        // and return a reader on it.
+        reader = new StringReader(
+                            new XMLOutputter().outputString((Document)src));
+      }
+      else {
+        if (src instanceof List) {
+          reader = new StringReader(
+                            new XMLOutputter().outputString((List)src));
+        }
+        // Else: No source, no reader!
+      }
+      return reader;
+    }
+  }
+
+  //=========================================================================
+  // DocumentReader nested class
+  //=========================================================================
+
+  /**
+   * An implementation of the SAX2 XMLReader interface that presents
+   * a SAX view of a JDOM Document.  The actual generation of the
+   * SAX events is delegated to JDOM's SAXOutputter.
+   *
+   * @see    org.jdom.Document
+   * @see    org.jdom.output.SAXOutputter
+   */
+  private static class DocumentReader   extends    SAXOutputter
+                                        implements XMLReader    {
+    /**
+     * Public default constructor.
+     */
+    public DocumentReader() {
+      super();
+    }
+
+    //----------------------------------------------------------------------
+    // SAX XMLReader interface support
+    //----------------------------------------------------------------------
+
+    /**
+     * Parses an XML document from a system identifier (URI).
+     * <p>
+     * This implementation does not support reading XML data from
+     * system identifiers, only from JDOM documents.  Hence,
+     * this method always throws a {@link SAXNotSupportedException}.
+     * </p>
+     *
+     * @param  systemId   the system identifier (URI).
+     *
+     * @throws SAXNotSupportedException   always!
+     */
+    public void parse(String systemId) throws SAXNotSupportedException {
+      throw new SAXNotSupportedException(
+                       "Only JDOM Documents are supported as input");
+    }
+
+    /**
+     * Parses an XML document.
+     * <p>
+     * The methods accepts only <code>JDOMInputSource</code>s
+     * instances as input sources.
+     * </p>
+     *
+     * @param  input   the input source for the top-level of the
+     *                  XML document.
+     *
+     * @throws SAXException               any SAX exception,
+     *                                    possibly wrapping
+     *                                    another exception.
+     * @throws SAXNotSupportedException   if the input source does
+     *                                    not wrap a JDOM document.
+     */
+    public void parse(InputSource input) throws SAXException {
+      if (input instanceof JDOMInputSource) {
+        try {
+          Object source = ((JDOMInputSource)input).getSource();
+          if (source instanceof Document) {
+            this.output((Document)source);
+          }
+          else {
+            this.output((List)source);
+          }
+        }
+        catch (JDOMException e) {
+          throw new SAXException(e.getMessage(), e);
+        }
+      }
+      else {
+        throw new SAXNotSupportedException(
+                         "Only JDOM Documents are supported as input");
+      }
+    }
+  }
+}
+