1320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson/*
2320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * Licensed to the Apache Software Foundation (ASF) under one or more
3320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * contributor license agreements.  See the NOTICE file distributed with
4320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * this work for additional information regarding copyright ownership.
5320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * The ASF licenses this file to You under the Apache License, Version 2.0
6320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * (the "License"); you may not use this file except in compliance with
7320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * the License.  You may obtain a copy of the License at
8320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson *
9320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson *     http://www.apache.org/licenses/LICENSE-2.0
10320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson *
11320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * Unless required by applicable law or agreed to in writing, software
12320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS,
13320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * See the License for the specific language governing permissions and
15320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * limitations under the License.
16320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson */
17320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
18320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson// $Id: StreamResult.java 829970 2009-10-26 21:15:29Z mrglavas $
19320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
20320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilsonpackage javax.xml.transform.stream;
21320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
22320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilsonimport java.io.File;
23320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilsonimport java.io.OutputStream;
24320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilsonimport java.io.Writer;
25320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilsonimport javax.xml.transform.Result;
26320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
27320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson/**
28320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * <p>Acts as an holder for a transformation result,
29320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * which may be XML, plain Text, HTML, or some other form of markup.</p>
30320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson *
31320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * @author <a href="Jeff.Suttor@Sun.com">Jeff Suttor</a>
32320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson */
33320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilsonpublic class StreamResult implements Result {
34320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
35320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    /** If {@link javax.xml.transform.TransformerFactory#getFeature}
36320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * returns true when passed this value as an argument,
37320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * the Transformer supports Result output of this type.
38320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     */
39320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    public static final String FEATURE =
40320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        "http://javax.xml.transform.stream.StreamResult/feature";
41320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
42320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    /**
43320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * Zero-argument default constructor.
44320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     */
45320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    public StreamResult() {
46320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    }
47320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
48320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    /**
49320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * Construct a StreamResult from a byte stream.  Normally,
50320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * a stream should be used rather than a reader, so that
51320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * the transformer may use instructions contained in the
52320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * transformation instructions to control the encoding.
53320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *
54320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param outputStream A valid OutputStream reference.
55320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     */
56320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    public StreamResult(OutputStream outputStream) {
57320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        setOutputStream(outputStream);
58320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    }
59320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
60320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    /**
61320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * Construct a StreamResult from a character stream.  Normally,
62320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * a stream should be used rather than a reader, so that
63320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * the transformer may use instructions contained in the
64320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * transformation instructions to control the encoding.  However,
65320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * there are times when it is useful to write to a character
66320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * stream, such as when using a StringWriter.
67320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *
68320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param writer  A valid Writer reference.
69320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     */
70320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    public StreamResult(Writer writer) {
71320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        setWriter(writer);
72320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    }
73320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
74320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    /**
75320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * Construct a StreamResult from a URL.
76320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *
77320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param systemId Must be a String that conforms to the URI syntax.
78320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     */
79320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    public StreamResult(String systemId) {
80320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        this.systemId = systemId;
81320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    }
82320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
83320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    /**
84320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * Construct a StreamResult from a File.
85320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *
86320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param f Must a non-null File reference.
87320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     */
88320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    public StreamResult(File f) {
89320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        setSystemId(f);
90320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    }
91320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
92320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    /**
93320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * Set the ByteStream that is to be written to.  Normally,
94320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * a stream should be used rather than a reader, so that
95320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * the transformer may use instructions contained in the
96320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * transformation instructions to control the encoding.
97320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *
98320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param outputStream A valid OutputStream reference.
99320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     */
100320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    public void setOutputStream(OutputStream outputStream) {
101320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        this.outputStream = outputStream;
102320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    }
103320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
104320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    /**
105320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * Get the byte stream that was set with setOutputStream.
106320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *
107320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @return The byte stream that was set with setOutputStream, or null
108320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * if setOutputStream or the ByteStream constructor was not called.
109320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     */
110320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    public OutputStream getOutputStream() {
111320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        return outputStream;
112320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    }
113320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
114320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    /**
115320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * Set the writer that is to receive the result.  Normally,
116320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * a stream should be used rather than a writer, so that
117320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * the transformer may use instructions contained in the
118320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * transformation instructions to control the encoding.  However,
119320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * there are times when it is useful to write to a writer,
120320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * such as when using a StringWriter.
121320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *
122320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param writer  A valid Writer reference.
123320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     */
124320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    public void setWriter(Writer writer) {
125320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        this.writer = writer;
126320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    }
127320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
128320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    /**
129320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * Get the character stream that was set with setWriter.
130320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *
131320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @return The character stream that was set with setWriter, or null
132320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * if setWriter or the Writer constructor was not called.
133320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     */
134320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    public Writer getWriter() {
135320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        return writer;
136320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    }
137320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
138320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    /**
139320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * Set the systemID that may be used in association
140320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * with the byte or character stream, or, if neither is set, use
141320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * this value as a writeable URI (probably a file name).
142320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *
143320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param systemId The system identifier as a URI string.
144320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     */
145320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    public void setSystemId(String systemId) {
146320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        this.systemId = systemId;
147320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    }
148320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
149320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    /**
150320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>Set the system ID from a <code>File</code> reference.</p>
151f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
152320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>Note the use of {@link File#toURI()} and {@link File#toURL()}.
153320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <code>toURI()</code> is preferred and used if possible.
154320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * To allow JAXP 1.3 to run on J2SE 1.3, <code>toURL()</code>
155320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * is used if a {@link NoSuchMethodException} is thrown by the attempt
156320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * to use <code>toURI()</code>.</p>
157320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *
158320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param f Must a non-null File reference.
159320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     */
160320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    public void setSystemId(File f) {
161320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        this.systemId = FilePathToURI.filepath2URI(f.getAbsolutePath());
162320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    }
163320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
164320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    /**
165320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * Get the system identifier that was set with setSystemId.
166320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *
167320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @return The system identifier that was set with setSystemId, or null
168320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * if setSystemId was not called.
169320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     */
170320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    public String getSystemId() {
171320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        return systemId;
172320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    }
173320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
174320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    //////////////////////////////////////////////////////////////////////
175320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    // Internal state.
176320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    //////////////////////////////////////////////////////////////////////
177320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
178320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    /**
179320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * The systemID that may be used in association
180320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * with the byte or character stream, or, if neither is set, use
181320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * this value as a writeable URI (probably a file name).
182320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     */
183320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    private String systemId;
184320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
185320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    /**
186320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * The byte stream that is to be written to.
187320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     */
188320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    private OutputStream outputStream;
189320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
190320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    /**
191320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * The character stream that is to be written to.
192320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     */
193320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    private Writer writer;
194320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson}
195