1 /**************************************************************** 2 * Licensed to the Apache Software Foundation (ASF) under one * 3 * or more contributor license agreements. See the NOTICE file * 4 * distributed with this work for additional information * 5 * regarding copyright ownership. The ASF licenses this file * 6 * to you under the Apache License, Version 2.0 (the * 7 * "License"); you may not use this file except in compliance * 8 * with the License. You may obtain a copy of the License at * 9 * * 10 * http://www.apache.org/licenses/LICENSE-2.0 * 11 * * 12 * Unless required by applicable law or agreed to in writing, * 13 * software distributed under the License is distributed on an * 14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * 15 * KIND, either express or implied. See the License for the * 16 * specific language governing permissions and limitations * 17 * under the License. * 18 ****************************************************************/ 19 20 package org.apache.james.mime4j.util; 21 22 import java.io.BufferedInputStream; 23 import java.io.BufferedOutputStream; 24 import java.io.File; 25 import java.io.FileInputStream; 26 import java.io.FileOutputStream; 27 import java.io.IOException; 28 import java.io.InputStream; 29 import java.io.OutputStream; 30 import java.util.Random; 31 32 //BEGIN android-changed: Stubbing out logging 33 import org.apache.james.mime4j.Log; 34 import org.apache.james.mime4j.LogFactory; 35 //END android-changed 36 37 /** 38 * 39 * @version $Id: SimpleTempStorage.java,v 1.2 2004/10/02 12:41:11 ntherning Exp $ 40 */ 41 public class SimpleTempStorage extends TempStorage { 42 private static Log log = LogFactory.getLog(SimpleTempStorage.class); 43 44 private TempPath rootPath = null; 45 private Random random = new Random(); 46 47 /** 48 * Creates a new <code>SimpleTempStorageManager</code> instance. 49 */ 50 public SimpleTempStorage() { 51 rootPath = new SimpleTempPath(System.getProperty("java.io.tmpdir")); 52 } 53 54 private TempPath createTempPath(TempPath parent, String prefix) 55 throws IOException { 56 57 if (prefix == null) { 58 prefix = ""; 59 } 60 61 File p = null; 62 int count = 1000; 63 do { 64 long n = Math.abs(random.nextLong()); 65 p = new File(parent.getAbsolutePath(), prefix + n); 66 count--; 67 } while (p.exists() && count > 0); 68 69 if (p.exists() || !p.mkdirs()) { 70 log.error("Unable to mkdirs on " + p.getAbsolutePath()); 71 throw new IOException("Creating dir '" 72 + p.getAbsolutePath() + "' failed."); 73 } 74 75 return new SimpleTempPath(p); 76 } 77 78 private TempFile createTempFile(TempPath parent, String prefix, 79 String suffix) throws IOException { 80 81 if (prefix == null) { 82 prefix = ""; 83 } 84 if (suffix == null) { 85 suffix = ".tmp"; 86 } 87 88 File f = null; 89 90 int count = 1000; 91 synchronized (this) { 92 do { 93 long n = Math.abs(random.nextLong()); 94 f = new File(parent.getAbsolutePath(), prefix + n + suffix); 95 count--; 96 } while (f.exists() && count > 0); 97 98 if (f.exists()) { 99 throw new IOException("Creating temp file failed: " 100 + "Unable to find unique file name"); 101 } 102 103 try { 104 f.createNewFile(); 105 } catch (IOException e) { 106 throw new IOException("Creating dir '" 107 + f.getAbsolutePath() + "' failed."); 108 } 109 } 110 111 return new SimpleTempFile(f); 112 } 113 114 /** 115 * @see org.apache.james.mime4j.util.TempStorage#getRootTempPath() 116 */ 117 public TempPath getRootTempPath() { 118 return rootPath; 119 } 120 121 private class SimpleTempPath implements TempPath { 122 private File path = null; 123 124 private SimpleTempPath(String path) { 125 this.path = new File(path); 126 } 127 128 private SimpleTempPath(File path) { 129 this.path = path; 130 } 131 132 /** 133 * @see org.apache.james.mime4j.util.TempPath#createTempFile() 134 */ 135 public TempFile createTempFile() throws IOException { 136 return SimpleTempStorage.this.createTempFile(this, null, null); 137 } 138 139 /** 140 * @see org.apache.james.mime4j.util.TempPath#createTempFile(java.lang.String, java.lang.String) 141 */ 142 public TempFile createTempFile(String prefix, String suffix) 143 throws IOException { 144 145 return SimpleTempStorage.this.createTempFile(this, prefix, suffix); 146 } 147 148 /** 149 * @see org.apache.james.mime4j.util.TempPath#createTempFile(java.lang.String, java.lang.String, boolean) 150 */ 151 public TempFile createTempFile(String prefix, String suffix, 152 boolean allowInMemory) 153 throws IOException { 154 155 return SimpleTempStorage.this.createTempFile(this, prefix, suffix); 156 } 157 158 /** 159 * @see org.apache.james.mime4j.util.TempPath#getAbsolutePath() 160 */ 161 public String getAbsolutePath() { 162 return path.getAbsolutePath(); 163 } 164 165 /** 166 * Do nothing 167 */ 168 public void delete() { 169 } 170 171 /** 172 * @see org.apache.james.mime4j.util.TempPath#createTempPath() 173 */ 174 public TempPath createTempPath() throws IOException { 175 return SimpleTempStorage.this.createTempPath(this, null); 176 } 177 178 /** 179 * @see org.apache.james.mime4j.util.TempPath#createTempPath(java.lang.String) 180 */ 181 public TempPath createTempPath(String prefix) throws IOException { 182 return SimpleTempStorage.this.createTempPath(this, prefix); 183 } 184 185 } 186 187 private class SimpleTempFile implements TempFile { 188 private File file = null; 189 190 private SimpleTempFile(File file) { 191 this.file = file; 192 this.file.deleteOnExit(); 193 } 194 195 /** 196 * @see org.apache.james.mime4j.util.TempFile#getInputStream() 197 */ 198 public InputStream getInputStream() throws IOException { 199 return new BufferedInputStream(new FileInputStream(file)); 200 } 201 202 /** 203 * @see org.apache.james.mime4j.util.TempFile#getOutputStream() 204 */ 205 public OutputStream getOutputStream() throws IOException { 206 return new BufferedOutputStream(new FileOutputStream(file)); 207 } 208 209 /** 210 * @see org.apache.james.mime4j.util.TempFile#getAbsolutePath() 211 */ 212 public String getAbsolutePath() { 213 return file.getAbsolutePath(); 214 } 215 216 /** 217 * Do nothing 218 */ 219 public void delete() { 220 // Not implementated 221 } 222 223 /** 224 * @see org.apache.james.mime4j.util.TempFile#isInMemory() 225 */ 226 public boolean isInMemory() { 227 return false; 228 } 229 230 /** 231 * @see org.apache.james.mime4j.util.TempFile#length() 232 */ 233 public long length() { 234 return file.length(); 235 } 236 237 } 238 } 239