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 2010/08/18 17:20:07 UTC

svn commit: r986733 - in /james/imap/trunk: jcr/src/main/java/org/apache/james/imap/jcr/ jpa/src/main/java/org/apache/james/imap/jpa/ maildir/src/main/java/org/apache/james/imap/maildir/mail/ maildir/src/main/java/org/apache/james/imap/maildir/user/ me...

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-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org