You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by ba...@apache.org on 2008/07/15 11:01:18 UTC
svn commit: r676835 - in /james/mime4j/branches/streams-refactoring/src:
main/java/org/apache/james/mime4j/ test/java/org/apache/james/mime4j/
Author: bago
Date: Tue Jul 15 02:01:17 2008
New Revision: 676835
URL: http://svn.apache.org/viewvc?rev=676835&view=rev
Log:
Changed InputBuffer to extend FilterInputStream.
Made it a BufferingInputStream extension.
Altered the main MimeEntity code to work with a single InputBuffer instead of InputStream+InputBuffer (MIME4J-50)
Removed:
james/mime4j/branches/streams-refactoring/src/main/java/org/apache/james/mime4j/BasicBufferingInputStream.java
Modified:
james/mime4j/branches/streams-refactoring/src/main/java/org/apache/james/mime4j/BufferingInputStream.java
james/mime4j/branches/streams-refactoring/src/main/java/org/apache/james/mime4j/BufferingInputStreamAdaptor.java
james/mime4j/branches/streams-refactoring/src/main/java/org/apache/james/mime4j/InputBuffer.java
james/mime4j/branches/streams-refactoring/src/main/java/org/apache/james/mime4j/MimeBoundaryInputStream.java
james/mime4j/branches/streams-refactoring/src/main/java/org/apache/james/mime4j/MimeEntity.java
james/mime4j/branches/streams-refactoring/src/main/java/org/apache/james/mime4j/MimeTokenStream.java
james/mime4j/branches/streams-refactoring/src/test/java/org/apache/james/mime4j/BasicBufferingInputStreamTest.java
james/mime4j/branches/streams-refactoring/src/test/java/org/apache/james/mime4j/MimeEntityTest.java
Modified: james/mime4j/branches/streams-refactoring/src/main/java/org/apache/james/mime4j/BufferingInputStream.java
URL: http://svn.apache.org/viewvc/james/mime4j/branches/streams-refactoring/src/main/java/org/apache/james/mime4j/BufferingInputStream.java?rev=676835&r1=676834&r2=676835&view=diff
==============================================================================
--- james/mime4j/branches/streams-refactoring/src/main/java/org/apache/james/mime4j/BufferingInputStream.java (original)
+++ james/mime4j/branches/streams-refactoring/src/main/java/org/apache/james/mime4j/BufferingInputStream.java Tue Jul 15 02:01:17 2008
@@ -19,13 +19,18 @@
package org.apache.james.mime4j;
+import java.io.FilterInputStream;
import java.io.IOException;
import java.io.InputStream;
/**
* Input stream capable of reading lines of text.
*/
-public abstract class BufferingInputStream extends InputStream {
+public abstract class BufferingInputStream extends FilterInputStream {
+
+ protected BufferingInputStream(InputStream in) {
+ super(in);
+ }
/**
* Reads one line of text into the given {@link ByteArrayBuffer}.
Modified: james/mime4j/branches/streams-refactoring/src/main/java/org/apache/james/mime4j/BufferingInputStreamAdaptor.java
URL: http://svn.apache.org/viewvc/james/mime4j/branches/streams-refactoring/src/main/java/org/apache/james/mime4j/BufferingInputStreamAdaptor.java?rev=676835&r1=676834&r2=676835&view=diff
==============================================================================
--- james/mime4j/branches/streams-refactoring/src/main/java/org/apache/james/mime4j/BufferingInputStreamAdaptor.java (original)
+++ james/mime4j/branches/streams-refactoring/src/main/java/org/apache/james/mime4j/BufferingInputStreamAdaptor.java Tue Jul 15 02:01:17 2008
@@ -31,14 +31,12 @@
*/
class BufferingInputStreamAdaptor extends BufferingInputStream {
- private final InputStream is;
private final BufferingInputStream bis;
private boolean used = false;
private boolean eof = false;
public BufferingInputStreamAdaptor(final InputStream is) {
- super();
- this.is = is;
+ super(is);
if (is instanceof BufferingInputStream) {
this.bis = (BufferingInputStream) is;
} else {
@@ -47,14 +45,14 @@
}
public int read() throws IOException {
- int i = this.is.read();
+ int i = in.read();
this.eof = i == -1;
this.used = true;
return i;
}
public int read(byte[] b, int off, int len) throws IOException {
- int i = this.is.read(b, off, len);
+ int i = in.read(b, off, len);
this.eof = i == -1;
this.used = true;
return i;
@@ -75,7 +73,7 @@
private int doReadLine(final ByteArrayBuffer dst) throws IOException {
int total = 0;
int ch;
- while ((ch = this.is.read()) != -1) {
+ while ((ch = in.read()) != -1) {
dst.append(ch);
total++;
if (ch == '\n') {
Modified: james/mime4j/branches/streams-refactoring/src/main/java/org/apache/james/mime4j/InputBuffer.java
URL: http://svn.apache.org/viewvc/james/mime4j/branches/streams-refactoring/src/main/java/org/apache/james/mime4j/InputBuffer.java?rev=676835&r1=676834&r2=676835&view=diff
==============================================================================
--- james/mime4j/branches/streams-refactoring/src/main/java/org/apache/james/mime4j/InputBuffer.java (original)
+++ james/mime4j/branches/streams-refactoring/src/main/java/org/apache/james/mime4j/InputBuffer.java Tue Jul 15 02:01:17 2008
@@ -26,23 +26,21 @@
* Input buffer that can be used to search for patterns using Quick Search
* algorithm in data read from an {@link InputStream}.
*/
-public class InputBuffer {
+public class InputBuffer extends BufferingInputStream {
- private final InputStream instream;
private final byte[] buffer;
private int bufpos;
private int buflen;
public InputBuffer(final InputStream instream, int buffersize) {
- super();
+ super(instream);
if (instream == null) {
throw new IllegalArgumentException("Input stream may not be null");
}
if (buffersize <= 0) {
throw new IllegalArgumentException("Buffer size may not be negative or zero");
}
- this.instream = instream;
this.buffer = new byte[buffersize];
this.bufpos = 0;
this.buflen = 0;
@@ -61,7 +59,7 @@
int l;
int off = this.buflen;
int len = this.buffer.length - off;
- l = this.instream.read(this.buffer, off, len);
+ l = in.read(this.buffer, off, len);
if (l == -1) {
return -1;
} else {
@@ -74,10 +72,6 @@
return this.bufpos < this.buflen;
}
- public void closeStream() throws IOException {
- this.instream.close();
- }
-
public int read() throws IOException {
int noRead = 0;
while (!hasBufferedData()) {
@@ -116,6 +110,46 @@
return read(b, 0, b.length);
}
+ public boolean markSupported() {
+ return false;
+ }
+
+
+ public int readLine(final ByteArrayBuffer linebuf) throws IOException {
+ if (linebuf == null) {
+ throw new IllegalArgumentException("Buffer may not be null");
+ }
+ int total = 0;
+ boolean found = false;
+ int bytesRead = 0;
+ while (!found) {
+ if (!hasBufferedData()) {
+ bytesRead = fillBuffer();
+ if (bytesRead == -1) {
+ break;
+ }
+ }
+ int i = indexOf((byte)'\n');
+ int chunk;
+ if (i != -1) {
+ found = true;
+ chunk = i + 1 - pos();
+ } else {
+ chunk = length();
+ }
+ if (chunk > 0) {
+ linebuf.append(buf(), pos(), chunk);
+ skip(chunk);
+ total += chunk;
+ }
+ }
+ if (total == 0 && bytesRead == -1) {
+ return -1;
+ } else {
+ return total;
+ }
+ }
+
/**
* Implements quick search algorithm as published by
* <p>
@@ -245,5 +279,8 @@
buffer.append("]");
return buffer.toString();
}
+
+ public void reset() {
+ }
}
Modified: james/mime4j/branches/streams-refactoring/src/main/java/org/apache/james/mime4j/MimeBoundaryInputStream.java
URL: http://svn.apache.org/viewvc/james/mime4j/branches/streams-refactoring/src/main/java/org/apache/james/mime4j/MimeBoundaryInputStream.java?rev=676835&r1=676834&r2=676835&view=diff
==============================================================================
--- james/mime4j/branches/streams-refactoring/src/main/java/org/apache/james/mime4j/MimeBoundaryInputStream.java (original)
+++ james/mime4j/branches/streams-refactoring/src/main/java/org/apache/james/mime4j/MimeBoundaryInputStream.java Tue Jul 15 02:01:17 2008
@@ -30,15 +30,16 @@
*/
public class MimeBoundaryInputStream extends BufferingInputStream {
- private final InputBuffer buffer;
- private final byte[] boundary;
+ private final byte[] boundary;
private boolean eof;
private int limit;
private boolean atBoundary;
private int boundaryLen;
private boolean lastPart;
- private boolean completed;
+ private boolean completed;
+
+ private InputBuffer buffer;
/**
* Creates a new MimeBoundaryInputStream.
@@ -47,13 +48,14 @@
*/
public MimeBoundaryInputStream(InputBuffer inbuffer, String boundary)
throws IOException {
- this.buffer = inbuffer;
+ super(inbuffer);
+ this.buffer = (InputBuffer) in;
this.eof = false;
this.limit = -1;
this.atBoundary = false;
this.boundaryLen = 0;
this.lastPart = false;
- this.completed = false;
+ this.completed = false;
this.boundary = new byte[boundary.length() + 2];
this.boundary[0] = (byte) '-';
@@ -90,7 +92,7 @@
if (completed) {
return -1;
}
- if (endOfStream() && !hasData()) {
+ if (endOfStream() && !hasData()) {
skipBoundary();
return -1;
}
@@ -184,12 +186,12 @@
return limit > buffer.pos() && limit < buffer.limit();
}
- private int fillBuffer() throws IOException {
+ private int fillBuffer() throws IOException {
if (eof) {
return -1;
}
int bytesRead;
- if (!hasData()) {
+ if (!hasData()) {
bytesRead = buffer.fillBuffer();
} else {
bytesRead = 0;
@@ -229,7 +231,7 @@
}
}
- private void skipBoundary() throws IOException {
+ private void skipBoundary() throws IOException {
if (!completed) {
completed = true;
buffer.skip(boundaryLen);
@@ -237,11 +239,11 @@
if (buffer.length() > 1) {
int ch1 = buffer.charAt(buffer.pos());
int ch2 = buffer.charAt(buffer.pos() + 1);
- if (ch1 == '-' && ch2 == '-') {
+ if (ch1 == '-' && ch2 == '-') {
this.lastPart = true;
buffer.skip(2);
}
- skipLineDelimiter();
+ skipLineDelimiter();
break;
} else {
fillBuffer();
@@ -284,5 +286,5 @@
buffer.append((char) boundary[i]);
}
return buffer.toString();
- }
+ }
}
Modified: james/mime4j/branches/streams-refactoring/src/main/java/org/apache/james/mime4j/MimeEntity.java
URL: http://svn.apache.org/viewvc/james/mime4j/branches/streams-refactoring/src/main/java/org/apache/james/mime4j/MimeEntity.java?rev=676835&r1=676834&r2=676835&view=diff
==============================================================================
--- james/mime4j/branches/streams-refactoring/src/main/java/org/apache/james/mime4j/MimeEntity.java (original)
+++ james/mime4j/branches/streams-refactoring/src/main/java/org/apache/james/mime4j/MimeEntity.java Tue Jul 15 02:01:17 2008
@@ -19,7 +19,6 @@
private static final int T_IN_MESSAGE = -3;
private final RootInputStream rootStream;
- private final InputStream rawStream;
private final InputBuffer inbuffer;
private int recursionMode;
@@ -31,7 +30,6 @@
public MimeEntity(
RootInputStream rootStream,
- InputStream rawStream,
InputBuffer inbuffer,
BodyDescriptor parent,
int startState,
@@ -41,19 +39,17 @@
super(parent, startState, endState, maximalBodyDescriptor, strictParsing);
this.rootStream = rootStream;
this.inbuffer = inbuffer;
- this.rawStream = rawStream;
- this.dataStream = new BufferingInputStreamAdaptor(rawStream);
+ this.dataStream = new BufferingInputStreamAdaptor(inbuffer);
this.skipHeader = false;
}
public MimeEntity(
RootInputStream rootStream,
- InputStream rawStream,
InputBuffer inbuffer,
BodyDescriptor parent,
int startState,
int endState) {
- this(rootStream, rawStream, inbuffer, parent, startState, endState, false, false);
+ this(rootStream, inbuffer, parent, startState, endState, false, false);
}
public int getRecursionMode() {
@@ -168,14 +164,12 @@
dataStream = new BufferingInputStreamAdaptor(mimeStream);
// If multipart message is embedded into another multipart message
// make sure to reset parent's mime stream
- if (rawStream instanceof BufferingInputStream) {
- ((BufferingInputStream) rawStream).reset();
- }
+ inbuffer.reset();
}
private void clearMimeStream() {
mimeStream = null;
- dataStream = new BufferingInputStreamAdaptor(rawStream);
+ dataStream = new BufferingInputStreamAdaptor(inbuffer);
}
private void advanceToBoundary() throws IOException {
@@ -191,18 +185,14 @@
private EntityStateMachine nextMessage() {
String transferEncoding = body.getTransferEncoding();
InputStream instream;
- InputBuffer buffer;
if (MimeUtil.isBase64Encoding(transferEncoding)) {
log.debug("base64 encoded message/rfc822 detected");
instream = new Base64InputStream(dataStream);
- buffer = new InputBuffer(instream, 4 * 1024);
} else if (MimeUtil.isQuotedPrintableEncoded(transferEncoding)) {
log.debug("quoted-printable encoded message/rfc822 detected");
instream = new QuotedPrintableInputStream(dataStream);
- buffer = new InputBuffer(instream, 4 * 1024);
} else {
instream = dataStream;
- buffer = inbuffer;
}
if (recursionMode == RecursionMode.M_RAW) {
@@ -211,8 +201,7 @@
} else {
MimeEntity message = new MimeEntity(
rootStream,
- instream,
- buffer,
+ new InputBuffer(instream, 4 * 1024),
body,
EntityStates.T_START_MESSAGE,
EntityStates.T_END_MESSAGE,
@@ -228,10 +217,10 @@
RawEntity message = new RawEntity(mimeStream);
return message;
} else {
+ InputBuffer stream = new InputBuffer(mimeStream, 4 * 1024);
MimeEntity mimeentity = new MimeEntity(
rootStream,
- mimeStream,
- inbuffer,
+ stream,
body,
EntityStates.T_START_BODYPART,
EntityStates.T_END_BODYPART,
Modified: james/mime4j/branches/streams-refactoring/src/main/java/org/apache/james/mime4j/MimeTokenStream.java
URL: http://svn.apache.org/viewvc/james/mime4j/branches/streams-refactoring/src/main/java/org/apache/james/mime4j/MimeTokenStream.java?rev=676835&r1=676834&r2=676835&view=diff
==============================================================================
--- james/mime4j/branches/streams-refactoring/src/main/java/org/apache/james/mime4j/MimeTokenStream.java (original)
+++ james/mime4j/branches/streams-refactoring/src/main/java/org/apache/james/mime4j/MimeTokenStream.java Tue Jul 15 02:01:17 2008
@@ -147,7 +147,7 @@
inbuffer = new InputBuffer(rootInputStream, 4 * 1024);
switch (recursionMode) {
case M_RAW:
- RawEntity rawentity = new RawEntity(new BasicBufferingInputStream(inbuffer));
+ RawEntity rawentity = new RawEntity(inbuffer);
currentStateMachine = rawentity;
break;
case M_NO_RECURSE:
@@ -156,7 +156,6 @@
case M_RECURSE:
MimeEntity mimeentity = new MimeEntity(
rootInputStream,
- new BasicBufferingInputStream(inbuffer),
inbuffer,
null,
T_START_MESSAGE,
Modified: james/mime4j/branches/streams-refactoring/src/test/java/org/apache/james/mime4j/BasicBufferingInputStreamTest.java
URL: http://svn.apache.org/viewvc/james/mime4j/branches/streams-refactoring/src/test/java/org/apache/james/mime4j/BasicBufferingInputStreamTest.java?rev=676835&r1=676834&r2=676835&view=diff
==============================================================================
--- james/mime4j/branches/streams-refactoring/src/test/java/org/apache/james/mime4j/BasicBufferingInputStreamTest.java (original)
+++ james/mime4j/branches/streams-refactoring/src/test/java/org/apache/james/mime4j/BasicBufferingInputStreamTest.java Tue Jul 15 02:01:17 2008
@@ -29,9 +29,7 @@
public void testBasicOperations() throws Exception {
String text = "ah blahblah";
byte[] b1 = text.getBytes("US-ASCII");
- InputBuffer inbuffer = new InputBuffer(new ByteArrayInputStream(b1), 4096);
-
- BasicBufferingInputStream instream = new BasicBufferingInputStream(inbuffer);
+ InputBuffer instream = new InputBuffer(new ByteArrayInputStream(b1), 4096);
assertEquals((byte)'a', instream.read());
assertEquals((byte)'h', instream.read());
@@ -69,8 +67,7 @@
}
byte[] raw = outstream.toByteArray();
- InputBuffer inbuffer = new InputBuffer(new ByteArrayInputStream(raw), 16);
- BasicBufferingInputStream instream = new BasicBufferingInputStream(inbuffer);
+ InputBuffer instream = new InputBuffer(new ByteArrayInputStream(raw), 16);
ByteArrayBuffer linebuf = new ByteArrayBuffer(8);
for (int i = 0; i < teststrs.length; i++) {
@@ -88,8 +85,7 @@
String teststr = "\n\n\r\n\r\r\n\n\n\n\n\n";
byte[] raw = teststr.getBytes("US-ASCII");
- InputBuffer inbuffer = new InputBuffer(new ByteArrayInputStream(raw), 4);
- BufferingInputStream instream = new BasicBufferingInputStream(inbuffer);
+ BufferingInputStream instream = new InputBuffer(new ByteArrayInputStream(raw), 4);
ByteArrayBuffer linebuf = new ByteArrayBuffer(8);
linebuf.clear();
Modified: james/mime4j/branches/streams-refactoring/src/test/java/org/apache/james/mime4j/MimeEntityTest.java
URL: http://svn.apache.org/viewvc/james/mime4j/branches/streams-refactoring/src/test/java/org/apache/james/mime4j/MimeEntityTest.java?rev=676835&r1=676834&r2=676835&view=diff
==============================================================================
--- james/mime4j/branches/streams-refactoring/src/test/java/org/apache/james/mime4j/MimeEntityTest.java (original)
+++ james/mime4j/branches/streams-refactoring/src/test/java/org/apache/james/mime4j/MimeEntityTest.java Tue Jul 15 02:01:17 2008
@@ -39,13 +39,11 @@
byte[] raw = message.getBytes("US-ASCII");
ByteArrayInputStream instream = new ByteArrayInputStream(raw);
RootInputStream rootStream = new RootInputStream(instream);
- InputBuffer inbuffer = new InputBuffer(rootStream, 12);
- BasicBufferingInputStream rawstream = new BasicBufferingInputStream(inbuffer);
+ InputBuffer rawstream = new InputBuffer(rootStream, 12);
MimeEntity entity = new MimeEntity(
rootStream,
rawstream,
- inbuffer,
null,
EntityStates.T_START_MESSAGE,
EntityStates.T_END_MESSAGE);
@@ -128,13 +126,11 @@
byte[] raw = message.getBytes("US-ASCII");
ByteArrayInputStream instream = new ByteArrayInputStream(raw);
RootInputStream rootStream = new RootInputStream(instream);
- InputBuffer inbuffer = new InputBuffer(rootStream, 24);
- BasicBufferingInputStream rawstream = new BasicBufferingInputStream(inbuffer);
+ InputBuffer rawstream = new InputBuffer(rootStream, 24);
MimeEntity entity = new MimeEntity(
rootStream,
rawstream,
- inbuffer,
null,
EntityStates.T_START_MESSAGE,
EntityStates.T_END_MESSAGE);
@@ -243,13 +239,11 @@
byte[] raw = message.getBytes("US-ASCII");
ByteArrayInputStream instream = new ByteArrayInputStream(raw);
RootInputStream rootStream = new RootInputStream(instream);
- InputBuffer inbuffer = new InputBuffer(rootStream, 24);
- BasicBufferingInputStream rawstream = new BasicBufferingInputStream(inbuffer);
+ InputBuffer rawstream = new InputBuffer(rootStream, 24);
MimeEntity entity = new MimeEntity(
rootStream,
rawstream,
- inbuffer,
null,
EntityStates.T_START_MESSAGE,
EntityStates.T_END_MESSAGE);
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org