### Eclipse Workspace Patch 1.0
#P apache-james-imap
Index: maildir/src/main/java/org/apache/james/imap/maildir/mail/MaildirMessageMapper.java
===================================================================
--- maildir/src/main/java/org/apache/james/imap/maildir/mail/MaildirMessageMapper.java	(Revision 987444)
+++ maildir/src/main/java/org/apache/james/imap/maildir/mail/MaildirMessageMapper.java	(Arbeitskopie)
@@ -57,12 +57,13 @@
 import org.apache.james.imap.store.mail.model.PropertyBuilder;
 import org.apache.james.imap.store.streaming.ConfigurableMimeTokenStream;
 import org.apache.james.imap.store.streaming.CountingInputStream;
+import org.apache.james.imap.store.transaction.NonTransactionalMapper;
 import org.apache.james.mime4j.MimeException;
 import org.apache.james.mime4j.descriptor.MaximalBodyDescriptor;
 import org.apache.james.mime4j.parser.MimeEntityConfig;
 import org.apache.james.mime4j.parser.MimeTokenStream;
 
-public class MaildirMessageMapper implements MessageMapper<Integer> {
+public class MaildirMessageMapper extends NonTransactionalMapper implements MessageMapper<Integer> {
 
     private final MaildirStore maildirStore;
     private final int BUF_SIZE = 2048;
@@ -443,15 +444,6 @@
         // not used
         
     }
-
-    /* 
-     * (non-Javadoc)
-     * @see org.apache.james.imap.store.transaction.TransactionalMapper#execute(org.apache.james.imap.store.transaction.TransactionalMapper.Transaction)
-     */
-    public <T> T execute(Transaction<T> transaction) throws MailboxException {
-        // no transactions used
-        return transaction.run();
-    }
     
     /**
      * Creates a {@link MaildirMessage} object with data loaded from the repository.
Index: store/src/main/java/org/apache/james/imap/store/transaction/AbstractTransactionalMapper.java
===================================================================
--- store/src/main/java/org/apache/james/imap/store/transaction/AbstractTransactionalMapper.java	(Revision 987444)
+++ store/src/main/java/org/apache/james/imap/store/transaction/AbstractTransactionalMapper.java	(Arbeitskopie)
@@ -1,68 +0,0 @@
-/****************************************************************
- * 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.transaction;
-
-import org.apache.james.imap.mailbox.MailboxException;
-
-/**
- *
- * 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.transaction.TransactionalMapper#execute(org.apache.james.imap.store.transaction.TransactionalMapper.Transaction)
-     */
-    public final <T> T execute(Transaction<T> transaction) throws MailboxException {
-        begin();
-        try {
-            T value = transaction.run();
-            commit();
-            return value;
-        } catch (MailboxException e) {
-            rollback();
-            throw e;
-        }
-    }
-    
-    /**
-     * Begin transaction
-     * 
-     * @throws StorageException
-     */
-    protected abstract void begin() throws MailboxException;
-
-    /**
-     * Commit transaction
-     * 
-     * @throws StorageException
-     */
-    protected abstract void commit() throws MailboxException;
-    
-    /**
-     * Rollback transaction
-     * 
-     * @throws StorageException
-     */
-    protected abstract void rollback() throws MailboxException;
-
-}
Index: maildir/src/main/java/org/apache/james/imap/maildir/mail/MaildirMailboxMapper.java
===================================================================
--- maildir/src/main/java/org/apache/james/imap/maildir/mail/MaildirMailboxMapper.java	(Revision 987444)
+++ maildir/src/main/java/org/apache/james/imap/maildir/mail/MaildirMailboxMapper.java	(Arbeitskopie)
@@ -29,7 +29,6 @@
 import org.apache.commons.lang.NotImplementedException;
 import org.apache.james.imap.api.MailboxPath;
 import org.apache.james.imap.api.display.HumanReadableText;
-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.maildir.MaildirFolder;
@@ -38,8 +37,9 @@
 import org.apache.james.imap.maildir.mail.model.MaildirMailbox;
 import org.apache.james.imap.store.mail.MailboxMapper;
 import org.apache.james.imap.store.mail.model.Mailbox;
+import org.apache.james.imap.store.transaction.NonTransactionalMapper;
 
-public class MaildirMailboxMapper implements MailboxMapper<Integer> {
+public class MaildirMailboxMapper extends NonTransactionalMapper implements MailboxMapper<Integer> {
 
     /**
      * The {@link MaildirStore} the mailboxes reside in
@@ -210,15 +210,6 @@
     public void endRequest() {
         mailboxCache.clear();
     }
-
-    /*
-     * (non-Javadoc)
-     * @see org.apache.james.imap.store.transaction.TransactionalMapper#execute(org.apache.james.imap.store.transaction.TransactionalMapper.Transaction)
-     */
-    public <T> T execute(Transaction<T> transaction) throws MailboxException {
-        // no transactions used
-        return transaction.run();
-    }
     
     /**
      * Stores a copy of a mailbox in a cache valid for one request. This is to enable
Index: memory/src/main/java/org/apache/james/imap/inmemory/InMemorySubscriptionManager.java
===================================================================
--- memory/src/main/java/org/apache/james/imap/inmemory/InMemorySubscriptionManager.java	(Revision 987444)
+++ memory/src/main/java/org/apache/james/imap/inmemory/InMemorySubscriptionManager.java	(Arbeitskopie)
@@ -23,7 +23,7 @@
 import org.apache.james.imap.mailbox.MailboxSession;
 import org.apache.james.imap.store.MailboxSessionMapperFactory;
 import org.apache.james.imap.store.StoreSubscriptionManager;
-import org.apache.james.imap.store.transaction.TransactionalMapper.Transaction;
+import org.apache.james.imap.store.transaction.Mapper.Transaction;
 import org.apache.james.imap.store.user.model.Subscription;
 
 /**
Index: store/src/main/java/org/apache/james/imap/store/transaction/Mapper.java
===================================================================
--- store/src/main/java/org/apache/james/imap/store/transaction/Mapper.java	(Revision 987444)
+++ store/src/main/java/org/apache/james/imap/store/transaction/Mapper.java	(Arbeitskopie)
@@ -22,10 +22,10 @@
 import org.apache.james.imap.mailbox.MailboxException;
 
 /**
- * Mapper which execute units of work in a {@link Transaction}
+ * Mapper which executes units of work in a {@link Transaction}
  *
  */
-public interface TransactionalMapper {
+public interface Mapper {
     
     /**
      * IMAP Request was complete. Cleanup all Request scoped stuff
Index: jpa/src/main/java/org/apache/james/imap/jpa/JPAMailboxManager.java
===================================================================
--- jpa/src/main/java/org/apache/james/imap/jpa/JPAMailboxManager.java	(Revision 987444)
+++ jpa/src/main/java/org/apache/james/imap/jpa/JPAMailboxManager.java	(Arbeitskopie)
@@ -27,7 +27,7 @@
 import org.apache.james.imap.store.Subscriber;
 import org.apache.james.imap.store.mail.MailboxMapper;
 import org.apache.james.imap.store.mail.model.Mailbox;
-import org.apache.james.imap.store.transaction.TransactionalMapper;
+import org.apache.james.imap.store.transaction.Mapper;
 
 /**
  * JPA implementation of {@link StoreMailboxManager}
@@ -43,7 +43,7 @@
     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.VoidTransaction(){
+        mapper.execute(new Mapper.VoidTransaction(){
 
             public void runVoid() throws MailboxException {
                 mapper.save(mailbox);
@@ -60,7 +60,7 @@
      */
     public void deleteEverything(MailboxSession mailboxSession) throws MailboxException {
         final MailboxMapper<Long> mapper = mailboxSessionMapperFactory.getMailboxMapper(mailboxSession);
-        mapper.execute(new TransactionalMapper.VoidTransaction() {
+        mapper.execute(new Mapper.VoidTransaction() {
 
             public void runVoid() throws MailboxException {
                 mapper.deleteAll(); 
Index: store/src/main/java/org/apache/james/imap/store/user/SubscriptionMapper.java
===================================================================
--- store/src/main/java/org/apache/james/imap/store/user/SubscriptionMapper.java	(Revision 987444)
+++ store/src/main/java/org/apache/james/imap/store/user/SubscriptionMapper.java	(Arbeitskopie)
@@ -21,14 +21,14 @@
 import java.util.List;
 
 import org.apache.james.imap.mailbox.SubscriptionException;
-import org.apache.james.imap.store.transaction.TransactionalMapper;
+import org.apache.james.imap.store.transaction.Mapper;
 import org.apache.james.imap.store.user.model.Subscription;
 
 /**
  * Mapper for {@link Subscription}
  *
  */
-public interface SubscriptionMapper extends TransactionalMapper{
+public interface SubscriptionMapper extends Mapper {
 
 	
     /**
Index: store/src/main/java/org/apache/james/imap/store/StoreMessageManager.java
===================================================================
--- store/src/main/java/org/apache/james/imap/store/StoreMessageManager.java	(Revision 987444)
+++ store/src/main/java/org/apache/james/imap/store/StoreMessageManager.java	(Arbeitskopie)
@@ -57,7 +57,7 @@
 import org.apache.james.imap.store.mail.model.PropertyBuilder;
 import org.apache.james.imap.store.streaming.ConfigurableMimeTokenStream;
 import org.apache.james.imap.store.streaming.CountingInputStream;
-import org.apache.james.imap.store.transaction.TransactionalMapper;
+import org.apache.james.imap.store.transaction.Mapper;
 import org.apache.james.mime4j.MimeException;
 import org.apache.james.mime4j.descriptor.MaximalBodyDescriptor;
 import org.apache.james.mime4j.parser.MimeEntityConfig;
@@ -243,7 +243,7 @@
                 flags.add(Flags.Flag.RECENT);
             }
             final MailboxMembership<Id> message = createMessage(internalDate, size, bodyStartOctet, tmpMsgIn.newStream(0, -1), flags, headers, propertyBuilder);
-            long uid = messageMapper.execute(new TransactionalMapper.Transaction<Long>() {
+            long uid = messageMapper.execute(new Mapper.Transaction<Long>() {
                 
                 public Long run() throws MailboxException {
                     return messageMapper.save(mailbox, message);
@@ -374,7 +374,7 @@
      */
     protected List<Long> recent(final boolean reset, MailboxSession mailboxSession) throws MailboxException {
 
-        return messageMapper.execute(new TransactionalMapper.Transaction<List<Long>>() {
+        return messageMapper.execute(new Mapper.Transaction<List<Long>>() {
 
             public List<Long> run() throws MailboxException {
                 final List<MailboxMembership<Id>> members = messageMapper.findRecentMessagesInMailbox(mailbox, -1);
@@ -403,7 +403,7 @@
      */
     public Iterator<Long> expunge(final MessageRange set, MailboxSession mailboxSession) throws MailboxException {
         
-        Collection<Long> uids = messageMapper.execute(new TransactionalMapper.Transaction<Collection<Long>>() {
+        Collection<Long> uids = messageMapper.execute(new Mapper.Transaction<Collection<Long>>() {
 
             public Collection<Long> run() throws MailboxException {
                 final Collection<Long> uids = new TreeSet<Long>();
@@ -434,7 +434,7 @@
             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.VoidTransaction(){
+        messageMapper.execute(new Mapper.VoidTransaction(){
 
             public void runVoid() throws MailboxException {
                 final List<MailboxMembership<Id>> members = messageMapper.findInMailbox(mailbox, set);
@@ -501,7 +501,7 @@
         try {
             final List<Long> copiedRows = new ArrayList<Long>();
             for (final MailboxMembership<Id> originalMessage:originalRows) {
-               copiedRows.add(messageMapper.execute(new TransactionalMapper.Transaction<Long>() {
+               copiedRows.add(messageMapper.execute(new Mapper.Transaction<Long>() {
 
                     public Long run() throws MailboxException {
 
Index: store/src/main/java/org/apache/james/imap/store/transaction/TransactionalMapper.java
===================================================================
--- store/src/main/java/org/apache/james/imap/store/transaction/TransactionalMapper.java	(Revision 987444)
+++ store/src/main/java/org/apache/james/imap/store/transaction/TransactionalMapper.java	(Arbeitskopie)
@@ -22,11 +22,9 @@
 import org.apache.james.imap.mailbox.MailboxException;
 
 /**
- *
- * Run Transaction and handle begin, commit and rollback in the right order
- *
+ * Run Transaction and handle begin, commit and rollback in the right order.
  */
-public abstract class AbstractTransactionalMapper implements TransactionalMapper {
+public abstract class TransactionalMapper implements Mapper {
 
     /*
      * (non-Javadoc)
Index: store/src/main/java/org/apache/james/imap/store/mail/MailboxMapper.java
===================================================================
--- store/src/main/java/org/apache/james/imap/store/mail/MailboxMapper.java	(Revision 987444)
+++ store/src/main/java/org/apache/james/imap/store/mail/MailboxMapper.java	(Arbeitskopie)
@@ -24,14 +24,14 @@
 import org.apache.james.imap.mailbox.MailboxNotFoundException;
 import org.apache.james.imap.mailbox.StorageException;
 import org.apache.james.imap.store.mail.model.Mailbox;
-import org.apache.james.imap.store.transaction.TransactionalMapper;
+import org.apache.james.imap.store.transaction.Mapper;
 
 /**
  * Mapper for {@link Mailbox} actions. A {@link MailboxMapper} has a lifecycle from the start of a request 
  * to the end of the request.
  *
  */
-public interface MailboxMapper<Id> extends TransactionalMapper {
+public interface MailboxMapper<Id> extends Mapper {
     
     /**
      * Save the give {@link Mailbox} to the underlying storage
Index: jcr/src/main/java/org/apache/james/imap/jcr/AbstractJCRMapper.java
===================================================================
--- jcr/src/main/java/org/apache/james/imap/jcr/AbstractJCRMapper.java	(Revision 987444)
+++ jcr/src/main/java/org/apache/james/imap/jcr/AbstractJCRMapper.java	(Arbeitskopie)
@@ -25,7 +25,7 @@
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.mailbox.MailboxException;
 import org.apache.james.imap.mailbox.MailboxSession;
-import org.apache.james.imap.store.transaction.AbstractTransactionalMapper;
+import org.apache.james.imap.store.transaction.TransactionalMapper;
 
 /**
  * Abstract Mapper base class for Level 1 Implementations of JCR. So no real transaction management is used. 
@@ -33,7 +33,7 @@
  * The Session.save() will get called on commit() method,  session.refresh(false) on rollback, and session.refresh(true) on begin()
  *
  */
-public abstract class AbstractJCRMapper extends AbstractTransactionalMapper implements JCRImapConstants {
+public abstract class AbstractJCRMapper extends TransactionalMapper implements JCRImapConstants {
     public final static String MAILBOXES_PATH =  "mailboxes";
 
     private final Log logger;
Index: memory/src/main/java/org/apache/james/imap/inmemory/mail/InMemoryMessageMapper.java
===================================================================
--- memory/src/main/java/org/apache/james/imap/inmemory/mail/InMemoryMessageMapper.java	(Revision 987444)
+++ memory/src/main/java/org/apache/james/imap/inmemory/mail/InMemoryMessageMapper.java	(Arbeitskopie)
@@ -9,7 +9,6 @@
 
 import org.apache.james.imap.inmemory.mail.model.InMemoryMailbox;
 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;
 import org.apache.james.imap.mailbox.StorageException;
@@ -18,8 +17,9 @@
 import org.apache.james.imap.store.mail.MessageMapper;
 import org.apache.james.imap.store.mail.model.Mailbox;
 import org.apache.james.imap.store.mail.model.MailboxMembership;
+import org.apache.james.imap.store.transaction.NonTransactionalMapper;
 
-public class InMemoryMessageMapper implements MessageMapper<Long> {
+public class InMemoryMessageMapper extends NonTransactionalMapper implements MessageMapper<Long> {
 
     private Map<Long, Map<Long, MailboxMembership<Long>>> mailboxByUid;
     private static final int INITIAL_SIZE = 256;
@@ -179,13 +179,6 @@
 
         return new SearchQueryIterator(memberships.iterator(), query);
     }
-
-    /**
-     * There is no really Transaction handling here.. Just run it 
-     */
-    public <T> T execute(Transaction<T> transaction) throws MailboxException {
-        return transaction.run();
-    }
     
     public void deleteAll() {
         mailboxByUid.clear();
Index: memory/src/main/java/org/apache/james/imap/inmemory/mail/InMemoryMailboxMapper.java
===================================================================
--- memory/src/main/java/org/apache/james/imap/inmemory/mail/InMemoryMailboxMapper.java	(Revision 987444)
+++ memory/src/main/java/org/apache/james/imap/inmemory/mail/InMemoryMailboxMapper.java	(Arbeitskopie)
@@ -25,13 +25,13 @@
 
 import org.apache.james.imap.api.MailboxPath;
 import org.apache.james.imap.inmemory.mail.model.InMemoryMailbox;
-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.mail.MailboxMapper;
 import org.apache.james.imap.store.mail.model.Mailbox;
+import org.apache.james.imap.store.transaction.NonTransactionalMapper;
 
-public class InMemoryMailboxMapper implements MailboxMapper<Long> {
+public class InMemoryMailboxMapper extends NonTransactionalMapper implements MailboxMapper<Long> {
     
     private static final int INITIAL_SIZE = 128;
     private final Map<Long, InMemoryMailbox> mailboxesById;
@@ -115,14 +115,6 @@
         mailboxesById.put(mailbox.getMailboxId(), (InMemoryMailbox) mailbox);
     }
 
-    /*
-     * (non-Javadoc)
-     * @see org.apache.james.imap.store.transaction.TransactionalMapper#execute(org.apache.james.imap.store.transaction.TransactionalMapper.Transaction)
-     */
-    public <T> T execute(Transaction<T> transaction) throws MailboxException {
-        return transaction.run();
-    }
-
     /**
      * Do nothing
      */
Index: jpa/src/main/java/org/apache/james/imap/jpa/JPATransactionalMapper.java
===================================================================
--- jpa/src/main/java/org/apache/james/imap/jpa/JPATransactionalMapper.java	(Revision 987444)
+++ jpa/src/main/java/org/apache/james/imap/jpa/JPATransactionalMapper.java	(Arbeitskopie)
@@ -26,13 +26,13 @@
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.mailbox.MailboxException;
 import org.apache.james.imap.mailbox.StorageException;
-import org.apache.james.imap.store.transaction.AbstractTransactionalMapper;
+import org.apache.james.imap.store.transaction.TransactionalMapper;
 
 /**
  * JPA implementation of TransactionMapper. This class is not thread-safe!
  *
  */
-public abstract class JPATransactionalMapper extends AbstractTransactionalMapper {
+public abstract class JPATransactionalMapper extends TransactionalMapper {
 
     protected EntityManagerFactory entityManagerFactory;
     protected EntityManager entityManager;
Index: store/src/main/java/org/apache/james/imap/store/StoreMailboxManager.java
===================================================================
--- store/src/main/java/org/apache/james/imap/store/StoreMailboxManager.java	(Revision 987444)
+++ store/src/main/java/org/apache/james/imap/store/StoreMailboxManager.java	(Arbeitskopie)
@@ -41,7 +41,7 @@
 import org.apache.james.imap.mailbox.util.SimpleMailboxMetaData;
 import org.apache.james.imap.store.mail.MailboxMapper;
 import org.apache.james.imap.store.mail.model.Mailbox;
-import org.apache.james.imap.store.transaction.TransactionalMapper;
+import org.apache.james.imap.store.transaction.Mapper;
 
 /**
  * This abstract base class of an {@link MailboxManager} implementation provides a high-level api for writing your own
@@ -143,7 +143,7 @@
         session.getLog().info("deleteMailbox " + mailboxPath);
         final MailboxMapper<Id> mapper = mailboxSessionMapperFactory.getMailboxMapper(session);
 
-        mapper.execute(new TransactionalMapper.VoidTransaction() {
+        mapper.execute(new Mapper.VoidTransaction() {
 
             public void runVoid() throws MailboxException {
                 Mailbox<Id> mailbox = mapper.findMailboxByPath(mailboxPath);
@@ -172,7 +172,7 @@
         }
 
         final MailboxMapper<Id> mapper = mailboxSessionMapperFactory.getMailboxMapper(session);
-        mapper.execute(new TransactionalMapper.VoidTransaction() {
+        mapper.execute(new Mapper.VoidTransaction() {
 
             public void runVoid() throws MailboxException {
                 // TODO put this into a serilizable transaction
Index: store/src/main/java/org/apache/james/imap/store/mail/MessageMapper.java
===================================================================
--- store/src/main/java/org/apache/james/imap/store/mail/MessageMapper.java	(Revision 987444)
+++ store/src/main/java/org/apache/james/imap/store/mail/MessageMapper.java	(Arbeitskopie)
@@ -27,13 +27,13 @@
 import org.apache.james.imap.store.mail.model.Document;
 import org.apache.james.imap.store.mail.model.Mailbox;
 import org.apache.james.imap.store.mail.model.MailboxMembership;
-import org.apache.james.imap.store.transaction.TransactionalMapper;
+import org.apache.james.imap.store.transaction.Mapper;
 
 /**
  * Maps {@link Document} in a {@link org.apache.james.imap.mailbox.Mailbox}. A {@link MessageMapper} has a lifecycle from the start of a request 
  * to the end of the request.
  */
-public interface MessageMapper<Id> extends TransactionalMapper {
+public interface MessageMapper<Id> extends Mapper {
 
     /**
      * Return a List of {@link MailboxMembership} which represent the given {@link MessageRange}
Index: jcr/src/main/java/org/apache/james/imap/jcr/JCRMailboxManager.java
===================================================================
--- jcr/src/main/java/org/apache/james/imap/jcr/JCRMailboxManager.java	(Revision 987444)
+++ jcr/src/main/java/org/apache/james/imap/jcr/JCRMailboxManager.java	(Arbeitskopie)
@@ -31,7 +31,7 @@
 import org.apache.james.imap.store.StoreMessageManager;
 import org.apache.james.imap.store.Subscriber;
 import org.apache.james.imap.store.mail.model.Mailbox;
-import org.apache.james.imap.store.transaction.TransactionalMapper;
+import org.apache.james.imap.store.transaction.Mapper;
 
 /**
  * JCR implementation of a MailboxManager
@@ -61,7 +61,7 @@
     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.VoidTransaction() {
+        mapper.execute(new Mapper.VoidTransaction() {
 
             public void runVoid() throws MailboxException {
                 mapper.save(mailbox);
Index: maildir/src/main/java/org/apache/james/imap/maildir/user/MaildirSubscriptionMapper.java
===================================================================
--- maildir/src/main/java/org/apache/james/imap/maildir/user/MaildirSubscriptionMapper.java	(Revision 987444)
+++ maildir/src/main/java/org/apache/james/imap/maildir/user/MaildirSubscriptionMapper.java	(Arbeitskopie)
@@ -34,10 +34,11 @@
 import org.apache.james.imap.mailbox.MailboxException;
 import org.apache.james.imap.mailbox.SubscriptionException;
 import org.apache.james.imap.maildir.user.model.MaildirSubscription;
+import org.apache.james.imap.store.transaction.NonTransactionalMapper;
 import org.apache.james.imap.store.user.SubscriptionMapper;
 import org.apache.james.imap.store.user.model.Subscription;
 
-public class MaildirSubscriptionMapper implements SubscriptionMapper {
+public class MaildirSubscriptionMapper extends NonTransactionalMapper implements SubscriptionMapper {
 
     private static final String PATH_USER = "%user";
     private static final String FILE_SUBSCRIPTION = "subscriptions";
@@ -118,14 +119,6 @@
     public void endRequest() {
         // nothing to do
     }
-
-    /*
-     * (non-Javadoc)
-     * @see org.apache.james.imap.store.transaction.TransactionalMapper#execute(org.apache.james.imap.store.transaction.TransactionalMapper.Transaction)
-     */
-    public <T> T execute(Transaction<T> transaction) throws MailboxException {
-        return transaction.run();
-    }
     
     /**
      * Get the folder name of the folder containing the user's mailboxes 
Index: memory/src/main/java/org/apache/james/imap/inmemory/user/InMemorySubscriptionMapper.java
===================================================================
--- memory/src/main/java/org/apache/james/imap/inmemory/user/InMemorySubscriptionMapper.java	(Revision 987444)
+++ memory/src/main/java/org/apache/james/imap/inmemory/user/InMemorySubscriptionMapper.java	(Arbeitskopie)
@@ -24,11 +24,11 @@
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
-import org.apache.james.imap.mailbox.MailboxException;
+import org.apache.james.imap.store.transaction.NonTransactionalMapper;
 import org.apache.james.imap.store.user.SubscriptionMapper;
 import org.apache.james.imap.store.user.model.Subscription;
 
-public class InMemorySubscriptionMapper implements SubscriptionMapper {
+public class InMemorySubscriptionMapper extends NonTransactionalMapper implements SubscriptionMapper {
     
     private static final int INITIAL_SIZE = 64;
     private final Map<String, List<Subscription>> subscriptionsByUser;
@@ -99,14 +99,6 @@
             subscriptions.add(subscription);
         }
     }
-
-    /*
-     * (non-Javadoc)
-     * @see org.apache.james.imap.store.transaction.TransactionalMapper#execute(org.apache.james.imap.store.transaction.TransactionalMapper.Transaction)
-     */
-    public <T> T execute(Transaction<T> transaction) throws MailboxException {
-        return transaction.run();
-    }
     
     public void deleteAll() {
         subscriptionsByUser.clear();
Index: store/src/main/java/org/apache/james/imap/store/StoreSubscriptionManager.java
===================================================================
--- store/src/main/java/org/apache/james/imap/store/StoreSubscriptionManager.java	(Revision 987444)
+++ store/src/main/java/org/apache/james/imap/store/StoreSubscriptionManager.java	(Arbeitskopie)
@@ -25,7 +25,7 @@
 import org.apache.james.imap.mailbox.MailboxException;
 import org.apache.james.imap.mailbox.MailboxSession;
 import org.apache.james.imap.mailbox.SubscriptionException;
-import org.apache.james.imap.store.transaction.TransactionalMapper;
+import org.apache.james.imap.store.transaction.Mapper;
 import org.apache.james.imap.store.user.SubscriptionMapper;
 import org.apache.james.imap.store.user.model.Subscription;
 
@@ -49,7 +49,7 @@
     public void subscribe(final MailboxSession session, final String mailbox) throws SubscriptionException {
         final SubscriptionMapper mapper = mapperFactory.getSubscriptionMapper(session);
         try {
-            mapper.execute(new TransactionalMapper.VoidTransaction() {
+            mapper.execute(new Mapper.VoidTransaction() {
 
                 public void runVoid() throws MailboxException {
                     final Subscription subscription = mapper.findMailboxSubscriptionForUser(session.getUser().getUserName(), mailbox);
@@ -95,7 +95,7 @@
     public void unsubscribe(final MailboxSession session, final String mailbox) throws SubscriptionException {
         final SubscriptionMapper mapper = mapperFactory.getSubscriptionMapper(session);
         try {
-            mapper.execute(new TransactionalMapper.VoidTransaction() {
+            mapper.execute(new Mapper.VoidTransaction() {
 
                 public void runVoid() throws MailboxException {
                     final Subscription subscription = mapper.findMailboxSubscriptionForUser(session.getUser().getUserName(), mailbox);
Index: store/src/main/java/org/apache/james/imap/store/transaction/NonTransactionalMapper.java
===================================================================
--- store/src/main/java/org/apache/james/imap/store/transaction/NonTransactionalMapper.java	(Revision 987444)
+++ store/src/main/java/org/apache/james/imap/store/transaction/NonTransactionalMapper.java	(Arbeitskopie)
@@ -21,39 +21,18 @@
 import org.apache.james.imap.mailbox.MailboxException;
 
 /**
- * Mapper which not do any real transaction handling. It just execute the execute() method
+ * A Mapper which does no transaction handling. It just executes the execute() method
  * of the Transaction object without any special handling.
  *  
- * This class is mostly useful for Mapper implementations which not support Transactions
- *
+ * This class is mostly useful for Mapper implementations which do not support Transactions
  */
-public abstract class NonTransactionalMapper extends AbstractTransactionalMapper {
+public abstract class NonTransactionalMapper implements Mapper {
 
-
-    /**
-     * Do nothing because we don't support transaction
-     */
-    protected void begin() throws MailboxException {
-        // do nothing
-        
+	/* (non-Javadoc)
+	 * @see org.apache.james.imap.store.transaction.Mapper#execute(org.apache.james.imap.store.transaction.Mapper.Transaction)
+	 */
+	public final <T> T execute(Transaction<T> transaction) throws MailboxException {
+        return transaction.run();
     }
 
-
-    /**
-     * Do nothing because we don't support transaction
-     */
-    protected void commit() throws MailboxException {
-        // do nothing
-        
-    }
-
-
-    /**
-     * Do nothing because we don't support transaction
-     */
-    protected void rollback() throws MailboxException {
-        // do nothing
-        
-    }
-
 }
Index: memory/src/main/java/org/apache/james/imap/inmemory/InMemoryMailboxSessionMapperFactory.java
===================================================================
--- memory/src/main/java/org/apache/james/imap/inmemory/InMemoryMailboxSessionMapperFactory.java	(Revision 987444)
+++ memory/src/main/java/org/apache/james/imap/inmemory/InMemoryMailboxSessionMapperFactory.java	(Arbeitskopie)
@@ -28,7 +28,7 @@
 import org.apache.james.imap.store.MailboxSessionMapperFactory;
 import org.apache.james.imap.store.mail.MailboxMapper;
 import org.apache.james.imap.store.mail.MessageMapper;
-import org.apache.james.imap.store.transaction.TransactionalMapper;
+import org.apache.james.imap.store.transaction.Mapper;
 import org.apache.james.imap.store.user.SubscriptionMapper;
 
 public class InMemoryMailboxSessionMapperFactory extends MailboxSessionMapperFactory<Long> {
@@ -64,7 +64,7 @@
     
     public void deleteAll() throws MailboxException {
         final MailboxMapper<Long> mapper = mailboxMapper;
-        mapper.execute(new TransactionalMapper.VoidTransaction() {
+        mapper.execute(new Mapper.VoidTransaction() {
 
             public void runVoid() throws MailboxException {
                 mapper.deleteAll(); 
