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

Reply via email to