KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > columba > ristretto > io > TempSourceFactory


1 /* ***** BEGIN LICENSE BLOCK *****
2  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3  *
4  * The contents of this file are subject to the Mozilla Public License Version
5  * 1.1 (the "License"); you may not use this file except in compliance with
6  * the License. You may obtain a copy of the License at
7  * http://www.mozilla.org/MPL/
8  *
9  * Software distributed under the License is distributed on an "AS IS" basis,
10  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11  * for the specific language governing rights and limitations under the
12  * License.
13  *
14  * The Original Code is Ristretto Mail API.
15  *
16  * The Initial Developers of the Original Code are
17  * Timo Stich and Frederik Dietz.
18  * Portions created by the Initial Developers are Copyright (C) 2004
19  * All Rights Reserved.
20  *
21  * Contributor(s):
22  *
23  * Alternatively, the contents of this file may be used under the terms of
24  * either the GNU General Public License Version 2 or later (the "GPL"), or
25  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26  * in which case the provisions of the GPL or the LGPL are applicable instead
27  * of those above. If you wish to allow use of your version of this file only
28  * under the terms of either the GPL or the LGPL, and not to allow others to
29  * use your version of this file under the terms of the MPL, indicate your
30  * decision by deleting the provisions above and replace them with the notice
31  * and other provisions required by the GPL or the LGPL. If you do not delete
32  * the provisions above, a recipient may use your version of this file under
33  * the terms of any one of the MPL, the GPL or the LGPL.
34  *
35  * ***** END LICENSE BLOCK ***** */

36 package org.columba.ristretto.io;
37
38 import java.io.ByteArrayOutputStream JavaDoc;
39 import java.io.File JavaDoc;
40 import java.io.FileOutputStream JavaDoc;
41 import java.io.IOException JavaDoc;
42 import java.io.InputStream JavaDoc;
43 import java.io.OutputStream JavaDoc;
44
45 /**
46  * Factory for creating temporary sources.
47  * A decision for a file or memory data backend
48  * is made given the size of the temporary source.
49  *
50  * @author tstich
51  *
52  */

53 public class TempSourceFactory {
54
55     /**
56      * Upper size bound for creating a memory source.
57      */

58     public static int MAX_IN_RAM_SIZE = 51200; // default is 50kB
59
protected static String JavaDoc TEMP_PREFIX = "ristretto_";
60     protected static String JavaDoc TEMP_POSTFIX = "tmp";
61     protected static int BUFFER_SIZE = 51200;
62
63     private static int counter = 0;
64
65     /**
66      * Creates a temporary Source.
67      *
68      * @param in
69      * @param size the size of the temp source or -1 if unknown
70      * @return the temporary source
71      * @throws IOException
72      */

73     public static Source createTempSource(
74         InputStream JavaDoc in,
75         int size)
76         throws IOException JavaDoc {
77
78         if(size != -1 && (size < MAX_IN_RAM_SIZE
79             || in.available() < MAX_IN_RAM_SIZE) ) {
80
81             // read in RAM
82
ByteArrayOutputStream JavaDoc out = new ByteArrayOutputStream JavaDoc();
83
84             copyStream(in, out, size);
85
86             out.close();
87
88             return new ByteBufferSource(out.toByteArray());
89         } else {
90             File JavaDoc tempFile = createTempFile();
91
92             OutputStream JavaDoc out = new FileOutputStream JavaDoc(tempFile);
93
94             copyStream(in, out, size);
95
96             out.close();
97             
98             // assign literal to response
99
return new FileSource(tempFile);
100         }
101
102     }
103
104     /**
105      * Creates a temporary Source.
106      *
107      * @param in
108      * @return the temporary source
109      * @throws IOException
110      */

111     public static Source createTempSource(
112         InputStream JavaDoc in)
113         throws IOException JavaDoc {
114         return TempSourceFactory.createTempSource(in, -1);
115     }
116     
117     
118     /**
119      * Check if a memory or file source will be created.
120      *
121      * @param size
122      * @return <code>true</code> if a temporary source will be used
123      */

124     public static boolean useMemoryTemp(int size) {
125         return size < MAX_IN_RAM_SIZE;
126     }
127     
128     /**
129      * Create a temporary file that will be deleted
130      * on exit of the Virtual Machine.
131      *
132      * @return the temporary file
133      * @throws IOException
134      */

135     public static File JavaDoc createTempFile() throws IOException JavaDoc {
136         // read in tempfile
137
File JavaDoc tempFile =
138             File.createTempFile(TEMP_PREFIX + nextID(), TEMP_POSTFIX);
139         tempFile.deleteOnExit();
140         return tempFile;
141     }
142
143     private static synchronized int nextID() {
144         return counter++;
145     }
146
147     private static int copyStream(
148         InputStream JavaDoc in,
149         OutputStream JavaDoc out,
150         int size)
151         throws IOException JavaDoc {
152         byte[] buffer = new byte[BUFFER_SIZE];
153
154         int copied = 0;
155         int actSize;
156
157         if (size != -1) {
158
159             while (size - copied > 0) {
160                 actSize =
161                     in.read(
162                         buffer,
163                         0,
164                         size - copied >= BUFFER_SIZE
165                             ? BUFFER_SIZE
166                             : size - copied);
167                 if (actSize == -1)
168                     break;
169                 out.write(buffer, 0, actSize);
170                 copied += actSize;
171             }
172         } else {
173             while (true) {
174                 actSize =
175                     in.read(buffer);
176                 if (actSize == -1)
177                     break;
178                 out.write(buffer, 0, actSize);
179                 copied += actSize;
180             }
181         }
182
183         return copied;
184     }
185
186 }
187
Popular Tags