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