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 782475 2009-06-07 22:02:58Z sgoeschl $
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 finally
072 {
073 if (bis != null)
074 {
075 bis.close();
076 }
077 }
078 }
079
080 /**
081 * Create a datasource from an input stream.
082 *
083 * @param aIs An InputStream.
084 * @param aType A String.
085 * @throws IOException IOException
086 * @since 1.0
087 */
088 public ByteArrayDataSource(InputStream aIs, String aType) throws IOException
089 {
090 this.byteArrayDataSource(aIs, aType);
091 }
092
093 /**
094 * Create a datasource from a String.
095 *
096 * @param data A String.
097 * @param aType A String.
098 * @throws IOException IOException
099 * @since 1.0
100 */
101 public ByteArrayDataSource(String data, String aType) throws IOException
102 {
103 this.type = aType;
104
105 try
106 {
107 baos = new ByteArrayOutputStream();
108
109 // Assumption that the string contains only ASCII
110 // characters! Else just pass in a charset into this
111 // constructor and use it in getBytes().
112 baos.write(data.getBytes("iso-8859-1"));
113 baos.flush();
114 baos.close();
115 }
116 catch (UnsupportedEncodingException uex)
117 {
118 throw new IOException("The Character Encoding is not supported.");
119 }
120 finally
121 {
122 if (baos != null)
123 {
124 baos.close();
125 }
126 }
127 }
128
129 /**
130 * Create a datasource from an input stream.
131 *
132 * @param aIs An InputStream.
133 * @param aType A String.
134 * @throws IOException IOException
135 */
136 private void byteArrayDataSource(InputStream aIs, String aType)
137 throws IOException
138 {
139 this.type = aType;
140
141 BufferedInputStream bis = null;
142 BufferedOutputStream osWriter = null;
143
144 try
145 {
146 int length = 0;
147 byte[] buffer = new byte[ByteArrayDataSource.BUFFER_SIZE];
148
149 bis = new BufferedInputStream(aIs);
150 baos = new ByteArrayOutputStream();
151 osWriter = new BufferedOutputStream(baos);
152
153 //Write the InputData to OutputStream
154 while ((length = bis.read(buffer)) != -1)
155 {
156 osWriter.write(buffer, 0, length);
157 }
158 osWriter.flush();
159 osWriter.close();
160
161 }
162 finally
163 {
164 if (bis != null)
165 {
166 bis.close();
167 }
168 if (baos != null)
169 {
170 baos.close();
171 }
172 if (osWriter != null)
173 {
174 osWriter.close();
175 }
176 }
177 }
178
179
180
181 /**
182 * Get the content type.
183 *
184 * @return A String.
185 * @since 1.0
186 */
187 public String getContentType()
188 {
189 return type == null ? "application/octet-stream" : type;
190 }
191
192 /**
193 * Get the input stream.
194 *
195 * @return An InputStream.
196 * @throws IOException IOException
197 * @since 1.0
198 */
199 public InputStream getInputStream() throws IOException
200 {
201 if (baos == null)
202 {
203 throw new IOException("no data");
204 }
205 return new ByteArrayInputStream(baos.toByteArray());
206 }
207
208 /**
209 * Get the name.
210 *
211 * @return A String.
212 * @since 1.0
213 */
214 public String getName()
215 {
216 return "ByteArrayDataSource";
217 }
218
219 /**
220 * Get the OutputStream to write to
221 *
222 * @return An OutputStream
223 * @since 1.0
224 */
225 public OutputStream getOutputStream()
226 {
227 baos = new ByteArrayOutputStream();
228 return baos;
229 }
230 }