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: [email protected]
For additional commands, e-mail: [email protected]