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/05/31 15:24:09 UTC
svn commit: r1129661 - in /james/mailbox/trunk:
jcr/src/main/java/org/apache/james/mailbox/jcr/mail/
jpa/src/main/java/org/apache/james/mailbox/jpa/mail/
maildir/src/main/java/org/apache/james/mailbox/maildir/mail/
memory/src/main/java/org/apache/james...
Author: norman
Date: Tue May 31 13:24:08 2011
New Revision: 1129661
URL: http://svn.apache.org/viewvc?rev=1129661&view=rev
Log:
Last adjustments on the mailbox api for mod-sequences. See MAILBOX-74
Modified:
james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/JCRMessageMapper.java
james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java
james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java
james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractMessageMapper.java
Modified: james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/JCRMessageMapper.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/JCRMessageMapper.java?rev=1129661&r1=1129660&r2=1129661&view=diff
==============================================================================
--- james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/JCRMessageMapper.java (original)
+++ james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/JCRMessageMapper.java Tue May 31 13:24:08 2011
@@ -600,7 +600,7 @@ public class JCRMessageMapper extends Ab
}
@Override
- protected void copy(Mailbox<String> mailbox, long uid, long modSeq, Message<String> original) throws MailboxException {
+ protected MessageMetaData copy(Mailbox<String> mailbox, long uid, long modSeq, Message<String> original) throws MailboxException {
try {
String newMessagePath = getSession().getNodeByIdentifier(mailbox.getMailboxId()).getPath() + NODE_DELIMITER + String.valueOf(uid);
getSession().getWorkspace().copy(((JCRMessage)original).getNode().getPath(), getSession().getNodeByIdentifier(mailbox.getMailboxId()).getPath() + NODE_DELIMITER + String.valueOf(uid));
@@ -608,14 +608,15 @@ public class JCRMessageMapper extends Ab
node.setProperty(JCRMessage.MAILBOX_UUID_PROPERTY, mailbox.getMailboxId());
node.setProperty(JCRMessage.UID_PROPERTY, uid);
node.setProperty(JCRMessage.MODSEQ_PROPERTY, modSeq);
-
+
+ return new SimpleMessageMetaData(new JCRMessage(node, mailboxSession.getLog()));
} catch (RepositoryException e) {
throw new MailboxException("Unable to copy message " +original + " in mailbox " + mailbox, e);
}
}
@Override
- protected void save(Mailbox<String> mailbox, Message<String> message) throws MailboxException {
+ protected MessageMetaData save(Mailbox<String> mailbox, Message<String> message) throws MailboxException {
final JCRMessage membership = (JCRMessage) message;
try {
@@ -683,6 +684,7 @@ public class JCRMessageMapper extends Ab
} else {
membership.merge(messageNode);
}
+ return new SimpleMessageMetaData(membership);
} catch (RepositoryException e) {
throw new MailboxException("Unable to save message " + message + " in mailbox " + mailbox, e);
} catch (IOException e) {
Modified: james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java?rev=1129661&r1=1129660&r2=1129661&view=diff
==============================================================================
--- james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java (original)
+++ james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java Tue May 31 13:24:08 2011
@@ -405,14 +405,14 @@ public class JPAMessageMapper extends Ab
* (non-Javadoc)
* @see org.apache.james.mailbox.store.mail.AbstractMessageMapper#copy(org.apache.james.mailbox.store.mail.model.Mailbox, long, long, org.apache.james.mailbox.store.mail.model.Message)
*/
- protected void copy(Mailbox<Long> mailbox, long uid, long modSeq, Message<Long> original) throws MailboxException {
+ protected MessageMetaData copy(Mailbox<Long> mailbox, long uid, long modSeq, Message<Long> original) throws MailboxException {
Message<Long> copy;
if (original instanceof JPAStreamingMessage) {
copy = new JPAStreamingMessage((JPAMailbox) mailbox, uid, modSeq, original);
} else {
copy = new JPAMessage((JPAMailbox) mailbox, uid, modSeq, original);
}
- save(mailbox, copy);
+ return save(mailbox, copy);
}
@@ -420,7 +420,7 @@ public class JPAMessageMapper extends Ab
* (non-Javadoc)
* @see org.apache.james.mailbox.store.mail.AbstractMessageMapper#save(org.apache.james.mailbox.store.mail.model.Mailbox, org.apache.james.mailbox.store.mail.model.Message)
*/
- protected void save(Mailbox<Long> mailbox, Message<Long> message) throws MailboxException {
+ protected MessageMetaData save(Mailbox<Long> mailbox, Message<Long> message) throws MailboxException {
try {
@@ -429,7 +429,7 @@ public class JPAMessageMapper extends Ab
((AbstractJPAMessage) message).setMailbox(getEntityManager().find(JPAMailbox.class, mailbox.getMailboxId()));
getEntityManager().persist(message);
-
+ return new SimpleMessageMetaData(message);
} catch (PersistenceException e) {
throw new MailboxException("Save of message " + message + " failed in mailbox " + mailbox, e);
} catch (ArgumentException e) {
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=1129661&r1=1129660&r2=1129661&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 Tue May 31 13:24:08 2011
@@ -25,11 +25,13 @@ import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
+import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.SortedMap;
import java.util.Map.Entry;
+import javax.mail.Flags;
import javax.mail.Flags.Flag;
import org.apache.commons.io.FileUtils;
@@ -37,6 +39,7 @@ import org.apache.james.mailbox.MailboxE
import org.apache.james.mailbox.MailboxSession;
import org.apache.james.mailbox.MessageMetaData;
import org.apache.james.mailbox.MessageRange;
+import org.apache.james.mailbox.UpdatedFlags;
import org.apache.james.mailbox.MessageRange.Type;
import org.apache.james.mailbox.maildir.MaildirFolder;
import org.apache.james.mailbox.maildir.MaildirMessageName;
@@ -309,9 +312,9 @@ public class MaildirMessageMapper extend
* (non-Javadoc)
* @see org.apache.james.mailbox.store.mail.AbstractMessageMapper#copy(org.apache.james.mailbox.store.mail.model.Mailbox, long, long, org.apache.james.mailbox.store.mail.model.Message)
*/
- protected void copy(Mailbox<Integer> mailbox, long uid, long modSeq, Message<Integer> original) throws MailboxException {
+ protected MessageMetaData copy(Mailbox<Integer> mailbox, long uid, long modSeq, Message<Integer> original) throws MailboxException {
MaildirMessage theCopy = new MaildirMessage(mailbox, (AbstractMaildirMessage) original);
- save(mailbox, theCopy);
+ return save(mailbox, theCopy);
}
@@ -353,127 +356,89 @@ public class MaildirMessageMapper extend
/*
* (non-Javadoc)
- * @see org.apache.james.mailbox.store.mail.AbstractMessageMapper#save(org.apache.james.mailbox.store.mail.model.Mailbox, org.apache.james.mailbox.store.mail.model.Message)
+ *
+ * @see
+ * org.apache.james.mailbox.store.mail.AbstractMessageMapper#save(org.apache
+ * .james.mailbox.store.mail.model.Mailbox,
+ * org.apache.james.mailbox.store.mail.model.Message)
*/
- protected void save(Mailbox<Integer> mailbox, Message<Integer> message) throws MailboxException {
- if (message instanceof LazyLoadingMaildirMessage) {
- // if the message is an instanceof LazyLoadingMaildirMessage we can be sure it was loaded out of the store and
- // so we need only to update the flags
- try {
- MaildirFolder folder = maildirStore.createMaildirFolder(mailbox);
- LazyLoadingMaildirMessage maildirMessage = (LazyLoadingMaildirMessage) message;
- MaildirMessageName messageName = folder.getMessageNameByUid(maildirMessage.getUid());
- File messageFile = messageName.getFile();
- // System.out.println("save existing " + message +
- // " as " + messageFile.getName());
- messageName.setFlags(maildirMessage.createFlags());
- // this automatically moves messages from new to cur if
- // needed
- String newMessageName = messageName.getFullName();
-
- File newMessageFile;
-
- // See MAILBOX-57
- if (message.createFlags().contains(Flag.RECENT)) {
- // message is recent so save it in the new folder
- newMessageFile = new File(folder.getNewFolder(), newMessageName);
- } else {
- newMessageFile = new File(folder.getCurFolder(), newMessageName);
- }
- long modSeq;
- // if the flags don't have change we should not try to move the
- // file
- if (newMessageFile.equals(messageFile) == false) {
- FileUtils.moveFile(messageFile, newMessageFile);
- modSeq = newMessageFile.lastModified();
-
- } else {
- modSeq = messageFile.lastModified();
- }
- maildirMessage.setModSeq(modSeq);
-
- long uid = maildirMessage.getUid();
- folder.update(uid, newMessageName);
- } catch (IOException e) {
- throw new MailboxException("Unable to save flags update for message " + message + " in mailbox " + mailbox, e);
- }
- } else {
- MaildirMessage maildirMessage = (MaildirMessage) message;
- MaildirFolder folder = maildirStore.createMaildirFolder(mailbox);
- long uid = 0;
- // a new message
- // save file to "tmp" folder
- File tmpFolder = folder.getTmpFolder();
- // The only case in which we could get problems with clashing names
- // is if the system clock
- // has been set backwards, then the server is restarted with the
- // same pid, delivers the same
- // number of messages since its start in the exact same millisecond
- // as done before and the
- // random number generator returns the same number.
- // In order to prevent this case we would need to check ALL files in
- // all folders and compare
- // them to this message name. We rather let this happen once in a
- // billion years...
- MaildirMessageName messageName = MaildirMessageName.createUniqueName(folder, message.getFullContentOctets());
- File messageFile = new File(tmpFolder, messageName.getFullName());
- FileOutputStream fos = null;
- InputStream input = null;
- try {
- messageFile.createNewFile();
- fos = new FileOutputStream(messageFile);
- input = message.getFullContent();
- byte[] b = new byte[BUF_SIZE];
- int len = 0;
- while ((len = input.read(b)) != -1)
- fos.write(b, 0, len);
- } catch (IOException ioe) {
- throw new MailboxException("Failure while save Message " + message + " in Mailbox " + mailbox, ioe);
- } finally {
- try {
- if (fos != null)
- fos.close();
- } catch (IOException e) {
- }
- try {
- if (input != null)
- input.close();
- } catch (IOException e) {
- }
- }
- File newMessageFile = null;
- // delivered via SMTP, goes to ./new without flags
- if (maildirMessage.isRecent()) {
- messageName.setFlags(message.createFlags());
- newMessageFile = new File(folder.getNewFolder(), messageName.getFullName());
- // System.out.println("save new recent " + message + " as " +
- // newMessageFile.getName());
- }
- // appended via IMAP (might already have flags etc, goes to ./cur
- // directly)
- else {
- messageName.setFlags(message.createFlags());
- newMessageFile = new File(folder.getCurFolder(), messageName.getFullName());
- // System.out.println("save new not recent " + message + " as "
- // + newMessageFile.getName());
- }
+ protected MessageMetaData save(Mailbox<Integer> mailbox, Message<Integer> message) throws MailboxException {
+ AbstractMaildirMessage maildirMessage = (AbstractMaildirMessage) message;
+ MaildirFolder folder = maildirStore.createMaildirFolder(mailbox);
+ long uid = 0;
+ // a new message
+ // save file to "tmp" folder
+ File tmpFolder = folder.getTmpFolder();
+ // The only case in which we could get problems with clashing names
+ // is if the system clock
+ // has been set backwards, then the server is restarted with the
+ // same pid, delivers the same
+ // number of messages since its start in the exact same millisecond
+ // as done before and the
+ // random number generator returns the same number.
+ // In order to prevent this case we would need to check ALL files in
+ // all folders and compare
+ // them to this message name. We rather let this happen once in a
+ // billion years...
+ MaildirMessageName messageName = MaildirMessageName.createUniqueName(folder, message.getFullContentOctets());
+ File messageFile = new File(tmpFolder, messageName.getFullName());
+ FileOutputStream fos = null;
+ InputStream input = null;
+ try {
+ messageFile.createNewFile();
+ fos = new FileOutputStream(messageFile);
+ input = message.getFullContent();
+ byte[] b = new byte[BUF_SIZE];
+ int len = 0;
+ while ((len = input.read(b)) != -1)
+ fos.write(b, 0, len);
+ } catch (IOException ioe) {
+ throw new MailboxException("Failure while save Message " + message + " in Mailbox " + mailbox, ioe);
+ } finally {
try {
- FileUtils.moveFile(messageFile, newMessageFile);
+ if (fos != null)
+ fos.close();
} catch (IOException e) {
- // TODO: Try copy and delete
- throw new MailboxException("Failure while save Message " + message + " in Mailbox " + mailbox, e);
}
try {
- uid = folder.appendMessage(newMessageFile.getName());
- maildirMessage.setUid(uid);
+ if (input != null)
+ input.close();
} catch (IOException e) {
- throw new MailboxException("Failure while save Message " + message + " in Mailbox " + mailbox, e);
}
}
+ File newMessageFile = null;
+ // delivered via SMTP, goes to ./new without flags
+ if (maildirMessage.isRecent()) {
+ messageName.setFlags(message.createFlags());
+ newMessageFile = new File(folder.getNewFolder(), messageName.getFullName());
+ // System.out.println("save new recent " + message + " as " +
+ // newMessageFile.getName());
+ }
+ // appended via IMAP (might already have flags etc, goes to ./cur
+ // directly)
+ else {
+ messageName.setFlags(message.createFlags());
+ newMessageFile = new File(folder.getCurFolder(), messageName.getFullName());
+ // System.out.println("save new not recent " + message + " as "
+ // + newMessageFile.getName());
+ }
+ try {
+ FileUtils.moveFile(messageFile, newMessageFile);
+ } catch (IOException e) {
+ // TODO: Try copy and delete
+ throw new MailboxException("Failure while save Message " + message + " in Mailbox " + mailbox, e);
+ }
+ try {
+ uid = folder.appendMessage(newMessageFile.getName());
+ maildirMessage.setUid(uid);
+ maildirMessage.setModSeq(newMessageFile.lastModified());
+ return new SimpleMessageMetaData(message);
+ } catch (IOException e) {
+ throw new MailboxException("Failure while save Message " + message + " in Mailbox " + mailbox, e);
+ }
}
-
/**
* Do nothing as maildir store the uid and modseq everytime by it own
*/
@@ -508,5 +473,77 @@ public class MaildirMessageMapper extend
protected void rollback() throws MailboxException {
//nothing todo
}
+ /*
+ * (non-Javadoc)
+ * @see org.apache.james.mailbox.store.mail.MessageMapper#updateFlags(org.apache.james.mailbox.store.mail.model.Mailbox, javax.mail.Flags, boolean, boolean, org.apache.james.mailbox.MessageRange)
+ */
+ public Iterator<UpdatedFlags> updateFlags(final Mailbox<Integer> mailbox, final Flags flags, final boolean value, final boolean replace, MessageRange set) throws MailboxException {
+ final List<UpdatedFlags> updatedFlags = new ArrayList<UpdatedFlags>();
+ final MaildirFolder folder = maildirStore.createMaildirFolder(mailbox);
+
+ findInMailbox(mailbox, set, new MailboxMembershipCallback<Integer>() {
+
+ public void onMailboxMembers(List<Message<Integer>> members) throws MailboxException {
+ for (final Message<Integer> member : members) {
+ Flags originalFlags = member.createFlags();
+ if (replace) {
+ member.setFlags(flags);
+ } else {
+ Flags current = member.createFlags();
+ if (value) {
+ current.add(flags);
+ } else {
+ current.remove(flags);
+ }
+ member.setFlags(current);
+ }
+ Flags newFlags = member.createFlags();
+
+ try {
+ AbstractMaildirMessage maildirMessage = (AbstractMaildirMessage) member;
+ MaildirMessageName messageName = folder.getMessageNameByUid(maildirMessage.getUid());
+ File messageFile = messageName.getFile();
+ // System.out.println("save existing " + message +
+ // " as " + messageFile.getName());
+ messageName.setFlags(maildirMessage.createFlags());
+ // this automatically moves messages from new to cur if
+ // needed
+ String newMessageName = messageName.getFullName();
+
+ File newMessageFile;
+
+ // See MAILBOX-57
+ if (newFlags.contains(Flag.RECENT)) {
+ // message is recent so save it in the new folder
+ newMessageFile = new File(folder.getNewFolder(), newMessageName);
+ } else {
+ newMessageFile = new File(folder.getCurFolder(), newMessageName);
+ }
+ long modSeq;
+ // if the flags don't have change we should not try to move the file
+ if (newMessageFile.equals(messageFile) == false) {
+ FileUtils.moveFile(messageFile, newMessageFile );
+ modSeq = newMessageFile.lastModified();
+
+ } else {
+ modSeq = messageFile.lastModified();
+ }
+ maildirMessage.setModSeq(modSeq);
+
+ updatedFlags.add(new UpdatedFlags(member.getUid(), modSeq, originalFlags, newFlags));
+
+ long uid = maildirMessage.getUid();
+ folder.update(uid, newMessageName);
+ } catch (IOException e) {
+ throw new MailboxException("Failure while save Message " + member + " in Mailbox " + mailbox, e);
+ }
+
+ }
+ }
+ });
+
+ return updatedFlags.iterator();
+
+ }
}
Modified: james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java?rev=1129661&r1=1129660&r2=1129661&view=diff
==============================================================================
--- james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java (original)
+++ james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java Tue May 31 13:24:08 2011
@@ -214,8 +214,8 @@ public class InMemoryMessageMapper exten
* (non-Javadoc)
* @see org.apache.james.mailbox.store.mail.AbstractMessageMapper#copy(org.apache.james.mailbox.store.mail.model.Mailbox, long, long, org.apache.james.mailbox.store.mail.model.Message)
*/
- protected void copy(Mailbox<Long> mailbox, long uid, long modSeq, Message<Long> original) throws MailboxException {
- save(mailbox, new SimpleMailboxMembership(mailbox.getMailboxId(), uid, modSeq, (SimpleMailboxMembership)original));
+ protected MessageMetaData copy(Mailbox<Long> mailbox, long uid, long modSeq, Message<Long> original) throws MailboxException {
+ return save(mailbox, new SimpleMailboxMembership(mailbox.getMailboxId(), uid, modSeq, (SimpleMailboxMembership)original));
}
/*
@@ -239,8 +239,9 @@ public class InMemoryMessageMapper exten
* (non-Javadoc)
* @see org.apache.james.mailbox.store.mail.AbstractMessageMapper#save(org.apache.james.mailbox.store.mail.model.Mailbox, org.apache.james.mailbox.store.mail.model.Message)
*/
- protected void save(Mailbox<Long> mailbox, Message<Long> message) throws MailboxException {
+ protected MessageMetaData save(Mailbox<Long> mailbox, Message<Long> message) throws MailboxException {
getMembershipByUidForMailbox(mailbox).put(message.getUid(), message);
+ return new SimpleMessageMetaData(message);
}
/**
Modified: james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractMessageMapper.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractMessageMapper.java?rev=1129661&r1=1129660&r2=1129661&view=diff
==============================================================================
--- james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractMessageMapper.java (original)
+++ james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractMessageMapper.java Tue May 31 13:24:08 2011
@@ -18,8 +18,11 @@
****************************************************************/
package org.apache.james.mailbox.store.mail;
+import java.io.IOException;
+import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
@@ -39,8 +42,10 @@ import org.apache.james.mailbox.SearchQu
import org.apache.james.mailbox.SearchQuery.UidCriterion;
import org.apache.james.mailbox.store.MessageSearchIndex;
import org.apache.james.mailbox.store.SearchQueryIterator;
+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.Property;
import org.apache.james.mailbox.store.transaction.TransactionalMapper;
/**
@@ -250,11 +255,12 @@ public abstract class AbstractMessageMap
public MessageMetaData add(Mailbox<Id> mailbox, Message<Id> message) throws MailboxException {
message.setUid(nextUid(mailbox));
message.setModSeq(nextModSeq(mailbox));
- save(mailbox, message);
+ MessageMetaData data = save(mailbox, message);
if (index != null) {
index.add(mailboxSession, mailbox, message);
}
- return new SimpleMessageMetaData(message);
+ return data;
+
}
@@ -262,11 +268,141 @@ public abstract class AbstractMessageMap
* (non-Javadoc)
* @see org.apache.james.mailbox.store.mail.MessageMapper#copy(org.apache.james.mailbox.store.mail.model.Mailbox, org.apache.james.mailbox.store.mail.model.Message)
*/
- public MessageMetaData copy(Mailbox<Id> mailbox, Message<Id> original) throws MailboxException {
+ public MessageMetaData copy(final Mailbox<Id> mailbox, final Message<Id> original) throws MailboxException {
long uid = nextUid(mailbox);
long modSeq = nextModSeq(mailbox);
- copy(mailbox, uid, modSeq, original);
- return new SimpleMessageMetaData(uid, modSeq, original.createFlags(), original.getFullContentOctets(), original.getInternalDate());
+ final MessageMetaData metaData = copy(mailbox, uid, modSeq, original);
+ if (index != null) {
+ // index the copied message by building a wrapper around the original message and the returned metadata
+ index.add(mailboxSession, mailbox, new Message<Id>() {
+
+ @Override
+ public Flags createFlags() {
+ return original.createFlags();
+ }
+
+ @Override
+ public InputStream getBodyContent() throws IOException {
+ return original.getBodyContent();
+ }
+
+ @Override
+ public long getBodyOctets() {
+ return original.getBodyOctets();
+ }
+
+ @Override
+ public InputStream getFullContent() throws IOException {
+ return original.getFullContent();
+ }
+
+ @Override
+ public long getFullContentOctets() {
+ return original.getFullContentOctets();
+ }
+
+ @Override
+ public List<Header> getHeaders() {
+ return original.getHeaders();
+ }
+
+ @Override
+ public Date getInternalDate() {
+ return metaData.getInternalDate();
+ }
+
+ @Override
+ public Id getMailboxId() {
+ return mailbox.getMailboxId();
+ }
+
+ @Override
+ public String getMediaType() {
+ return original.getMediaType();
+ }
+
+ @Override
+ public long getModSeq() {
+ return metaData.getModSeq();
+ }
+
+ @Override
+ public List<Property> getProperties() {
+ return original.getProperties();
+ }
+
+ @Override
+ public String getSubType() {
+ return original.getSubType();
+ }
+
+ @Override
+ public Long getTextualLineCount() {
+ return original.getTextualLineCount();
+ }
+
+ @Override
+ public long getUid() {
+ return metaData.getUid();
+ }
+
+ @Override
+ public boolean isAnswered() {
+ return original.isAnswered();
+ }
+
+ @Override
+ public boolean isDeleted() {
+ return original.isDeleted();
+
+ }
+
+ @Override
+ public boolean isDraft() {
+ return original.isDraft();
+
+ }
+
+ @Override
+ public boolean isFlagged() {
+ return original.isFlagged();
+ }
+
+ @Override
+ public boolean isRecent() {
+ return original.isRecent();
+ }
+
+ @Override
+ public boolean isSeen() {
+ return original.isSeen();
+ }
+
+ @Override
+ public void setFlags(Flags flags) {
+ throw new UnsupportedOperationException("Read-Only Message");
+ }
+
+ @Override
+ public void setModSeq(long modSeq) {
+ throw new UnsupportedOperationException("Read-Only Message");
+ }
+
+ @Override
+ public void setUid(long uid) {
+ throw new UnsupportedOperationException("Read-Only Message");
+ }
+
+ @Override
+ public int compareTo(Message<Id> o) {
+ return (int) (metaData.getUid() - o.getUid());
+ }
+
+
+ });
+ }
+
+ return metaData;
}
@@ -370,13 +506,14 @@ public abstract class AbstractMessageMap
/**
- * Save the {@link Message} for the given {@link Mailbox}
+ * Save the {@link Message} for the given {@link Mailbox} and return the {@link MessageMetaData}
*
* @param mailbox
* @param message
+ * @return metaData
* @throws MailboxException
*/
- protected abstract void save(Mailbox<Id> mailbox, Message<Id> message) throws MailboxException;
+ protected abstract MessageMetaData save(Mailbox<Id> mailbox, Message<Id> message) throws MailboxException;
/**
@@ -386,9 +523,10 @@ public abstract class AbstractMessageMap
* @param uid
* @param modSeq
* @param original
+ * @return metaData
* @throws MailboxException
*/
- protected abstract void copy(Mailbox<Id> mailbox, long uid, long modSeq, Message<Id> original) throws MailboxException;
+ protected abstract MessageMetaData copy(Mailbox<Id> mailbox, long uid, long modSeq, Message<Id> original) throws MailboxException;
/**
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org