001: /*
002: * $Header: /home/cvs/jakarta-commons/fileupload/src/java/org/apache/commons/fileupload/DeferredFileOutputStream.java,v 1.2 2003/05/31 22:31:08 martinc Exp $
003: * $Revision: 1.2 $
004: * $Date: 2003/05/31 22:31:08 $
005: *
006: * ====================================================================
007: *
008: * The Apache Software License, Version 1.1
009: *
010: * Copyright (c) 2001-2003 The Apache Software Foundation. All rights
011: * reserved.
012: *
013: * Redistribution and use in source and binary forms, with or without
014: * modification, are permitted provided that the following conditions
015: * are met:
016: *
017: * 1. Redistributions of source code must retain the above copyright
018: * notice, this list of conditions and the following disclaimer.
019: *
020: * 2. Redistributions in binary form must reproduce the above copyright
021: * notice, this list of conditions and the following disclaimer in
022: * the documentation and/or other materials provided with the
023: * distribution.
024: *
025: * 3. The end-user documentation included with the redistribution, if
026: * any, must include the following acknowlegement:
027: * "This product includes software developed by the
028: * Apache Software Foundation (http://www.apache.org/)."
029: * Alternately, this acknowlegement may appear in the software itself,
030: * if and wherever such third-party acknowlegements normally appear.
031: *
032: * 4. The names "The Jakarta Project", "Commons", and "Apache Software
033: * Foundation" must not be used to endorse or promote products derived
034: * from this software without prior written permission. For written
035: * permission, please contact apache@apache.org.
036: *
037: * 5. Products derived from this software may not be called "Apache"
038: * nor may "Apache" appear in their names without prior written
039: * permission of the Apache Group.
040: *
041: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
042: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
043: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
044: * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
045: * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
046: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
047: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
048: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
049: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
050: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
051: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
052: * SUCH DAMAGE.
053: * ====================================================================
054: *
055: * This software consists of voluntary contributions made by many
056: * individuals on behalf of the Apache Software Foundation. For more
057: * information on the Apache Software Foundation, please see
058: * <http://www.apache.org/>.
059: *
060: */
061:
062: package de.ug2t.extTools.httpFileUpLoad;
063:
064: import java.io.*;
065:
066: /**
067: * <p>
068: * An output stream which will retain data in memory until a specified threshold
069: * is reached, and only then commit it to disk. If the stream is closed before
070: * the threshold is reached, the data will not be written to disk at all.
071: * </p>
072: *
073: * @author <a href="mailto:martinc@apache.org">Martin Cooper</a>
074: *
075: * @version $Id: DeferredFileOutputStream.java,v 1.2 2003/05/31 22:31:08 martinc
076: * Exp $
077: */
078: public class DeferredFileOutputStream extends AThresholdingOutputStream {
079:
080: // ----------------------------------------------------------- Data members
081:
082: /**
083: * The output stream to which data will be written prior to the theshold being
084: * reached.
085: */
086: private ByteArrayOutputStream memoryOutputStream;
087:
088: /**
089: * The output stream to which data will be written after the theshold is
090: * reached.
091: */
092: private FileOutputStream diskOutputStream;
093:
094: /**
095: * The output stream to which data will be written at any given time. This
096: * will always be one of <code>memoryOutputStream</code> or
097: * <code>diskOutputStream</code>.
098: */
099: private OutputStream currentOutputStream;
100:
101: /**
102: * The file to which output will be directed if the threshold is exceeded.
103: */
104: private File outputFile;
105:
106: // ----------------------------------------------------------- Constructors
107:
108: /**
109: * Constructs an instance of this class which will trigger an event at the
110: * specified threshold, and save data to a file beyond that point.
111: *
112: * @param threshold
113: * The number of bytes at which to trigger an event.
114: * @param outputFile
115: * The file to which data is saved beyond the threshold.
116: */
117: public DeferredFileOutputStream(int threshold, File outputFile) {
118: super (threshold);
119: this .outputFile = outputFile;
120:
121: memoryOutputStream = new ByteArrayOutputStream(threshold);
122: currentOutputStream = memoryOutputStream;
123: }
124:
125: // --------------------------------------- AThresholdingOutputStream methods
126:
127: /**
128: * Returns the current output stream. This may be memory based or disk based,
129: * depending on the current state with respect to the threshold.
130: *
131: * @return The underlying output stream.
132: *
133: * @exception IOException
134: * if an error occurs.
135: */
136: protected OutputStream getStream() throws IOException {
137: return currentOutputStream;
138: }
139:
140: /**
141: * Switches the underlying output stream from a memory based stream to one
142: * that is backed by disk. This is the point at which we realise that too much
143: * data is being written to keep in memory, so we elect to switch to
144: * disk-based storage.
145: *
146: * @exception IOException
147: * if an error occurs.
148: */
149: protected void thresholdReached() throws IOException {
150: byte[] data = memoryOutputStream.toByteArray();
151: FileOutputStream fos = new FileOutputStream(outputFile);
152: fos.write(data);
153: diskOutputStream = fos;
154: currentOutputStream = fos;
155: memoryOutputStream = null;
156: }
157:
158: // --------------------------------------------------------- Public methods
159:
160: /**
161: * Determines whether or not the data for this output stream has been retained
162: * in memory.
163: *
164: * @return <code>true</code> if the data is available in memory;
165: * <code>false</code> otherwise.
166: */
167: public boolean isInMemory() {
168: return (!isThresholdExceeded());
169: }
170:
171: /**
172: * Returns the data for this output stream as an array of bytes, assuming that
173: * the data has been retained in memory. If the data was written to disk, this
174: * method returns <code>null</code>.
175: *
176: * @return The data for this output stream, or <code>null</code> if no such
177: * data is available.
178: */
179: public byte[] getData() {
180: if (memoryOutputStream != null) {
181: return memoryOutputStream.toByteArray();
182: }
183: return null;
184: }
185:
186: /**
187: * Returns the data for this output stream as a <code>File</code>, assuming
188: * that the data was written to disk. If the data was retained in memory, this
189: * method returns <code>null</code>.
190: *
191: * @return The file for this output stream, or <code>null</code> if no such
192: * file exists.
193: */
194: public File getFile() {
195: return outputFile;
196: }
197: }
|