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 ma...@apache.org on 2016/01/12 14:18:56 UTC

svn commit: r1724227 - in /james/project/trunk/mailbox: hbase/src/main/java/org/apache/james/mailbox/hbase/mail/ jcr/src/main/java/org/apache/james/mailbox/jcr/mail/model/ jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/ maildir/src/m...

Author: matthieu
Date: Tue Jan 12 13:18:56 2016
New Revision: 1724227

URL: http://svn.apache.org/viewvc?rev=1724227&view=rev
Log:
MAILBOX-262 try to make Abstract*Message useless by delegating when needed

Added:
    james/project/trunk/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMessage.java
      - copied, changed from r1724226, james/project/trunk/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMailboxMessage.java
    james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/DelegatingMailboxMessage.java
      - copied, changed from r1724226, james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/AbstractMailboxMessage.java
    james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/FlagsBuilder.java
      - copied, changed from r1724226, james/project/trunk/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AbstractMailboxMessageTest.java
    james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/MessageUidComparator.java
    james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMessage.java
    james/project/trunk/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/DelegatingMailboxMessageTest.java
      - copied, changed from r1724226, james/project/trunk/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AbstractMailboxMessageTest.java
Removed:
    james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/AbstractMailboxMessage.java
    james/project/trunk/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AbstractMailboxMessageTest.java
Modified:
    james/project/trunk/mailbox/hbase/src/main/java/org/apache/james/mailbox/hbase/mail/HBaseMailboxMessage.java
    james/project/trunk/mailbox/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/model/JCRMailboxMessage.java
    james/project/trunk/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMailboxMessage.java
    james/project/trunk/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAEncryptedMailboxMessage.java
    james/project/trunk/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAMailboxMessage.java
    james/project/trunk/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAStreamingMailboxMessage.java
    james/project/trunk/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMailboxMessage.java
    james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessage.java
    james/project/trunk/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessageTest.java

Modified: james/project/trunk/mailbox/hbase/src/main/java/org/apache/james/mailbox/hbase/mail/HBaseMailboxMessage.java
URL: http://svn.apache.org/viewvc/james/project/trunk/mailbox/hbase/src/main/java/org/apache/james/mailbox/hbase/mail/HBaseMailboxMessage.java?rev=1724227&r1=1724226&r2=1724227&view=diff
==============================================================================
--- james/project/trunk/mailbox/hbase/src/main/java/org/apache/james/mailbox/hbase/mail/HBaseMailboxMessage.java (original)
+++ james/project/trunk/mailbox/hbase/src/main/java/org/apache/james/mailbox/hbase/mail/HBaseMailboxMessage.java Tue Jan 12 13:18:56 2016
@@ -25,6 +25,7 @@ import static org.apache.james.mailbox.h
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.SequenceInputStream;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Date;
@@ -36,9 +37,12 @@ import org.apache.hadoop.conf.Configurat
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.hbase.HBaseId;
 import org.apache.james.mailbox.hbase.io.ChunkInputStream;
-import org.apache.james.mailbox.store.mail.model.AbstractMailboxMessage;
+import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
+import org.apache.james.mailbox.store.mail.model.FlagsBuilder;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
+import org.apache.james.mailbox.store.mail.model.MessageId;
 import org.apache.james.mailbox.store.mail.model.Property;
+import org.apache.james.mailbox.store.mail.model.impl.MessageUidComparator;
 import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
 
 /**
@@ -46,8 +50,9 @@ import org.apache.james.mailbox.store.ma
  * message content. The message content is retrieved using a ChunkedInputStream
  * directly from HBase.
  */
-public class HBaseMailboxMessage extends AbstractMailboxMessage<HBaseId> {
+public class HBaseMailboxMessage implements MailboxMessage<HBaseId> {
 
+    private static final MessageUidComparator MESSAGE_UID_COMPARATOR = new MessageUidComparator();
     private static final String TOSTRING_SEPARATOR = " ";
     /** Configuration for the HBase cluster */
     private final Configuration conf;
@@ -84,18 +89,12 @@ public class HBaseMailboxMessage extends
     /** Meta data for this message */
     private List<Property> properties;
     private List<String> userFlags;
-
+    
     /**
      * Create a copy of the given message.
      * All properties are cloned except mailbox and UID.
-     * @param mailboxId
-     * @param uid
-     * @param modSeq
-     * @param original
-     * @throws MailboxException
      */
     public HBaseMailboxMessage(Configuration conf, HBaseId mailboxId, long uid, long modSeq, MailboxMessage<?> original) throws MailboxException {
-        super();
         this.conf = conf;
         this.mailboxId = mailboxId;
         this.uid = uid;
@@ -117,15 +116,6 @@ public class HBaseMailboxMessage extends
         this.properties = original.getProperties();
     }
 
-    /**
-     * Create a copy of the given message.
-     * @param mailboxId
-     * @param internalDate
-     * @param flags
-     * @param contentOctets
-     * @param bodyStartOctet
-     * @param propertyBuilder
-     */
     public HBaseMailboxMessage(Configuration conf, HBaseId mailboxId, Date internalDate, Flags flags, long contentOctets, int bodyStartOctet, PropertyBuilder propertyBuilder) {
         super();
         this.conf = conf;
@@ -142,25 +132,22 @@ public class HBaseMailboxMessage extends
         this.properties = propertyBuilder.toProperties();
     }
 
-    /*
-     * (non-Javadoc)
-     * @see org.apache.james.mailbox.store.mail.model.MailboxMessage#getBodyContent()
-     */
     @Override
     public InputStream getBodyContent() throws IOException {
         return new ChunkInputStream(conf, MESSAGES_TABLE, MESSAGE_DATA_BODY_CF, messageRowKey(this));
     }
 
-    /*
-     * (non-Javadoc)
-     * @see org.apache.james.mailbox.store.mail.model.MailboxMessage#getHeaderContent()
-     */
     @Override
     public InputStream getHeaderContent() throws IOException {
         return new ChunkInputStream(conf, MESSAGES_TABLE, MESSAGE_DATA_HEADERS_CF, messageRowKey(this));
     }
 
     @Override
+    public InputStream getFullContent() throws IOException {
+        return new SequenceInputStream(getHeaderContent(), getBodyContent());
+    }
+
+    @Override
     public int hashCode() {
         final int PRIME = 31;
         int result = 1;
@@ -196,19 +183,11 @@ public class HBaseMailboxMessage extends
         return true;
     }
 
-    /*
-     * (non-Javadoc)
-     * @see org.apache.james.mailbox.store.mail.model.MailboxMessage#getModSeq()
-     */
     @Override
     public long getModSeq() {
         return modSeq;
     }
 
-    /*
-     * (non-Javadoc)
-     * @see org.apache.james.mailbox.store.mail.model.MailboxMessage#setModSeq(long)
-     */
     @Override
     public void setModSeq(long modSeq) {
         this.modSeq = modSeq;
@@ -234,6 +213,11 @@ public class HBaseMailboxMessage extends
         return subType;
     }
 
+    @Override
+    public long getBodyOctets() {
+        return getFullContentOctets() - bodyStartOctet;
+    }
+
     /**
      * Gets a read-only list of meta-data properties.
      * For properties with multiple values, this list will contain
@@ -259,87 +243,56 @@ public class HBaseMailboxMessage extends
         this.textualLineCount = textualLineCount;
     }
 
-    /*
-     * (non-Javadoc)
-     * @see org.apache.james.mailbox.store.mail.model.Document#getFullContentOctets()
-     */
     @Override
     public long getFullContentOctets() {
         return contentOctets;
     }
 
     @Override
-    protected int getBodyStartOctet() {
-        return bodyStartOctet;
+    public MessageId getMessageId() {
+        return new DefaultMessageId(getMailboxId(), getUid());
     }
 
-    /**
-     * @see MailboxMessage#getInternalDate()
-     */
     @Override
     public Date getInternalDate() {
         return internalDate;
     }
 
-    /**
-     * @see MailboxMessage#getMailboxId()
-     */
     @Override
     public HBaseId getMailboxId() {
         return mailboxId;
     }
 
-    /**
-     * @see MailboxMessage#getUid()
-     */
     @Override
     public long getUid() {
         return uid;
     }
 
-    /**
-     * @see MailboxMessage#isAnswered()
-     */
     @Override
     public boolean isAnswered() {
         return answered;
     }
 
-    /**
-     * @see MailboxMessage#isDeleted()
-     */
     @Override
     public boolean isDeleted() {
         return deleted;
     }
 
-    /**
-     * @see MailboxMessage#isDraft()
-     */
     @Override
     public boolean isDraft() {
         return draft;
     }
 
-    /**
-     * @see MailboxMessage#isFlagged()
-     */
     @Override
     public boolean isFlagged() {
         return flagged;
     }
 
-    /**
-     * @see MailboxMessage#isRecent()
-     */
     @Override
     public boolean isRecent() {
         return recent;
     }
 
-    /**
-     * @see MailboxMessage#isSeen()
-     */
     @Override
     public boolean isSeen() {
         return seen;
@@ -350,9 +303,6 @@ public class HBaseMailboxMessage extends
         this.uid = uid;
     }
 
-    /**
-     * @see MailboxMessage#setFlags(javax.mail.Flags)
-     */
     @Override
     public final void setFlags(Flags flags) {
         answered = flags.contains(Flags.Flag.ANSWERED);
@@ -366,12 +316,14 @@ public class HBaseMailboxMessage extends
         userFlags.addAll(Arrays.asList(userflags));
     }
 
+    @Override
+    public Flags createFlags() {
+        return FlagsBuilder.createFlags(this, createUserFlags());
+    }
+
     /**
      * This implementation supports user flags
-     *
-     *
      */
-    @Override
     public String[] createUserFlags() {
         String[] flags = new String[userFlags.size()];
         for (int i = 0; i < userFlags.size(); i++) {
@@ -396,4 +348,9 @@ public class HBaseMailboxMessage extends
                 + " )";
         return retValue;
     }
+
+    @Override
+    public int compareTo(MailboxMessage<HBaseId> other) {
+        return MESSAGE_UID_COMPARATOR.compare(this, other);
+    }
 }

Modified: james/project/trunk/mailbox/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/model/JCRMailboxMessage.java
URL: http://svn.apache.org/viewvc/james/project/trunk/mailbox/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/model/JCRMailboxMessage.java?rev=1724227&r1=1724226&r2=1724227&view=diff
==============================================================================
--- james/project/trunk/mailbox/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/model/JCRMailboxMessage.java (original)
+++ james/project/trunk/mailbox/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/model/JCRMailboxMessage.java Tue Jan 12 13:18:56 2016
@@ -41,18 +41,19 @@ import org.apache.james.mailbox.exceptio
 import org.apache.james.mailbox.jcr.JCRId;
 import org.apache.james.mailbox.jcr.JCRImapConstants;
 import org.apache.james.mailbox.jcr.Persistent;
-import org.apache.james.mailbox.store.mail.model.AbstractMailboxMessage;
+import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
+import org.apache.james.mailbox.store.mail.model.FlagsBuilder;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
+import org.apache.james.mailbox.store.mail.model.MessageId;
 import org.apache.james.mailbox.store.mail.model.Property;
+import org.apache.james.mailbox.store.mail.model.impl.MessageUidComparator;
 import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
 import org.slf4j.Logger;
 
-/**
- * JCR implementation of {@link MailboxMessage}
- *
- */
-public class JCRMailboxMessage extends AbstractMailboxMessage<JCRId> implements JCRImapConstants, Persistent{
+public class JCRMailboxMessage implements MailboxMessage<JCRId>, JCRImapConstants, Persistent {
 
+    private static final MessageUidComparator MESSAGE_UID_COMPARATOR = new MessageUidComparator();
+    
     private Node node;
     private final Logger logger;
     private SharedInputStream content;
@@ -125,12 +126,8 @@ public class JCRMailboxMessage extends A
         
     }
 
-
     /**
      * Create a copy of the given message
-     * 
-     * @param message
-     * @throws IOException 
      */
     public JCRMailboxMessage(JCRId mailboxUUID, long uid, long modSeq, JCRMailboxMessage message, Logger logger) throws MailboxException {
         this.mailboxUUID = mailboxUUID;
@@ -158,11 +155,8 @@ public class JCRMailboxMessage extends A
             this.properties.add(new JCRProperty(property,  logger));
         }
     }
-    
-    /*
-     * (non-Javadoc)
-     * @see org.apache.james.mailbox.store.mail.model.Document#getFullContentOctets()
-     */
+
+    @Override
     public long getFullContentOctets() {
         if (isPersistent()) {
             try {
@@ -176,10 +170,7 @@ public class JCRMailboxMessage extends A
         return size;
     }
 
-    /*
-     * (non-Javadoc)
-     * @see org.apache.james.mailbox.store.mail.model.Document#getMediaType()
-     */
+    @Override
     public String getMediaType() {
         if (isPersistent()) {
             try {
@@ -192,10 +183,7 @@ public class JCRMailboxMessage extends A
         return mediaType;
     }
 
-    /*
-     * (non-Javadoc)
-     * @see org.apache.james.mailbox.store.mail.model.Document#getProperties()
-     */
+    @Override
     public List<Property> getProperties() {
         if (isPersistent()) {
             try {
@@ -212,10 +200,7 @@ public class JCRMailboxMessage extends A
         return new ArrayList<Property>(properties);
     }
 
-    /*
-     * (non-Javadoc)
-     * @see org.apache.james.mailbox.store.mail.model.Document#getSubType()
-     */
+    @Override
     public String getSubType() {
         if (isPersistent()) {
             try {
@@ -228,10 +213,12 @@ public class JCRMailboxMessage extends A
         return subType;
     }
 
-    /*
-     * (non-Javadoc)
-     * @see org.apache.james.mailbox.store.mail.model.Document#getTextualLineCount()
-     */
+    @Override
+    public long getBodyOctets() {
+        return getFullContentOctets() - getBodyStartOctet();
+    }
+
+    @Override
     public Long getTextualLineCount() {
         if (isPersistent()) {
             try {
@@ -247,18 +234,12 @@ public class JCRMailboxMessage extends A
         return textualLineCount;
     }
 
-    /*
-     * (non-Javadoc)
-     * @see org.apache.james.mailbox.jcr.Persistent#getNode()
-     */
+    @Override
     public Node getNode() {
         return node;
     }
 
-    /*
-     * (non-Javadoc)
-     * @see org.apache.james.mailbox.jcr.Persistent#isPersistent()
-     */
+    @Override
     public boolean isPersistent() {
         return node != null;
     }
@@ -273,11 +254,8 @@ public class JCRMailboxMessage extends A
         }
         return null;
     }
-    
-    /*
-     * (non-Javadoc)
-     * @see org.apache.james.mailbox.jcr.Persistent#merge(javax.jcr.Node)
-     */
+
+    @Override
     public void merge(Node node) throws RepositoryException, IOException {
 
         // update the flags 
@@ -343,13 +321,7 @@ public class JCRMailboxMessage extends A
 
     }
     
-    @Override
-    protected String[] createUserFlags() {
-        return userFlags;
-    }
-
-    @Override
-    protected int getBodyStartOctet() {
+    private int getBodyStartOctet() {
         if (isPersistent()) {
             try {
                 return (int)node.getProperty(BODY_START_OCTET_PROPERTY).getLong();
@@ -399,14 +371,12 @@ public class JCRMailboxMessage extends A
     }
 
 
+    @Override
+    public MessageId getMessageId() {
+        return new DefaultMessageId(getMailboxId(), getUid());
+    }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * org.apache.james.mailbox.store.mail.model.MailboxMembership#getInternalDate
-     * ()
-     */
+    @Override
     public Date getInternalDate() {
         if (isPersistent()) {
             try {
@@ -423,12 +393,7 @@ public class JCRMailboxMessage extends A
         return internalDate;
     }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * org.apache.james.mailbox.store.mail.model.MailboxMembership#getMailboxId()
-     */
+    @Override
     public JCRId getMailboxId() {
         if (isPersistent()) {
             try {
@@ -442,11 +407,7 @@ public class JCRMailboxMessage extends A
     }
 
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.apache.james.mailbox.store.mail.model.MailboxMembership#getUid()
-     */
+    @Override
     public long getUid() {
         if (isPersistent()) {
             try {
@@ -460,12 +421,7 @@ public class JCRMailboxMessage extends A
         return uid;
     }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * org.apache.james.mailbox.store.mail.model.MailboxMembership#isAnswered()
-     */
+    @Override
     public boolean isAnswered() {
         if (isPersistent()) {
             try {
@@ -482,11 +438,7 @@ public class JCRMailboxMessage extends A
         return answered;
     }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.apache.james.mailbox.store.mail.model.MailboxMembership#isDeleted()
-     */
+    @Override
     public boolean isDeleted() {
         if (isPersistent()) {
             try {
@@ -503,11 +455,7 @@ public class JCRMailboxMessage extends A
         return deleted;
     }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.apache.james.mailbox.store.mail.model.MailboxMembership#isDraft()
-     */
+    @Override
     public boolean isDraft() {
         if (isPersistent()) {
             try {
@@ -522,11 +470,7 @@ public class JCRMailboxMessage extends A
         return draft;
     }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.apache.james.mailbox.store.mail.model.MailboxMembership#isFlagged()
-     */
+    @Override
     public boolean isFlagged() {
         if (isPersistent()) {
             try {
@@ -542,11 +486,7 @@ public class JCRMailboxMessage extends A
         return flagged;
     }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.apache.james.mailbox.store.mail.model.MailboxMembership#isRecent()
-     */
+    @Override
     public boolean isRecent() {
         if (isPersistent()) {
             try {
@@ -561,11 +501,7 @@ public class JCRMailboxMessage extends A
         return recent;
     }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.apache.james.mailbox.store.mail.model.MailboxMembership#isSeen()
-     */
+    @Override
     public boolean isSeen() {
         if (isPersistent()) {
             try {
@@ -579,13 +515,7 @@ public class JCRMailboxMessage extends A
         return seen;
     }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * org.apache.james.mailbox.store.mail.model.MailboxMembership#setFlags(javax
-     * .mail.Flags)
-     */
+    @Override
     public void setFlags(Flags flags) {
         if (isPersistent()) {
             try {
@@ -616,12 +546,11 @@ public class JCRMailboxMessage extends A
         }
     }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * org.apache.james.mailbox.store.mail.model.MailboxMembership#unsetRecent()
-     */
+    @Override
+    public Flags createFlags() {
+        return FlagsBuilder.createFlags(this, userFlags);
+    }
+
     public void unsetRecent() {
         if (isPersistent()) {
             try {
@@ -636,7 +565,6 @@ public class JCRMailboxMessage extends A
     }
 
 
-
     public String getId() {
         if (isPersistent()) {
             try {
@@ -692,20 +620,14 @@ public class JCRMailboxMessage extends A
         return content.newStream(0, -1);
     }
 
-    /*
-     * (non-Javadoc)
-     * @see org.apache.james.mailbox.store.mail.model.MailboxMessage#getBodyContent()
-     */
+    @Override
     public InputStream getBodyContent() throws IOException {
         InputStream body = getFullContent();
         IOUtils.skipFully(body,  getBodyStartOctet());
         return body;
     }
 
-    /*
-     * (non-Javadoc)
-     * @see org.apache.james.mailbox.store.mail.model.MailboxMessage#getModSeq()
-     */
+    @Override
     public long getModSeq() {
         if (isPersistent()) {
             try {
@@ -719,10 +641,7 @@ public class JCRMailboxMessage extends A
         return modSeq;
     }
 
-    /*
-     * (non-Javadoc)
-     * @see org.apache.james.mailbox.store.mail.model.MailboxMessage#setModSeq(long)
-     */
+    @Override
     public void setModSeq(long modSeq) {
         if (isPersistent()) {
             try {
@@ -735,10 +654,7 @@ public class JCRMailboxMessage extends A
         }  
     }
 
-    /*
-     * (non-Javadoc)
-     * @see org.apache.james.mailbox.store.mail.model.MailboxMessage#setUid(long)
-     */
+    @Override
     public void setUid(long uid) {
         if (isPersistent()) {
             try {
@@ -751,10 +667,7 @@ public class JCRMailboxMessage extends A
         }          
     }
 
-    /*
-     * (non-Javadoc)
-     * @see org.apache.james.mailbox.store.mail.model.MailboxMessage#getHeaderContent()
-     */
+    @Override
     public InputStream getHeaderContent() throws IOException {
         long limit = getBodyStartOctet();
         if (limit < 0) {
@@ -762,4 +675,9 @@ public class JCRMailboxMessage extends A
         }
         return new BoundedInputStream(getFullContent(), limit);
     }
+
+    @Override
+    public int compareTo(MailboxMessage<JCRId> other) {
+        return MESSAGE_UID_COMPARATOR.compare(this, other);
+    }
 }

Modified: james/project/trunk/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMailboxMessage.java
URL: http://svn.apache.org/viewvc/james/project/trunk/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMailboxMessage.java?rev=1724227&r1=1724226&r2=1724227&view=diff
==============================================================================
--- james/project/trunk/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMailboxMessage.java (original)
+++ james/project/trunk/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMailboxMessage.java Tue Jan 12 13:18:56 2016
@@ -18,6 +18,9 @@
  ****************************************************************/
 package org.apache.james.mailbox.jpa.mail.model.openjpa;
 
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.SequenceInputStream;
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Date;
@@ -42,16 +45,20 @@ import org.apache.james.mailbox.jpa.JPAI
 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.AbstractMailboxMessage;
+import org.apache.james.mailbox.store.mail.model.DelegatingMailboxMessage;
+import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
+import org.apache.james.mailbox.store.mail.model.FlagsBuilder;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
+import org.apache.james.mailbox.store.mail.model.MessageId;
 import org.apache.james.mailbox.store.mail.model.Property;
+import org.apache.james.mailbox.store.mail.model.impl.MessageUidComparator;
 import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
 import org.apache.openjpa.persistence.jdbc.ElementJoinColumn;
 import org.apache.openjpa.persistence.jdbc.ElementJoinColumns;
 import org.apache.openjpa.persistence.jdbc.Index;
 
 /**
- * Abstract base class for JPA based implementations of {@link AbstractMailboxMessage}
+ * Abstract base class for JPA based implementations of {@link DelegatingMailboxMessage}
  */
 @IdClass(AbstractJPAMailboxMessage.MailboxIdUidKey.class)
 @NamedQueries({
@@ -99,10 +106,9 @@ import org.apache.openjpa.persistence.jd
             query="DELETE FROM MailboxMessage message")
 })
 @MappedSuperclass
-public abstract class AbstractJPAMailboxMessage extends AbstractMailboxMessage<JPAId> {
-
-
+public abstract class AbstractJPAMailboxMessage implements MailboxMessage<JPAId> {
 
+    private static final MessageUidComparator MESSAGE_UID_COMPARATOR = new MessageUidComparator();
     private static final String TOSTRING_SEPARATOR = " ";
 
     /** Identifies composite key */
@@ -244,11 +250,7 @@ public abstract class AbstractJPAMailbox
     @ElementJoinColumn(name="MAIL_UID", referencedColumnName="MAIL_UID")})
     private List<JPAUserFlag> userFlags;
     
-    @Deprecated
-    public AbstractJPAMailboxMessage() {}
-
     public AbstractJPAMailboxMessage(JPAMailbox mailbox, Date internalDate, Flags flags, final long contentOctets, final int bodyStartOctet, final PropertyBuilder propertyBuilder) {
-        super();
         this.mailbox = mailbox;
         this.internalDate = internalDate;
         userFlags = new ArrayList<JPAUserFlag>();
@@ -275,7 +277,6 @@ public abstract class AbstractJPAMailbox
      * @param uid new UID
      * @param modSeq new modSeq
      * @param original message to be copied, not null
-     * @throws IOException 
      */
     public AbstractJPAMailboxMessage(JPAMailbox mailbox, long uid, long modSeq, MailboxMessage<?> original) throws MailboxException {
         super();
@@ -394,7 +395,6 @@ public abstract class AbstractJPAMailbox
         return contentOctets;
     }
 
-    @Override
     protected int getBodyStartOctet() {
         return bodyStartOctet;
     }
@@ -519,12 +519,11 @@ public abstract class AbstractJPAMailbox
         return mailbox;
     }
 
-    /**
-     * This implementation supports user flags
-     * 
-     * 
-     */
     @Override
+    public Flags createFlags() {
+        return FlagsBuilder.createFlags(this, createUserFlags());
+    }
+
     protected String[] createUserFlags() {
         String[] flags = new String[userFlags.size()];
         for (int i = 0; i < userFlags.size(); i++) {
@@ -540,6 +539,26 @@ public abstract class AbstractJPAMailbox
         this.mailbox = mailbox;
     }
 
+    @Override
+    public InputStream getFullContent() throws IOException {
+        return new SequenceInputStream(getHeaderContent(), getBodyContent());
+    }
+
+    @Override
+    public long getBodyOctets() {
+        return getFullContentOctets() - getBodyStartOctet();
+    }
+
+    @Override
+    public MessageId getMessageId() {
+        return new DefaultMessageId(getMailboxId(), uid);
+    }
+
+    @Override
+    public int compareTo(MailboxMessage<JPAId> other) {
+        return MESSAGE_UID_COMPARATOR.compare(this, other);
+    }
+
     public String toString() {
         final String retValue = 
             "message("

Modified: james/project/trunk/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAEncryptedMailboxMessage.java
URL: http://svn.apache.org/viewvc/james/project/trunk/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAEncryptedMailboxMessage.java?rev=1724227&r1=1724226&r2=1724227&view=diff
==============================================================================
--- james/project/trunk/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAEncryptedMailboxMessage.java (original)
+++ james/project/trunk/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAEncryptedMailboxMessage.java Tue Jan 12 13:18:56 2016
@@ -61,9 +61,6 @@ public class JPAEncryptedMailboxMessage
         @Factory("EncryptDecryptHelper.getDecrypted")
         @Lob private byte[] header;
         
-        @Deprecated
-        public JPAEncryptedMailboxMessage() {}
-
         public JPAEncryptedMailboxMessage(JPAMailbox mailbox, Date internalDate, int size, Flags flags, SharedInputStream content, int bodyStartOctet, final PropertyBuilder propertyBuilder) throws MailboxException {
             super(mailbox, internalDate, flags, size ,bodyStartOctet, propertyBuilder);
             try {
@@ -81,9 +78,6 @@ public class JPAEncryptedMailboxMessage
 
         /**
          * Create a copy of the given message
-         * 
-         * @param message
-         * @throws MailboxException 
          */
         public JPAEncryptedMailboxMessage(JPAMailbox mailbox, long uid, long modSeq, MailboxMessage<?> message) throws MailboxException{
             super(mailbox, uid, modSeq, message);
@@ -96,16 +90,12 @@ public class JPAEncryptedMailboxMessage
         }
 
 
-        /**
-         * @see MailboxMessage#getBodyContent()
-         */
+        @Override
         public InputStream getBodyContent() throws IOException {
             return new ByteArrayInputStream(body);
         }
 
-        /**
-         * @see MailboxMessage#getHeaderContent()
-         */
+        @Override
         public InputStream getHeaderContent() throws IOException {
             return new ByteArrayInputStream(header);
         }

Modified: james/project/trunk/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAMailboxMessage.java
URL: http://svn.apache.org/viewvc/james/project/trunk/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAMailboxMessage.java?rev=1724227&r1=1724226&r2=1724227&view=diff
==============================================================================
--- james/project/trunk/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAMailboxMessage.java (original)
+++ james/project/trunk/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAMailboxMessage.java Tue Jan 12 13:18:56 2016
@@ -55,9 +55,6 @@ public class JPAMailboxMessage extends A
     @Column(name = "HEADER_BYTES", length = 10485760, nullable = false)
     @Lob private byte[] header;
     
-    @Deprecated
-    public JPAMailboxMessage() {}
-
     public JPAMailboxMessage(JPAMailbox mailbox, Date internalDate, int size, Flags flags, SharedInputStream content, int bodyStartOctet, final PropertyBuilder propertyBuilder) throws MailboxException {
         super(mailbox, internalDate, flags, size ,bodyStartOctet, propertyBuilder);
         try {
@@ -75,9 +72,6 @@ public class JPAMailboxMessage extends A
 
     /**
      * Create a copy of the given message
-     * 
-     * @param message
-     * @throws MailboxException 
      */
     public JPAMailboxMessage(JPAMailbox mailbox, long uid, long modSeq, MailboxMessage<?> message) throws MailboxException{
         super(mailbox, uid, modSeq, message);
@@ -89,17 +83,12 @@ public class JPAMailboxMessage extends A
         }
     }
 
-
-    /**
-     * @see MailboxMessage#getBodyContent()
-     */
+    @Override
     public InputStream getBodyContent() throws IOException {
         return new ByteArrayInputStream(body);
     }
 
-    /**
-     * @see MailboxMessage#getHeaderContent()
-     */
+    @Override
     public InputStream getHeaderContent() throws IOException {
         return new ByteArrayInputStream(header);
     }

Modified: james/project/trunk/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAStreamingMailboxMessage.java
URL: http://svn.apache.org/viewvc/james/project/trunk/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAStreamingMailboxMessage.java?rev=1724227&r1=1724226&r2=1724227&view=diff
==============================================================================
--- james/project/trunk/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAStreamingMailboxMessage.java (original)
+++ james/project/trunk/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAStreamingMailboxMessage.java Tue Jan 12 13:18:56 2016
@@ -61,9 +61,6 @@ public class JPAStreamingMailboxMessage
 
     private SharedInputStream content;
 
-    @Deprecated
-    public JPAStreamingMailboxMessage() {}
-
     public JPAStreamingMailboxMessage(JPAMailbox mailbox, Date internalDate, int size, Flags flags, SharedInputStream content, int bodyStartOctet, final PropertyBuilder propertyBuilder) throws MailboxException {
         super(mailbox, internalDate, flags, size ,bodyStartOctet, propertyBuilder);
         this.content = content;
@@ -79,9 +76,6 @@ public class JPAStreamingMailboxMessage
 
     /**
      * Create a copy of the given message
-     * 
-     * @param message
-     * @throws IOException 
      */
     public JPAStreamingMailboxMessage(JPAMailbox mailbox, long uid, long modSeq, MailboxMessage<?> message) throws MailboxException {
         super(mailbox, uid, modSeq, message);
@@ -94,17 +88,12 @@ public class JPAStreamingMailboxMessage
         }
     }
 
-    
-    /**
-     * @see MailboxMessage#getBodyContent()
-     */
+    @Override
     public InputStream getBodyContent() throws IOException {
         return content.newStream(getBodyStartOctet(), -1);
     }
 
-    /**
-     * @see MailboxMessage#getHeaderContent()
-     */
+    @Override
     public InputStream getHeaderContent() throws IOException {
         int headerEnd = getBodyStartOctet() -2;
         if (headerEnd < 0) {

Modified: james/project/trunk/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMailboxMessage.java
URL: http://svn.apache.org/viewvc/james/project/trunk/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMailboxMessage.java?rev=1724227&r1=1724226&r2=1724227&view=diff
==============================================================================
--- james/project/trunk/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMailboxMessage.java (original)
+++ james/project/trunk/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMailboxMessage.java Tue Jan 12 13:18:56 2016
@@ -19,42 +19,19 @@
 package org.apache.james.mailbox.maildir.mail.model;
 
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.IOException;
-import java.io.InputStream;
-import java.io.PushbackInputStream;
-import java.util.Date;
-import java.util.List;
 
 import javax.mail.Flags;
-import javax.mail.util.SharedFileInputStream;
 
-import org.apache.commons.io.IOUtils;
 import org.apache.james.mailbox.maildir.MaildirFolder;
 import org.apache.james.mailbox.maildir.MaildirId;
 import org.apache.james.mailbox.maildir.MaildirMessageName;
-import org.apache.james.mailbox.store.mail.model.AbstractMailboxMessage;
+import org.apache.james.mailbox.store.mail.model.DelegatingMailboxMessage;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
-import org.apache.james.mailbox.store.mail.model.MailboxMessage;
-import org.apache.james.mailbox.store.mail.model.Property;
-import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
-import org.apache.james.mailbox.store.streaming.CountingInputStream;
-import org.apache.james.mailbox.store.streaming.LimitingFileInputStream;
-import org.apache.james.mime4j.MimeException;
-import org.apache.james.mime4j.message.DefaultBodyDescriptorBuilder;
-import org.apache.james.mime4j.message.MaximalBodyDescriptor;
-import org.apache.james.mime4j.stream.EntityState;
-import org.apache.james.mime4j.stream.MimeConfig;
-import org.apache.james.mime4j.stream.MimeTokenStream;
-import org.apache.james.mime4j.stream.RecursionMode;
-
-public class MaildirMailboxMessage extends AbstractMailboxMessage<MaildirId> {
-
-	private MaildirMessageName messageName;
-    private int bodyStartOctet;
-    private final PropertyBuilder propertyBuilder = new PropertyBuilder();
-    private boolean parsed;
+
+public class MaildirMailboxMessage extends DelegatingMailboxMessage<MaildirId> {
+
     private boolean answered;
     private boolean deleted;
     private boolean draft;
@@ -67,6 +44,8 @@ public class MaildirMailboxMessage exten
     private long modSeq;
     
     public MaildirMailboxMessage(Mailbox<MaildirId> mailbox, long uid, MaildirMessageName messageName) throws IOException {
+        super(new MaildirMessage(messageName));
+
         this.mailbox = mailbox;
         setUid(uid);
         setModSeq(messageName.getFile().lastModified());
@@ -86,7 +65,6 @@ public class MaildirMailboxMessage exten
             }
         }
         setFlags(flags);
-        this.messageName = messageName;
     }
 
     
@@ -104,11 +82,8 @@ public class MaildirMailboxMessage exten
     public void setUid(long uid) {
         this.uid = uid;
     }
-    /**
-     * @see
-     * MailboxMessage#setFlags(
-     * javax.mail.Flags)
-     */
+
+
     @Override
     public void setFlags(Flags flags) {
         if (flags != null) {
@@ -121,54 +96,31 @@ public class MaildirMailboxMessage exten
         }
     }
     
-    /**
-     * @see
-     * MailboxMessage#isAnswered()
-     */
     @Override
     public boolean isAnswered() {
         return answered;
     }
 
-    /**
-     * @see
-     * MailboxMessage#isDeleted()
-     */
     @Override
     public boolean isDeleted() {
         return deleted;
     }
 
-    /**
-     * @see
-     * MailboxMessage#isDraft()
-     */
     @Override
     public boolean isDraft() {
         return draft;
     }
 
-    /**
-     * @see
-     * MailboxMessage#isFlagged()
-     */
     @Override
     public boolean isFlagged() {
         return flagged;
     }
 
-    /**
-     * @see
-     * MailboxMessage#isRecent()
-     */
     @Override
     public boolean isRecent() {
         return recent;
     }
 
-    /**
-     * @see MailboxMessage#isSeen()
-     */
     @Override
     public boolean isSeen() {
         return seen;
@@ -182,8 +134,17 @@ public class MaildirMailboxMessage exten
     public boolean isNew() {
         return newMessage;
     }
-    
-    
+
+    @Override
+    public long getModSeq() {
+        return modSeq;
+    }
+
+    @Override
+    public void setModSeq(long modSeq) {
+        this.modSeq = modSeq;
+    }
+
     @Override
     public String toString() {
         StringBuilder theString = new StringBuilder("MaildirMailboxMessage ");
@@ -205,259 +166,4 @@ public class MaildirMailboxMessage exten
         return theString.toString();
     }
 
-    /**
-     * @see MailboxMessage#getModSeq()
-     */
-    @Override
-    public long getModSeq() {
-        return modSeq;
-    }
-
-    /**
-     * @see MailboxMessage#setModSeq(long)
-     */
-    @Override
-    public void setModSeq(long modSeq) {
-        this.modSeq = modSeq;
-    }
-    /**
-     * Parse message if needed
-     */
-    private synchronized void parseMessage() {
-        if (parsed)
-            return;
-        SharedFileInputStream tmpMsgIn = null;
-        try {
-            tmpMsgIn = new SharedFileInputStream(messageName.getFile());
-
-            bodyStartOctet = bodyStartOctet(tmpMsgIn);
-
-            // Disable line length... This should be handled by the smtp server
-            // component and not the parser itself
-            // https://issues.apache.org/jira/browse/IMAP-122
-            MimeConfig config = MimeConfig.custom().setMaxLineLen(-1).build();
-            final MimeTokenStream parser = new MimeTokenStream(config, new DefaultBodyDescriptorBuilder());
-            parser.setRecursionMode(RecursionMode.M_NO_RECURSE);
-            parser.parse(tmpMsgIn.newStream(0, -1));
-
-            EntityState next = parser.next();
-            while (next != EntityState.T_BODY && next != EntityState.T_END_OF_STREAM && next != EntityState.T_START_MULTIPART) {
-                next = parser.next();
-            }
-            final MaximalBodyDescriptor descriptor = (MaximalBodyDescriptor) parser.getBodyDescriptor();
-            final String mediaType;
-            final String mediaTypeFromHeader = descriptor.getMediaType();
-            final String subType;
-            if (mediaTypeFromHeader == null) {
-                mediaType = "text";
-                subType = "plain";
-            } else {
-                mediaType = mediaTypeFromHeader;
-                subType = descriptor.getSubType();
-            }
-            propertyBuilder.setMediaType(mediaType);
-            propertyBuilder.setSubType(subType);
-            propertyBuilder.setContentID(descriptor.getContentId());
-            propertyBuilder.setContentDescription(descriptor.getContentDescription());
-            propertyBuilder.setContentLocation(descriptor.getContentLocation());
-            propertyBuilder.setContentMD5(descriptor.getContentMD5Raw());
-            propertyBuilder.setContentTransferEncoding(descriptor.getTransferEncoding());
-            propertyBuilder.setContentLanguage(descriptor.getContentLanguage());
-            propertyBuilder.setContentDispositionType(descriptor.getContentDispositionType());
-            propertyBuilder.setContentDispositionParameters(descriptor.getContentDispositionParameters());
-            propertyBuilder.setContentTypeParameters(descriptor.getContentTypeParameters());
-            // Add missing types
-            final String codeset = descriptor.getCharset();
-            if (codeset == null) {
-                if ("TEXT".equalsIgnoreCase(mediaType)) {
-                    propertyBuilder.setCharset("us-ascii");
-                }
-            } else {
-                propertyBuilder.setCharset(codeset);
-            }
-
-            final String boundary = descriptor.getBoundary();
-            if (boundary != null) {
-                propertyBuilder.setBoundary(boundary);
-            }
-            if ("text".equalsIgnoreCase(mediaType)) {
-                long lines = -1;
-                final CountingInputStream bodyStream = new CountingInputStream(parser.getInputStream());
-                try {
-                    bodyStream.readAll();
-                    lines = bodyStream.getLineCount();
-                } finally {
-                    IOUtils.closeQuietly(bodyStream);
-                }
-
-                next = parser.next();
-                if (next == EntityState.T_EPILOGUE) {
-                    final CountingInputStream epilogueStream = new CountingInputStream(parser.getInputStream());
-                    try {
-                        epilogueStream.readAll();
-                        lines += epilogueStream.getLineCount();
-                    } finally {
-                        IOUtils.closeQuietly(epilogueStream);
-                    }
-                }
-                propertyBuilder.setTextualLineCount(lines);
-            }
-        } catch (IOException e) {
-            // has successfully been parsen when appending, shouldn't give any
-            // problems
-        } catch (MimeException e) {
-            // has successfully been parsen when appending, shouldn't give any
-            // problems
-        } finally {
-            if (tmpMsgIn != null) {
-                try {
-                    tmpMsgIn.close();
-                } catch (IOException e) {
-                    // ignore on close
-                }
-            }
-            parsed = true;
-        }
-    }
-
-    /**
-     * Return the position in the given {@link InputStream} at which the Body of
-     * the MailboxMessage starts
-     * 
-     * @param msgIn
-     * @return bodyStartOctet
-     * @throws IOException
-     */
-    private int bodyStartOctet(InputStream msgIn) throws IOException {
-        // we need to pushback maximal 3 bytes
-        PushbackInputStream in = new PushbackInputStream(msgIn, 3);
-        int localBodyStartOctet = in.available();
-        int i = -1;
-        int count = 0;
-        while ((i = in.read()) != -1 && in.available() > 4) {
-            if (i == 0x0D) {
-                int a = in.read();
-                if (a == 0x0A) {
-                    int b = in.read();
-
-                    if (b == 0x0D) {
-                        int c = in.read();
-
-                        if (c == 0x0A) {
-                            localBodyStartOctet = count + 4;
-                            break;
-                        }
-                        in.unread(c);
-                    }
-                    in.unread(b);
-                }
-                in.unread(a);
-            }
-            count++;
-        }
-        return localBodyStartOctet;
-    }
-
-    /**
-     * @see MailboxMessage#getMediaType()
-     */
-    @Override
-    public String getMediaType() {
-        parseMessage();
-        return propertyBuilder.getMediaType();
-    }
-
-    /**
-     * @see MailboxMessage#getSubType()
-     */
-    @Override
-    public String getSubType() {
-        parseMessage();
-        return propertyBuilder.getSubType();
-    }
-
-    /**
-     * @see MailboxMessage#getFullContentOctets()
-     */
-    @Override
-    public long getFullContentOctets() {
-        Long size = messageName.getSize();
-        if (size != null) {
-            return size;
-        } else {
-            try {
-                return messageName.getFile().length();
-            } catch (FileNotFoundException e) {
-                return -1;
-            }
-        }
-    }
-
-    /**
-     * @see MailboxMessage#getTextualLineCount()
-     */
-    @Override
-    public Long getTextualLineCount() {
-        parseMessage();
-        return propertyBuilder.getTextualLineCount();
-    }
-
-    /**
-     * @see MailboxMessage#getProperties()
-     */
-    @Override
-    public List<Property> getProperties() {
-        parseMessage();
-        return propertyBuilder.toProperties();
-    }
-
-    /**
-     * @see MailboxMessage#getInternalDate()
-     */
-    @Override
-    public Date getInternalDate() {
-        return messageName.getInternalDate();
-    }
-
-    /**
-     * Return the full content of the message via a {@link FileInputStream}
-     */
-    @Override
-    public InputStream getFullContent() throws IOException {
-        return new FileInputStream(messageName.getFile());
-    }
-
-    /**
-     * @see MailboxMessage#getBodyContent()
-     */
-    @Override
-    public InputStream getBodyContent() throws IOException {
-        parseMessage();
-        FileInputStream body = new FileInputStream(messageName.getFile());
-        IOUtils.skipFully(body, bodyStartOctet);
-        return body;
-
-    }
-
-    /**
-     * @see AbstractMailboxMessage#getBodyStartOctet()
-     */
-    @Override
-    protected int getBodyStartOctet() {
-        parseMessage();
-        return bodyStartOctet;
-    }
-
-    @Override
-    public InputStream getHeaderContent() throws IOException {
-        parseMessage();
-        long limit = getBodyStartOctet();
-        if (limit < 0) {
-            limit = 0;
-        }
-        return new LimitingFileInputStream(messageName.getFile(), limit);
-
-    }
-
-
 }

Copied: james/project/trunk/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMessage.java (from r1724226, james/project/trunk/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMailboxMessage.java)
URL: http://svn.apache.org/viewvc/james/project/trunk/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMessage.java?p2=james/project/trunk/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMessage.java&p1=james/project/trunk/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMailboxMessage.java&r1=1724226&r2=1724227&rev=1724227&view=diff
==============================================================================
--- james/project/trunk/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMailboxMessage.java (original)
+++ james/project/trunk/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMessage.java Tue Jan 12 13:18:56 2016
@@ -18,25 +18,10 @@
  ****************************************************************/
 package org.apache.james.mailbox.maildir.mail.model;
 
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.PushbackInputStream;
-import java.util.Date;
-import java.util.List;
-
-import javax.mail.Flags;
-import javax.mail.util.SharedFileInputStream;
-
 import org.apache.commons.io.IOUtils;
-import org.apache.james.mailbox.maildir.MaildirFolder;
-import org.apache.james.mailbox.maildir.MaildirId;
 import org.apache.james.mailbox.maildir.MaildirMessageName;
-import org.apache.james.mailbox.store.mail.model.AbstractMailboxMessage;
-import org.apache.james.mailbox.store.mail.model.Mailbox;
-import org.apache.james.mailbox.store.mail.model.MailboxMessage;
+import org.apache.james.mailbox.store.mail.model.Message;
+import org.apache.james.mailbox.store.mail.model.MessageId;
 import org.apache.james.mailbox.store.mail.model.Property;
 import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
 import org.apache.james.mailbox.store.streaming.CountingInputStream;
@@ -49,178 +34,27 @@ import org.apache.james.mime4j.stream.Mi
 import org.apache.james.mime4j.stream.MimeTokenStream;
 import org.apache.james.mime4j.stream.RecursionMode;
 
-public class MaildirMailboxMessage extends AbstractMailboxMessage<MaildirId> {
+import javax.mail.util.SharedFileInputStream;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.PushbackInputStream;
+import java.util.Date;
+import java.util.List;
 
-	private MaildirMessageName messageName;
+public class MaildirMessage implements Message {
+
+    private MaildirMessageName messageName;
     private int bodyStartOctet;
     private final PropertyBuilder propertyBuilder = new PropertyBuilder();
     private boolean parsed;
-    private boolean answered;
-    private boolean deleted;
-    private boolean draft;
-    private boolean flagged;
-    private boolean recent;
-    private boolean seen;
-    private Mailbox<MaildirId> mailbox;
-    private long uid;
-    protected boolean newMessage;
-    private long modSeq;
-    
-    public MaildirMailboxMessage(Mailbox<MaildirId> mailbox, long uid, MaildirMessageName messageName) throws IOException {
-        this.mailbox = mailbox;
-        setUid(uid);
-        setModSeq(messageName.getFile().lastModified());
-        Flags flags = messageName.getFlags();
-        
-        // Set the flags for the message and respect if its RECENT
-        // See MAILBOX-84
-        File file = messageName.getFile();
-        if (!file.exists()) {
-            throw new FileNotFoundException("Unable to read file " + file.getAbsolutePath() + " for the message");
-        } else {
-            // if the message resist in the new folder its RECENT
-            if (file.getParentFile().getName().equals(MaildirFolder.NEW)) {
-                if (flags == null)
-                    flags = new Flags();
-                flags.add(Flags.Flag.RECENT);
-            }
-        }
-        setFlags(flags);
-        this.messageName = messageName;
-    }
-
-    
-    @Override
-    public MaildirId getMailboxId() {
-        return mailbox.getMailboxId();
-    }
 
-    @Override
-    public long getUid() {
-        return uid;
-    }
-
-    @Override
-    public void setUid(long uid) {
-        this.uid = uid;
-    }
-    /**
-     * @see
-     * MailboxMessage#setFlags(
-     * javax.mail.Flags)
-     */
-    @Override
-    public void setFlags(Flags flags) {
-        if (flags != null) {
-            answered = flags.contains(Flags.Flag.ANSWERED);
-            deleted = flags.contains(Flags.Flag.DELETED);
-            draft = flags.contains(Flags.Flag.DRAFT);
-            flagged = flags.contains(Flags.Flag.FLAGGED);
-            recent = flags.contains(Flags.Flag.RECENT);
-            seen = flags.contains(Flags.Flag.SEEN);
-        }
-    }
-    
-    /**
-     * @see
-     * MailboxMessage#isAnswered()
-     */
-    @Override
-    public boolean isAnswered() {
-        return answered;
-    }
-
-    /**
-     * @see
-     * MailboxMessage#isDeleted()
-     */
-    @Override
-    public boolean isDeleted() {
-        return deleted;
-    }
-
-    /**
-     * @see
-     * MailboxMessage#isDraft()
-     */
-    @Override
-    public boolean isDraft() {
-        return draft;
-    }
-
-    /**
-     * @see
-     * MailboxMessage#isFlagged()
-     */
-    @Override
-    public boolean isFlagged() {
-        return flagged;
-    }
-
-    /**
-     * @see
-     * MailboxMessage#isRecent()
-     */
-    @Override
-    public boolean isRecent() {
-        return recent;
-    }
-
-    /**
-     * @see MailboxMessage#isSeen()
-     */
-    @Override
-    public boolean isSeen() {
-        return seen;
-    }
-
-    /**
-     * Indicates whether this MaildirMailboxMessage reflects a new message or one that already
-     * exists in the file system.
-     * @return true if it is new, false if it already exists
-     */
-    public boolean isNew() {
-        return newMessage;
-    }
-    
-    
-    @Override
-    public String toString() {
-        StringBuilder theString = new StringBuilder("MaildirMailboxMessage ");
-        theString.append(getUid());
-        theString.append(" {");
-        Flags flags = createFlags();
-        if (flags.contains(Flags.Flag.DRAFT))
-            theString.append(MaildirMessageName.FLAG_DRAFT);
-        if (flags.contains(Flags.Flag.FLAGGED))
-            theString.append(MaildirMessageName.FLAG_FLAGGED);
-        if (flags.contains(Flags.Flag.ANSWERED))
-            theString.append(MaildirMessageName.FLAG_ANSWERD);
-        if (flags.contains(Flags.Flag.SEEN))
-            theString.append(MaildirMessageName.FLAG_SEEN);
-        if (flags.contains(Flags.Flag.DELETED))
-            theString.append(MaildirMessageName.FLAG_DELETED);
-        theString.append("} ");
-        theString.append(getInternalDate());
-        return theString.toString();
-    }
-
-    /**
-     * @see MailboxMessage#getModSeq()
-     */
-    @Override
-    public long getModSeq() {
-        return modSeq;
+    public MaildirMessage(MaildirMessageName messageName) {
+        this.messageName = messageName;
     }
 
     /**
-     * @see MailboxMessage#setModSeq(long)
-     */
-    @Override
-    public void setModSeq(long modSeq) {
-        this.modSeq = modSeq;
-    }
-    /**
      * Parse message if needed
      */
     private synchronized void parseMessage() {
@@ -320,19 +154,16 @@ public class MaildirMailboxMessage exten
         }
     }
 
+
     /**
      * Return the position in the given {@link InputStream} at which the Body of
      * the MailboxMessage starts
-     * 
-     * @param msgIn
-     * @return bodyStartOctet
-     * @throws IOException
      */
     private int bodyStartOctet(InputStream msgIn) throws IOException {
         // we need to pushback maximal 3 bytes
         PushbackInputStream in = new PushbackInputStream(msgIn, 3);
         int localBodyStartOctet = in.available();
-        int i = -1;
+        int i;
         int count = 0;
         while ((i = in.read()) != -1 && in.available() > 4) {
             if (i == 0x0D) {
@@ -358,27 +189,23 @@ public class MaildirMailboxMessage exten
         return localBodyStartOctet;
     }
 
-    /**
-     * @see MailboxMessage#getMediaType()
-     */
     @Override
     public String getMediaType() {
         parseMessage();
         return propertyBuilder.getMediaType();
     }
 
-    /**
-     * @see MailboxMessage#getSubType()
-     */
     @Override
     public String getSubType() {
         parseMessage();
         return propertyBuilder.getSubType();
     }
 
-    /**
-     * @see MailboxMessage#getFullContentOctets()
-     */
+    @Override
+    public long getBodyOctets() {
+        return getFullContentOctets() - getBodyStartOctet();
+    }
+
     @Override
     public long getFullContentOctets() {
         Long size = messageName.getSize();
@@ -393,27 +220,23 @@ public class MaildirMailboxMessage exten
         }
     }
 
-    /**
-     * @see MailboxMessage#getTextualLineCount()
-     */
     @Override
     public Long getTextualLineCount() {
         parseMessage();
         return propertyBuilder.getTextualLineCount();
     }
 
-    /**
-     * @see MailboxMessage#getProperties()
-     */
     @Override
     public List<Property> getProperties() {
         parseMessage();
         return propertyBuilder.toProperties();
     }
 
-    /**
-     * @see MailboxMessage#getInternalDate()
-     */
+    @Override
+    public MessageId getMessageId() {
+        return null;
+    }
+
     @Override
     public Date getInternalDate() {
         return messageName.getInternalDate();
@@ -427,9 +250,6 @@ public class MaildirMailboxMessage exten
         return new FileInputStream(messageName.getFile());
     }
 
-    /**
-     * @see MailboxMessage#getBodyContent()
-     */
     @Override
     public InputStream getBodyContent() throws IOException {
         parseMessage();
@@ -439,11 +259,7 @@ public class MaildirMailboxMessage exten
 
     }
 
-    /**
-     * @see AbstractMailboxMessage#getBodyStartOctet()
-     */
-    @Override
-    protected int getBodyStartOctet() {
+    private int getBodyStartOctet() {
         parseMessage();
         return bodyStartOctet;
     }
@@ -456,8 +272,6 @@ public class MaildirMailboxMessage exten
             limit = 0;
         }
         return new LimitingFileInputStream(messageName.getFile(), limit);
-
     }
 
-
 }

Copied: james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/DelegatingMailboxMessage.java (from r1724226, james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/AbstractMailboxMessage.java)
URL: http://svn.apache.org/viewvc/james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/DelegatingMailboxMessage.java?p2=james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/DelegatingMailboxMessage.java&p1=james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/AbstractMailboxMessage.java&r1=1724226&r2=1724227&rev=1724227&view=diff
==============================================================================
--- james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/AbstractMailboxMessage.java (original)
+++ james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/DelegatingMailboxMessage.java Tue Jan 12 13:18:56 2016
@@ -20,62 +20,33 @@ package org.apache.james.mailbox.store.m
 
 import java.io.IOException;
 import java.io.InputStream;
-import java.io.SequenceInputStream;
+import java.util.Date;
+import java.util.List;
 
 import javax.mail.Flags;
 
+import org.apache.james.mailbox.store.mail.model.impl.MessageUidComparator;
 
+public abstract class DelegatingMailboxMessage<Id extends MailboxId> implements MailboxMessage<Id> {
 
-/**
- * Abstract base class for {@link MailboxMessage}
- *
- */
-public abstract class AbstractMailboxMessage<Id extends MailboxId> implements MailboxMessage<Id> {
+    private static final MessageUidComparator MESSAGE_UID_COMPARATOR = new MessageUidComparator();
     
+    private final Message message;
 
-    /**
-     * @see java.lang.Comparable#compareTo(java.lang.Object)
-     */
+    protected DelegatingMailboxMessage(Message message) {
+        this.message = message;
+    }
+
+    @Override
     public int compareTo(MailboxMessage<Id> other) {
-        return (int) (getUid() - other.getUid());
+        return MESSAGE_UID_COMPARATOR.compare(this, other);
     }
-    
-    
 
-    /**
-     * @see MailboxMessage#createFlags()
-     */
+    @Override
     public final Flags createFlags() {
-        final Flags flags = new Flags();
-
-        if (isAnswered()) {
-            flags.add(Flags.Flag.ANSWERED);
-        }
-        if (isDeleted()) {
-            flags.add(Flags.Flag.DELETED);
-        }
-        if (isDraft()) {
-            flags.add(Flags.Flag.DRAFT);
-        }
-        if (isFlagged()) {
-            flags.add(Flags.Flag.FLAGGED);
-        }
-        if (isRecent()) {
-            flags.add(Flags.Flag.RECENT);
-        }
-        if (isSeen()) {
-            flags.add(Flags.Flag.SEEN);
-        }
-        String[] userFlags = createUserFlags();
-        if (userFlags != null && userFlags.length > 0) {
-            for (int i = 0; i < userFlags.length; i++) {
-                flags.add(userFlags[i]);
-            }
-        }
-        return flags;
+        return FlagsBuilder.createFlags(this, createUserFlags());
     }
-    
-    
+
     /**
      * Return all stored user flags or null if none are stored. By default this return null as no user flags are stored
      * permanent. This method SHOULD get overridden, If the implementation supports to store user flags.
@@ -85,37 +56,55 @@ public abstract class AbstractMailboxMes
     protected String[] createUserFlags() {
         return null;
     }
-    
-    
-    /**
-     * The number of octets contained in the body of this part.
-     * 
-     * @return number of octets
-     */
+
+    @Override
     public long getBodyOctets() {
-        return getFullContentOctets() - getBodyStartOctet();
+        return message.getBodyOctets();
+    }
+
+    @Override
+    public long getFullContentOctets() {
+        return message.getFullContentOctets();
     }
-    
-    /**
-     * Return the start octet of the body
-     * 
-     * @return startOctet
-     */
-    protected abstract int getBodyStartOctet();
 
+    @Override
+    public Long getTextualLineCount() {
+        return message.getTextualLineCount();
+    }
 
+    @Override
+    public InputStream getHeaderContent() throws IOException {
+        return message.getHeaderContent();
+    }
 
-    
-    /**
-     * This implementation just concat {@link #getHeaderContent()} and {@link #getBodyContent()}.
-     * 
-     * Implementation should override this if they can provide a more performant solution
-     * 
-     * @return content
-     * @throws exception
-     */
+    @Override
     public InputStream getFullContent() throws IOException {
-        return new SequenceInputStream(getHeaderContent(), getBodyContent());
+        return message.getFullContent();
+    }
+
+    @Override
+    public List<Property> getProperties() {
+        return message.getProperties();
+    }
+
+    @Override
+    public Date getInternalDate() {
+        return message.getInternalDate();
+    }
+
+    @Override
+    public InputStream getBodyContent() throws IOException {
+        return message.getBodyContent();
+    }
+
+    @Override
+    public String getMediaType() {
+        return message.getMediaType();
+    }
+
+    @Override
+    public String getSubType() {
+        return message.getSubType();
     }
 
     @Override
@@ -123,4 +112,7 @@ public abstract class AbstractMailboxMes
         return new DefaultMessageId(getMailboxId(), getUid());
     }
 
+    public Message getMessage() {
+        return message;
+    }
 }

Copied: james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/FlagsBuilder.java (from r1724226, james/project/trunk/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AbstractMailboxMessageTest.java)
URL: http://svn.apache.org/viewvc/james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/FlagsBuilder.java?p2=james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/FlagsBuilder.java&p1=james/project/trunk/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AbstractMailboxMessageTest.java&r1=1724226&r2=1724227&rev=1724227&view=diff
==============================================================================
--- james/project/trunk/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AbstractMailboxMessageTest.java (original)
+++ james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/FlagsBuilder.java Tue Jan 12 13:18:56 2016
@@ -16,43 +16,40 @@
  * specific language governing permissions and limitations      *
  * under the License.                                           *
  ****************************************************************/
-
 package org.apache.james.mailbox.store.mail.model;
 
-import static org.junit.Assert.*;
+import javax.mail.Flags;
 
-import org.apache.james.mailbox.store.MessageBuilder;
-import org.apache.james.mailbox.store.TestId;
-import org.junit.Test;
-
-public class AbstractMailboxMessageTest {
-    
-    @Test
-    public void testShouldReturnPositiveWhenFirstGreaterThanSecond()
-            throws Exception {
-        MailboxMessage<TestId> one = buildMessage(100);
-        MailboxMessage<TestId> two = buildMessage(99);
-        assertTrue( one.compareTo(two) > 0);
-    }
+public class FlagsBuilder {
 
-    private MailboxMessage<TestId> buildMessage(int uid) throws Exception {
-        MessageBuilder builder = new MessageBuilder();
-        builder.uid = uid;
-        return builder.build();
-    }
+    public static Flags createFlags(MailboxMessage<?> mailboxMessage, String[] userFlags) {
+        final Flags flags = new Flags();
 
-    @Test
-    public void testShouldReturnNegativeWhenFirstLessThanSecond()
-            throws Exception {
-        MailboxMessage<TestId> one = buildMessage(98);
-        MailboxMessage<TestId> two = buildMessage(99);
-        assertTrue( one.compareTo(two) < 0);
+        if (mailboxMessage.isAnswered()) {
+            flags.add(Flags.Flag.ANSWERED);
+        }
+        if (mailboxMessage.isDeleted()) {
+            flags.add(Flags.Flag.DELETED);
+        }
+        if (mailboxMessage.isDraft()) {
+            flags.add(Flags.Flag.DRAFT);
+        }
+        if (mailboxMessage.isFlagged()) {
+            flags.add(Flags.Flag.FLAGGED);
+        }
+        if (mailboxMessage.isRecent()) {
+            flags.add(Flags.Flag.RECENT);
+        }
+        if (mailboxMessage.isSeen()) {
+            flags.add(Flags.Flag.SEEN);
+        }
+        if (userFlags != null && userFlags.length > 0) {
+            for (int i = 0; i < userFlags.length; i++) {
+                flags.add(userFlags[i]);
+            }
+        }
+        return flags;
     }
 
-    @Test
-    public void testShouldReturnZeroWhenFirstEqualsSecond() throws Exception {
-        MailboxMessage<TestId> one = buildMessage(90);
-        MailboxMessage<TestId> two = buildMessage(90);
-        assertEquals(0, one.compareTo(two));
-    }
+
 }

Added: james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/MessageUidComparator.java
URL: http://svn.apache.org/viewvc/james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/MessageUidComparator.java?rev=1724227&view=auto
==============================================================================
--- james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/MessageUidComparator.java (added)
+++ james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/MessageUidComparator.java Tue Jan 12 13:18:56 2016
@@ -0,0 +1,31 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+package org.apache.james.mailbox.store.mail.model.impl;
+
+import org.apache.james.mailbox.store.mail.model.MailboxMessage;
+
+import java.util.Comparator;
+
+public class MessageUidComparator implements Comparator<MailboxMessage<?>> {
+
+    @Override
+    public int compare(MailboxMessage<?> m1, MailboxMessage<?> m2) {
+        return Long.valueOf(m1.getUid()).compareTo(m2.getUid());
+    }
+}

Modified: james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessage.java
URL: http://svn.apache.org/viewvc/james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessage.java?rev=1724227&r1=1724226&r2=1724227&view=diff
==============================================================================
--- james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessage.java (original)
+++ james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessage.java Tue Jan 12 13:18:56 2016
@@ -20,9 +20,7 @@
 package org.apache.james.mailbox.store.mail.model.impl;
 
 import java.io.IOException;
-import java.io.InputStream;
 import java.util.Date;
-import java.util.List;
 
 import javax.mail.Flags;
 import javax.mail.internet.SharedInputStream;
@@ -30,15 +28,14 @@ import javax.mail.util.SharedByteArrayIn
 
 import org.apache.commons.io.IOUtils;
 import org.apache.james.mailbox.exception.MailboxException;
-import org.apache.james.mailbox.store.mail.model.AbstractMailboxMessage;
+import org.apache.james.mailbox.store.mail.model.DelegatingMailboxMessage;
 import org.apache.james.mailbox.store.mail.model.MailboxId;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
-import org.apache.james.mailbox.store.mail.model.Property;
 
+import com.google.common.base.Objects;
 import com.google.common.primitives.Ints;
 
-
-public class SimpleMailboxMessage<Id extends MailboxId> extends AbstractMailboxMessage<Id> {
+public class SimpleMailboxMessage<Id extends MailboxId> extends DelegatingMailboxMessage<Id> {
 
     public static <Id extends MailboxId> SimpleMailboxMessage<Id> copy(Id mailboxId, MailboxMessage<Id> original) throws MailboxException {
         Date internalDate = original.getInternalDate();
@@ -60,7 +57,6 @@ public class SimpleMailboxMessage<Id ext
 
     private long uid;
     private final Id mailboxId;
-    private long size;
     private boolean answered;
     private boolean deleted;
     private boolean draft;
@@ -68,29 +64,21 @@ public class SimpleMailboxMessage<Id ext
     private boolean recent;
     private boolean seen;
     private String[] userFlags;
-    private Date internalDate;
-    private final String subType;
-    private List<Property> properties;
-    private final String mediaType;
-    private Long lineCount;
-    private int bodyStartOctet;
     private long modSeq;
-    private SharedInputStream content;
 
     public SimpleMailboxMessage(Date internalDate, long size, int bodyStartOctet,
                                 SharedInputStream content, Flags flags,
                                 PropertyBuilder propertyBuilder, final Id mailboxId) {
-        this.content = content;
+        super(new SimpleMessage(
+            content, size, internalDate, propertyBuilder.getSubType(),
+            propertyBuilder.getMediaType(),
+            bodyStartOctet,
+            propertyBuilder.getTextualLineCount(),
+            propertyBuilder.toProperties()
+            ));
 
-        this.size = size;
-        this.bodyStartOctet = bodyStartOctet;
         setFlags(flags);
-        lineCount = propertyBuilder.getTextualLineCount();
-        this.internalDate = internalDate;
         this.mailboxId = mailboxId;
-        this.properties = propertyBuilder.toProperties();
-        this.mediaType = propertyBuilder.getMediaType();
-        this.subType = propertyBuilder.getSubType();
         this.userFlags = flags.getUserFlags();
     }
 
@@ -99,10 +87,6 @@ public class SimpleMailboxMessage<Id ext
         return userFlags.clone();
     }
 
-    public Date getInternalDate() {
-        return internalDate;
-    }
-
     public Id getMailboxId() {
         return mailboxId;
     }
@@ -135,6 +119,18 @@ public class SimpleMailboxMessage<Id ext
         return seen;
     }
 
+    public long getModSeq() {
+        return modSeq;
+    }
+
+    public void setModSeq(long modSeq) {
+        this.modSeq = modSeq;
+    }
+
+    public void setUid(long uid) {
+        this.uid = uid;
+    }
+
     public synchronized void setFlags(Flags flags) {
         answered = flags.contains(Flags.Flag.ANSWERED);
         deleted = flags.contains(Flags.Flag.DELETED);
@@ -145,30 +141,6 @@ public class SimpleMailboxMessage<Id ext
         userFlags = flags.getUserFlags();
     }
 
-    public InputStream getBodyContent() throws IOException {
-        return content.newStream(getBodyStartOctet(), -1);
-    }
-
-    public long getFullContentOctets() {
-        return size;
-    }
-
-    public String getMediaType() {
-        return mediaType;
-    }
-
-    public List<Property> getProperties() {
-        return properties;
-    }
-
-    public String getSubType() {
-        return subType;
-    }
-
-    public Long getTextualLineCount() {
-        return lineCount;
-    }
-
     @Override
     public int hashCode() {
         final int PRIME = 31;
@@ -192,60 +164,18 @@ public class SimpleMailboxMessage<Id ext
         return true;
     }
 
-    /**
-     * Representation suitable for logging and debugging.
-     * 
-     * @return a <code>String</code> representation of this object.
-     */
     public String toString() {
-        return super.toString() + "[" + "uid = " + this.uid + " "
-                + "mailboxId = " + this.mailboxId + " " + "size = " + this.size
-                + " " + "answered = " + this.answered + " " + "deleted = "
-                + this.deleted + " " + "draft = " + this.draft + " "
-                + "flagged = " + this.flagged + " " + "recent = " + this.recent
-                + " " + "seen = " + this.seen + " " + "internalDate = "
-                + this.internalDate + " " + "subType = " + this.subType + " "
-                + "mediaType = " + this.mediaType + " " + " ]";
-    }
-
-    @Override
-    protected int getBodyStartOctet() {
-        return bodyStartOctet;
-    }
-
-    /**
-     * @see MailboxMessage#getModSeq()
-     */
-    public long getModSeq() {
-        return modSeq;
-    }
-
-    /**
-     * @see MailboxMessage#setModSeq(long)
-     */
-    public void setModSeq(long modSeq) {
-        this.modSeq = modSeq;
-    }
-
-    /**
-     * @see MailboxMessage#setUid(long)
-     */
-    public void setUid(long uid) {
-        this.uid = uid;
-    }
-
-    @Override
-    public InputStream getHeaderContent() throws IOException {
-        long headerEnd = getBodyStartOctet();
-        if (headerEnd < 0) {
-            headerEnd = 0;
-        }
-        return content.newStream(0, headerEnd);
-    }
-
-    @Override
-    public InputStream getFullContent() throws IOException {
-        return content.newStream(0, -1);
+        return Objects.toStringHelper(this)
+            .add("uid", this.uid)
+            .add("mailboxId", this.mailboxId)
+            .add("answered", this.answered)
+            .add("deleted", this.deleted)
+            .add("draft", this.draft)
+            .add("flagged", this.flagged)
+            .add("recent", this.recent)
+            .add("seen", this.seen)
+            .add("message", this.getMessage())
+            .toString();
     }
 
 }

Added: james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMessage.java
URL: http://svn.apache.org/viewvc/james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMessage.java?rev=1724227&view=auto
==============================================================================
--- james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMessage.java (added)
+++ james/project/trunk/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMessage.java Tue Jan 12 13:18:56 2016
@@ -0,0 +1,111 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+package org.apache.james.mailbox.store.mail.model.impl;
+
+import org.apache.james.mailbox.store.mail.model.Message;
+import org.apache.james.mailbox.store.mail.model.MessageId;
+import org.apache.james.mailbox.store.mail.model.Property;
+
+import javax.mail.internet.SharedInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Date;
+import java.util.List;
+
+public class SimpleMessage implements Message {
+
+    private final String subType;
+    private final String mediaType;
+    private final SharedInputStream content;
+    private final int bodyStartOctet;
+    private final Date internalDate;
+    private final long size;
+    private final Long textualLineCount;
+    private final List<Property> properties;
+
+    public SimpleMessage(SharedInputStream content, long size, Date internalDate, String subType, String mediaType, int bodyStartOctet, Long textualLineCount, List<Property> properties) {
+        this.subType = subType;
+        this.mediaType = mediaType;
+        this.content = content;
+        this.bodyStartOctet = bodyStartOctet;
+        this.internalDate = internalDate;
+        this.size = size;
+        this.textualLineCount = textualLineCount;
+        this.properties = properties;
+    }
+
+    @Override
+    public MessageId getMessageId() {
+        return null;
+    }
+
+    @Override
+    public Date getInternalDate() {
+        return internalDate;
+    }
+
+    @Override
+    public InputStream getBodyContent() throws IOException {
+        return content.newStream(bodyStartOctet, -1);
+    }
+
+    @Override
+    public String getMediaType() {
+        return mediaType;
+    }
+
+    @Override
+    public String getSubType() {
+        return subType;
+    }
+
+    @Override
+    public long getBodyOctets() {
+        return getFullContentOctets() - bodyStartOctet;
+    }
+
+    @Override
+    public long getFullContentOctets() {
+        return size;
+    }
+
+    @Override
+    public Long getTextualLineCount() {
+        return textualLineCount;
+    }
+
+    @Override
+    public InputStream getHeaderContent() throws IOException {
+        long headerEnd = bodyStartOctet;
+        if (headerEnd < 0) {
+            headerEnd = 0;
+        }
+        return content.newStream(0, headerEnd);
+    }
+
+    @Override
+    public InputStream getFullContent() throws IOException {
+        return content.newStream(0, -1);
+    }
+
+    @Override
+    public List<Property> getProperties() {
+        return properties;
+    }
+}

Copied: james/project/trunk/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/DelegatingMailboxMessageTest.java (from r1724226, james/project/trunk/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AbstractMailboxMessageTest.java)
URL: http://svn.apache.org/viewvc/james/project/trunk/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/DelegatingMailboxMessageTest.java?p2=james/project/trunk/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/DelegatingMailboxMessageTest.java&p1=james/project/trunk/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AbstractMailboxMessageTest.java&r1=1724226&r2=1724227&rev=1724227&view=diff
==============================================================================
--- james/project/trunk/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AbstractMailboxMessageTest.java (original)
+++ james/project/trunk/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/DelegatingMailboxMessageTest.java Tue Jan 12 13:18:56 2016
@@ -25,7 +25,7 @@ import org.apache.james.mailbox.store.Me
 import org.apache.james.mailbox.store.TestId;
 import org.junit.Test;
 
-public class AbstractMailboxMessageTest {
+public class DelegatingMailboxMessageTest {
     
     @Test
     public void testShouldReturnPositiveWhenFirstGreaterThanSecond()

Modified: james/project/trunk/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessageTest.java
URL: http://svn.apache.org/viewvc/james/project/trunk/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessageTest.java?rev=1724227&r1=1724226&r2=1724227&view=diff
==============================================================================
--- james/project/trunk/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessageTest.java (original)
+++ james/project/trunk/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessageTest.java Tue Jan 12 13:18:56 2016
@@ -34,6 +34,7 @@ import org.apache.commons.io.IOUtils;
 import org.apache.james.mailbox.FlagsBuilder;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.store.TestId;
+import org.assertj.core.internal.FieldByFieldComparator;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -93,7 +94,8 @@ public class SimpleMailboxMessageTest {
     public void copyShouldReturnFieldByFieldEqualsObject() throws MailboxException {
         SimpleMailboxMessage<TestId> original = buildMessage("my content");
         SimpleMailboxMessage<TestId> copy = SimpleMailboxMessage.copy(TestId.of(1337), original);
-        assertThat((Object)copy).isEqualToIgnoringGivenFields(original, "mailboxId").isNotSameAs(original);
+        assertThat((Object)copy).isEqualToIgnoringGivenFields(original, "message", "mailboxId").isNotSameAs(original);
+        assertThat(copy.getMessage()).usingComparator(new FieldByFieldComparator()).isEqualTo(original.getMessage());
     }
 
     private static SimpleMailboxMessage<TestId> buildMessage(String content) {



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