Author: norman
Date: Mon Aug 22 10:40:07 2011
New Revision: 1160196
URL: http://svn.apache.org/viewvc?rev=1160196&view=rev
Log:
Use the raw message header if possible when build the FETCH response. See
MAILBOX-115 and IMAP-332
Added:
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/HeadersBodyElement.java
(with props)
Removed:
james/imap/trunk/message/src/main/java/org/apache/james/imap/main/ChannelImapResponseWriter.java
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/PartialWritableByteChannel.java
james/imap/trunk/processor/src/test/java/org/apache/james/imap/processor/fetch/PartialWritableByteChannelTest.java
Modified:
james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/ImapResponseWriter.java
james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/base/ImapResponseComposerImpl.java
james/imap/trunk/message/src/main/java/org/apache/james/imap/main/OutputStreamImapResponseWriter.java
james/imap/trunk/message/src/main/java/org/apache/james/imap/message/response/Literal.java
james/imap/trunk/message/src/test/java/org/apache/james/imap/encode/base/ByteImapResponseWriter.java
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/ContentBodyElement.java
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/EmptyContent.java
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/FetchResponseBuilder.java
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/HeaderBodyElement.java
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/MimeBodyElement.java
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/PartialFetchBodyElement.java
james/imap/trunk/processor/src/test/java/org/apache/james/imap/processor/fetch/MessageResultUtilsTest.java
Modified:
james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/ImapResponseWriter.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/ImapResponseWriter.java?rev=1160196&r1=1160195&r2=1160196&view=diff
==============================================================================
---
james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/ImapResponseWriter.java
(original)
+++
james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/ImapResponseWriter.java
Mon Aug 22 10:40:07 2011
@@ -20,7 +20,6 @@
package org.apache.james.imap.encode;
import java.io.IOException;
-import java.nio.ByteBuffer;
import org.apache.james.imap.message.response.Literal;
@@ -44,12 +43,12 @@ public interface ImapResponseWriter {
void write(Literal literal) throws IOException;
/**
- * Write a ByteBuffer to the client
+ * Write a byte[] to the client
*
* @param buffer
- * <code>ByteBuffer</code> to be written, not null
+ * <code>byte array</code> to be written, not null
* @throws IOException
*/
- void write(ByteBuffer buffer) throws IOException;
+ void write(byte[] buffer) throws IOException;
}
Modified:
james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/base/ImapResponseComposerImpl.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/base/ImapResponseComposerImpl.java?rev=1160196&r1=1160195&r2=1160196&view=diff
==============================================================================
---
james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/base/ImapResponseComposerImpl.java
(original)
+++
james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/base/ImapResponseComposerImpl.java
Mon Aug 22 10:40:07 2011
@@ -20,7 +20,6 @@
package org.apache.james.imap.encode.base;
import java.io.IOException;
-import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import javax.mail.Flags;
@@ -184,7 +183,7 @@ public class ImapResponseComposerImpl im
*/
public ImapResponseComposer end() throws IOException {
buffer.write(LINE_END.getBytes());
- writer.write(ByteBuffer.wrap(buffer.toByteArray()));
+ writer.write(buffer.toByteArray());
buffer.reset();
return this;
}
Modified:
james/imap/trunk/message/src/main/java/org/apache/james/imap/main/OutputStreamImapResponseWriter.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/message/src/main/java/org/apache/james/imap/main/OutputStreamImapResponseWriter.java?rev=1160196&r1=1160195&r2=1160196&view=diff
==============================================================================
---
james/imap/trunk/message/src/main/java/org/apache/james/imap/main/OutputStreamImapResponseWriter.java
(original)
+++
james/imap/trunk/message/src/main/java/org/apache/james/imap/main/OutputStreamImapResponseWriter.java
Mon Aug 22 10:40:07 2011
@@ -20,19 +20,20 @@
package org.apache.james.imap.main;
import java.io.IOException;
+import java.io.InputStream;
import java.io.OutputStream;
-import java.nio.channels.Channels;
+import org.apache.james.imap.encode.ImapResponseWriter;
+import org.apache.james.imap.message.response.Literal;
/**
* Class providing methods to send response messages from the server to the
* client.
*/
-public class OutputStreamImapResponseWriter extends ChannelImapResponseWriter {
+public class OutputStreamImapResponseWriter implements ImapResponseWriter {
private final OutputStream output;
public OutputStreamImapResponseWriter(OutputStream output) {
- super(Channels.newChannel(output));
this.output = output;
}
@@ -40,4 +41,35 @@ public class OutputStreamImapResponseWri
output.flush();
}
+
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.apache.james.imap.encode.ImapResponseWriter#write(org.apache.james
+ * .imap.message.response.Literal)
+ */
+ public void write(Literal literal) throws IOException {
+ InputStream in = null;
+ try {
+ in = literal.getInputStream();
+
+ byte[] buffer = new byte[1024];
+ for (int len; (len = in.read(buffer)) != -1;) {
+ output.write(buffer, 0, len);
+ }
+ } finally {
+ if (in != null) {
+ in.close();
+ }
+ }
+
+ }
+
+ @Override
+ public void write(byte[] buffer) throws IOException {
+ output.write(buffer);
+ }
+
}
Modified:
james/imap/trunk/message/src/main/java/org/apache/james/imap/message/response/Literal.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/message/src/main/java/org/apache/james/imap/message/response/Literal.java?rev=1160196&r1=1160195&r2=1160196&view=diff
==============================================================================
---
james/imap/trunk/message/src/main/java/org/apache/james/imap/message/response/Literal.java
(original)
+++
james/imap/trunk/message/src/main/java/org/apache/james/imap/message/response/Literal.java
Mon Aug 22 10:40:07 2011
@@ -29,17 +29,10 @@ public interface Literal {
*
* @return number of octets which {@link #writeTo(WritableByteChannel)}
will
* put onto the channel
+ * @throws IOException
*/
- public long size();
+ public long size() throws IOException;
- /**
- * Writes the contents of this body element to the channel.
- *
- * @param channel
- * <code>Channel</code>, not null
- * @throws IOException
- */
- public void writeTo(WritableByteChannel channel) throws IOException;
/**
* Return the Literal as {@link InputStream}
Modified:
james/imap/trunk/message/src/test/java/org/apache/james/imap/encode/base/ByteImapResponseWriter.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/message/src/test/java/org/apache/james/imap/encode/base/ByteImapResponseWriter.java?rev=1160196&r1=1160195&r2=1160196&view=diff
==============================================================================
---
james/imap/trunk/message/src/test/java/org/apache/james/imap/encode/base/ByteImapResponseWriter.java
(original)
+++
james/imap/trunk/message/src/test/java/org/apache/james/imap/encode/base/ByteImapResponseWriter.java
Mon Aug 22 10:40:07 2011
@@ -21,9 +21,7 @@ package org.apache.james.imap.encode.bas
import java.io.ByteArrayOutputStream;
import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.nio.channels.Channels;
-import java.nio.channels.WritableByteChannel;
+import java.io.InputStream;
import org.apache.james.imap.api.ImapConstants;
import org.apache.james.imap.encode.ImapResponseWriter;
@@ -37,7 +35,6 @@ public class ByteImapResponseWriter impl
private ByteArrayOutputStream out;
- private WritableByteChannel channel;
public ByteImapResponseWriter() {
@@ -55,15 +52,27 @@ public class ByteImapResponseWriter impl
public void clear() {
this.out = new ByteArrayOutputStream();
- channel = Channels.newChannel(out);
}
public void write(Literal literal) throws IOException {
- literal.writeTo(channel);
- }
- public void write(ByteBuffer buffer) throws IOException {
- while (channel.write(buffer) > 0) { // NOPMD false positive
- // Write all
+ InputStream in = null;
+ try {
+ in = literal.getInputStream();
+
+ byte[] buffer = new byte[1024];
+ for (int len; (len = in.read(buffer)) != -1;) {
+ out.write(buffer, 0, len);
+ }
+ } finally {
+ if (in != null) {
+ in.close();
+ }
}
}
+
+ @Override
+ public void write(byte[] buffer) throws IOException {
+ out.write(buffer);
+ }
+
}
Modified:
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/ContentBodyElement.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/ContentBodyElement.java?rev=1160196&r1=1160195&r2=1160196&view=diff
==============================================================================
---
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/ContentBodyElement.java
(original)
+++
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/ContentBodyElement.java
Mon Aug 22 10:40:07 2011
@@ -22,21 +22,18 @@
*/
package org.apache.james.imap.processor.fetch;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
-import java.nio.channels.Channels;
-import java.nio.channels.WritableByteChannel;
+
import org.apache.james.imap.message.response.FetchResponse.BodyElement;
import org.apache.james.mailbox.Content;
-import org.apache.james.mailbox.InputStreamContent;
+import org.apache.james.mailbox.MailboxException;
-final class ContentBodyElement implements BodyElement {
+class ContentBodyElement implements BodyElement {
private final String name;
- private final Content content;
+ protected final Content content;
public ContentBodyElement(final String name, final Content content) {
super();
@@ -52,29 +49,23 @@ final class ContentBodyElement implement
}
/**
+ * @throws MailboxException
* @see
org.apache.james.imap.message.response.FetchResponse.BodyElement#size()
*/
- public long size() {
- return content.size();
+ public long size() throws IOException {
+ try {
+ return content.size();
+ } catch (MailboxException e) {
+ throw new IOException("Unable to get size for body element",e);
+ }
}
- /**
- * @see
org.apache.james.imap.message.response.FetchResponse.BodyElement#writeTo(WritableByteChannel)
- */
- public void writeTo(WritableByteChannel channel) throws IOException {
- content.writeTo(channel);
- }
/*
* (non-Javadoc)
* @see org.apache.james.imap.message.response.Literal#getInputStream()
*/
public InputStream getInputStream() throws IOException {
- if (content instanceof InputStreamContent) {
- return ((InputStreamContent) content).getInputStream();
- }
- ByteArrayOutputStream out = new ByteArrayOutputStream();
- writeTo(Channels.newChannel(out));
- return new ByteArrayInputStream(out.toByteArray());
+ return content.getInputStream();
}
}
\ No newline at end of file
Modified:
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/EmptyContent.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/EmptyContent.java?rev=1160196&r1=1160195&r2=1160196&view=diff
==============================================================================
---
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/EmptyContent.java
(original)
+++
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/EmptyContent.java
Mon Aug 22 10:40:07 2011
@@ -18,8 +18,9 @@
****************************************************************/
package org.apache.james.imap.processor.fetch;
+import java.io.ByteArrayInputStream;
import java.io.IOException;
-import java.nio.channels.WritableByteChannel;
+import java.io.InputStream;
import org.apache.james.mailbox.Content;
@@ -30,17 +31,15 @@ import org.apache.james.mailbox.Content;
public class EmptyContent implements Content{
/**
- * Write nothing as this {@link Content} is empty
- */
- public void writeTo(WritableByteChannel channel) throws IOException {
- // do nothing..
- }
-
- /**
* Return 0 as this {@link Content} is empty
*/
public long size() {
return 0;
}
+ @Override
+ public InputStream getInputStream() throws IOException {
+ return new ByteArrayInputStream("".getBytes());
+ }
+
}
Modified:
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/FetchResponseBuilder.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/FetchResponseBuilder.java?rev=1160196&r1=1160195&r2=1160196&view=diff
==============================================================================
---
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/FetchResponseBuilder.java
(original)
+++
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/FetchResponseBuilder.java
Mon Aug 22 10:40:07 2011
@@ -22,6 +22,7 @@
*/
package org.apache.james.imap.processor.fetch;
+import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
@@ -194,7 +195,7 @@ public final class FetchResponseBuilder
}
private FetchResponse.Envelope buildEnvelope(final MessageResult result)
throws MailboxException {
- return envelopeBuilder.buildEnvelope(result);
+ return envelopeBuilder.buildEnvelope(result.getHeaders());
}
private void setSize(long size) {
@@ -222,6 +223,7 @@ public final class FetchResponseBuilder
private FetchResponse.BodyElement bodyContent(final MessageResult
messageResult, final String name, final int specifier, final int[] path, final
Collection<String> names, final boolean isBase) throws MailboxException {
final FetchResponse.BodyElement fullResult;
+
switch (specifier) {
case BodyFetchElement.CONTENT:
fullResult = content(messageResult, name, path, isBase);
@@ -265,7 +267,10 @@ public final class FetchResponseBuilder
numberOfOctetsAsLong = numberOfOctets.longValue();
}
final long firstOctetAsLong = firstOctet.longValue();
+
result = new PartialFetchBodyElement(fullResult, firstOctetAsLong,
numberOfOctetsAsLong);
+
+
}
return result;
}
@@ -274,7 +279,11 @@ public final class FetchResponseBuilder
final FetchResponse.BodyElement result;
Content body;
if (isBase) {
- body = messageResult.getBody();
+ try {
+ body = messageResult.getBody();
+ } catch (IOException e) {
+ throw new MailboxException("Unable to get TEXT of body", e);
+ }
} else {
MessageResult.MimePath mimePath = new MimePathImpl(path);
body = messageResult.getBody(mimePath);
@@ -309,17 +318,39 @@ public final class FetchResponseBuilder
result.noBody();
}
- } else if (content(messageResult, name, path, isBase).size() <= 0)
{
- // Seems like this mail has no body
- result.noBody();
- }
+ } else
+ try {
+ if (content(messageResult, name, path, isBase).size() <=
0) {
+ // Seems like this mail has no body
+ result.noBody();
+ }
+ } catch (IOException e) {
+ throw new MailboxException("Unable to get size of header
body element", e);
+ }
}
return result;
}
- private FetchResponse.BodyElement headers(final MessageResult
messageResult, String name, final int[] path, final boolean isBase) throws
MailboxException {
- final Iterator<MessageResult.Header> headers =
getHeaders(messageResult, path, isBase);
- List<MessageResult.Header> lines = MessageResultUtils.getAll(headers);
- return headerBodyElement(messageResult, name, lines, path, isBase);
+ private FetchResponse.BodyElement headers(final MessageResult
messageResult, String name, final int[] path, final boolean isBase) throws
MailboxException {
+ if (isBase) {
+ // if its base we can just return the raw headers without parsing
+ // them. See MAILBOX-311 and IMAP-?
+ HeadersBodyElement element = new HeadersBodyElement(name,
messageResult.getHeaders());
+ try {
+ if (messageResult.getSize() - element.size() <= 0) {
+ // Seems like this mail has no body
+ element.noBody();
+
+ }
+ } catch (IOException e) {
+ throw new MailboxException("Unable to get size of header body
element", e);
+
+ }
+ return element;
+ } else {
+ final Iterator<MessageResult.Header> headers =
getHeaders(messageResult, path, isBase);
+ List<MessageResult.Header> lines =
MessageResultUtils.getAll(headers);
+ return headerBodyElement(messageResult, name, lines, path, isBase);
+ }
}
private FetchResponse.BodyElement fieldsNot(final MessageResult
messageResult, String name, final int[] path, Collection<String> names, final
boolean isBase) throws MailboxException {
@@ -338,7 +369,7 @@ public final class FetchResponseBuilder
private Iterator<MessageResult.Header> getHeaders(final MessageResult
messageResult, final int[] path, final boolean isBase) throws MailboxException {
final Iterator<MessageResult.Header> headers;
if (isBase) {
- headers = messageResult.headers();
+ headers = messageResult.getHeaders().headers();
} else {
MessageResult.MimePath mimePath = new MimePathImpl(path);
headers = messageResult.iterateHeaders(mimePath);
@@ -356,11 +387,17 @@ public final class FetchResponseBuilder
final FetchResponse.BodyElement result;
Content full;
if (isBase) {
- full = messageResult.getFullContent();
+ try {
+ full = messageResult.getFullContent();
+
+ } catch (IOException e) {
+ throw new MailboxException("Unable to get content", e);
+ }
} else {
MessageResult.MimePath mimePath = new MimePathImpl(path);
full = messageResult.getMimeBody(mimePath);
}
+
if (full == null) {
full = new EmptyContent();
}
Modified:
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/HeaderBodyElement.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/HeaderBodyElement.java?rev=1160196&r1=1160195&r2=1160196&view=diff
==============================================================================
---
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/HeaderBodyElement.java
(original)
+++
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/HeaderBodyElement.java
Mon Aug 22 10:40:07 2011
@@ -26,6 +26,7 @@ import java.util.List;
import org.apache.james.imap.api.ImapConstants;
import org.apache.james.imap.message.response.FetchResponse.BodyElement;
+import org.apache.james.mailbox.MailboxException;
import org.apache.james.mailbox.MessageResult;
/**
@@ -33,7 +34,7 @@ import org.apache.james.mailbox.MessageR
*/
public class HeaderBodyElement extends MimeBodyElement {
- public HeaderBodyElement(final String name, final
List<MessageResult.Header> headers) {
+ public HeaderBodyElement(final String name, final
List<MessageResult.Header> headers) throws MailboxException {
super(name, headers);
}
@@ -49,7 +50,7 @@ public class HeaderBodyElement extends M
}
@Override
- protected long calculateSize(List<MessageResult.Header> headers) {
+ protected long calculateSize(List<MessageResult.Header> headers) throws
MailboxException {
if (headers.isEmpty()) {
// even if the headers are empty we need to include the headers
body
// seperator
Added:
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/HeadersBodyElement.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/HeadersBodyElement.java?rev=1160196&view=auto
==============================================================================
---
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/HeadersBodyElement.java
(added)
+++
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/HeadersBodyElement.java
Mon Aug 22 10:40:07 2011
@@ -0,0 +1,68 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one *
+ * or more contributor license agreements. See the NOTICE file *
+ * distributed with this work for additional information *
+ * regarding copyright ownership. The ASF licenses this file *
+ * to you 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 org.apache.james.imap.processor.fetch;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.SequenceInputStream;
+
+import org.apache.james.mailbox.Content;
+
+public class HeadersBodyElement extends ContentBodyElement{
+
+ private boolean noBody = false;
+
+ public HeadersBodyElement(String name, Content content) {
+ super(name, content);
+ }
+
+
+ /**
+ * Indicate that there is no text body in the message. In this case we
don't need to write a single CRLF in anycase if
+ * this Element does not contain a header.
+ * @throws IOException
+ */
+ public void noBody() throws IOException {
+ if (super.size() == 0) {
+ noBody = true;
+ }
+ }
+
+ @Override
+ public long size() throws IOException {
+ if (noBody) {
+ return 0;
+ } else {
+ return super.size() + 2;
+
+ }
+ }
+
+ @Override
+ public InputStream getInputStream() throws IOException {
+ if (!noBody &&size() > 0) {
+ return new SequenceInputStream(super.getInputStream(), new
ByteArrayInputStream("\r\n".getBytes("US-ASCII")));
+ } else {
+ return super.getInputStream();
+ }
+ }
+
+}
Propchange:
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/HeadersBodyElement.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified:
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/MimeBodyElement.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/MimeBodyElement.java?rev=1160196&r1=1160195&r2=1160196&view=diff
==============================================================================
---
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/MimeBodyElement.java
(original)
+++
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/MimeBodyElement.java
Mon Aug 22 10:40:07 2011
@@ -22,14 +22,13 @@ import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
-import java.nio.ByteBuffer;
-import java.nio.channels.Channels;
-import java.nio.channels.WritableByteChannel;
+import java.nio.charset.Charset;
import java.util.Iterator;
import java.util.List;
import org.apache.james.imap.api.ImapConstants;
import org.apache.james.imap.message.response.FetchResponse.BodyElement;
+import org.apache.james.mailbox.MailboxException;
import org.apache.james.mailbox.MessageResult;
@@ -43,9 +42,10 @@ public class MimeBodyElement implements
protected final List<MessageResult.Header> headers;
protected long size;
+ private static final Charset US_ASCII = Charset.forName("US-ASCII");
- public MimeBodyElement(final String name, final List<MessageResult.Header>
headers) {
+ public MimeBodyElement(final String name, final List<MessageResult.Header>
headers) throws MailboxException {
super();
this.name = name;
this.headers = headers;
@@ -65,7 +65,7 @@ public class MimeBodyElement implements
}
- protected long calculateSize(List<MessageResult.Header> headers) {
+ protected long calculateSize(List<MessageResult.Header> headers) throws
MailboxException {
final int result;
if (headers.isEmpty()) {
result = 0;
@@ -90,39 +90,28 @@ public class MimeBodyElement implements
return size;
}
+
/*
* (non-Javadoc)
*
- * @see
- * org.apache.james.imap.message.response.FetchResponse.BodyElement#writeTo
- * (java.nio.channels.WritableByteChannel)
+ * @see org.apache.james.imap.message.response.FetchResponse.BodyElement#
+ * getInputStream()
*/
- public void writeTo(WritableByteChannel channel) throws IOException {
- ByteBuffer endLine =
ByteBuffer.wrap(ImapConstants.LINE_END.getBytes());
- endLine.rewind();
+ public InputStream getInputStream() throws IOException {
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+
for (final Iterator<MessageResult.Header> it = headers.iterator();
it.hasNext();) {
MessageResult.Header header = it.next();
- header.writeTo(channel);
- while (channel.write(endLine) > 0) { // NOPMD false positive
+ try {
+ out.write((header.getName() + ": " + header.getValue() +
ImapConstants.LINE_END).getBytes(US_ASCII));
+ } catch (MailboxException e) {
+ throw new IOException("Unable to read header", e);
}
- endLine.rewind();
}
// no empty line with CRLF for MIME headers. See IMAP-297
if (size > 0) {
- while (channel.write(endLine) > 0) { // NOPMD false positive
- }
+ out.write(ImapConstants.LINE_END.getBytes());
}
- }
-
- /*
- * (non-Javadoc)
- *
- * @see org.apache.james.imap.message.response.FetchResponse.BodyElement#
- * getInputStream()
- */
- public InputStream getInputStream() throws IOException {
- ByteArrayOutputStream out = new ByteArrayOutputStream();
- writeTo(Channels.newChannel(out));
return new ByteArrayInputStream(out.toByteArray());
}
Modified:
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/PartialFetchBodyElement.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/PartialFetchBodyElement.java?rev=1160196&r1=1160195&r2=1160196&view=diff
==============================================================================
---
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/PartialFetchBodyElement.java
(original)
+++
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/PartialFetchBodyElement.java
Mon Aug 22 10:40:07 2011
@@ -22,7 +22,6 @@ package org.apache.james.imap.processor.
import java.io.FilterInputStream;
import java.io.IOException;
import java.io.InputStream;
-import java.nio.channels.WritableByteChannel;
import org.apache.james.imap.message.response.FetchResponse.BodyElement;
@@ -59,7 +58,7 @@ final class PartialFetchBodyElement impl
* (non-Javadoc)
* @see org.apache.james.imap.message.response.Literal#size()
*/
- public long size() {
+ public long size() throws IOException {
final long size = delegate.size();
final long lastOctet = this.numberOfOctets + firstOctet;
final long result;
@@ -73,14 +72,6 @@ final class PartialFetchBodyElement impl
return result;
}
- /*
- * (non-Javadoc)
- * @see
org.apache.james.imap.message.response.Literal#writeTo(java.nio.channels.WritableByteChannel)
- */
- public void writeTo(WritableByteChannel channel) throws IOException {
- PartialWritableByteChannel partialChannel = new
PartialWritableByteChannel(channel, firstOctet, size());
- delegate.writeTo(partialChannel);
- }
/*
* (non-Javadoc)
@@ -159,15 +150,14 @@ final class PartialFetchBodyElement impl
if (pos >= length) {
return -1;
}
-
+ int readLimit;
if (pos + len >= length) {
- int readLimit = (int) length - (int) pos;
- pos = length;
-
- return super.read(b, off, readLimit);
+ readLimit = (int) length - (int) pos;
+ } else {
+ readLimit = len;
}
- int i = super.read(b, off, len);
+ int i = super.read(b, off, readLimit);
pos += i;
return i;
Modified:
james/imap/trunk/processor/src/test/java/org/apache/james/imap/processor/fetch/MessageResultUtilsTest.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/processor/src/test/java/org/apache/james/imap/processor/fetch/MessageResultUtilsTest.java?rev=1160196&r1=1160195&r2=1160196&view=diff
==============================================================================
---
james/imap/trunk/processor/src/test/java/org/apache/james/imap/processor/fetch/MessageResultUtilsTest.java
(original)
+++
james/imap/trunk/processor/src/test/java/org/apache/james/imap/processor/fetch/MessageResultUtilsTest.java
Mon Aug 22 10:40:07 2011
@@ -22,7 +22,7 @@ package org.apache.james.imap.processor.
import static org.junit.Assert.*;
import java.io.IOException;
-import java.nio.channels.WritableByteChannel;
+import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
@@ -66,10 +66,12 @@ public class MessageResultUtilsTest {
return value;
}
- public void writeTo(WritableByteChannel channel) throws IOException {
-
+ @Override
+ public InputStream getInputStream() throws IOException {
+ return null;
}
+
}
@Before
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]