jaxp/src/share/classes/javax/xml/transform/stream/StreamSource.java
changeset 12005 a754d69d5e60
equal deleted inserted replaced
11943:16ba58282d11 12005:a754d69d5e60
       
     1 /*
       
     2  * Copyright (c) 2000, 2005, Oracle and/or its affiliates. All rights reserved.
       
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
       
     4  *
       
     5  * This code is free software; you can redistribute it and/or modify it
       
     6  * under the terms of the GNU General Public License version 2 only, as
       
     7  * published by the Free Software Foundation.  Oracle designates this
       
     8  * particular file as subject to the "Classpath" exception as provided
       
     9  * by Oracle in the LICENSE file that accompanied this code.
       
    10  *
       
    11  * This code is distributed in the hope that it will be useful, but WITHOUT
       
    12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
       
    13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
       
    14  * version 2 for more details (a copy is included in the LICENSE file that
       
    15  * accompanied this code).
       
    16  *
       
    17  * You should have received a copy of the GNU General Public License version
       
    18  * 2 along with this work; if not, write to the Free Software Foundation,
       
    19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
       
    20  *
       
    21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
       
    22  * or visit www.oracle.com if you need additional information or have any
       
    23  * questions.
       
    24  */
       
    25 
       
    26 package javax.xml.transform.stream;
       
    27 
       
    28 import java.io.File;
       
    29 import java.io.InputStream;
       
    30 import java.io.Reader;
       
    31 
       
    32 import javax.xml.transform.Source;
       
    33 
       
    34 /**
       
    35  * <p>Acts as an holder for a transformation Source in the form
       
    36  * of a stream of XML markup.</p>
       
    37  *
       
    38  * <p><em>Note:</em> Due to their internal use of either a {@link Reader} or {@link InputStream} instance,
       
    39  * <code>StreamSource</code> instances may only be used once.</p>
       
    40  *
       
    41  * @author <a href="Jeff.Suttor@Sun.com">Jeff Suttor</a>
       
    42  */
       
    43 public class StreamSource implements Source {
       
    44 
       
    45     /** If {@link javax.xml.transform.TransformerFactory#getFeature}
       
    46      * returns true when passed this value as an argument,
       
    47      * the Transformer supports Source input of this type.
       
    48      */
       
    49     public static final String FEATURE =
       
    50         "http://javax.xml.transform.stream.StreamSource/feature";
       
    51 
       
    52     /**
       
    53      * <p>Zero-argument default constructor.  If this constructor is used, and
       
    54      * no Stream source is set using
       
    55      * {@link #setInputStream(java.io.InputStream inputStream)} or
       
    56      * {@link #setReader(java.io.Reader reader)}, then the
       
    57      * <code>Transformer</code> will
       
    58      * create an empty source {@link java.io.InputStream} using
       
    59      * {@link java.io.InputStream#InputStream() new InputStream()}.</p>
       
    60      *
       
    61      * @see javax.xml.transform.Transformer#transform(Source xmlSource, Result outputTarget)
       
    62      */
       
    63     public StreamSource() { }
       
    64 
       
    65     /**
       
    66      * Construct a StreamSource from a byte stream.  Normally,
       
    67      * a stream should be used rather than a reader, so
       
    68      * the XML parser can resolve character encoding specified
       
    69      * by the XML declaration.
       
    70      *
       
    71      * <p>If this constructor is used to process a stylesheet, normally
       
    72      * setSystemId should also be called, so that relative URI references
       
    73      * can be resolved.</p>
       
    74      *
       
    75      * @param inputStream A valid InputStream reference to an XML stream.
       
    76      */
       
    77     public StreamSource(InputStream inputStream) {
       
    78         setInputStream(inputStream);
       
    79     }
       
    80 
       
    81     /**
       
    82      * Construct a StreamSource from a byte stream.  Normally,
       
    83      * a stream should be used rather than a reader, so that
       
    84      * the XML parser can resolve character encoding specified
       
    85      * by the XML declaration.
       
    86      *
       
    87      * <p>This constructor allows the systemID to be set in addition
       
    88      * to the input stream, which allows relative URIs
       
    89      * to be processed.</p>
       
    90      *
       
    91      * @param inputStream A valid InputStream reference to an XML stream.
       
    92      * @param systemId Must be a String that conforms to the URI syntax.
       
    93      */
       
    94     public StreamSource(InputStream inputStream, String systemId) {
       
    95         setInputStream(inputStream);
       
    96         setSystemId(systemId);
       
    97     }
       
    98 
       
    99     /**
       
   100      * Construct a StreamSource from a character reader.  Normally,
       
   101      * a stream should be used rather than a reader, so that
       
   102      * the XML parser can resolve character encoding specified
       
   103      * by the XML declaration.  However, in many cases the encoding
       
   104      * of the input stream is already resolved, as in the case of
       
   105      * reading XML from a StringReader.
       
   106      *
       
   107      * @param reader A valid Reader reference to an XML character stream.
       
   108      */
       
   109     public StreamSource(Reader reader) {
       
   110         setReader(reader);
       
   111     }
       
   112 
       
   113     /**
       
   114      * Construct a StreamSource from a character reader.  Normally,
       
   115      * a stream should be used rather than a reader, so that
       
   116      * the XML parser may resolve character encoding specified
       
   117      * by the XML declaration.  However, in many cases the encoding
       
   118      * of the input stream is already resolved, as in the case of
       
   119      * reading XML from a StringReader.
       
   120      *
       
   121      * @param reader A valid Reader reference to an XML character stream.
       
   122      * @param systemId Must be a String that conforms to the URI syntax.
       
   123      */
       
   124     public StreamSource(Reader reader, String systemId) {
       
   125         setReader(reader);
       
   126         setSystemId(systemId);
       
   127     }
       
   128 
       
   129     /**
       
   130      * Construct a StreamSource from a URL.
       
   131      *
       
   132      * @param systemId Must be a String that conforms to the URI syntax.
       
   133      */
       
   134     public StreamSource(String systemId) {
       
   135         this.systemId = systemId;
       
   136     }
       
   137 
       
   138     /**
       
   139      * Construct a StreamSource from a File.
       
   140      *
       
   141      * @param f Must a non-null File reference.
       
   142      */
       
   143     public StreamSource(File f) {
       
   144         //convert file to appropriate URI, f.toURI().toASCIIString()
       
   145         //converts the URI to string as per rule specified in
       
   146         //RFC 2396,
       
   147         setSystemId(f.toURI().toASCIIString());
       
   148     }
       
   149 
       
   150     /**
       
   151      * Set the byte stream to be used as input.  Normally,
       
   152      * a stream should be used rather than a reader, so that
       
   153      * the XML parser can resolve character encoding specified
       
   154      * by the XML declaration.
       
   155      *
       
   156      * <p>If this Source object is used to process a stylesheet, normally
       
   157      * setSystemId should also be called, so that relative URL references
       
   158      * can be resolved.</p>
       
   159      *
       
   160      * @param inputStream A valid InputStream reference to an XML stream.
       
   161      */
       
   162     public void setInputStream(InputStream inputStream) {
       
   163         this.inputStream = inputStream;
       
   164     }
       
   165 
       
   166     /**
       
   167      * Get the byte stream that was set with setByteStream.
       
   168      *
       
   169      * @return The byte stream that was set with setByteStream, or null
       
   170      * if setByteStream or the ByteStream constructor was not called.
       
   171      */
       
   172     public InputStream getInputStream() {
       
   173         return inputStream;
       
   174     }
       
   175 
       
   176     /**
       
   177      * Set the input to be a character reader.  Normally,
       
   178      * a stream should be used rather than a reader, so that
       
   179      * the XML parser can resolve character encoding specified
       
   180      * by the XML declaration.  However, in many cases the encoding
       
   181      * of the input stream is already resolved, as in the case of
       
   182      * reading XML from a StringReader.
       
   183      *
       
   184      * @param reader A valid Reader reference to an XML CharacterStream.
       
   185      */
       
   186     public void setReader(Reader reader) {
       
   187         this.reader = reader;
       
   188     }
       
   189 
       
   190     /**
       
   191      * Get the character stream that was set with setReader.
       
   192      *
       
   193      * @return The character stream that was set with setReader, or null
       
   194      * if setReader or the Reader constructor was not called.
       
   195      */
       
   196     public Reader getReader() {
       
   197         return reader;
       
   198     }
       
   199 
       
   200     /**
       
   201      * Set the public identifier for this Source.
       
   202      *
       
   203      * <p>The public identifier is always optional: if the application
       
   204      * writer includes one, it will be provided as part of the
       
   205      * location information.</p>
       
   206      *
       
   207      * @param publicId The public identifier as a string.
       
   208      */
       
   209     public void setPublicId(String publicId) {
       
   210         this.publicId = publicId;
       
   211     }
       
   212 
       
   213     /**
       
   214      * Get the public identifier that was set with setPublicId.
       
   215      *
       
   216      * @return The public identifier that was set with setPublicId, or null
       
   217      * if setPublicId was not called.
       
   218      */
       
   219     public String getPublicId() {
       
   220         return publicId;
       
   221     }
       
   222 
       
   223     /**
       
   224      * Set the system identifier for this Source.
       
   225      *
       
   226      * <p>The system identifier is optional if there is a byte stream
       
   227      * or a character stream, but it is still useful to provide one,
       
   228      * since the application can use it to resolve relative URIs
       
   229      * and can include it in error messages and warnings (the parser
       
   230      * will attempt to open a connection to the URI only if
       
   231      * there is no byte stream or character stream specified).</p>
       
   232      *
       
   233      * @param systemId The system identifier as a URL string.
       
   234      */
       
   235     public void setSystemId(String systemId) {
       
   236         this.systemId = systemId;
       
   237     }
       
   238 
       
   239     /**
       
   240      * Get the system identifier that was set with setSystemId.
       
   241      *
       
   242      * @return The system identifier that was set with setSystemId, or null
       
   243      * if setSystemId was not called.
       
   244      */
       
   245     public String getSystemId() {
       
   246         return systemId;
       
   247     }
       
   248 
       
   249     /**
       
   250      * Set the system ID from a File reference.
       
   251      *
       
   252      * @param f Must a non-null File reference.
       
   253      */
       
   254     public void setSystemId(File f) {
       
   255         //convert file to appropriate URI, f.toURI().toASCIIString()
       
   256         //converts the URI to string as per rule specified in
       
   257         //RFC 2396,
       
   258         this.systemId = f.toURI().toASCIIString();
       
   259     }
       
   260 
       
   261     //////////////////////////////////////////////////////////////////////
       
   262     // Internal state.
       
   263     //////////////////////////////////////////////////////////////////////
       
   264 
       
   265     /**
       
   266      * The public identifier for this input source, or null.
       
   267      */
       
   268     private String publicId;
       
   269 
       
   270     /**
       
   271      * The system identifier as a URL string, or null.
       
   272      */
       
   273     private String systemId;
       
   274 
       
   275     /**
       
   276      * The byte stream for this Source, or null.
       
   277      */
       
   278     private InputStream inputStream;
       
   279 
       
   280     /**
       
   281      * The character stream for this Source, or null.
       
   282      */
       
   283     private Reader reader;
       
   284 }