Author: norman Date: Wed Aug 18 15:20:07 2010 New Revision: 986733 URL: http://svn.apache.org/viewvc?rev=986733&view=rev Log: Allow to return a value when execute Transactions
Modified: james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRMailboxManager.java james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAMailboxManager.java james/imap/trunk/maildir/src/main/java/org/apache/james/imap/maildir/mail/MaildirMailboxMapper.java james/imap/trunk/maildir/src/main/java/org/apache/james/imap/maildir/mail/MaildirMessageMapper.java james/imap/trunk/maildir/src/main/java/org/apache/james/imap/maildir/user/MaildirSubscriptionMapper.java james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryMailboxSessionMapperFactory.java james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/mail/InMemoryMailboxMapper.java james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/mail/InMemoryMessageMapper.java james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/user/InMemorySubscriptionMapper.java james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailboxManager.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/StoreSubscriptionManager.java james/imap/trunk/store/src/main/java/org/apache/james/imap/store/transaction/AbstractTransactionalMapper.java james/imap/trunk/store/src/main/java/org/apache/james/imap/store/transaction/TransactionalMapper.java Modified: james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRMailboxManager.java URL: http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRMailboxManager.java?rev=986733&r1=986732&r2=986733&view=diff ============================================================================== --- james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRMailboxManager.java (original) +++ james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRMailboxManager.java Wed Aug 18 15:20:07 2010 @@ -61,9 +61,9 @@ public class JCRMailboxManager extends S protected void doCreateMailbox(MailboxPath path, MailboxSession session) throws MailboxException { final Mailbox<String> mailbox = new org.apache.james.imap.jcr.mail.model.JCRMailbox(path, randomUidValidity(), logger); final JCRMailboxMapper mapper = (JCRMailboxMapper) mapperFactory.getMailboxMapper(session); - mapper.execute(new TransactionalMapper.Transaction() { + mapper.execute(new TransactionalMapper.VoidTransaction() { - public void run() throws MailboxException { + public void runVoid() throws MailboxException { mapper.save(mailbox); } Modified: james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAMailboxManager.java URL: http://svn.apache.org/viewvc/james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAMailboxManager.java?rev=986733&r1=986732&r2=986733&view=diff ============================================================================== --- james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAMailboxManager.java (original) +++ james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAMailboxManager.java Wed Aug 18 15:20:07 2010 @@ -43,9 +43,9 @@ public abstract class JPAMailboxManager protected void doCreateMailbox(MailboxPath path, MailboxSession session) throws MailboxException { final Mailbox<Long> mailbox = new JPAMailbox(path, randomUidValidity()); final MailboxMapper<Long> mapper = mailboxSessionMapperFactory.getMailboxMapper(session); - mapper.execute(new TransactionalMapper.Transaction(){ + mapper.execute(new TransactionalMapper.VoidTransaction(){ - public void run() throws MailboxException { + public void runVoid() throws MailboxException { mapper.save(mailbox); } @@ -60,9 +60,9 @@ public abstract class JPAMailboxManager */ public void deleteEverything(MailboxSession mailboxSession) throws MailboxException { final MailboxMapper<Long> mapper = mailboxSessionMapperFactory.getMailboxMapper(mailboxSession); - mapper.execute(new TransactionalMapper.Transaction() { + mapper.execute(new TransactionalMapper.VoidTransaction() { - public void run() throws MailboxException { + public void runVoid() throws MailboxException { mapper.deleteAll(); } Modified: james/imap/trunk/maildir/src/main/java/org/apache/james/imap/maildir/mail/MaildirMailboxMapper.java URL: http://svn.apache.org/viewvc/james/imap/trunk/maildir/src/main/java/org/apache/james/imap/maildir/mail/MaildirMailboxMapper.java?rev=986733&r1=986732&r2=986733&view=diff ============================================================================== --- james/imap/trunk/maildir/src/main/java/org/apache/james/imap/maildir/mail/MaildirMailboxMapper.java (original) +++ james/imap/trunk/maildir/src/main/java/org/apache/james/imap/maildir/mail/MaildirMailboxMapper.java Wed Aug 18 15:20:07 2010 @@ -215,9 +215,9 @@ public class MaildirMailboxMapper implem * (non-Javadoc) * @see org.apache.james.imap.store.transaction.TransactionalMapper#execute(org.apache.james.imap.store.transaction.TransactionalMapper.Transaction) */ - public void execute(Transaction transaction) throws MailboxException { + public <T> T execute(Transaction<T> transaction) throws MailboxException { // no transactions used - transaction.run(); + return transaction.run(); } /** Modified: james/imap/trunk/maildir/src/main/java/org/apache/james/imap/maildir/mail/MaildirMessageMapper.java URL: http://svn.apache.org/viewvc/james/imap/trunk/maildir/src/main/java/org/apache/james/imap/maildir/mail/MaildirMessageMapper.java?rev=986733&r1=986732&r2=986733&view=diff ============================================================================== --- james/imap/trunk/maildir/src/main/java/org/apache/james/imap/maildir/mail/MaildirMessageMapper.java (original) +++ james/imap/trunk/maildir/src/main/java/org/apache/james/imap/maildir/mail/MaildirMessageMapper.java Wed Aug 18 15:20:07 2010 @@ -448,9 +448,9 @@ public class MaildirMessageMapper implem * (non-Javadoc) * @see org.apache.james.imap.store.transaction.TransactionalMapper#execute(org.apache.james.imap.store.transaction.TransactionalMapper.Transaction) */ - public void execute(Transaction transaction) throws MailboxException { + public <T> T execute(Transaction<T> transaction) throws MailboxException { // no transactions used - transaction.run(); + return transaction.run(); } /** Modified: james/imap/trunk/maildir/src/main/java/org/apache/james/imap/maildir/user/MaildirSubscriptionMapper.java URL: http://svn.apache.org/viewvc/james/imap/trunk/maildir/src/main/java/org/apache/james/imap/maildir/user/MaildirSubscriptionMapper.java?rev=986733&r1=986732&r2=986733&view=diff ============================================================================== --- james/imap/trunk/maildir/src/main/java/org/apache/james/imap/maildir/user/MaildirSubscriptionMapper.java (original) +++ james/imap/trunk/maildir/src/main/java/org/apache/james/imap/maildir/user/MaildirSubscriptionMapper.java Wed Aug 18 15:20:07 2010 @@ -123,8 +123,8 @@ public class MaildirSubscriptionMapper i * (non-Javadoc) * @see org.apache.james.imap.store.transaction.TransactionalMapper#execute(org.apache.james.imap.store.transaction.TransactionalMapper.Transaction) */ - public void execute(Transaction transaction) throws MailboxException { - transaction.run(); + public <T> T execute(Transaction<T> transaction) throws MailboxException { + return transaction.run(); } /** Modified: james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryMailboxSessionMapperFactory.java URL: http://svn.apache.org/viewvc/james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryMailboxSessionMapperFactory.java?rev=986733&r1=986732&r2=986733&view=diff ============================================================================== --- james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryMailboxSessionMapperFactory.java (original) +++ james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryMailboxSessionMapperFactory.java Wed Aug 18 15:20:07 2010 @@ -64,9 +64,9 @@ public class InMemoryMailboxSessionMappe public void deleteAll() throws MailboxException { final MailboxMapper<Long> mapper = mailboxMapper; - mapper.execute(new TransactionalMapper.Transaction() { + mapper.execute(new TransactionalMapper.VoidTransaction() { - public void run() throws MailboxException { + public void runVoid() throws MailboxException { mapper.deleteAll(); } Modified: james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/mail/InMemoryMailboxMapper.java URL: http://svn.apache.org/viewvc/james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/mail/InMemoryMailboxMapper.java?rev=986733&r1=986732&r2=986733&view=diff ============================================================================== --- james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/mail/InMemoryMailboxMapper.java (original) +++ james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/mail/InMemoryMailboxMapper.java Wed Aug 18 15:20:07 2010 @@ -119,8 +119,8 @@ public class InMemoryMailboxMapper imple * (non-Javadoc) * @see org.apache.james.imap.store.transaction.TransactionalMapper#execute(org.apache.james.imap.store.transaction.TransactionalMapper.Transaction) */ - public void execute(Transaction transaction) throws MailboxException { - transaction.run(); + public <T> T execute(Transaction<T> transaction) throws MailboxException { + return transaction.run(); } /** 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=986733&r1=986732&r2=986733&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 Wed Aug 18 15:20:07 2010 @@ -183,8 +183,8 @@ public class InMemoryMessageMapper imple /** * There is no really Transaction handling here.. Just run it */ - public void execute(Transaction transaction) throws MailboxException { - transaction.run(); + public <T> T execute(Transaction<T> transaction) throws MailboxException { + return transaction.run(); } public void deleteAll() { Modified: james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/user/InMemorySubscriptionMapper.java URL: http://svn.apache.org/viewvc/james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/user/InMemorySubscriptionMapper.java?rev=986733&r1=986732&r2=986733&view=diff ============================================================================== --- james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/user/InMemorySubscriptionMapper.java (original) +++ james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/user/InMemorySubscriptionMapper.java Wed Aug 18 15:20:07 2010 @@ -104,8 +104,8 @@ public class InMemorySubscriptionMapper * (non-Javadoc) * @see org.apache.james.imap.store.transaction.TransactionalMapper#execute(org.apache.james.imap.store.transaction.TransactionalMapper.Transaction) */ - public void execute(Transaction transaction) throws MailboxException { - transaction.run(); + public <T> T execute(Transaction<T> transaction) throws MailboxException { + return transaction.run(); } public void deleteAll() { Modified: james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailboxManager.java URL: http://svn.apache.org/viewvc/james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailboxManager.java?rev=986733&r1=986732&r2=986733&view=diff ============================================================================== --- james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailboxManager.java (original) +++ james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailboxManager.java Wed Aug 18 15:20:07 2010 @@ -143,9 +143,9 @@ public abstract class StoreMailboxManage session.getLog().info("deleteMailbox " + mailboxPath); final MailboxMapper<Id> mapper = mailboxSessionMapperFactory.getMailboxMapper(session); - mapper.execute(new TransactionalMapper.Transaction() { + mapper.execute(new TransactionalMapper.VoidTransaction() { - public void run() throws MailboxException { + public void runVoid() throws MailboxException { Mailbox<Id> mailbox = mapper.findMailboxByPath(mailboxPath); if (mailbox == null) { throw new MailboxNotFoundException("Mailbox not found"); @@ -172,9 +172,9 @@ public abstract class StoreMailboxManage } final MailboxMapper<Id> mapper = mailboxSessionMapperFactory.getMailboxMapper(session); - mapper.execute(new TransactionalMapper.Transaction() { + mapper.execute(new TransactionalMapper.VoidTransaction() { - public void run() throws MailboxException { + public void runVoid() throws MailboxException { // TODO put this into a serilizable transaction final Mailbox<Id> mailbox = mapper.findMailboxByPath(from); if (mailbox == null) { 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=986733&r1=986732&r2=986733&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 Wed Aug 18 15:20:07 2010 @@ -243,14 +243,12 @@ public abstract class StoreMessageManage flags.add(Flags.Flag.RECENT); } final MailboxMembership<Id> message = createMessage(internalDate, size, bodyStartOctet, tmpMsgIn.newStream(0, -1), flags, headers, propertyBuilder); - final List<Long> uids = new ArrayList<Long>(); - messageMapper.execute(new TransactionalMapper.Transaction() { + long uid = messageMapper.execute(new TransactionalMapper.Transaction<Long>() { - public void run() throws MailboxException { - uids.add(messageMapper.save(mailbox, message)); + public Long run() throws MailboxException { + return messageMapper.save(mailbox, message); } }); - long uid = uids.get(0); dispatcher.added(uid, mailboxSession.getSessionId(), new StoreMailboxPath<Id>(getMailboxEntity())); return uid; } catch (IOException e) { @@ -375,12 +373,12 @@ public abstract class StoreMessageManage * @throws MailboxException */ protected List<Long> recent(final boolean reset, MailboxSession mailboxSession) throws MailboxException { - final List<Long> results = new ArrayList<Long>(); - messageMapper.execute(new TransactionalMapper.Transaction() { + return messageMapper.execute(new TransactionalMapper.Transaction<List<Long>>() { - public void run() throws MailboxException { + public List<Long> run() throws MailboxException { final List<MailboxMembership<Id>> members = messageMapper.findRecentMessagesInMailbox(mailbox, -1); + final List<Long> results = new ArrayList<Long>(); for (MailboxMembership<Id> member:members) { results.add(member.getUid()); @@ -391,11 +389,11 @@ public abstract class StoreMessageManage messageMapper.save(mailbox, member); } } + return results; } - });; + }); - return results; } @@ -404,16 +402,19 @@ public abstract class StoreMessageManage * @see org.apache.james.imap.mailbox.Mailbox#expunge(org.apache.james.imap.mailbox.MessageRange, org.apache.james.imap.mailbox.MailboxSession) */ public Iterator<Long> expunge(final MessageRange set, MailboxSession mailboxSession) throws MailboxException { - final Collection<Long> uids = new TreeSet<Long>(); - messageMapper.execute(new TransactionalMapper.Transaction() { + Collection<Long> uids = messageMapper.execute(new TransactionalMapper.Transaction<Collection<Long>>() { + + public Collection<Long> run() throws MailboxException { + final Collection<Long> uids = new TreeSet<Long>(); - public void run() throws MailboxException { final List<MailboxMembership<Id>> members = messageMapper.findMarkedForDeletionInMailbox(mailbox, set); for (MailboxMembership<Id> message:members) { uids.add(message.getUid()); messageMapper.delete(mailbox, message); + } + return uids; } }); @@ -433,9 +434,9 @@ public abstract class StoreMessageManage final MessageRange set, MailboxSession mailboxSession) throws MailboxException { final SortedMap<Long, Flags> newFlagsByUid = new TreeMap<Long, Flags>(); final Map<Long, Flags> originalFlagsByUid = new HashMap<Long, Flags>(INITIAL_SIZE_FLAGS); - messageMapper.execute(new TransactionalMapper.Transaction(){ + messageMapper.execute(new TransactionalMapper.VoidTransaction(){ - public void run() throws MailboxException { + public void runVoid() throws MailboxException { final List<MailboxMembership<Id>> members = messageMapper.findInMailbox(mailbox, set); for (final MailboxMembership<Id> member:members) { originalFlagsByUid.put(member.getUid(), member.createFlags()); @@ -499,16 +500,19 @@ public abstract class StoreMessageManage private void copy(final List<MailboxMembership<Id>> originalRows, final MailboxSession session) throws MailboxException { try { final List<MailboxMembership<Id>> copiedRows = new ArrayList<MailboxMembership<Id>>(); - for (final MailboxMembership<Id> originalMessage:originalRows) { - messageMapper.execute(new TransactionalMapper.Transaction() { + copiedRows.addAll(messageMapper.execute(new TransactionalMapper.Transaction<List<MailboxMembership<Id>>>() { + + public List<MailboxMembership<Id>> run() throws MailboxException { + final List<MailboxMembership<Id>> copiedRows = new ArrayList<MailboxMembership<Id>>(); - public void run() throws MailboxException { final MailboxMembership<Id> newRow = messageMapper.copy(mailbox, originalMessage); + copiedRows.add(newRow); + return copiedRows; } - }); + })); } // Wait until commit before issuing events for (MailboxMembership<Id> newMember:copiedRows) { Modified: james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreSubscriptionManager.java URL: http://svn.apache.org/viewvc/james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreSubscriptionManager.java?rev=986733&r1=986732&r2=986733&view=diff ============================================================================== --- james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreSubscriptionManager.java (original) +++ james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreSubscriptionManager.java Wed Aug 18 15:20:07 2010 @@ -49,9 +49,9 @@ public abstract class StoreSubscriptionM public void subscribe(final MailboxSession session, final String mailbox) throws SubscriptionException { final SubscriptionMapper mapper = mapperFactory.getSubscriptionMapper(session); try { - mapper.execute(new TransactionalMapper.Transaction() { + mapper.execute(new TransactionalMapper.VoidTransaction() { - public void run() throws MailboxException { + public void runVoid() throws MailboxException { final Subscription subscription = mapper.findMailboxSubscriptionForUser(session.getUser().getUserName(), mailbox); if (subscription == null) { final Subscription newSubscription = createSubscription(session, mailbox); @@ -95,9 +95,9 @@ public abstract class StoreSubscriptionM public void unsubscribe(final MailboxSession session, final String mailbox) throws SubscriptionException { final SubscriptionMapper mapper = mapperFactory.getSubscriptionMapper(session); try { - mapper.execute(new TransactionalMapper.Transaction() { + mapper.execute(new TransactionalMapper.VoidTransaction() { - public void run() throws MailboxException { + public void runVoid() throws MailboxException { final Subscription subscription = mapper.findMailboxSubscriptionForUser(session.getUser().getUserName(), mailbox); if (subscription != null) { mapper.delete(subscription); Modified: james/imap/trunk/store/src/main/java/org/apache/james/imap/store/transaction/AbstractTransactionalMapper.java URL: http://svn.apache.org/viewvc/james/imap/trunk/store/src/main/java/org/apache/james/imap/store/transaction/AbstractTransactionalMapper.java?rev=986733&r1=986732&r2=986733&view=diff ============================================================================== --- james/imap/trunk/store/src/main/java/org/apache/james/imap/store/transaction/AbstractTransactionalMapper.java (original) +++ james/imap/trunk/store/src/main/java/org/apache/james/imap/store/transaction/AbstractTransactionalMapper.java Wed Aug 18 15:20:07 2010 @@ -32,11 +32,12 @@ public abstract class AbstractTransactio * (non-Javadoc) * @see org.apache.james.imap.store.transaction.TransactionalMapper#execute(org.apache.james.imap.store.transaction.TransactionalMapper.Transaction) */ - public final void execute(Transaction transaction) throws MailboxException { + public final <T> T execute(Transaction<T> transaction) throws MailboxException { begin(); try { - transaction.run(); + T value = transaction.run(); commit(); + return value; } catch (MailboxException e) { rollback(); throw e; Modified: james/imap/trunk/store/src/main/java/org/apache/james/imap/store/transaction/TransactionalMapper.java URL: http://svn.apache.org/viewvc/james/imap/trunk/store/src/main/java/org/apache/james/imap/store/transaction/TransactionalMapper.java?rev=986733&r1=986732&r2=986733&view=diff ============================================================================== --- james/imap/trunk/store/src/main/java/org/apache/james/imap/store/transaction/TransactionalMapper.java (original) +++ james/imap/trunk/store/src/main/java/org/apache/james/imap/store/transaction/TransactionalMapper.java Wed Aug 18 15:20:07 2010 @@ -38,19 +38,29 @@ public interface TransactionalMapper { * @param transaction * @throws MailboxException */ - public void execute(Transaction transaction) throws MailboxException; + public <T> T execute(Transaction<T> transaction) throws MailboxException; /** * Unit of work executed in a Transaction * */ - public interface Transaction { + public interface Transaction<T> { /** - * Run unit of work in a Transaction + * Run unit of work in a Transaction and return a value * * @throws MailboxException */ - public void run() throws MailboxException; + public T run() throws MailboxException; + } + + public abstract class VoidTransaction implements Transaction<Void> { + + public final Void run() throws MailboxException { + runVoid(); + return null; + } + public abstract void runVoid() throws MailboxException; + } } --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org