001 /* 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 package org.apache.commons.mail; 018 019 import java.io.BufferedInputStream; 020 import java.io.BufferedOutputStream; 021 import java.io.ByteArrayInputStream; 022 import java.io.ByteArrayOutputStream; 023 import java.io.IOException; 024 import java.io.InputStream; 025 import java.io.OutputStream; 026 import java.io.UnsupportedEncodingException; 027 028 import javax.activation.DataSource; 029 030 /** 031 * This class implements a typed DataSource from:<br> 032 * 033 * - an InputStream<br> 034 * - a byte array<br> 035 * - a String<br> 036 * 037 * @since 1.0 038 * @author <a href="mailto:colin.chalmers@maxware.nl">Colin Chalmers</a> 039 * @author <a href="mailto:jon@latchkey.com">Jon S. Stevens</a> 040 * @author <a href="mailto:bmclaugh@algx.net">Brett McLaughlin</a> 041 * @version $Id: ByteArrayDataSource.java 480401 2006-11-29 04:40:04Z bayard $ 042 */ 043 public class ByteArrayDataSource implements DataSource 044 { 045 /** define the buffer size */ 046 public static final int BUFFER_SIZE = 512; 047 048 /** Stream containg the Data */ 049 private ByteArrayOutputStream baos; 050 051 /** Content-type. */ 052 private String type = "application/octet-stream"; 053 054 /** 055 * Create a datasource from a byte array. 056 * 057 * @param data A byte[]. 058 * @param aType A String. 059 * @throws IOException IOException 060 * @since 1.0 061 */ 062 public ByteArrayDataSource(byte[] data, String aType) throws IOException 063 { 064 ByteArrayInputStream bis = null; 065 066 try 067 { 068 bis = new ByteArrayInputStream(data); 069 this.byteArrayDataSource(bis, aType); 070 } 071 catch (IOException ioex) 072 { 073 throw ioex; 074 } 075 finally 076 { 077 if (bis != null) 078 { 079 bis.close(); 080 } 081 } 082 } 083 084 /** 085 * Create a datasource from an input stream. 086 * 087 * @param aIs An InputStream. 088 * @param aType A String. 089 * @throws IOException IOException 090 * @since 1.0 091 */ 092 public ByteArrayDataSource(InputStream aIs, String aType) throws IOException 093 { 094 this.byteArrayDataSource(aIs, aType); 095 } 096 097 /** 098 * Create a datasource from a String. 099 * 100 * @param data A String. 101 * @param aType A String. 102 * @throws IOException IOException 103 * @since 1.0 104 */ 105 public ByteArrayDataSource(String data, String aType) throws IOException 106 { 107 this.type = aType; 108 109 try 110 { 111 baos = new ByteArrayOutputStream(); 112 113 // Assumption that the string contains only ASCII 114 // characters! Else just pass in a charset into this 115 // constructor and use it in getBytes(). 116 baos.write(data.getBytes("iso-8859-1")); 117 baos.flush(); 118 baos.close(); 119 } 120 catch (UnsupportedEncodingException uex) 121 { 122 throw new IOException("The Character Encoding is not supported."); 123 } 124 finally 125 { 126 if (baos != null) 127 { 128 baos.close(); 129 } 130 } 131 } 132 133 /** 134 * Create a datasource from an input stream. 135 * 136 * @param aIs An InputStream. 137 * @param aType A String. 138 * @throws IOException IOException 139 */ 140 private void byteArrayDataSource(InputStream aIs, String aType) 141 throws IOException 142 { 143 this.type = aType; 144 145 BufferedInputStream bis = null; 146 BufferedOutputStream osWriter = null; 147 148 try 149 { 150 int length = 0; 151 byte[] buffer = new byte[ByteArrayDataSource.BUFFER_SIZE]; 152 153 bis = new BufferedInputStream(aIs); 154 baos = new ByteArrayOutputStream(); 155 osWriter = new BufferedOutputStream(baos); 156 157 //Write the InputData to OutputStream 158 while ((length = bis.read(buffer)) != -1) 159 { 160 osWriter.write(buffer, 0, length); 161 } 162 osWriter.flush(); 163 osWriter.close(); 164 165 } 166 catch (IOException ioex) 167 { 168 throw ioex; 169 } 170 finally 171 { 172 if (bis != null) 173 { 174 bis.close(); 175 } 176 if (baos != null) 177 { 178 baos.close(); 179 } 180 if (osWriter != null) 181 { 182 osWriter.close(); 183 } 184 } 185 } 186 187 188 189 /** 190 * Get the content type. 191 * 192 * @return A String. 193 * @since 1.0 194 */ 195 public String getContentType() 196 { 197 return type == null ? "application/octet-stream" : type; 198 } 199 200 /** 201 * Get the input stream. 202 * 203 * @return An InputStream. 204 * @throws IOException IOException 205 * @since 1.0 206 */ 207 public InputStream getInputStream() throws IOException 208 { 209 if (baos == null) 210 { 211 throw new IOException("no data"); 212 } 213 return new ByteArrayInputStream(baos.toByteArray()); 214 } 215 216 /** 217 * Get the name. 218 * 219 * @return A String. 220 * @since 1.0 221 */ 222 public String getName() 223 { 224 return "ByteArrayDataSource"; 225 } 226 227 /** 228 * Get the OutputStream to write to 229 * 230 * @return An OutputStream 231 * @since 1.0 232 */ 233 public OutputStream getOutputStream() 234 { 235 baos = new ByteArrayOutputStream(); 236 return baos; 237 } 238 }