Author: norman Date: Fri Jun 25 11:27:56 2010 New Revision: 957892 URL: http://svn.apache.org/viewvc?rev=957892&view=rev Log: Move copy(..) to MessageMapper, and use Workspace.copy(..) in jcr to improve performance on copy operations (IMAP-163)
Modified: james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRMessageManager.java james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/JCRMessageMapper.java james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAMessageManager.java james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/mail/JPAMessageMapper.java james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/openjpa/OpenJPAMessageManager.java james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryStoreMessageManager.java james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/mail/InMemoryMessageMapper.java james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMessageManager.java james/imap/trunk/store/src/main/java/org/apache/james/imap/store/mail/MessageMapper.java Modified: james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRMessageManager.java URL: http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRMessageManager.java?rev=957892&r1=957891&r2=957892&view=diff ============================================================================== --- james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRMessageManager.java (original) +++ james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRMessageManager.java Fri Jun 25 11:27:56 2010 @@ -54,12 +54,6 @@ public class JCRMessageManager extends S } @Override - protected MailboxMembership<String> copyMessage(MailboxMembership<String> originalMessage, long uid, MailboxSession session) throws MailboxException { - MailboxMembership<String> newRow = new JCRMessage(getMailboxId(), uid, (JCRMessage) originalMessage, log); - return newRow; - } - - @Override protected Header createHeader(int lineNumber, String name, String value) { return new JCRHeader(lineNumber, name, value, log); } Modified: james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/JCRMessageMapper.java URL: http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/JCRMessageMapper.java?rev=957892&r1=957891&r2=957892&view=diff ============================================================================== --- james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/JCRMessageMapper.java (original) +++ james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/JCRMessageMapper.java Fri Jun 25 11:27:56 2010 @@ -575,5 +575,22 @@ public class JCRMessageMapper extends Ab final String jql = queryBuilder.toString(); return jql; } + + /* + * (non-Javadoc) + * @see org.apache.james.imap.store.mail.MessageMapper#copy(java.lang.Object, long, org.apache.james.imap.store.mail.model.MailboxMembership) + */ + public MailboxMembership<String> copy(String uuid, long uid, MailboxMembership<String> oldmessage) throws StorageException{ + try { + String newMessagePath = getSession().getNodeByIdentifier(uuid).getPath() + NODE_DELIMITER + String.valueOf(uid); + getSession().getWorkspace().copy(((JCRMessage)oldmessage).getNode().getPath(), getSession().getNodeByIdentifier(uuid).getPath() + NODE_DELIMITER + String.valueOf(uid)); + Node node = getSession().getNode(newMessagePath); + node.setProperty(JCRMessage.MAILBOX_UUID_PROPERTY, uuid); + node.setProperty(JCRMessage.UID_PROPERTY, uid); + return new JCRMessage(node,getLogger()); + } catch (RepositoryException e) { + throw new StorageException(HumanReadableText.SAVE_FAILED, e); + } + } } Modified: james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAMessageManager.java URL: http://svn.apache.org/viewvc/james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAMessageManager.java?rev=957892&r1=957891&r2=957892&view=diff ============================================================================== --- james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAMessageManager.java (original) +++ james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAMessageManager.java Fri Jun 25 11:27:56 2010 @@ -25,7 +25,6 @@ import java.util.List; import javax.mail.Flags; -import org.apache.james.imap.jpa.mail.model.AbstractJPAMailboxMembership; import org.apache.james.imap.jpa.mail.model.JPAHeader; import org.apache.james.imap.jpa.mail.model.JPAMailboxMembership; import org.apache.james.imap.mailbox.MailboxException; @@ -59,12 +58,7 @@ public class JPAMessageManager extends S final MailboxMembership<Long> message = new JPAMailboxMembership(getMailboxId(), uid, internalDate, size, flags, document, bodyStartOctet, jpaHeaders, propertyBuilder); return message; } - - @Override - protected MailboxMembership<Long> copyMessage(MailboxMembership<Long> originalMessage, long uid, MailboxSession session) throws MailboxException{ - final MailboxMembership<Long> newRow = new JPAMailboxMembership(getMailboxId(), uid, (AbstractJPAMailboxMembership) originalMessage); - return newRow; - } + @Override protected Header createHeader(int lineNumber, String name, String value) { Modified: james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/mail/JPAMessageMapper.java URL: http://svn.apache.org/viewvc/james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/mail/JPAMessageMapper.java?rev=957892&r1=957891&r2=957892&view=diff ============================================================================== --- james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/mail/JPAMessageMapper.java (original) +++ james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/mail/JPAMessageMapper.java Fri Jun 25 11:27:56 2010 @@ -26,6 +26,10 @@ import javax.persistence.Query; import org.apache.james.imap.api.display.HumanReadableText; import org.apache.james.imap.jpa.JPATransactionalMapper; +import org.apache.james.imap.jpa.mail.model.AbstractJPAMailboxMembership; +import org.apache.james.imap.jpa.mail.model.JPAMailboxMembership; +import org.apache.james.imap.jpa.mail.model.openjpa.JPAStreamingMailboxMembership; +import org.apache.james.imap.mailbox.MailboxException; import org.apache.james.imap.mailbox.MessageRange; import org.apache.james.imap.mailbox.SearchQuery; import org.apache.james.imap.mailbox.StorageException; @@ -276,4 +280,23 @@ public class JPAMessageMapper extends JP throw new StorageException(HumanReadableText.SAVE_FAILED, e); } } + + /* + * (non-Javadoc) + * @see org.apache.james.imap.store.mail.MessageMapper#copy(java.lang.Object, long, org.apache.james.imap.store.mail.model.MailboxMembership) + */ + public MailboxMembership<Long> copy(Long mailboxId, long uid, MailboxMembership<Long> original) throws StorageException { + try { + MailboxMembership<Long> copy; + if (original instanceof JPAStreamingMailboxMembership) { + copy = new JPAStreamingMailboxMembership(mailboxId, uid, (AbstractJPAMailboxMembership) original); + } else { + copy = new JPAMailboxMembership(mailboxId, uid, (AbstractJPAMailboxMembership)original); + } + save(mailboxId, copy); + return copy; + } catch (MailboxException e) { + throw new StorageException(e.getKey(),e); + } + } } Modified: james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/openjpa/OpenJPAMessageManager.java URL: http://svn.apache.org/viewvc/james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/openjpa/OpenJPAMessageManager.java?rev=957892&r1=957891&r2=957892&view=diff ============================================================================== --- james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/openjpa/OpenJPAMessageManager.java (original) +++ james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/openjpa/OpenJPAMessageManager.java Fri Jun 25 11:27:56 2010 @@ -28,7 +28,6 @@ import javax.mail.Flags; import org.apache.james.imap.jpa.JPAMailboxSessionMapperFactory; import org.apache.james.imap.jpa.JPAMessageManager; -import org.apache.james.imap.jpa.mail.model.AbstractJPAMailboxMembership; import org.apache.james.imap.jpa.mail.model.JPAHeader; import org.apache.james.imap.jpa.mail.model.openjpa.JPAStreamingMailboxMembership; import org.apache.james.imap.mailbox.MailboxException; @@ -62,15 +61,6 @@ public class OpenJPAMessageManager exten } @Override - protected MailboxMembership<Long> copyMessage(MailboxMembership<Long> originalMessage, long uid, MailboxSession session) throws MailboxException { - if (useStreaming) { - return new JPAStreamingMailboxMembership(getMailboxId(), uid, (AbstractJPAMailboxMembership) originalMessage); - } else { - return super.copyMessage(originalMessage, uid, session); - } - } - - @Override protected MailboxMembership<Long> createMessage(Date internalDate, long uid, int size, int bodyStartOctet, InputStream document, Flags flags, List<Header> headers, PropertyBuilder propertyBuilder) throws MailboxException { if (useStreaming) { final List<JPAHeader> jpaHeaders = new ArrayList<JPAHeader>(headers.size()); Modified: james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryStoreMessageManager.java URL: http://svn.apache.org/viewvc/james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryStoreMessageManager.java?rev=957892&r1=957891&r2=957892&view=diff ============================================================================== --- james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryStoreMessageManager.java (original) +++ james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryStoreMessageManager.java Fri Jun 25 11:27:56 2010 @@ -46,12 +46,7 @@ public class InMemoryStoreMessageManager MailboxSession session) throws MailboxException { super(mapperFactory, dispatcher, consumer, mailbox, session); } - - @Override - protected MailboxMembership<Long> copyMessage(MailboxMembership<Long> originalMessage, long uid, MailboxSession session) { - return new SimpleMailboxMembership(getMailboxId(), uid, (SimpleMailboxMembership) originalMessage); - } - + @Override protected Header createHeader(int lineNumber, String name, String value) { return new SimpleHeader(name, lineNumber, value); Modified: james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/mail/InMemoryMessageMapper.java URL: http://svn.apache.org/viewvc/james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/mail/InMemoryMessageMapper.java?rev=957892&r1=957891&r2=957892&view=diff ============================================================================== --- james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/mail/InMemoryMessageMapper.java (original) +++ james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/mail/InMemoryMessageMapper.java Fri Jun 25 11:27:56 2010 @@ -7,6 +7,7 @@ import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import org.apache.james.imap.inmemory.mail.model.SimpleMailboxMembership; import org.apache.james.imap.mailbox.MailboxException; import org.apache.james.imap.mailbox.MessageRange; import org.apache.james.imap.mailbox.SearchQuery; @@ -183,5 +184,15 @@ public class InMemoryMessageMapper imple public void endRequest() { // Do nothing } + + /* + * (non-Javadoc) + * @see org.apache.james.imap.store.mail.MessageMapper#copy(java.lang.Object, long, org.apache.james.imap.store.mail.model.MailboxMembership) + */ + public MailboxMembership<Long> copy(Long mailboxId, long uid, MailboxMembership<Long> original) throws StorageException { + SimpleMailboxMembership membership = new SimpleMailboxMembership(mailboxId, uid, (SimpleMailboxMembership) original); + save(mailboxId, membership); + return membership; + } } Modified: james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMessageManager.java URL: http://svn.apache.org/viewvc/james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMessageManager.java?rev=957892&r1=957891&r2=957892&view=diff ============================================================================== --- james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMessageManager.java (original) +++ james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMessageManager.java Fri Jun 25 11:27:56 2010 @@ -94,6 +94,10 @@ public abstract class StoreMessageManage this.messageMapper = mapperFactory.getMessageMapper(session); } + protected MessageMapper<Id> getMessageMapper() { + return messageMapper; + } + /** * Return the {...@link MailboxEventDispatcher} for this Mailbox * @@ -104,15 +108,6 @@ public abstract class StoreMessageManage } /** - * Copy the given {...@link MailboxMembership} to a new instance with the given uid - * - * @param originalMessage - * @param uid - * @return membershipCopy - */ - protected abstract MailboxMembership<Id> copyMessage(MailboxMembership<Id> originalMessage, long uid, MailboxSession session) throws MailboxException; - - /** * Return the underlying {...@link Mailbox} * * @param session @@ -593,8 +588,7 @@ public abstract class StoreMessageManage messageMapper.execute(new TransactionalMapper.Transaction() { public void run() throws MailboxException { - final MailboxMembership<Id> newRow = copyMessage(originalMessage, uid, session); - messageMapper.save(getMailboxId(), newRow); + final MailboxMembership<Id> newRow = messageMapper.copy(getMailboxId(), uid, originalMessage); copiedRows.add(newRow); } Modified: james/imap/trunk/store/src/main/java/org/apache/james/imap/store/mail/MessageMapper.java URL: http://svn.apache.org/viewvc/james/imap/trunk/store/src/main/java/org/apache/james/imap/store/mail/MessageMapper.java?rev=957892&r1=957891&r2=957892&view=diff ============================================================================== --- james/imap/trunk/store/src/main/java/org/apache/james/imap/store/mail/MessageMapper.java (original) +++ james/imap/trunk/store/src/main/java/org/apache/james/imap/store/mail/MessageMapper.java Fri Jun 25 11:27:56 2010 @@ -125,5 +125,17 @@ public interface MessageMapper<Id> exten * @throws StorageException */ public abstract void save(Id mailboxId, MailboxMembership<Id> message) throws StorageException; + + + /** + * Copy the given {...@link MailboxMembership} to a new mailbox + * + * @param mailboxId the id of the mailbox to copy to + * @param uid the uid to use for the new mailboxmembership + * @param original the original to copy + * @return membership. The copied instance + * @throws StorageException + */ + public abstract MailboxMembership<Id> copy(Id mailboxId, long uid, MailboxMembership<Id> original) throws StorageException; } \ No newline at end of file --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org