Author: norman
Date: Wed Jan 13 16:51:46 2010
New Revision: 898835

URL: http://svn.apache.org/viewvc?rev=898835&view=rev
Log:
Some refactoring for better handling of transactions. Now its easier to just 
run stuff in transactions without the need of begin and commit the Transactions

Added:
    
james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/mail/JPATransactionalMapper.java
      - copied, changed from r898752, 
james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/mail/Mapper.java
    
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/mail/AbstractTransactionalMapper.java
    
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/mail/TransactionalMapper.java
Removed:
    
james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/mail/Mapper.java
Modified:
    
james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAMailboxManager.java
    
james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/mail/JPAMailboxMapper.java
    
james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/mail/JPAMessageMapper.java
    
james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryMailboxManager.java
    
james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryStoreMailbox.java
    
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailbox.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/mail/MailboxMapper.java
    
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/mail/MessageMapper.java

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=898835&r1=898834&r2=898835&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 Jan 13 16:51:46 2010
@@ -25,6 +25,7 @@
 import org.apache.james.imap.store.StoreMailboxManager;
 import org.apache.james.imap.store.Subscriber;
 import org.apache.james.imap.store.mail.MailboxMapper;
+import org.apache.james.imap.store.mail.TransactionalMapper;
 import org.apache.james.imap.store.mail.model.Mailbox;
 
 public abstract class JPAMailboxManager extends StoreMailboxManager {
@@ -40,11 +41,15 @@
     
     @Override
     protected void doCreate(String namespaceName) throws MailboxException {
-        Mailbox mailbox = new 
org.apache.james.imap.jpa.mail.model.JPAMailbox(namespaceName, 
randomUidValidity());
+        final Mailbox mailbox = new 
org.apache.james.imap.jpa.mail.model.JPAMailbox(namespaceName, 
randomUidValidity());
         final MailboxMapper mapper = createMailboxMapper();
-        mapper.begin();
-        mapper.save(mailbox);
-        mapper.commit();
+        mapper.execute(new TransactionalMapper.Transaction(){
+
+            public void run() throws MailboxException {
+                mapper.save(mailbox);
+            }
+            
+        });
     }
     
 }

Modified: 
james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/mail/JPAMailboxMapper.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/mail/JPAMailboxMapper.java?rev=898835&r1=898834&r2=898835&view=diff
==============================================================================
--- 
james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/mail/JPAMailboxMapper.java
 (original)
+++ 
james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/mail/JPAMailboxMapper.java
 Wed Jan 13 16:51:46 2010
@@ -35,7 +35,7 @@
 /**
  * Data access management for mailbox.
  */
-public abstract class JPAMailboxMapper extends Mapper implements MailboxMapper 
{
+public abstract class JPAMailboxMapper extends JPATransactionalMapper 
implements MailboxMapper {
 
     private static final char SQL_WILDCARD_CHAR = '%';
     

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=898835&r1=898834&r2=898835&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
 Wed Jan 13 16:51:46 2010
@@ -33,7 +33,7 @@
 import org.apache.james.imap.store.mail.MessageMapper;
 import org.apache.james.imap.store.mail.model.MailboxMembership;
 
-public class JPAMessageMapper extends Mapper implements MessageMapper {
+public class JPAMessageMapper extends JPATransactionalMapper implements 
MessageMapper {
 
     private final long mailboxId;
     

Copied: 
james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/mail/JPATransactionalMapper.java
 (from r898752, 
james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/mail/Mapper.java)
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/mail/JPATransactionalMapper.java?p2=james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/mail/JPATransactionalMapper.java&p1=james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/mail/Mapper.java&r1=898752&r2=898835&rev=898835&view=diff
==============================================================================
--- 
james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/mail/Mapper.java 
(original)
+++ 
james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/mail/JPATransactionalMapper.java
 Wed Jan 13 16:51:46 2010
@@ -23,17 +23,25 @@
 
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.mailbox.StorageException;
+import org.apache.james.imap.store.mail.AbstractTransactionalMapper;
 
-abstract class Mapper {
+/**
+ * JPA implementation of TransactionMapper  
+ *
+ */
+public class JPATransactionalMapper extends AbstractTransactionalMapper {
 
     protected final EntityManager entityManager;
     
-    public Mapper(final EntityManager entityManager) {
-        super();
+    public JPATransactionalMapper(final EntityManager entityManager) {
         this.entityManager = entityManager;
     }
-    
-    public void begin() throws StorageException {
+
+    /*
+     * (non-Javadoc)
+     * @see 
org.apache.james.imap.store.mail.AbstractTransactionalMapper#begin()
+     */
+    protected void begin() throws StorageException {
         try {
             entityManager.getTransaction().begin();
         } catch (PersistenceException e) {
@@ -41,13 +49,23 @@
         }
     }
     
-    public void commit() throws StorageException {
+    /*
+     * (non-Javadoc)
+     * @see 
org.apache.james.imap.store.mail.AbstractTransactionalMapper#commit()
+     */
+    protected void commit() throws StorageException {
         try {
             entityManager.getTransaction().commit();
         } catch (PersistenceException e) {
-            // rollback on exception
-            entityManager.getTransaction().rollback();
             throw new 
StorageException(HumanReadableText.COMMIT_TRANSACTION_FAILED, e);
         }
     }
+    
+    /*
+     * (non-Javadoc)
+     * @see 
org.apache.james.imap.store.mail.AbstractTransactionalMapper#rollback()
+     */
+    protected void rollback() throws StorageException {
+        entityManager.getTransaction().rollback();
+    }
 }

Modified: 
james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryMailboxManager.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryMailboxManager.java?rev=898835&r1=898834&r2=898835&view=diff
==============================================================================
--- 
james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryMailboxManager.java
 (original)
+++ 
james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryMailboxManager.java
 Wed Jan 13 16:51:46 2010
@@ -24,6 +24,7 @@
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
+import org.apache.james.imap.mailbox.MailboxException;
 import org.apache.james.imap.mailbox.MailboxNotFoundException;
 import org.apache.james.imap.mailbox.StorageException;
 import org.apache.james.imap.store.Authenticator;
@@ -60,9 +61,6 @@
         save(mailbox);
     }
 
-    public void begin() throws StorageException {}
-
-    public void commit() throws StorageException {}
 
     public long countMailboxesWithName(String name) throws StorageException {
         int total = 0;
@@ -123,4 +121,8 @@
         mailboxesById.put(mailbox.getMailboxId(), (InMemoryMailbox) mailbox);
     }
 
+    public void execute(Transaction transaction) throws MailboxException {
+        transaction.run();
+    }
+
 }

Modified: 
james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryStoreMailbox.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryStoreMailbox.java?rev=898835&r1=898834&r2=898835&view=diff
==============================================================================
--- 
james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryStoreMailbox.java
 (original)
+++ 
james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryStoreMailbox.java
 Wed Jan 13 16:51:46 2010
@@ -85,12 +85,6 @@
         return mailbox;
     }
 
-    public void begin() throws StorageException {
-    }
-
-    public void commit() throws StorageException {
-    }
-
     public long countMessagesInMailbox() throws StorageException {
         return membershipByUid.size();
     }
@@ -187,4 +181,12 @@
     public List<MailboxMembership> searchMailbox(SearchQuery query) throws 
StorageException {
         return new ArrayList<MailboxMembership>(membershipByUid.values());
     }
+
+
+    /**
+     * There is no really Transaction handling here.. Just run it 
+     */
+    public void execute(Transaction transaction) throws MailboxException {
+        transaction.run();
+    }
 }

Modified: 
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailbox.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailbox.java?rev=898835&r1=898834&r2=898835&view=diff
==============================================================================
--- 
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailbox.java
 (original)
+++ 
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailbox.java
 Wed Jan 13 16:51:46 2010
@@ -37,6 +37,7 @@
 import javax.mail.Flags;
 import javax.mail.MessagingException;
 
+import org.apache.commons.lang.ArrayUtils;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.mailbox.MailboxException;
 import org.apache.james.imap.mailbox.MailboxListener;
@@ -49,6 +50,7 @@
 import org.apache.james.imap.mailbox.util.UidChangeTracker;
 import org.apache.james.imap.mailbox.util.UidRange;
 import org.apache.james.imap.store.mail.MessageMapper;
+import org.apache.james.imap.store.mail.TransactionalMapper;
 import org.apache.james.imap.store.mail.model.Header;
 import org.apache.james.imap.store.mail.model.Mailbox;
 import org.apache.james.imap.store.mail.model.MailboxMembership;
@@ -198,10 +200,13 @@
                 final MailboxMembership message = createMessage(internalDate, 
uid, size, bodyStartOctet, messageBytes, flags, headers, propertyBuilder);
                 final MessageMapper mapper = createMessageMapper();
 
-                mapper.begin();
-                mapper.save(message);
-                mapper.commit();
+                mapper.execute(new TransactionalMapper.Transaction() {
 
+                    public void run() throws MailboxException {
+                        mapper.save(message);
+                    }
+                    
+                });
                 tracker.found(uid, message.createFlags());
                 return uid;
             } catch (IOException e) {
@@ -285,22 +290,26 @@
         return permanentFlags;
     }
 
-    public long[] recent(boolean reset, MailboxSession mailboxSession) throws 
MailboxException {
+    public long[] recent(final boolean reset, MailboxSession mailboxSession) 
throws MailboxException {
         final MessageMapper mapper = createMessageMapper();
-        mapper.begin();
-        final List<MailboxMembership> members = 
mapper.findRecentMessagesInMailbox();
-        final long[] results = new long[members.size()];
+        final List<Long> results = new ArrayList<Long>();
 
-        int count = 0;
-        for (MailboxMembership member:members) {
-            results[count++] = member.getUid();
-            if (reset) {
-                member.unsetRecent();
-            }
-        }
+        mapper.execute(new TransactionalMapper.Transaction() {
 
-        mapper.commit();
-        return results;
+            public void run() throws MailboxException {
+                final List<MailboxMembership> members = 
mapper.findRecentMessagesInMailbox();
+
+                for (MailboxMembership member:members) {
+                    results.add(member.getUid());
+                    if (reset) {
+                        member.unsetRecent();
+                    }
+                }
+            }
+            
+        });;
+        
+        return ArrayUtils.toPrimitive(results.toArray(new 
Long[results.size()]));
     }
 
     public Long getFirstUnseen(MailboxSession mailboxSession) throws 
MailboxException {
@@ -335,14 +344,20 @@
     private Iterator<Long> doExpunge(final MessageRange set)
     throws MailboxException {
         final MessageMapper mapper = createMessageMapper();
-        mapper.begin();
-        final List<MailboxMembership> members = 
mapper.findMarkedForDeletionInMailbox(set);
         final Collection<Long> uids = new TreeSet<Long>();
-        for (MailboxMembership message:members) {
-            uids.add(message.getUid());
-            mapper.delete(message);
-        }
-        mapper.commit();
+        
+        mapper.execute(new TransactionalMapper.Transaction() {
+
+            public void run() throws MailboxException {
+                final List<MailboxMembership> members = 
mapper.findMarkedForDeletionInMailbox(set);
+                for (MailboxMembership message:members) {
+                    uids.add(message.getUid());
+                    mapper.delete(message);
+                }  
+            }
+            
+        });
+        
         tracker.expunged(uids);
         return uids.iterator();
     }
@@ -352,30 +367,35 @@
         return doSetFlags(flags, value, replace, set, mailboxSession);
     }
 
-    private Map<Long, Flags> doSetFlags(Flags flags, boolean value, boolean 
replace,
-            final MessageRange set, MailboxSession mailboxSession) throws 
MailboxException {
+    private Map<Long, Flags> doSetFlags(final Flags flags, final boolean 
value, final boolean replace,
+            final MessageRange set, final MailboxSession mailboxSession) 
throws MailboxException {
         final MessageMapper mapper = createMessageMapper();
         final SortedMap<Long, Flags> newFlagsByUid = new TreeMap<Long, 
Flags>();
         final Map<Long, Flags> originalFlagsByUid = new HashMap<Long, 
Flags>(INITIAL_SIZE_FLAGS);
-        mapper.begin();
-        final List<MailboxMembership> members = mapper.findInMailbox(set);
-        for (final MailboxMembership member:members) {
-            originalFlagsByUid.put(member.getUid(), member.createFlags());
-            if (replace) {
-                member.setFlags(flags);
-            } else {
-                Flags current = member.createFlags();
-                if (value) {
-                    current.add(flags);
-                } else {
-                    current.remove(flags);
+        mapper.execute(new TransactionalMapper.Transaction(){
+
+            public void run() throws MailboxException {
+                final List<MailboxMembership> members = 
mapper.findInMailbox(set);
+                for (final MailboxMembership member:members) {
+                    originalFlagsByUid.put(member.getUid(), 
member.createFlags());
+                    if (replace) {
+                        member.setFlags(flags);
+                    } else {
+                        Flags current = member.createFlags();
+                        if (value) {
+                            current.add(flags);
+                        } else {
+                            current.remove(flags);
+                        }
+                        member.setFlags(current);
+                    }
+                    newFlagsByUid.put(member.getUid(), member.createFlags());
+                    mapper.save(member);
                 }
-                member.setFlags(current);
             }
-            newFlagsByUid.put(member.getUid(), member.createFlags());
-            mapper.save(member);
-        }
-        mapper.commit();
+            
+        });
+       
         tracker.flagsUpdated(newFlagsByUid, originalFlagsByUid, 
mailboxSession.getSessionId());
         return newFlagsByUid;
     }
@@ -428,24 +448,27 @@
     }
     
 
-    public void copy(List<MailboxMembership> originalRows, MailboxSession 
session) throws MailboxException {
+    public void copy(final List<MailboxMembership> originalRows, 
MailboxSession session) throws MailboxException {
         try {
+            final List<MailboxMembership> copiedRows = new 
ArrayList<MailboxMembership>();
             final MessageMapper mapper = createMessageMapper();
-            mapper.begin();
+            mapper.execute(new TransactionalMapper.Transaction() {
 
-            final List<MailboxMembership> copiedRows = new 
ArrayList<MailboxMembership>();
-            for (MailboxMembership originalMessage:originalRows) {
+                public void run() throws MailboxException {
+                    for (MailboxMembership originalMessage:originalRows) {
 
-                final Mailbox mailbox = reserveNextUid();
-                if (mailbox != null) {
-                    long uid = mailbox.getLastUid();
-                    final MailboxMembership newRow = 
copyMessage(originalMessage, uid);
-                    mapper.save(newRow);
-                    copiedRows.add(newRow);
+                        final Mailbox mailbox = reserveNextUid();
+                        if (mailbox != null) {
+                            long uid = mailbox.getLastUid();
+                            final MailboxMembership newRow = 
copyMessage(originalMessage, uid);
+                            mapper.save(newRow);
+                            copiedRows.add(newRow);
+                        }
+                    }  
                 }
-            }
-
-            mapper.commit();
+                
+            });
+            
             
             // Wait until commit before issuing events
             for (MailboxMembership newMember:copiedRows) {

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=898835&r1=898834&r2=898835&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 Jan 13 16:51:46 2010
@@ -46,6 +46,7 @@
 import org.apache.james.imap.mailbox.MailboxMetaData.Selectability;
 import org.apache.james.imap.mailbox.util.SimpleMailboxMetaData;
 import org.apache.james.imap.store.mail.MailboxMapper;
+import org.apache.james.imap.store.mail.TransactionalMapper;
 import org.apache.james.imap.store.mail.model.Mailbox;
 
 public abstract class StoreMailboxManager extends AbstractLogEnabled 
implements MailboxManager {
@@ -145,19 +146,24 @@
         }
     }
 
-    public void deleteMailbox(String mailboxName, MailboxSession session)
+    public void deleteMailbox(final String mailboxName, final MailboxSession 
session)
     throws MailboxException {
         session.getLog().info("deleteMailbox " + mailboxName);
         synchronized (mailboxes) {
             // TODO put this into a serilizable transaction
             final MailboxMapper mapper = createMailboxMapper();
-            mapper.begin();
-            Mailbox mailbox = mapper.findMailboxByName(mailboxName);
-            if (mailbox == null) {
-                throw new MailboxNotFoundException("Mailbox not found");
-            }
-            mapper.delete(mailbox);
-            mapper.commit();
+            mapper.execute(new TransactionalMapper.Transaction() {
+
+                public void run() throws MailboxException {
+                    Mailbox mailbox = mapper.findMailboxByName(mailboxName);
+                    if (mailbox == null) {
+                        throw new MailboxNotFoundException("Mailbox not 
found");
+                    }
+                    mapper.delete(mailbox);
+                }
+                
+            });
+            
             final StoreMailbox storeMailbox = mailboxes.remove(mailboxName);
             if (storeMailbox != null) {
                 storeMailbox.deleted(session);
@@ -165,7 +171,7 @@
         }
     }
 
-    public void renameMailbox(String from, String to, MailboxSession session)
+    public void renameMailbox(final String from, final String to, final 
MailboxSession session)
     throws MailboxException {
         final Log log = getLog();
         if (log.isDebugEnabled()) log.debug("renameMailbox " + from + " to " + 
to);
@@ -175,32 +181,37 @@
             }
 
             final MailboxMapper mapper = createMailboxMapper();                
-            mapper.begin();
-            // TODO put this into a serilizable transaction
-            final Mailbox mailbox = mapper.findMailboxByName(from);
+            mapper.execute(new TransactionalMapper.Transaction() {
 
-            if (mailbox == null) {
-                throw new MailboxNotFoundException(from);
-            }
-            mailbox.setName(to);
-            mapper.save(mailbox);
+                public void run() throws MailboxException {
+                    // TODO put this into a serilizable transaction
+                    final Mailbox mailbox = mapper.findMailboxByName(from);
+
+                    if (mailbox == null) {
+                        throw new MailboxNotFoundException(from);
+                    }
+                    mailbox.setName(to);
+                    mapper.save(mailbox);
 
-            changeMailboxName(from, to);
+                    changeMailboxName(from, to);
 
-            // rename submailbox
-            final List<Mailbox> subMailboxes = 
mapper.findMailboxWithNameLike(from + delimiter + "%");
-            for (Mailbox sub:subMailboxes) {
-                final String subOriginalName = sub.getName();
-                final String subNewName = to + 
subOriginalName.substring(from.length());
-                sub.setName(subNewName);
-                mapper.save(sub);
+                    // rename submailbox
+                    final List<Mailbox> subMailboxes = 
mapper.findMailboxWithNameLike(from + delimiter + "%");
+                    for (Mailbox sub:subMailboxes) {
+                        final String subOriginalName = sub.getName();
+                        final String subNewName = to + 
subOriginalName.substring(from.length());
+                        sub.setName(subNewName);
+                        mapper.save(sub);
 
-                changeMailboxName(subOriginalName, subNewName);
+                        changeMailboxName(subOriginalName, subNewName);
+
+                        if (log.isDebugEnabled()) log.debug("Rename mailbox 
sub-mailbox " + subOriginalName + " to "
+                                + subNewName);
+                    }
+                }
+                
+            });
 
-                if (log.isDebugEnabled()) log.debug("Rename mailbox 
sub-mailbox " + subOriginalName + " to "
-                        + subNewName);
-            }
-            mapper.commit();
         }
     }
 
@@ -298,10 +309,14 @@
 
     public void deleteEverything() throws MailboxException {
         final MailboxMapper mapper = createMailboxMapper();
-        mapper.begin();
-        mapper.deleteAll();
-        mapper.commit();
-        mailboxes.clear();
+        mapper.execute(new TransactionalMapper.Transaction() {
+
+            public void run() throws MailboxException {
+                mapper.deleteAll(); 
+                mailboxes.clear();
+            }
+            
+        });
     }
 
     public MailboxSession createSystemSession(String userName, Log log) {

Added: 
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/mail/AbstractTransactionalMapper.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/store/src/main/java/org/apache/james/imap/store/mail/AbstractTransactionalMapper.java?rev=898835&view=auto
==============================================================================
--- 
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/mail/AbstractTransactionalMapper.java
 (added)
+++ 
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/mail/AbstractTransactionalMapper.java
 Wed Jan 13 16:51:46 2010
@@ -0,0 +1,71 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.imap.store.mail;
+
+import org.apache.james.imap.mailbox.MailboxException;
+import org.apache.james.imap.mailbox.StorageException;
+
+/**
+ *
+ * Run Transaction and handle begin, commit and rollback in the right order
+ *
+ */
+public abstract class AbstractTransactionalMapper implements 
TransactionalMapper{
+
+    /*
+     * (non-Javadoc)
+     * @see 
org.apache.james.imap.store.mail.TransactionalMapper#execute(org.apache.james.imap.store.mail.TransactionalMapper.Transaction)
+     */
+    public final void execute(Transaction transaction) throws MailboxException 
{
+        begin();
+        try {
+            transaction.run();
+            commit();
+        } catch (MailboxException e) {
+            rollback();
+            throw e;
+        }
+        
+    }
+    
+    /**
+     * Begin transaction
+     * 
+     * @throws StorageException
+     */
+    protected abstract void begin() throws StorageException;
+
+    /**
+     * Commit transaction
+     * 
+     * @throws StorageException
+     */
+    protected abstract void commit() throws StorageException;
+    
+    
+    /**
+     * Rollback transaction
+     * 
+     * @throws StorageException
+     */
+    protected abstract void rollback() throws StorageException;
+
+
+}

Modified: 
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/mail/MailboxMapper.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/store/src/main/java/org/apache/james/imap/store/mail/MailboxMapper.java?rev=898835&r1=898834&r2=898835&view=diff
==============================================================================
--- 
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/mail/MailboxMapper.java
 (original)
+++ 
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/mail/MailboxMapper.java
 Wed Jan 13 16:51:46 2010
@@ -24,10 +24,7 @@
 import org.apache.james.imap.mailbox.StorageException;
 import org.apache.james.imap.store.mail.model.Mailbox;
 
-public interface MailboxMapper {
-    public abstract void begin() throws StorageException;
-    
-    public abstract void commit() throws StorageException;
+public interface MailboxMapper extends TransactionalMapper{
     
     public abstract void save(Mailbox mailbox) throws StorageException;
 

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=898835&r1=898834&r2=898835&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
 Wed Jan 13 16:51:46 2010
@@ -28,12 +28,8 @@
 /**
  * Maps messages in a mailbox.
  */
-public interface MessageMapper {
+public interface MessageMapper extends TransactionalMapper {
 
-    public abstract void begin() throws StorageException;
-    
-    public abstract void commit() throws StorageException;
-    
     public abstract List<MailboxMembership> findInMailbox(MessageRange set)
             throws StorageException;
 

Added: 
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/mail/TransactionalMapper.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/store/src/main/java/org/apache/james/imap/store/mail/TransactionalMapper.java?rev=898835&view=auto
==============================================================================
--- 
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/mail/TransactionalMapper.java
 (added)
+++ 
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/mail/TransactionalMapper.java
 Wed Jan 13 16:51:46 2010
@@ -0,0 +1,48 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.imap.store.mail;
+
+import org.apache.james.imap.mailbox.MailboxException;
+
+public interface TransactionalMapper {
+    
+    /**
+     * Execute the given Transaction
+     * 
+     * @param transaction 
+     * @throws MailboxException
+     */
+    public void execute(Transaction transaction) throws MailboxException;
+    
+    /**
+     * Transaction 
+     *
+     */
+    public interface Transaction {
+        
+        /**
+         * Run code in a Transaction
+         * 
+         * @throws MailboxException
+         */
+        public void run() throws MailboxException;
+    }
+
+}



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to