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 no...@apache.org on 2011/06/15 22:24:11 UTC

svn commit: r1136175 [1/2] - in /james/mailbox/trunk: jcr/src/main/java/org/apache/james/mailbox/jcr/ jcr/src/main/java/org/apache/james/mailbox/jcr/mail/model/ jcr/src/main/resources/org/apache/james/mailbox/jcr/ jpa/src/main/java/org/apache/james/mai...

Author: norman
Date: Wed Jun 15 20:24:10 2011
New Revision: 1136175

URL: http://svn.apache.org/viewvc?rev=1136175&view=rev
Log:
Remove the Header model class and just return an InputStream which holds the header. See MAILBOX-90

Removed:
    james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/model/JCRHeader.java
    james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/JPAHeader.java
    james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirHeader.java
    james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/model/SimpleHeader.java
    james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/model/AbstractComparableHeader.java
    james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/model/Header.java
    james/mailbox/trunk/store/src/test/java/org/apache/james/mailbox/store/SimpleHeader.java
Modified:
    james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMessageManager.java
    james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/model/JCRMessage.java
    james/mailbox/trunk/jcr/src/main/resources/org/apache/james/mailbox/jcr/imap.cnd
    james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMessageManager.java
    james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMessage.java
    james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAMessage.java
    james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAStreamingMessage.java
    james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMessageManager.java
    james/mailbox/trunk/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAMailboxManagerTest.java
    james/mailbox/trunk/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAStressTest.java
    james/mailbox/trunk/jpa/src/test/java/org/apache/james/mailbox/jpa/JPASubscriptionManagerTest.java
    james/mailbox/trunk/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java
    james/mailbox/trunk/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndexTest.java
    james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java
    james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMessageManager.java
    james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java
    james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/LazyLoadingMaildirMessage.java
    james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMessage.java
    james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryStoreMessageManager.java
    james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/model/SimpleMailboxMembership.java
    james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/ResultHeader.java
    james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/ResultUtils.java
    james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
    james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/model/Message.java
    james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java
    james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/search/comparator/AbstractHeaderComparator.java
    james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/streaming/InputStreamContent.java
    james/mailbox/trunk/store/src/test/java/org/apache/james/mailbox/store/MessageBuilder.java
    james/mailbox/trunk/store/src/test/java/org/apache/james/mailbox/store/SimpleMailboxMembership.java

Modified: james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMessageManager.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMessageManager.java?rev=1136175&r1=1136174&r2=1136175&view=diff
==============================================================================
--- james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMessageManager.java (original)
+++ james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMessageManager.java Wed Jun 15 20:24:10 2011
@@ -19,21 +19,17 @@
 package org.apache.james.mailbox.jcr;
 
 import java.io.InputStream;
-import java.util.ArrayList;
 import java.util.Date;
-import java.util.List;
 
 import javax.mail.Flags;
 
 import org.apache.james.mailbox.MailboxException;
 import org.apache.james.mailbox.MailboxSession;
-import org.apache.james.mailbox.jcr.mail.model.JCRHeader;
 import org.apache.james.mailbox.jcr.mail.model.JCRMailbox;
 import org.apache.james.mailbox.jcr.mail.model.JCRMessage;
 import org.apache.james.mailbox.store.MailboxEventDispatcher;
 import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
 import org.apache.james.mailbox.store.StoreMessageManager;
-import org.apache.james.mailbox.store.mail.model.Header;
 import org.apache.james.mailbox.store.mail.model.Message;
 import org.apache.james.mailbox.store.mail.model.PropertyBuilder;
 import org.apache.james.mailbox.store.search.MessageSearchIndex;
@@ -53,19 +49,12 @@ public class JCRMessageManager extends S
         this.log = log;
     }
 
-    @Override
-    protected Header createHeader(int lineNumber, String name, String value) {
-        return new JCRHeader(lineNumber, name, value, log);
-    }
 
     @Override
-    protected Message<String> createMessage(Date internalDate, int size, int bodyStartOctet, InputStream document, Flags flags, List<Header> headers, PropertyBuilder propertyBuilder) throws MailboxException{
-        final List<JCRHeader> jcrHeaders = new ArrayList<JCRHeader>(headers.size());
-        for (Header header: headers) {
-            jcrHeaders.add((JCRHeader) header);
-        }
+    protected Message<String> createMessage(Date internalDate, int size, int bodyStartOctet, InputStream header, InputStream body, Flags flags, PropertyBuilder propertyBuilder) throws MailboxException{
+      
         final Message<String> message = new JCRMessage(getMailboxEntity().getMailboxId(), internalDate, 
-                size, flags, document, bodyStartOctet, jcrHeaders, propertyBuilder, log);
+                size, flags, header, body, bodyStartOctet, propertyBuilder, log);
         return message;
     }
 

Modified: james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/model/JCRMessage.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/model/JCRMessage.java?rev=1136175&r1=1136174&r2=1136175&view=diff
==============================================================================
--- james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/model/JCRMessage.java (original)
+++ james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/model/JCRMessage.java Wed Jun 15 20:24:10 2011
@@ -33,13 +33,14 @@ import javax.jcr.RepositoryException;
 import javax.mail.Flags;
 
 import org.apache.commons.io.IOUtils;
+import org.apache.commons.io.input.BoundedInputStream;
 import org.apache.jackrabbit.JcrConstants;
 import org.apache.jackrabbit.commons.JcrUtils;
 import org.apache.james.mailbox.MailboxException;
 import org.apache.james.mailbox.jcr.JCRImapConstants;
 import org.apache.james.mailbox.jcr.Persistent;
+import org.apache.james.mailbox.store.ResultUtils;
 import org.apache.james.mailbox.store.mail.model.AbstractMessage;
-import org.apache.james.mailbox.store.mail.model.Header;
 import org.apache.james.mailbox.store.mail.model.Message;
 import org.apache.james.mailbox.store.mail.model.Property;
 import org.apache.james.mailbox.store.mail.model.PropertyBuilder;
@@ -55,7 +56,6 @@ public class JCRMessage extends Abstract
     private Node node;
     private final Logger logger;
     private InputStream content;
-    private List<JCRHeader> headers;
     private String mediaType;
     private Long textualLineCount;
     private String subType;
@@ -103,19 +103,17 @@ public class JCRMessage extends Abstract
         this.node = node;
     }
     
-    public JCRMessage(String mailboxUUID, Date internalDate, int size, Flags flags, InputStream content,
-            int bodyStartOctet, final List<JCRHeader> headers,
-            final PropertyBuilder propertyBuilder, Logger logger) {
+    public JCRMessage(String mailboxUUID, Date internalDate, int size, Flags flags, InputStream header, InputStream body,
+            int bodyStartOctet,  final PropertyBuilder propertyBuilder, Logger logger) {
         super();
         this.mailboxUUID = mailboxUUID;
         this.internalDate = internalDate;
         this.size = size;
         this.logger = logger;
         setFlags(flags);
-        this.content = content;
+        this.content = ResultUtils.toInput(header, body);
        
         this.bodyStartOctet = bodyStartOctet;
-        this.headers = new ArrayList<JCRHeader>(headers);
         this.textualLineCount = propertyBuilder.getTextualLineCount();
         this.mediaType = propertyBuilder.getMediaType();
         this.subType = propertyBuilder.getSubType();
@@ -144,19 +142,13 @@ public class JCRMessage extends Abstract
         this.modSeq = modSeq;
         this.logger = logger;
         try {
-            this.content = new ByteArrayInputStream(IOUtils.toByteArray(message.getFullContent()));
+            this.content = new ByteArrayInputStream(IOUtils.toByteArray(ResultUtils.toInput(message)));
         } catch (IOException e) {
             throw new MailboxException("Unable to parse message",e);
         }
        
         this.bodyStartOctet = (int) (message.getFullContentOctets() - message.getBodyOctets());
-        this.headers = new ArrayList<JCRHeader>();
-
-        List<Header> originalHeaders = message.getHeaders();
-        for (int i = 0; i < originalHeaders.size(); i++) {
-            headers.add(new JCRHeader(originalHeaders.get(i),logger));
-        }
-
+        
         PropertyBuilder pBuilder = new PropertyBuilder(message.getProperties());
         this.textualLineCount = message.getTextualLineCount();
         this.mediaType = message.getMediaType();
@@ -188,26 +180,6 @@ public class JCRMessage extends Abstract
 
     /*
      * (non-Javadoc)
-     * @see org.apache.james.mailbox.store.mail.model.Document#getHeaders()
-     */
-    public List<Header> getHeaders() {
-        if (isPersistent()) {
-            try {
-                List<Header> headers = new ArrayList<Header>();
-                NodeIterator nodeIt = node.getNodes("messageHeader");
-                while (nodeIt.hasNext()) {
-                    headers.add(new JCRHeader(nodeIt.nextNode(), logger));
-                }
-                return headers;
-            } catch (RepositoryException e) {
-                logger.error("Unable to retrieve nodes messageHeader", e);
-            }
-        }
-        return new ArrayList<Header>(headers);
-    }
-
-    /*
-     * (non-Javadoc)
      * @see org.apache.james.mailbox.store.mail.model.Document#getMediaType()
      */
     public String getMediaType() {
@@ -348,26 +320,6 @@ public class JCRMessage extends Abstract
             node.setProperty(SUBTYPE_PROPERTY, getSubType());
             node.setProperty(BODY_START_OCTET_PROPERTY, getBodyStartOctet());
 
-            // copy the headers and store them in memory as pure pojos
-            List<Header> currentHeaders = getHeaders();
-            List<Header> newHeaders = new ArrayList<Header>();
-            for (int i = 0; i < currentHeaders.size(); i++) {
-                newHeaders.add(new JCRHeader(currentHeaders.get(i), logger));
-            }
-
-            NodeIterator iterator = node.getNodes("messageHeader");
-            // remove old headers
-            while (iterator.hasNext()) {
-                iterator.nextNode().remove();
-            }
-
-            // add headers to the message again
-            for (int i = 0; i < newHeaders.size(); i++) {
-                JCRHeader header = (JCRHeader) newHeaders.get(i);
-                Node headerNode = node.addNode("messageHeader", "nt:unstructured");
-                headerNode.addMixin(HEADER_NODE_TYPE);
-                header.merge(headerNode);
-            }
 
             List<Property> currentProperties = getProperties();
             List<Property> newProperites = new ArrayList<Property>();
@@ -376,7 +328,7 @@ public class JCRMessage extends Abstract
                 newProperites.add(new JCRProperty(prop, i, logger));
             }
             // remove old properties, we will add a bunch of new ones
-            iterator = node.getNodes("messageProperty");
+            NodeIterator iterator = node.getNodes("messageProperty");
             while (iterator.hasNext()) {
                 iterator.nextNode().remove();
             }
@@ -727,11 +679,8 @@ public class JCRMessage extends Abstract
         return retValue;
     }
 
-    /*
-     * (non-Javadoc)
-     * @see org.apache.james.mailbox.store.mail.model.Message#getFullContent()
-     */
-    public InputStream getFullContent() throws IOException {
+
+    protected InputStream getFullContent() throws IOException {
         if (isPersistent()) {
             try {
                 //TODO: Maybe we should cache this somehow...
@@ -800,4 +749,12 @@ public class JCRMessage extends Abstract
             this.uid = uid;
         }          
     }
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.mailbox.store.mail.model.Message#getHeaderContent()
+     */
+    public InputStream getHeaderContent() throws IOException {
+        return new BoundedInputStream(getFullContent(), getBodyStartOctet() - 2);
+    }
 }

Modified: james/mailbox/trunk/jcr/src/main/resources/org/apache/james/mailbox/jcr/imap.cnd
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/jcr/src/main/resources/org/apache/james/mailbox/jcr/imap.cnd?rev=1136175&r1=1136174&r2=1136175&view=diff
==============================================================================
--- james/mailbox/trunk/jcr/src/main/resources/org/apache/james/mailbox/jcr/imap.cnd (original)
+++ james/mailbox/trunk/jcr/src/main/resources/org/apache/james/mailbox/jcr/imap.cnd Wed Jun 15 20:24:10 2011
@@ -23,13 +23,6 @@
     - jamesMailbox:subscriptionMailboxes (STRING) multiple
     + * (nt:unstructured) multiple
     
-
-[jamesMailbox:messageHeader] > mix:created, mix:lockable
-    mixin
-    - jamesMailbox:headerFieldName (STRING) mandatory
-    - jamesMailbox:headerValue(STRING) mandatory
-    - jamesMailbox:headerLineNumber (LONG) mandatory
-
 [jamesMailbox:messageProperty] > mix:created
     mixin
     - jamesMailbox:propertyNamespace (STRING) mandatory
@@ -54,7 +47,6 @@
     - jamesMailbox:messageBodyStartOctet (LONG) mandatory
     - jamesMailbox:messageTextualLineCount (LONG)
     - jamesMailbox:messageSubType (String) mandatory
-    + messageHeader (nt:unstructured)  multiple
     + messageProperty (nt:unstructured) multiple
 
 [jamesMailbox:mailbox] >  mix:referenceable, mix:lockable, mix:created
@@ -66,5 +58,4 @@
     - jamesMailbox:mailboxUser (STRING) 
     - jamesMailbox:mailboxLastKnownUid (LONG) 
     - jamesMailbox:mailboxHighestKnownModSeq (LONG) 
-
     + * (nt:unstructured) multiple

Modified: james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMessageManager.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMessageManager.java?rev=1136175&r1=1136174&r2=1136175&view=diff
==============================================================================
--- james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMessageManager.java (original)
+++ james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMessageManager.java Wed Jun 15 20:24:10 2011
@@ -19,21 +19,17 @@
 package org.apache.james.mailbox.jpa;
 
 import java.io.InputStream;
-import java.util.ArrayList;
 import java.util.Date;
-import java.util.List;
 
 import javax.mail.Flags;
 
 import org.apache.james.mailbox.MailboxException;
 import org.apache.james.mailbox.MailboxSession;
-import org.apache.james.mailbox.jpa.mail.model.JPAHeader;
 import org.apache.james.mailbox.jpa.mail.model.JPAMailbox;
 import org.apache.james.mailbox.jpa.mail.model.openjpa.JPAMessage;
 import org.apache.james.mailbox.store.MailboxEventDispatcher;
 import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
 import org.apache.james.mailbox.store.StoreMessageManager;
-import org.apache.james.mailbox.store.mail.model.Header;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.store.mail.model.Message;
 import org.apache.james.mailbox.store.mail.model.PropertyBuilder;
@@ -49,21 +45,13 @@ public class JPAMessageManager extends S
     }
     
     @Override
-    protected Message<Long> createMessage(Date internalDate, final int size, int bodyStartOctet, final InputStream document, 
-            final Flags flags, final List<Header> headers, PropertyBuilder propertyBuilder) throws MailboxException{
-        final List<JPAHeader> jpaHeaders = new ArrayList<JPAHeader>(headers.size());
-        for (Header header: headers) {
-            jpaHeaders.add((JPAHeader) header);
-        }
-        final Message<Long> message = new JPAMessage((JPAMailbox) getMailboxEntity(), internalDate, size, flags, document, bodyStartOctet, jpaHeaders, propertyBuilder);
+    protected Message<Long> createMessage(Date internalDate, final int size, int bodyStartOctet, final InputStream header, final InputStream body, 
+            final Flags flags, PropertyBuilder propertyBuilder) throws MailboxException{
+       
+        final Message<Long> message = new JPAMessage((JPAMailbox) getMailboxEntity(), internalDate, size, flags, header, body,  bodyStartOctet,  propertyBuilder);
         return message;
     }
-    
-    @Override
-    protected Header createHeader(int lineNumber, String name, String value) {
-        final Header header = new JPAHeader(lineNumber, name, value);
-        return header;
-    }
+
 
     /**
      * Support user flags

Modified: james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMessage.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMessage.java?rev=1136175&r1=1136174&r2=1136175&view=diff
==============================================================================
--- james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMessage.java (original)
+++ james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMessage.java Wed Jun 15 20:24:10 2011
@@ -38,12 +38,10 @@ import javax.persistence.OneToMany;
 import javax.persistence.OrderBy;
 
 import org.apache.james.mailbox.MailboxException;
-import org.apache.james.mailbox.jpa.mail.model.JPAHeader;
 import org.apache.james.mailbox.jpa.mail.model.JPAMailbox;
 import org.apache.james.mailbox.jpa.mail.model.JPAProperty;
 import org.apache.james.mailbox.jpa.mail.model.JPAUserFlag;
 import org.apache.james.mailbox.store.mail.model.AbstractMessage;
-import org.apache.james.mailbox.store.mail.model.Header;
 import org.apache.james.mailbox.store.mail.model.Message;
 import org.apache.james.mailbox.store.mail.model.Property;
 import org.apache.james.mailbox.store.mail.model.PropertyBuilder;
@@ -231,12 +229,6 @@ public abstract class AbstractJPAMessage
     @Column(name = "MAIL_TEXTUAL_LINE_COUNT", nullable = true)
     private Long textualLineCount;
     
-    /** Headers for this message */
-    @OneToMany(cascade = CascadeType.ALL, fetch=FetchType.LAZY)
-    @OrderBy("lineNumber")
-    @ElementJoinColumns({@ElementJoinColumn(name="MAILBOX_ID", referencedColumnName="MAILBOX_ID"),
-    @ElementJoinColumn(name="MAIL_UID", referencedColumnName="MAIL_UID")})
-    private List<JPAHeader> headers;
 
     /** Meta data for this message */
     @OneToMany(cascade = CascadeType.ALL, fetch=FetchType.LAZY)
@@ -254,7 +246,7 @@ public abstract class AbstractJPAMessage
     @Deprecated
     public AbstractJPAMessage() {}
 
-    public AbstractJPAMessage(JPAMailbox mailbox, Date internalDate, Flags flags, final long contentOctets, final int bodyStartOctet, final List<JPAHeader> headers, final PropertyBuilder propertyBuilder) {
+    public AbstractJPAMessage(JPAMailbox mailbox, Date internalDate, Flags flags, final long contentOctets, final int bodyStartOctet, final PropertyBuilder propertyBuilder) {
         super();
         this.mailbox = mailbox;
         this.internalDate = internalDate;
@@ -263,7 +255,6 @@ public abstract class AbstractJPAMessage
         setFlags(flags);        
         this.contentOctets = contentOctets;
         this.bodyStartOctet = bodyStartOctet;
-        this.headers = new ArrayList<JPAHeader>(headers);
         this.textualLineCount = propertyBuilder.getTextualLineCount();
         this.mediaType = propertyBuilder.getMediaType();
         this.subType = propertyBuilder.getSubType();
@@ -298,12 +289,8 @@ public abstract class AbstractJPAMessage
 
         this.contentOctets = original.getFullContentOctets();
         this.bodyStartOctet = (int) (original.getFullContentOctets() - original.getBodyOctets());
-        this.headers = new ArrayList<JPAHeader>();
         this.internalDate = original.getInternalDate();
-        List<Header> originalHeaders = original.getHeaders();
-        for (int i = 0; i < originalHeaders.size(); i++) {
-            headers.add(new JPAHeader(originalHeaders.get(i)));
-        }
+
 
         PropertyBuilder pBuilder = new PropertyBuilder(original.getProperties());
         this.textualLineCount = original.getTextualLineCount();
@@ -317,14 +304,6 @@ public abstract class AbstractJPAMessage
         }
     }
 
-
-    /**
-     * @see org.apache.james.mailbox.store.mail.model.Message#getHeaders()
-     */
-    public List<Header> getHeaders() {
-        return new ArrayList<Header>(headers);
-    }
-
     @Override
     public int hashCode() {
         final int PRIME = 31;

Modified: james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAMessage.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAMessage.java?rev=1136175&r1=1136174&r2=1136175&view=diff
==============================================================================
--- james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAMessage.java (original)
+++ james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAMessage.java Wed Jun 15 20:24:10 2011
@@ -22,7 +22,6 @@ import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.Date;
-import java.util.List;
 
 import javax.mail.Flags;
 import javax.persistence.Basic;
@@ -34,7 +33,6 @@ import javax.persistence.Table;
 
 import org.apache.commons.io.IOUtils;
 import org.apache.james.mailbox.MailboxException;
-import org.apache.james.mailbox.jpa.mail.model.JPAHeader;
 import org.apache.james.mailbox.jpa.mail.model.JPAMailbox;
 import org.apache.james.mailbox.store.mail.model.Message;
 import org.apache.james.mailbox.store.mail.model.PropertyBuilder;
@@ -47,16 +45,25 @@ public class JPAMessage extends Abstract
     /** We use a max length to represent 1gb data. Thats prolly overkill, but who knows */
     @Basic(optional = false, fetch = FetchType.LAZY)
     @Column(name = "MAIL_BYTES", length = 1048576000, nullable = false)
-    @Lob private byte[] content;
+    @Lob private byte[] body;
 
+
+    /** The value for the header field. Lazy loaded */
+    /** We use a max length to represent 1gb data. Thats prolly overkill, but who knows */
+    @Basic(optional = false, fetch = FetchType.LAZY)
+    @Column(name = "HEADER_BYTES", length = 10485760, nullable = false)
+    @Lob private byte[] header;
+    
     @Deprecated
     public JPAMessage() {}
 
-    public JPAMessage(JPAMailbox mailbox,Date internalDate, int size, Flags flags, 
-            InputStream content, int bodyStartOctet, final List<JPAHeader> headers, final PropertyBuilder propertyBuilder) throws MailboxException {
-        super(mailbox, internalDate, flags, size ,bodyStartOctet,headers,propertyBuilder);
+    public JPAMessage(JPAMailbox mailbox,Date internalDate, int size, Flags flags, InputStream header,
+            InputStream body, int bodyStartOctet, final PropertyBuilder propertyBuilder) throws MailboxException {
+        super(mailbox, internalDate, flags, size ,bodyStartOctet, propertyBuilder);
         try {
-            this.content = IOUtils.toByteArray(content);
+            this.body = IOUtils.toByteArray(body);
+            this.header = IOUtils.toByteArray(header);
+
         } catch (IOException e) {
             throw new MailboxException("Unable to parse message",e);
         }
@@ -71,26 +78,28 @@ public class JPAMessage extends Abstract
     public JPAMessage(JPAMailbox mailbox, long uid, long modSeq, Message<?> message) throws MailboxException{
         super(mailbox, uid, modSeq, message);
         try {
-            this.content = IOUtils.toByteArray(message.getFullContent());
+            this.body = IOUtils.toByteArray(message.getBodyContent());
+            this.header = IOUtils.toByteArray(message.getHeaderContent());
         } catch (IOException e) {
             throw new MailboxException("Unable to parse message",e);
         }
     }
 
+
     /*
      * (non-Javadoc)
-     * @see org.apache.james.mailbox.store.mail.model.Message#getFullContent()
+     * @see org.apache.james.mailbox.store.mail.model.Message#getBodyContent()
      */
-    public InputStream getFullContent() throws IOException {
-        return new ByteArrayInputStream(content);
+    public InputStream getBodyContent() throws IOException {
+        return new ByteArrayInputStream(body);
     }
 
     /*
      * (non-Javadoc)
-     * @see org.apache.james.mailbox.store.mail.model.Message#getBodyContent()
+     * @see org.apache.james.mailbox.store.mail.model.Message#getHeaderContent()
      */
-    public InputStream getBodyContent() throws IOException {
-        return new ByteArrayInputStream(content, getBodyStartOctet(), (int)getFullContentOctets());
+    public InputStream getHeaderContent() throws IOException {
+        return new ByteArrayInputStream(header);
     }
 
 }

Modified: james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAStreamingMessage.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAStreamingMessage.java?rev=1136175&r1=1136174&r2=1136175&view=diff
==============================================================================
--- james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAStreamingMessage.java (original)
+++ james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAStreamingMessage.java Wed Jun 15 20:24:10 2011
@@ -21,9 +21,7 @@ package org.apache.james.mailbox.jpa.mai
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
-
 import java.util.Date;
-import java.util.List;
 
 import javax.mail.Flags;
 import javax.persistence.Column;
@@ -33,11 +31,9 @@ import javax.persistence.Table;
 
 import org.apache.commons.io.IOUtils;
 import org.apache.james.mailbox.MailboxException;
-import org.apache.james.mailbox.jpa.mail.model.JPAHeader;
 import org.apache.james.mailbox.jpa.mail.model.JPAMailbox;
 import org.apache.james.mailbox.store.mail.model.Message;
 import org.apache.james.mailbox.store.mail.model.PropertyBuilder;
-import org.apache.james.mailbox.store.streaming.LazySkippingInputStream;
 import org.apache.openjpa.persistence.Persistent;
 
 /**
@@ -54,17 +50,22 @@ import org.apache.openjpa.persistence.Pe
 @Table(name="JAMES_MAIL")
 public class JPAStreamingMessage extends AbstractJPAMessage {
 
-	@Persistent(optional=false, fetch=FetchType.LAZY)
-	@Column(name = "MAIL_BYTES", length=1048576000, nullable = false)
-	private InputStream content;
-	 
+    @Persistent(optional = false, fetch = FetchType.LAZY)
+    @Column(name = "MAIL_BYTES", length = 1048576000, nullable = false)
+    private InputStream body;
+
+    @Persistent(optional = false, fetch = FetchType.LAZY)
+    @Column(name = "HEADER_BYTES", length = 10485760, nullable = false)
+    private InputStream header;
+
     @Deprecated
     public JPAStreamingMessage() {}
 
-    public JPAStreamingMessage(JPAMailbox mailbox, Date internalDate, int size, Flags flags, 
-            InputStream content, int bodyStartOctet, final List<JPAHeader> headers, final PropertyBuilder propertyBuilder) throws MailboxException {
-        super(mailbox, internalDate, flags, size ,bodyStartOctet,headers,propertyBuilder);
-        this.content = content;
+    public JPAStreamingMessage(JPAMailbox mailbox, Date internalDate, int size, Flags flags, InputStream header, 
+            InputStream body, int bodyStartOctet,final PropertyBuilder propertyBuilder) throws MailboxException {
+        super(mailbox, internalDate, flags, size ,bodyStartOctet, propertyBuilder);
+        this.header = header;
+        this.body = body;
     }
 
     /**
@@ -76,18 +77,28 @@ public class JPAStreamingMessage extends
     public JPAStreamingMessage(JPAMailbox mailbox, long uid, long modSeq, Message<?> message) throws MailboxException {
         super(mailbox, uid, modSeq, message);
         try {
-            this.content = new ByteArrayInputStream(IOUtils.toByteArray(message.getFullContent()));
+            this.header = new ByteArrayInputStream(IOUtils.toByteArray(message.getHeaderContent()));
+            this.body = new ByteArrayInputStream(IOUtils.toByteArray(message.getBodyContent()));
         } catch (IOException e) {
             throw new MailboxException("Unable to parse message",e);
         }
     }
 
-    public InputStream getFullContent() throws IOException {
-        return content;
-    }
     
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.mailbox.store.mail.model.Message#getBodyContent()
+     */
     public InputStream getBodyContent() throws IOException {
-        return new LazySkippingInputStream(content, getBodyStartOctet());
+        return body;
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.mailbox.store.mail.model.Message#getHeaderContent()
+     */
+    public InputStream getHeaderContent() throws IOException {
+        return header;
     }
 
 }

Modified: james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMessageManager.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMessageManager.java?rev=1136175&r1=1136174&r2=1136175&view=diff
==============================================================================
--- james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMessageManager.java (original)
+++ james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMessageManager.java Wed Jun 15 20:24:10 2011
@@ -20,20 +20,16 @@
 package org.apache.james.mailbox.jpa.openjpa;
 
 import java.io.InputStream;
-import java.util.ArrayList;
 import java.util.Date;
-import java.util.List;
 
 import javax.mail.Flags;
 
 import org.apache.james.mailbox.MailboxException;
 import org.apache.james.mailbox.jpa.JPAMessageManager;
-import org.apache.james.mailbox.jpa.mail.model.JPAHeader;
 import org.apache.james.mailbox.jpa.mail.model.JPAMailbox;
 import org.apache.james.mailbox.jpa.mail.model.openjpa.JPAStreamingMessage;
 import org.apache.james.mailbox.store.MailboxEventDispatcher;
 import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
-import org.apache.james.mailbox.store.mail.model.Header;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.store.mail.model.Message;
 import org.apache.james.mailbox.store.mail.model.PropertyBuilder;
@@ -58,16 +54,14 @@ public class OpenJPAMessageManager exten
     }
 
     @Override
-    protected Message<Long> createMessage(Date internalDate, int size, int bodyStartOctet, InputStream document, Flags flags, List<Header> headers, PropertyBuilder propertyBuilder) throws MailboxException {
+    protected Message<Long> createMessage(Date internalDate, int size, int bodyStartOctet, InputStream header, InputStream body, Flags flags, PropertyBuilder propertyBuilder) throws MailboxException {
         if (useStreaming) {
-            final List<JPAHeader> jpaHeaders = new ArrayList<JPAHeader>(headers.size());
-            for (Header header: headers) {
-                jpaHeaders.add((JPAHeader) header);
-            }
-            return new JPAStreamingMessage((JPAMailbox) getMailboxEntity(), internalDate, size, flags, document, bodyStartOctet, jpaHeaders, propertyBuilder);
+            return new JPAStreamingMessage((JPAMailbox) getMailboxEntity(), internalDate, size, flags, header, body, bodyStartOctet,  propertyBuilder);
         } else {
-            return super.createMessage(internalDate, size, bodyStartOctet, document, flags, headers, propertyBuilder);
+            return super.createMessage(internalDate, size, bodyStartOctet, header, body, flags,  propertyBuilder);
         }
     }
 
+    
+
 }

Modified: james/mailbox/trunk/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAMailboxManagerTest.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAMailboxManagerTest.java?rev=1136175&r1=1136174&r2=1136175&view=diff
==============================================================================
--- james/mailbox/trunk/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAMailboxManagerTest.java (original)
+++ james/mailbox/trunk/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAMailboxManagerTest.java Wed Jun 15 20:24:10 2011
@@ -26,7 +26,6 @@ import org.apache.james.mailbox.BadCrede
 import org.apache.james.mailbox.MailboxException;
 import org.apache.james.mailbox.MailboxManagerTest;
 import org.apache.james.mailbox.MailboxSession;
-import org.apache.james.mailbox.jpa.mail.model.JPAHeader;
 import org.apache.james.mailbox.jpa.mail.model.JPAMailbox;
 import org.apache.james.mailbox.jpa.mail.model.JPAProperty;
 import org.apache.james.mailbox.jpa.mail.model.JPAUserFlag;
@@ -86,7 +85,6 @@ public class JPAMailboxManagerTest exten
         properties.put("openjpa.ConnectionFactoryProperties", "PrettyPrint=true, PrettyPrintLineLength=72");
         properties.put("openjpa.jdbc.SynchronizeMappings", "buildSchema(ForeignKeys=true)");
         properties.put("openjpa.MetaDataFactory", "jpa(Types=" +
-                JPAHeader.class.getName() + ";" +
                 JPAMailbox.class.getName() + ";" +
                 AbstractJPAMessage.class.getName() + ";" +
                 JPAMessage.class.getName() + ";" +

Modified: james/mailbox/trunk/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAStressTest.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAStressTest.java?rev=1136175&r1=1136174&r2=1136175&view=diff
==============================================================================
--- james/mailbox/trunk/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAStressTest.java (original)
+++ james/mailbox/trunk/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAStressTest.java Wed Jun 15 20:24:10 2011
@@ -27,7 +27,6 @@ import org.apache.james.mailbox.Abstract
 import org.apache.james.mailbox.MailboxException;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
-import org.apache.james.mailbox.jpa.mail.model.JPAHeader;
 import org.apache.james.mailbox.jpa.mail.model.JPAMailbox;
 import org.apache.james.mailbox.jpa.mail.model.JPAProperty;
 import org.apache.james.mailbox.jpa.mail.model.JPAUserFlag;
@@ -61,7 +60,6 @@ public class JPAStressTest extends Abstr
         properties.put("openjpa.ConnectionFactoryProperties", "PrettyPrint=true, PrettyPrintLineLength=72");
         properties.put("openjpa.jdbc.SynchronizeMappings", "buildSchema(ForeignKeys=true)");
         properties.put("openjpa.MetaDataFactory", "jpa(Types=" +
-                JPAHeader.class.getName() + ";" +
                 JPAMailbox.class.getName() + ";" +
                 AbstractJPAMessage.class.getName() + ";" +
                 JPAMessage.class.getName() + ";" +

Modified: james/mailbox/trunk/jpa/src/test/java/org/apache/james/mailbox/jpa/JPASubscriptionManagerTest.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/jpa/src/test/java/org/apache/james/mailbox/jpa/JPASubscriptionManagerTest.java?rev=1136175&r1=1136174&r2=1136175&view=diff
==============================================================================
--- james/mailbox/trunk/jpa/src/test/java/org/apache/james/mailbox/jpa/JPASubscriptionManagerTest.java (original)
+++ james/mailbox/trunk/jpa/src/test/java/org/apache/james/mailbox/jpa/JPASubscriptionManagerTest.java Wed Jun 15 20:24:10 2011
@@ -22,7 +22,6 @@ import java.util.HashMap;
 
 import org.apache.james.mailbox.AbstractSubscriptionManagerTest;
 import org.apache.james.mailbox.SubscriptionManager;
-import org.apache.james.mailbox.jpa.mail.model.JPAHeader;
 import org.apache.james.mailbox.jpa.mail.model.JPAMailbox;
 import org.apache.james.mailbox.jpa.mail.model.JPAProperty;
 import org.apache.james.mailbox.jpa.mail.model.JPAUserFlag;
@@ -48,7 +47,6 @@ public class JPASubscriptionManagerTest 
         properties.put("openjpa.ConnectionFactoryProperties", "PrettyPrint=true, PrettyPrintLineLength=72");
         properties.put("openjpa.jdbc.SynchronizeMappings", "buildSchema(ForeignKeys=true)");
         properties.put("openjpa.MetaDataFactory", "jpa(Types=" +
-                JPAHeader.class.getName() + ";" +
                 JPAMailbox.class.getName() + ";" +
                 AbstractJPAMessage.class.getName() + ";" +
                 JPAMessage.class.getName() + ";" +

Modified: james/mailbox/trunk/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java?rev=1136175&r1=1136174&r2=1136175&view=diff
==============================================================================
--- james/mailbox/trunk/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java (original)
+++ james/mailbox/trunk/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java Wed Jun 15 20:24:10 2011
@@ -55,6 +55,7 @@ import org.apache.james.mailbox.SearchQu
 import org.apache.james.mailbox.SearchQuery.NumericRange;
 import org.apache.james.mailbox.SearchQuery.UidCriterion;
 import org.apache.james.mailbox.UnsupportedSearchException;
+import org.apache.james.mailbox.store.ResultUtils;
 import org.apache.james.mailbox.store.mail.MessageMapperFactory;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.store.mail.model.Message;
@@ -636,7 +637,7 @@ public class LuceneMessageSearchIndex<Id
        
         try {
             // parse the message to index headers and body
-            parser.parse(membership.getFullContent());
+            parser.parse(ResultUtils.toInput(membership));
         } catch (MimeException e) {
             // This should never happen as it was parsed before too without problems.            
             throw new MailboxException("Unable to index content of message", e);

Modified: james/mailbox/trunk/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndexTest.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndexTest.java?rev=1136175&r1=1136174&r2=1136175&view=diff
==============================================================================
--- james/mailbox/trunk/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndexTest.java (original)
+++ james/mailbox/trunk/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndexTest.java Wed Jun 15 20:24:10 2011
@@ -23,12 +23,12 @@ import static org.junit.Assert.assertFal
 import static org.junit.Assert.assertTrue;
 
 import java.nio.charset.Charset;
-import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.Iterator;
-import java.util.List;
 import java.util.Locale;
+import java.util.Map;
 
 import javax.mail.Flags;
 import javax.mail.Flags.Flag;
@@ -36,9 +36,7 @@ import javax.mail.Flags.Flag;
 import org.apache.james.mailbox.SearchQuery;
 import org.apache.james.mailbox.SearchQuery.AddressType;
 import org.apache.james.mailbox.SearchQuery.DateResolution;
-import org.apache.james.mailbox.lucene.search.LuceneMessageSearchIndex;
 import org.apache.james.mailbox.store.MessageBuilder;
-import org.apache.james.mailbox.store.SimpleHeader;
 import org.apache.james.mailbox.store.SimpleMailboxMembership;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.store.mail.model.Message;
@@ -77,15 +75,15 @@ public class LuceneMessageSearchIndexTes
     public void setUp() throws Exception {
         index = new LuceneMessageSearchIndex<Long>(null, new RAMDirectory(), true, useLenient());
         index.setEnableSuffixMatch(true);
-        List<org.apache.james.mailbox.store.SimpleHeader> headersSubject = new ArrayList<org.apache.james.mailbox.store.SimpleHeader>();
-        headersSubject.add(new SimpleHeader("Subject", 1, "test"));
+        Map<String, String> headersSubject = new HashMap<String, String>();
+        headersSubject.put("Subject", "test");
        
-        List<org.apache.james.mailbox.store.SimpleHeader> headersTest = new ArrayList<org.apache.james.mailbox.store.SimpleHeader>();
-        headersSubject.add(new SimpleHeader("Test", 1, "test"));
+        Map<String, String> headersTest = new HashMap<String, String>();
+        headersSubject.put("Test", "test");
         
-        List<org.apache.james.mailbox.store.SimpleHeader> headersTestSubject = new ArrayList<org.apache.james.mailbox.store.SimpleHeader>();
-        headersTestSubject.add(new SimpleHeader("Test", 1, "test"));
-        headersTestSubject.add(new SimpleHeader("Subject", 2, "test2"));
+        Map<String, String> headersTestSubject =  new HashMap<String, String>();
+        headersTestSubject.put("Test", "test");
+        headersTestSubject.put("Subject", "test2");
 
 
         

Modified: james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java?rev=1136175&r1=1136174&r2=1136175&view=diff
==============================================================================
--- james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java (original)
+++ james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java Wed Jun 15 20:24:10 2011
@@ -43,16 +43,9 @@ import org.apache.james.mailbox.MailboxP
 import org.apache.james.mailbox.MailboxPathLocker;
 import org.apache.james.mailbox.MailboxPathLocker.LockAwareExecution;
 import org.apache.james.mailbox.MailboxSession;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 public class MaildirFolder {
 
-    /**
-     * The logger.
-     */
-    private Logger log = LoggerFactory.getLogger(MaildirFolder.class.getName());
-
     public static final String VALIDITY_FILE = "james-uidvalidity";
     public static final String UIDLIST_FILE = "james-uidlist";
     public static final String CUR = "cur";
@@ -95,27 +88,7 @@ public class MaildirFolder {
     public File getRootFile() {
         return rootFolder;
     }
-    
-    /**
-     * Locks the uidList file and if it has retrieved the lock, returns it.
-     * Make sure to call unlockUidList() in a finally block afterwards.
-     * @return The locked uidList
-     */
-    /*
-    public File lockUidList() {
-        FileLock.lock(uidFile);
-        return uidFile;
-    }
-    */
-    
-    /**
-     * Unlocks the uidList file if it has been locked before.
-     */
-    /*
-    public void unlockUidList() {
-        FileLock.unlock(uidFile);
-    }
-    */
+
     /**
      * Tests whether the directory belonging to this {@link MaildirFolder} exists 
      * @return true if the directory belonging to this {@link MaildirFolder} exists ; false otherwise 

Modified: james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMessageManager.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMessageManager.java?rev=1136175&r1=1136174&r2=1136175&view=diff
==============================================================================
--- james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMessageManager.java (original)
+++ james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMessageManager.java Wed Jun 15 20:24:10 2011
@@ -19,19 +19,15 @@
 package org.apache.james.mailbox.maildir;
 
 import java.io.InputStream;
-import java.util.ArrayList;
 import java.util.Date;
-import java.util.List;
 
 import javax.mail.Flags;
 
 import org.apache.james.mailbox.MailboxException;
-import org.apache.james.mailbox.maildir.mail.model.MaildirHeader;
 import org.apache.james.mailbox.maildir.mail.model.MaildirMessage;
 import org.apache.james.mailbox.store.MailboxEventDispatcher;
 import org.apache.james.mailbox.store.StoreMessageManager;
 import org.apache.james.mailbox.store.mail.MessageMapperFactory;
-import org.apache.james.mailbox.store.mail.model.Header;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.store.mail.model.Message;
 import org.apache.james.mailbox.store.mail.model.PropertyBuilder;
@@ -44,22 +40,13 @@ public class MaildirMessageManager exten
         super(mapperFactory, index, dispatcher, mailboxEntiy);
     }
 
-    @Override
-    protected Header createHeader(int lineNumber, String name, String value) {
-        return new MaildirHeader(lineNumber, name, value);
-    }
-
+    
     @Override
     protected Message<Integer> createMessage(Date internalDate,
-            int size, int bodyStartOctet, InputStream documentIn, Flags flags,
-            List<Header> headers, PropertyBuilder propertyBuilder)
+            int size, int bodyStartOctet, InputStream header, InputStream body, Flags flags, PropertyBuilder propertyBuilder)
             throws MailboxException {
-        final List<MaildirHeader> maildirHeaders = new ArrayList<MaildirHeader>(headers.size());
-        for (Header header: headers) {
-            maildirHeaders.add((MaildirHeader) header);
-        }
         final Message<Integer> message = new MaildirMessage(getMailboxEntity(), internalDate, 
-                size, flags, documentIn, bodyStartOctet, maildirHeaders, propertyBuilder);
+                size, flags, header, body, bodyStartOctet, propertyBuilder);
         return message;
     }
 

Modified: james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java?rev=1136175&r1=1136174&r2=1136175&view=diff
==============================================================================
--- james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java (original)
+++ james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java Wed Jun 15 20:24:10 2011
@@ -47,6 +47,7 @@ import org.apache.james.mailbox.maildir.
 import org.apache.james.mailbox.maildir.mail.model.AbstractMaildirMessage;
 import org.apache.james.mailbox.maildir.mail.model.LazyLoadingMaildirMessage;
 import org.apache.james.mailbox.maildir.mail.model.MaildirMessage;
+import org.apache.james.mailbox.store.ResultUtils;
 import org.apache.james.mailbox.store.mail.AbstractMessageMapper;
 import org.apache.james.mailbox.store.mail.SimpleMessageMetaData;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
@@ -386,7 +387,7 @@ public class MaildirMessageMapper extend
         try {
             messageFile.createNewFile();
             fos = new FileOutputStream(messageFile);
-            input = message.getFullContent();
+            input = ResultUtils.toInput(message);
             byte[] b = new byte[BUF_SIZE];
             int len = 0;
             while ((len = input.read(b)) != -1)

Modified: james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/LazyLoadingMaildirMessage.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/LazyLoadingMaildirMessage.java?rev=1136175&r1=1136174&r2=1136175&view=diff
==============================================================================
--- james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/LazyLoadingMaildirMessage.java (original)
+++ james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/LazyLoadingMaildirMessage.java Wed Jun 15 20:24:10 2011
@@ -24,7 +24,6 @@ import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.PushbackInputStream;
-import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 
@@ -32,9 +31,9 @@ import javax.mail.Flags;
 import javax.mail.util.SharedFileInputStream;
 
 import org.apache.commons.io.IOUtils;
+import org.apache.commons.io.input.BoundedInputStream;
 import org.apache.james.mailbox.maildir.MaildirFolder;
 import org.apache.james.mailbox.maildir.MaildirMessageName;
-import org.apache.james.mailbox.store.mail.model.Header;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.store.mail.model.Property;
 import org.apache.james.mailbox.store.mail.model.PropertyBuilder;
@@ -51,7 +50,6 @@ public class LazyLoadingMaildirMessage e
     private MaildirMessageName messageName;
     private int bodyStartOctet;
     private final PropertyBuilder propertyBuilder = new PropertyBuilder();
-    private final List<Header> headers = new ArrayList<Header>();
 
     private boolean parsed;
 
@@ -99,19 +97,8 @@ public class LazyLoadingMaildirMessage e
             parser.setRecursionMode(MimeTokenStream.M_NO_RECURSE);
             parser.parse(tmpMsgIn.newStream(0, -1));
 
-            int lineNumber = 0;
             int next = parser.next();
             while (next != MimeTokenStream.T_BODY && next != MimeTokenStream.T_END_OF_STREAM && next != MimeTokenStream.T_START_MULTIPART) {
-                if (next == MimeTokenStream.T_FIELD) {
-                    String fieldValue = parser.getField().getBody();
-                    if (fieldValue.endsWith("\r\f")) {
-                        fieldValue = fieldValue.substring(0, fieldValue.length() - 2);
-                    }
-                    if (fieldValue.startsWith(" ")) {
-                        fieldValue = fieldValue.substring(1);
-                    }
-                    headers.add(new MaildirHeader(lineNumber, parser.getField().getName(), fieldValue));
-                }
                 next = parser.next();
             }
             final MaximalBodyDescriptor descriptor = (MaximalBodyDescriptor) parser.getBodyDescriptor();
@@ -265,16 +252,6 @@ public class LazyLoadingMaildirMessage e
 
     /*
      * (non-Javadoc)
-     * @see org.apache.james.mailbox.store.mail.model.Message#getHeaders()
-     */
-    public List<Header> getHeaders() {
-        parseMessage();
-
-        return headers;
-    }
-
-    /*
-     * (non-Javadoc)
      * @see org.apache.james.mailbox.store.mail.model.Message#getProperties()
      */
     public List<Property> getProperties() {
@@ -290,11 +267,7 @@ public class LazyLoadingMaildirMessage e
         return messageName.getInternalDate();
     }
 
-    /*
-     * (non-Javadoc)
-     * @see org.apache.james.mailbox.store.mail.model.Message#getFullContent()
-     */
-    public InputStream getFullContent() throws IOException {
+    private InputStream getFullContent() throws IOException {
         return new FileInputStream(messageName.getFile());
     }
 
@@ -317,5 +290,13 @@ public class LazyLoadingMaildirMessage e
         return bodyStartOctet;
     }
 
+    @Override
+    public InputStream getHeaderContent() throws IOException {
+        parseMessage();
+            
+        return new BoundedInputStream(getFullContent(), bodyStartOctet - 2);
+
+    }
+
 
 }

Modified: james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMessage.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMessage.java?rev=1136175&r1=1136174&r2=1136175&view=diff
==============================================================================
--- james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMessage.java (original)
+++ james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMessage.java Wed Jun 15 20:24:10 2011
@@ -28,8 +28,9 @@ import java.util.List;
 import javax.mail.Flags;
 
 import org.apache.commons.io.IOUtils;
+import org.apache.commons.io.input.BoundedInputStream;
 import org.apache.james.mailbox.MailboxException;
-import org.apache.james.mailbox.store.mail.model.Header;
+import org.apache.james.mailbox.store.ResultUtils;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.store.mail.model.Property;
 import org.apache.james.mailbox.store.mail.model.PropertyBuilder;
@@ -40,7 +41,6 @@ public class MaildirMessage extends Abst
     // Document
     private int bodyStartOctet;
     private InputStream rawFullContent;
-    private List<MaildirHeader> headers;
     private String mediaType;
     private List<MaildirProperty> properties;
     private String subType;
@@ -64,13 +64,11 @@ public class MaildirMessage extends Abst
      * @param propertyBuilder
      */
     public MaildirMessage(Mailbox<Integer> mailbox, Date internalDate,
-            int size, Flags flags, InputStream documentIn, int bodyStartOctet,
-            List<MaildirHeader> maildirHeaders, PropertyBuilder propertyBuilder) {
+            int size, Flags flags, InputStream header, InputStream body, int bodyStartOctet, PropertyBuilder propertyBuilder) {
         super(mailbox);
         // Document
-        this.rawFullContent = documentIn;
+        this.rawFullContent = ResultUtils.toInput(header, body);
         this.bodyStartOctet = bodyStartOctet;
-        this.headers = new ArrayList<MaildirHeader>(maildirHeaders);
         this.textualLineCount = propertyBuilder.getTextualLineCount();
         this.mediaType = propertyBuilder.getMediaType();
         this.subType = propertyBuilder.getSubType();
@@ -109,19 +107,13 @@ public class MaildirMessage extends Abst
         this.seen = message.isSeen();
         
         try {
-            this.rawFullContent = new ByteArrayInputStream(IOUtils.toByteArray(message.getFullContent()));
+            this.rawFullContent = new ByteArrayInputStream(IOUtils.toByteArray(ResultUtils.toInput(message)));
         } catch (IOException e) {
             throw new MailboxException("Parsing of message failed",e);
         }
        
         this.bodyStartOctet = (int) (message.getFullContentOctets() - message.getBodyOctets());
-        this.headers = new ArrayList<MaildirHeader>();
-        
-        List<Header> originalHeaders = message.getHeaders();
-        for (int i = 0; i < originalHeaders.size(); i++) {
-            headers.add(new MaildirHeader(originalHeaders.get(i)));
-        }
-
+      
         PropertyBuilder pBuilder = new PropertyBuilder(message.getProperties());
         this.textualLineCount = message.getTextualLineCount();
         this.mediaType = message.getMediaType();
@@ -149,12 +141,13 @@ public class MaildirMessage extends Abst
         return size;
     }
 
-    /* 
+
+    /*
      * (non-Javadoc)
-     * @see org.apache.james.mailbox.store.mail.model.Document#getHeaders()
+     * @see org.apache.james.mailbox.store.mail.model.Message#getHeaderContent()
      */
-    public List<Header> getHeaders() {
-        return new ArrayList<Header>(headers);
+    public InputStream  getHeaderContent() {
+        return new BoundedInputStream(rawFullContent, bodyStartOctet - 2);
     }
 
     /* 
@@ -245,14 +238,6 @@ public class MaildirMessage extends Abst
 
     /*
      * (non-Javadoc)
-     * @see org.apache.james.mailbox.store.mail.model.Message#getFullContent()
-     */
-    public InputStream getFullContent() throws IOException {
-        return rawFullContent;
-    }
-
-    /*
-     * (non-Javadoc)
      * @see org.apache.james.mailbox.store.mail.model.Message#getBodyContent()
      */
     public InputStream getBodyContent() throws IOException {

Modified: james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryStoreMessageManager.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryStoreMessageManager.java?rev=1136175&r1=1136174&r2=1136175&view=diff
==============================================================================
--- james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryStoreMessageManager.java (original)
+++ james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryStoreMessageManager.java Wed Jun 15 20:24:10 2011
@@ -19,21 +19,19 @@
 
 package org.apache.james.mailbox.inmemory;
 
-import java.io.ByteArrayOutputStream;
+import java.io.IOException;
 import java.io.InputStream;
 import java.util.Date;
-import java.util.List;
 
 import javax.mail.Flags;
 
+import org.apache.commons.io.IOUtils;
 import org.apache.james.mailbox.MailboxException;
 import org.apache.james.mailbox.inmemory.mail.model.InMemoryMailbox;
-import org.apache.james.mailbox.inmemory.mail.model.SimpleHeader;
 import org.apache.james.mailbox.inmemory.mail.model.SimpleMailboxMembership;
 import org.apache.james.mailbox.store.MailboxEventDispatcher;
 import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
 import org.apache.james.mailbox.store.StoreMessageManager;
-import org.apache.james.mailbox.store.mail.model.Header;
 import org.apache.james.mailbox.store.mail.model.Message;
 import org.apache.james.mailbox.store.mail.model.PropertyBuilder;
 import org.apache.james.mailbox.store.search.MessageSearchIndex;
@@ -43,33 +41,16 @@ public class InMemoryStoreMessageManager
     public InMemoryStoreMessageManager(MailboxSessionMapperFactory<Long> mapperFactory, MessageSearchIndex<Long> index, MailboxEventDispatcher<Long> dispatcher, InMemoryMailbox mailbox) throws MailboxException {
         super(mapperFactory, index, dispatcher,mailbox);
     }
-    
-    @Override
-    protected Header createHeader(int lineNumber, String name, String value) {
-        return new SimpleHeader(name, lineNumber, value);
-    }
 
     @Override
     protected Message<Long> createMessage(Date internalDate, int size, int bodyStartOctet, 
-            InputStream  document, Flags flags, List<Header> headers, PropertyBuilder propertyBuilder) throws MailboxException {
-        ByteArrayOutputStream out = new ByteArrayOutputStream();
-        byte[] byteContent;
+            InputStream header, InputStream  body, Flags flags,  PropertyBuilder propertyBuilder) throws MailboxException {
+
         try {
-            byte[] buf = new byte[1024];
-            int i = 0;
-            while ((i = document.read(buf)) != -1) {
-                out.write(buf, 0, i);
-            }
-            byteContent = out.toByteArray();
-            if (out != null)
-                out.close();
-
-        } catch (Exception e) {
-            e.printStackTrace();
-            byteContent = new byte[0];
+            return new SimpleMailboxMembership(internalDate, size, bodyStartOctet,  IOUtils.toByteArray(header), IOUtils.toByteArray(body), flags, propertyBuilder, ((InMemoryMailbox) getMailboxEntity()).getMailboxId());
+        } catch (IOException e) {
+            throw new MailboxException("Unable to create message", e);
         }
-        InMemoryMailbox mailbox = (InMemoryMailbox) getMailboxEntity();
-        return new SimpleMailboxMembership(internalDate, size, bodyStartOctet, byteContent, flags, headers, propertyBuilder, mailbox.getMailboxId());
     }
     
 }

Modified: james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/model/SimpleMailboxMembership.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/model/SimpleMailboxMembership.java?rev=1136175&r1=1136174&r2=1136175&view=diff
==============================================================================
--- james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/model/SimpleMailboxMembership.java (original)
+++ james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/model/SimpleMailboxMembership.java Wed Jun 15 20:24:10 2011
@@ -28,7 +28,6 @@ import java.util.List;
 import javax.mail.Flags;
 
 import org.apache.james.mailbox.store.mail.model.AbstractMessage;
-import org.apache.james.mailbox.store.mail.model.Header;
 import org.apache.james.mailbox.store.mail.model.Property;
 import org.apache.james.mailbox.store.mail.model.PropertyBuilder;
 
@@ -47,9 +46,9 @@ public class SimpleMailboxMembership ext
     private final String subType;
     private List<Property> properties;
     private final String mediaType;
-    private List<Header> headers;
+    private byte[] header;
     private Long lineCount;
-    private byte[] document;
+    private byte[] body;
     private int bodyStartOctet;
     private long modSeq;
     public SimpleMailboxMembership(long mailboxId, long uid, long modSeq, final SimpleMailboxMembership original) {
@@ -69,21 +68,21 @@ public class SimpleMailboxMembership ext
         this.subType  = original.subType;
         this.mediaType = original.mediaType;
         this.properties = original.properties;
-        this.headers = original.headers;
+        this.header = original.header;
         this.lineCount = original.lineCount;
-        this.document = original.document;
+        this.body = original.body;
         this.bodyStartOctet = original.bodyStartOctet;
     }
     
-    public SimpleMailboxMembership(Date internalDate, int size, int bodyStartOctet, byte[] document, 
-            Flags flags, List<Header> headers, PropertyBuilder propertyBuilder, final long mailboxId) {
-        this.document = document;
+    public SimpleMailboxMembership(Date internalDate, int size, int bodyStartOctet, byte[] header,  byte[] body, 
+            Flags flags, PropertyBuilder propertyBuilder, final long mailboxId) {
+        this.body = body;
         
         this.size = size;
         this.bodyStartOctet = bodyStartOctet;
         setFlags(flags);
         lineCount = propertyBuilder.getTextualLineCount();
-        this.headers = headers;
+        this.header = header;
         this.internalDate = internalDate;
         this.mailboxId = mailboxId;
         this.properties = propertyBuilder.toProperties();
@@ -146,20 +145,14 @@ public class SimpleMailboxMembership ext
     }
 
     public InputStream getBodyContent() throws IOException {
-        return new ByteArrayInputStream(document,bodyStartOctet, (int) getFullContentOctets());      
+        return new ByteArrayInputStream(body);     
     }
 
-    public InputStream getFullContent() throws IOException {
-        return new ByteArrayInputStream(document);
-    }
 
     public long getFullContentOctets() {
-        return document.length;
+        return size;
     }
 
-    public List<Header> getHeaders() {
-        return headers;
-    }
 
     public String getMediaType() {
         return mediaType;
@@ -251,4 +244,9 @@ public class SimpleMailboxMembership ext
     public void setUid(long uid) {
         this.uid = uid;
     }
+
+    @Override
+    public InputStream getHeaderContent() throws IOException {
+        return new ByteArrayInputStream(header);
+    }
 }

Modified: james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/ResultHeader.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/ResultHeader.java?rev=1136175&r1=1136174&r2=1136175&view=diff
==============================================================================
--- james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/ResultHeader.java (original)
+++ james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/ResultHeader.java Wed Jun 15 20:24:10 2011
@@ -33,7 +33,6 @@ import java.nio.channels.WritableByteCha
 import org.apache.james.mailbox.InputStreamContent;
 import org.apache.james.mailbox.MailboxException;
 import org.apache.james.mailbox.MessageResult;
-import org.apache.james.mailbox.store.mail.model.Header;
 
 public final class ResultHeader implements MessageResult.Header, InputStreamContent {
     private final String name;
@@ -42,9 +41,6 @@ public final class ResultHeader implemen
 
     private final long size;
 
-    public ResultHeader(final Header header) {
-        this(header.getFieldName(), header.getValue());
-    }
 
     public ResultHeader(String name, String value) {
         this.name = name;

Modified: james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/ResultUtils.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/ResultUtils.java?rev=1136175&r1=1136174&r2=1136175&view=diff
==============================================================================
--- james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/ResultUtils.java (original)
+++ james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/ResultUtils.java Wed Jun 15 20:24:10 2011
@@ -19,11 +19,13 @@
 
 package org.apache.james.mailbox.store;
 
-import java.io.FilterInputStream;
+import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.SequenceInputStream;
 import java.nio.charset.Charset;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
@@ -34,13 +36,13 @@ import org.apache.james.mailbox.MessageR
 import org.apache.james.mailbox.MessageResult.FetchGroup;
 import org.apache.james.mailbox.MessageResult.MimePath;
 import org.apache.james.mailbox.MimeDescriptor;
-import org.apache.james.mailbox.store.mail.model.Header;
 import org.apache.james.mailbox.store.mail.model.Message;
 import org.apache.james.mailbox.store.streaming.InputStreamContent;
 import org.apache.james.mailbox.store.streaming.InputStreamContent.Type;
 import org.apache.james.mailbox.store.streaming.PartContentBuilder;
 import org.apache.james.mailbox.util.MessageResultImpl;
 import org.apache.james.mime4j.MimeException;
+import org.apache.james.mime4j.parser.Field;
 
 /**
  *
@@ -53,23 +55,18 @@ public class ResultUtils {
 
     static final Charset US_ASCII = Charset.forName("US-ASCII");
 
-    public static List<MessageResult.Header> createHeaders(final Message<?> document) {
-        final List<Header> headers = getSortedHeaders(document);
-
-        final List<MessageResult.Header> results = new ArrayList<MessageResult.Header>(headers.size());
-        for (Header header: headers) {
-            final ResultHeader resultHeader = new ResultHeader(header);
+    public static List<MessageResult.Header> createHeaders(final Message<?> document) throws IOException {
+        org.apache.james.mime4j.message.Header header = new org.apache.james.mime4j.message.Header(document.getHeaderContent());
+        
+        final List<MessageResult.Header> results = new ArrayList<MessageResult.Header>();
+        List<Field> fields = header.getFields();
+        for (Field field: fields) {
+            final ResultHeader resultHeader = new ResultHeader(field.getName(), field.getBody());
             results.add(resultHeader);
         }
         return results;
     }
 
-    private static List<Header> getSortedHeaders(final Message<?> document) {
-        final List<Header> headers = new ArrayList<Header>(document.getHeaders());
-        Collections.sort(headers);
-        return headers;
-    }
-
     /**
      * Return the {@link Content} which holds only the Body for the given {@link MailboxMembership}
      * 
@@ -95,6 +92,20 @@ public class ResultUtils {
     }
 
     /**
+     * Return an {@link InputStream} which holds the full content of the message
+     * @param message
+     * @return
+     * @throws IOException
+     */
+    public static InputStream toInput(final Message<?> message) throws IOException{
+        return toInput(message.getHeaderContent(), message.getBodyContent());
+    }
+    
+    public static InputStream toInput(final InputStream header, final InputStream body) {
+        return new SequenceInputStream(Collections.enumeration(Arrays.asList(header, new ByteArrayInputStream(BYTES_NEW_LINE), body)));
+    }
+    
+    /**
      * Return the {@link MessageResult} for the given {@link MailboxMembership} and {@link FetchGroup}
      * 
      * @param message
@@ -164,7 +175,7 @@ public class ResultUtils {
     }
 
     private static void addHeaders(final Message<?> message,
-            MessageResultImpl messageResult) {
+            MessageResultImpl messageResult) throws IOException {
         final List<MessageResult.Header> headers = createHeaders(message);
         messageResult.setHeaders(headers);
     }
@@ -223,85 +234,6 @@ public class ResultUtils {
     }
    
 
-    /**
-     * Return an {@link InputStream} which holds the content of the given {@link org.apache.james.mailbox.store.mail.model.Message}
-     * 
-     * @param document
-     * @return stream
-     * @throws IOException 
-     */
-    public static InputStream toInput(final Message<?> document) throws IOException {
-        final List<Header> headers = getSortedHeaders(document);
-        final StringBuffer headersToString = new StringBuffer(headers.size() * 50);
-        for (Header header: headers) {
-            headersToString.append(header.getFieldName());
-            headersToString.append(": ");
-            headersToString.append(header.getValue());
-            headersToString.append("\r\n");
-        }
-        headersToString.append("\r\n");
-        final InputStream bodyContent = document.getBodyContent();
-        final MessageInputStream stream = new MessageInputStream(headersToString, bodyContent);
-        return stream;
-    }
-
-
-    private static final class MessageInputStream extends FilterInputStream {
-        private final StringBuffer headers;
-        private int headerPosition = 0;
-
-        public MessageInputStream(final StringBuffer headers,
-                final InputStream bodyContent) throws IOException{
-            super(bodyContent);
-            
-            this.headers = headers;
-        }
-
-        public int read() throws IOException {
-            final int result;
-            if (headerPosition < headers.length()) {
-                result = headers.charAt(headerPosition++);
-            } else  { 
-                result = super.read();
-            }
-            return result;
-        }
-
-        @Override
-        public int read(byte[] b, int off, int len) throws IOException {
-            if (headerPosition < headers.length()) {
-                int headersLeft = headers.length() - headerPosition;
-                if (len > headersLeft) {
-                    int i;
-                    for (i = 0; i < headersLeft; i++) {
-                        int a =  read();
-                        if (a == -1) {
-                            return i;
-                        } 
-                        b[off +i] = (byte) a;
-                    }
-                    int bytesLeft = len - headersLeft;
-                    return i + super.read(b, off +i, bytesLeft);
-                } else {
-
-                    for (int i = 0 ; i < len; i++) {
-                        int a =  read();
-                        if (a == -1) {
-                            return -1;
-                        } 
-                        b[off +i] = (byte) a;
-                    }
-                    return len;
-                }
-            }
-            return super.read(b, off, len);
-        }
-
-        @Override
-        public int read(byte[] b) throws IOException {
-            return read(b, 0, b.length);
-        }
-    }
   
     private static final int[] path(MimePath mimePath) {
         final int[] result;

Modified: james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java?rev=1136175&r1=1136174&r2=1136175&view=diff
==============================================================================
--- james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java (original)
+++ james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java Wed Jun 15 20:24:10 2011
@@ -19,6 +19,7 @@
 
 package org.apache.james.mailbox.store;
 
+import java.io.ByteArrayInputStream;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
@@ -49,7 +50,6 @@ import org.apache.james.mailbox.UpdatedF
 import org.apache.james.mailbox.MessageResult.FetchGroup;
 import org.apache.james.mailbox.store.mail.MessageMapper;
 import org.apache.james.mailbox.store.mail.MessageMapperFactory;
-import org.apache.james.mailbox.store.mail.model.Header;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.store.mail.model.Message;
 import org.apache.james.mailbox.store.mail.model.PropertyBuilder;
@@ -61,6 +61,7 @@ import org.apache.james.mailbox.store.tr
 import org.apache.james.mailbox.store.transaction.Mapper.MailboxMembershipCallback;
 import org.apache.james.mime4j.MimeException;
 import org.apache.james.mime4j.descriptor.MaximalBodyDescriptor;
+import org.apache.james.mime4j.message.Header;
 import org.apache.james.mime4j.parser.MimeEntityConfig;
 import org.apache.james.mime4j.parser.MimeTokenStream;
 
@@ -197,25 +198,14 @@ public abstract class StoreMessageManage
            
             parser.setRecursionMode(MimeTokenStream.M_NO_RECURSE);
             parser.parse(bIn);
-            final List<Header> headers = new ArrayList<Header>();
+            final Header header = new Header();
             
-            int lineNumber = 0;
             int next = parser.next();
             while (next != MimeTokenStream.T_BODY
                     && next != MimeTokenStream.T_END_OF_STREAM
                     && next != MimeTokenStream.T_START_MULTIPART) {
                 if (next == MimeTokenStream.T_FIELD) {
-                    String fieldValue = parser.getField().getBody();
-                    if (fieldValue.endsWith("\r\f")) {
-                        fieldValue = fieldValue.substring(0,fieldValue.length() - 2);
-                    }
-                    if (fieldValue.startsWith(" ")) {
-                        fieldValue = fieldValue.substring(1);
-                    }
-                    final Header header 
-                        = createHeader(++lineNumber, parser.getField().getName(), 
-                            fieldValue);
-                    headers.add(header);
+                    header.addField(parser.getField());
                 }
                 next = parser.next();
             }
@@ -294,10 +284,14 @@ public abstract class StoreMessageManage
                 // via the TeeInputStream
             }
             int bodyStartOctet = (int) bIn.getBodyStartOffset();
+            if (bodyStartOctet == -1) {
+                bodyStartOctet = 0;
+            }
             contentIn = new FileInputStream(file);
+            contentIn.skip(bodyStartOctet);
             final int size = (int) file.length();
 
-            final Message<Id> message = createMessage(internalDate, size, bodyStartOctet, contentIn, flags, headers, propertyBuilder);
+            final Message<Id> message = createMessage(internalDate, size, bodyStartOctet, new ByteArrayInputStream(header.toString().getBytes("US-ASCII")), contentIn, flags, propertyBuilder);
             MessageMetaData data = appendMessageToStore(message, mailboxSession);
                        
             Map<Long, MessageMetaData> uids = new HashMap<Long, MessageMetaData>();
@@ -331,25 +325,15 @@ public abstract class StoreMessageManage
      * @param internalDate
      * @param size
      * @param bodyStartOctet
-     * @param documentIn
+     * @param headersContent
+     * @param bodyContent
      * @param flags
-     * @param headers
-     * @param propertyBuilder
      * @return membership
      * @throws MailboxException 
      */
     protected abstract Message<Id> createMessage(Date internalDate, final int size, int bodyStartOctet, 
-            final InputStream documentIn, final Flags flags, final List<Header> headers, PropertyBuilder propertyBuilder) throws MailboxException;
+            final InputStream headersContent, final InputStream bodyContent, final Flags flags, final PropertyBuilder propertyBuilder) throws MailboxException;
     
-    /**
-     * Create a new {@link Header} for the given data
-     * 
-     * @param lineNumber
-     * @param name
-     * @param value
-     * @return header
-     */
-    protected abstract Header createHeader(int lineNumber, String name, String value);
     
     public void addListener(MailboxListener listener) throws MailboxException {
         dispatcher.addMailboxListener(listener);

Modified: james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/model/Message.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/model/Message.java?rev=1136175&r1=1136174&r2=1136175&view=diff
==============================================================================
--- james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/model/Message.java (original)
+++ james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/model/Message.java Wed Jun 15 20:24:10 2011
@@ -73,8 +73,6 @@ public interface Message<Id> extends Com
      */
     public abstract long getModSeq();
 
-    
-
     /**
      * Return if it was marked as answered
      * 
@@ -132,16 +130,7 @@ public interface Message<Id> extends Com
      * @return new instance, not null
      */
     public abstract Flags createFlags();
-
-    /**
-     * Gets the full content (including headers) of the document. 
-     * 
-     * Be aware that this method need to return a new fresh {@link InputStream}
-     * on every call, which basicly means it need to start at position 0
-     * 
-     * @return fullContent, not null
-     */
-    public abstract InputStream getFullContent() throws IOException;
+    
     
     /**
      * Gets the body content of the document. Headers are excluded.
@@ -188,11 +177,15 @@ public interface Message<Id> extends Com
     public Long getTextualLineCount();
     
     /**
-     * Gets a read-only list of headers.
+     * Gets the header as {@link InputStream}. This MUST exclude the CRLF terminator
+     * 
+     * Be aware that this method need to return a new fresh {@link InputStream}
+     * on every call
      * 
-     * @return unmodifiable list of headers, not null
+     * @return header
+     * @throws IOException 
      */
-    public abstract List<Header> getHeaders();
+    public abstract InputStream getHeaderContent() throws IOException;
     
     /**
      * Gets a read-only list of meta-data properties.

Modified: james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java?rev=1136175&r1=1136174&r2=1136175&view=diff
==============================================================================
--- james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java (original)
+++ james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java Wed Jun 15 20:24:10 2011
@@ -37,13 +37,13 @@ import java.util.TreeSet;
 import javax.mail.Flags;
 
 import org.apache.james.mailbox.MailboxException;
+import org.apache.james.mailbox.MessageResult.Header;
 import org.apache.james.mailbox.SearchQuery;
 import org.apache.james.mailbox.SearchQuery.AddressType;
 import org.apache.james.mailbox.SearchQuery.DateResolution;
 import org.apache.james.mailbox.UnsupportedSearchException;
 import org.apache.james.mailbox.SearchQuery.NumericRange;
 import org.apache.james.mailbox.store.ResultUtils;
-import org.apache.james.mailbox.store.mail.model.Header;
 import org.apache.james.mailbox.store.mail.model.Message;
 import org.apache.james.mailbox.store.search.comparator.CombinedComparator;
 import org.apache.james.mime4j.MimeException;
@@ -138,7 +138,11 @@ public class MessageSearches implements 
         } else if (criterion instanceof SearchQuery.SizeCriterion) {
             result = matches((SearchQuery.SizeCriterion) criterion, message);
         } else if (criterion instanceof SearchQuery.HeaderCriterion) {
-            result = matches((SearchQuery.HeaderCriterion) criterion, message, log);
+            try {
+                result = matches((SearchQuery.HeaderCriterion) criterion, message, log);
+            } catch (IOException e) {
+                throw new MailboxException("Unable to search header", e);
+            }
         } else if (criterion instanceof SearchQuery.UidCriterion) {
             result = matches((SearchQuery.UidCriterion) criterion, message);
         } else if (criterion instanceof SearchQuery.FlagCriterion) {
@@ -313,7 +317,7 @@ public class MessageSearches implements 
         return result;
     }
 
-    private static boolean matches(SearchQuery.HeaderCriterion criterion, Message<?> message, Logger log) throws UnsupportedSearchException {
+    private static boolean matches(SearchQuery.HeaderCriterion criterion, Message<?> message, Logger log) throws MailboxException, IOException {
         final SearchQuery.HeaderOperator operator = criterion.getOperator();
         final String headerName = criterion.getHeaderName();
         final boolean result;
@@ -338,13 +342,15 @@ public class MessageSearches implements 
      * @param headerName
      * @param message
      * @return containsAddress
+     * @throws MailboxException 
+     * @throws IOException 
      */
     private static boolean matchesAddress(final SearchQuery.AddressOperator operator,
-            final String headerName, final Message<?> message, Logger log) {
+            final String headerName, final Message<?> message, Logger log) throws MailboxException, IOException {
         final String text = operator.getAddress().toUpperCase(Locale.ENGLISH);
-        final List<Header> headers = message.getHeaders();
+        final List<Header> headers = ResultUtils.createHeaders(message);
         for (Header header:headers) {
-            final String name = header.getFieldName();
+            final String name = header.getName();
             if (headerName.equalsIgnoreCase(name)) {
                 final String value = header.getValue();
                 try {
@@ -375,11 +381,12 @@ public class MessageSearches implements 
         return false;
     }
     
-    private static boolean exists(String headerName, Message<?> message) {
+    private static boolean exists(String headerName, Message<?> message) throws MailboxException, IOException {
         boolean result = false;
-        final List<Header> headers = message.getHeaders();
+        final List<Header> headers = ResultUtils.createHeaders(message);
+
         for (Header header:headers) {
-            final String name = header.getFieldName();
+            final String name = header.getName();
             if (headerName.equalsIgnoreCase(name)) {
                 result = true;
                 break;
@@ -389,12 +396,12 @@ public class MessageSearches implements 
     }
 
     private static boolean matches(final SearchQuery.ContainsOperator operator,
-            final String headerName, final Message<?> message) {
+            final String headerName, final Message<?> message) throws MailboxException, IOException {
         final String text = operator.getValue().toUpperCase();
         boolean result = false;
-        final List<Header> headers = message.getHeaders();
+        final List<Header> headers = ResultUtils.createHeaders(message);
         for (Header header:headers) {
-            final String name = header.getFieldName();
+            final String name = header.getName();
             if (headerName.equalsIgnoreCase(name)) {
                 final String value = header.getValue();
                 if (value != null) {
@@ -408,19 +415,19 @@ public class MessageSearches implements 
         return result;
     }
 
-    private static boolean matches(final SearchQuery.DateOperator operator,
-            final String headerName, final Message<?> message) throws UnsupportedSearchException {
-       
+    private static boolean matches(final SearchQuery.DateOperator operator, final String headerName, final Message<?> message) throws MailboxException {
+
         final Date date = operator.getDate();
         final DateResolution res = operator.getDateResultion();
-        final String value = headerValue(headerName, message);
-        if (value == null) {
-            return false;
-        } else {
-            try {
-                final Date isoFieldValue = toISODate(value);
-                final SearchQuery.DateComparator type = operator.getType();
-                switch (type) {
+        try {
+            final String value = headerValue(headerName, message);
+            if (value == null) {
+                return false;
+            } else {
+                try {
+                    final Date isoFieldValue = toISODate(value);
+                    final SearchQuery.DateComparator type = operator.getType();
+                    switch (type) {
                     case AFTER:
                         return after(isoFieldValue, date, res);
                     case BEFORE:
@@ -429,18 +436,21 @@ public class MessageSearches implements 
                         return on(isoFieldValue, date, res);
                     default:
                         throw new UnsupportedSearchException();
+                    }
+                } catch (ParseException e) {
+                    return false;
                 }
-            } catch (ParseException e) {
-                return false;
             }
+        } catch (IOException e) {
+            return false;
         }
     }
 
-    private static String headerValue(final String headerName, final Message<?> message) {
-        final List<Header> headers = message.getHeaders();
+    private static String headerValue(final String headerName, final Message<?> message) throws MailboxException, IOException {
+        final List<Header> headers = ResultUtils.createHeaders(message);
         String value = null;
         for (Header header:headers) {
-            final String name = header.getFieldName();
+            final String name = header.getName();
             if (headerName.equalsIgnoreCase(name)) {
                 value = header.getValue();
                 break;



---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org