You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by bs...@apache.org on 2006/03/23 01:16:09 UTC
svn commit: r387976 - in /geronimo/specs/trunk/geronimo-spec-javamail/src:
main/java/javax/mail/internet/ main/java/org/apache/geronimo/mail/util/
test/java/javax/mail/internet/
Author: bsnyder
Date: Wed Mar 22 16:16:06 2006
New Revision: 387976
URL: http://svn.apache.org/viewcvs?rev=387976&view=rev
Log:
Committed patch for GERONIMO-1760.
Added:
geronimo/specs/trunk/geronimo-spec-javamail/src/test/java/javax/mail/internet/MimeTest.java
Modified:
geronimo/specs/trunk/geronimo-spec-javamail/src/main/java/javax/mail/internet/MimeBodyPart.java
geronimo/specs/trunk/geronimo-spec-javamail/src/main/java/javax/mail/internet/MimeMultipart.java
geronimo/specs/trunk/geronimo-spec-javamail/src/main/java/org/apache/geronimo/mail/util/Base64DecoderStream.java
geronimo/specs/trunk/geronimo-spec-javamail/src/main/java/org/apache/geronimo/mail/util/Base64EncoderStream.java
Modified: geronimo/specs/trunk/geronimo-spec-javamail/src/main/java/javax/mail/internet/MimeBodyPart.java
URL: http://svn.apache.org/viewcvs/geronimo/specs/trunk/geronimo-spec-javamail/src/main/java/javax/mail/internet/MimeBodyPart.java?rev=387976&r1=387975&r2=387976&view=diff
==============================================================================
--- geronimo/specs/trunk/geronimo-spec-javamail/src/main/java/javax/mail/internet/MimeBodyPart.java (original)
+++ geronimo/specs/trunk/geronimo-spec-javamail/src/main/java/javax/mail/internet/MimeBodyPart.java Wed Mar 22 16:16:06 2006
@@ -399,7 +399,9 @@
out.write('\r');
out.write('\n');
// we need to process this using the transfer encoding type
- getDataHandler().writeTo(MimeUtility.encode(out, getEncoding()));
+ OutputStream encodingStream = MimeUtility.encode(out, getEncoding());
+ getDataHandler().writeTo(encodingStream);
+ encodingStream.flush();
}
public String[] getHeader(String name) throws MessagingException {
Modified: geronimo/specs/trunk/geronimo-spec-javamail/src/main/java/javax/mail/internet/MimeMultipart.java
URL: http://svn.apache.org/viewcvs/geronimo/specs/trunk/geronimo-spec-javamail/src/main/java/javax/mail/internet/MimeMultipart.java?rev=387976&r1=387975&r2=387976&view=diff
==============================================================================
--- geronimo/specs/trunk/geronimo-spec-javamail/src/main/java/javax/mail/internet/MimeMultipart.java (original)
+++ geronimo/specs/trunk/geronimo-spec-javamail/src/main/java/javax/mail/internet/MimeMultipart.java Wed Mar 22 16:16:06 2006
@@ -264,12 +264,11 @@
if (boundaryIndex == boundary.length) { // boundary found
boundaryFound = true;
// read the end of line character
- if (inStream.read() == 45) {
- //check whether end of stream
+ if (inStream.read() == 45 && value == 45) {
//Last mime boundary should have a succeeding "--"
- if (!((value = inStream.read()) == 45) && value != -1) {
- inStream.unread(value);
- }
+ //as we are on it, read the terminating CRLF
+ inStream.read();
+ inStream.read();
}
return -1;
}
Modified: geronimo/specs/trunk/geronimo-spec-javamail/src/main/java/org/apache/geronimo/mail/util/Base64DecoderStream.java
URL: http://svn.apache.org/viewcvs/geronimo/specs/trunk/geronimo-spec-javamail/src/main/java/org/apache/geronimo/mail/util/Base64DecoderStream.java?rev=387976&r1=387975&r2=387976&view=diff
==============================================================================
--- geronimo/specs/trunk/geronimo-spec-javamail/src/main/java/org/apache/geronimo/mail/util/Base64DecoderStream.java (original)
+++ geronimo/specs/trunk/geronimo-spec-javamail/src/main/java/org/apache/geronimo/mail/util/Base64DecoderStream.java Wed Mar 22 16:16:06 2006
@@ -127,7 +127,7 @@
// now copy some of the data from the decoded buffer to the target buffer
int copyCount = Math.min(decodedCount, length);
- System.arraycopy(data, offset, decodedChars, decodedIndex, copyCount);
+ System.arraycopy(decodedChars, decodedIndex, data, offset, copyCount);
decodedIndex += copyCount;
decodedCount -= copyCount;
offset += copyCount;
Modified: geronimo/specs/trunk/geronimo-spec-javamail/src/main/java/org/apache/geronimo/mail/util/Base64EncoderStream.java
URL: http://svn.apache.org/viewcvs/geronimo/specs/trunk/geronimo-spec-javamail/src/main/java/org/apache/geronimo/mail/util/Base64EncoderStream.java?rev=387976&r1=387975&r2=387976&view=diff
==============================================================================
--- geronimo/specs/trunk/geronimo-spec-javamail/src/main/java/org/apache/geronimo/mail/util/Base64EncoderStream.java (original)
+++ geronimo/specs/trunk/geronimo-spec-javamail/src/main/java/org/apache/geronimo/mail/util/Base64EncoderStream.java Wed Mar 22 16:16:06 2006
@@ -134,6 +134,18 @@
}
}
}
+
+ public void close() throws IOException {
+ flush();
+ out.close();
+ }
+
+ public void flush() throws IOException {
+ if (bufferedBytes > 0) {
+ encoder.encode(buffer, 0, bufferedBytes, out);
+ bufferedBytes = 0;
+ }
+ }
/**
Added: geronimo/specs/trunk/geronimo-spec-javamail/src/test/java/javax/mail/internet/MimeTest.java
URL: http://svn.apache.org/viewcvs/geronimo/specs/trunk/geronimo-spec-javamail/src/test/java/javax/mail/internet/MimeTest.java?rev=387976&view=auto
==============================================================================
--- geronimo/specs/trunk/geronimo-spec-javamail/src/test/java/javax/mail/internet/MimeTest.java (added)
+++ geronimo/specs/trunk/geronimo-spec-javamail/src/test/java/javax/mail/internet/MimeTest.java Wed Mar 22 16:16:06 2006
@@ -0,0 +1,121 @@
+/**
+ *
+ * Copyright 2003-2004 The Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package javax.mail.internet;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.Properties;
+
+import javax.activation.DataHandler;
+import javax.activation.DataSource;
+import javax.mail.Session;
+
+import junit.framework.TestCase;
+
+public class MimeTest extends TestCase {
+
+ public void testWriteRead() throws Exception {
+ Session session = Session.getDefaultInstance(new Properties(), null);
+ MimeMessage mime = new MimeMessage(session);
+ MimeMultipart parts = new MimeMultipart("related; type=\"text/xml\"; start=\"<xml>\"");
+ MimeBodyPart xmlPart = new MimeBodyPart();
+ xmlPart.setContentID("<xml>");
+ xmlPart.setDataHandler(new DataHandler(new ByteArrayDataSource("<hello/>".getBytes(), "text/xml")));
+ parts.addBodyPart(xmlPart);
+ MimeBodyPart jpegPart = new MimeBodyPart();
+ jpegPart.setContentID("<jpeg>");
+ jpegPart.setDataHandler(new DataHandler(new ByteArrayDataSource(new byte[] { 0, 1, 2, 3, 4, 5 }, "image/jpeg")));
+ parts.addBodyPart(jpegPart);
+ mime.setContent(parts);
+ mime.setHeader("Content-Type", parts.getContentType());
+
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ mime.writeTo(baos);
+
+ System.out.println(baos);
+
+ MimeMessage mime2 = new MimeMessage(session, new ByteArrayInputStream(baos.toByteArray()));
+ assertTrue(mime2.getContent() instanceof MimeMultipart);
+ MimeMultipart parts2 = (MimeMultipart) mime2.getContent();
+ assertEquals(mime.getContentType(), mime2.getContentType());
+ assertEquals(parts.getCount(), parts2.getCount());
+ assertTrue(parts2.getBodyPart(0) instanceof MimeBodyPart);
+ assertTrue(parts2.getBodyPart(1) instanceof MimeBodyPart);
+
+ MimeBodyPart xmlPart2 = (MimeBodyPart) parts2.getBodyPart(0);
+ assertEquals(xmlPart.getContentID(), xmlPart2.getContentID());
+ ByteArrayOutputStream xmlBaos = new ByteArrayOutputStream();
+ copyInputStream(xmlPart.getDataHandler().getInputStream(), xmlBaos);
+ ByteArrayOutputStream xmlBaos2 = new ByteArrayOutputStream();
+ copyInputStream(xmlPart2.getDataHandler().getInputStream(), xmlBaos2);
+ assertEquals(xmlBaos.toString(), xmlBaos2.toString());
+
+ MimeBodyPart jpegPart2 = (MimeBodyPart) parts2.getBodyPart(1);
+ assertEquals(jpegPart.getContentID(), jpegPart2.getContentID());
+ ByteArrayOutputStream jpegBaos = new ByteArrayOutputStream();
+ copyInputStream(jpegPart.getDataHandler().getInputStream(), jpegBaos);
+ ByteArrayOutputStream jpegBaos2 = new ByteArrayOutputStream();
+ copyInputStream(jpegPart2.getDataHandler().getInputStream(), jpegBaos2);
+ assertEquals(jpegBaos.toString(), jpegBaos2.toString());
+ }
+
+ public static class ByteArrayDataSource implements DataSource {
+ private byte[] data;
+ private String type;
+ private String name = "unused";
+
+ public ByteArrayDataSource(byte[] data, String type) {
+ this.data = data;
+ this.type = type;
+ }
+
+ public InputStream getInputStream() throws IOException {
+ if (data == null) throw new IOException("no data");
+ return new ByteArrayInputStream(data);
+ }
+
+ public OutputStream getOutputStream() throws IOException {
+ throw new IOException("getOutputStream() not supported");
+ }
+
+ public String getContentType() {
+ return type;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+ }
+
+ public static void copyInputStream(InputStream in, OutputStream out) throws IOException {
+ byte[] buffer = new byte[1024];
+ int len;
+ while ((len = in.read(buffer)) >= 0) {
+ out.write(buffer, 0, len);
+ }
+ in.close();
+ out.close();
+ }
+}