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/03/16 18:46:12 UTC

svn commit: r923896 - in /james/imap/trunk: jcr/src/main/java/org/apache/james/imap/jcr/ jcr/src/main/java/org/apache/james/imap/jcr/mail/ jcr/src/main/java/org/apache/james/imap/jcr/mail/model/ jcr/src/main/java/org/apache/james/imap/jcr/user/ jpa/src...

Author: norman
Date: Tue Mar 16 17:46:11 2010
New Revision: 923896

URL: http://svn.apache.org/viewvc?rev=923896&view=rev
Log:
Refactor api to allow to react on start and end of request depending on the MailboxSession. This was mainly needed for JCR but can be useful for other implementations too. (IMAP-93)
More fixes for JCR

Modified:
    james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/AbstractJCRMapper.java
    james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRGlobalMailbox.java
    james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRGlobalUserSubscriptionManager.java
    james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRMailbox.java
    james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRMailboxManager.java
    james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRSubscriptionManager.java
    james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRUtils.java
    james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/JCRMailboxMapper.java
    james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/JCRMessageMapper.java
    james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/model/JCRMailboxMembership.java
    james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/model/JCRMessage.java
    james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/user/JCRSubscriptionMapper.java
    james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAMailbox.java
    james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/openjpa/OpenJPAMailboxManager.java
    james/imap/trunk/mailbox/pom.xml
    james/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/MailboxManager.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/processor/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.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/transaction/TransactionalMapper.java
    james/imap/trunk/torque/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailboxManager.java

Modified: james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/AbstractJCRMapper.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/AbstractJCRMapper.java?rev=923896&r1=923895&r2=923896&view=diff
==============================================================================
--- james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/AbstractJCRMapper.java (original)
+++ james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/AbstractJCRMapper.java Tue Mar 16 17:46:11 2010
@@ -18,6 +18,7 @@
  ****************************************************************/
 package org.apache.james.imap.jcr;
 
+import javax.jcr.PathNotFoundException;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 
@@ -30,6 +31,7 @@ import org.apache.james.imap.store.trans
 /**
  * Abstract Mapper base class for Level 1 Implementations of JCR. So no real transaction management is used. 
  * 
+ * The Session.save() will get called on commit() method
  *
  */
 public abstract class AbstractJCRMapper extends AbstractTransactionalMapper implements JCRImapConstants{
@@ -40,17 +42,28 @@ public abstract class AbstractJCRMapper 
         this.session = session;
     }
     
+    /**
+     * Return the JCR Session
+     * 
+     * @return session
+     */
     protected Session getSession() {
         return session;
     }
 
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.imap.store.transaction.TransactionalMapper#destroy()
+     */
     public void destroy() {
+        // Do nothing
     }
 
     /**
      * Begin is not supported by level 1 JCR implementations, so just do nothing
      */
-    protected void begin() throws MailboxException {        
+    protected void begin() throws MailboxException {    
+        // Do nothing
     }
 
     /**
@@ -74,5 +87,11 @@ public abstract class AbstractJCRMapper 
         // no rollback supported by level 1 jcr
     }
     
+    protected void createNodeIfNotExists(String path) throws RepositoryException, PathNotFoundException {
+        
+        if (session.getRootNode().hasNode(path) == false) {
+           session.getRootNode().addNode(path);
+        }
+    }
     
 }

Modified: james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRGlobalMailbox.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRGlobalMailbox.java?rev=923896&r1=923895&r2=923896&view=diff
==============================================================================
--- james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRGlobalMailbox.java (original)
+++ james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRGlobalMailbox.java Tue Mar 16 17:46:11 2010
@@ -30,8 +30,12 @@ import org.apache.commons.logging.Log;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.mailbox.MailboxSession;
 import org.apache.james.imap.mailbox.SubscriptionException;
-import org.apache.james.imap.store.PasswordAwareUser;
 
+/**
+ * JCR based Mailbox which use the same username and password to obtain a
+ * JCR Session for every MailboxSession
+ *
+ */
 public class JCRGlobalMailbox extends JCRMailbox{
 
 	private final String username;
@@ -45,7 +49,7 @@ public class JCRGlobalMailbox extends JC
 	}
 
 	@Override
-	  protected Session getSession(PasswordAwareUser user) throws SubscriptionException {
+	  protected Session getSession(MailboxSession session) throws SubscriptionException {
         try {
             return getRepository().login(new SimpleCredentials(username, password), getWorkspace());
         } catch (LoginException e) {

Modified: james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRGlobalUserSubscriptionManager.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRGlobalUserSubscriptionManager.java?rev=923896&r1=923895&r2=923896&view=diff
==============================================================================
--- james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRGlobalUserSubscriptionManager.java (original)
+++ james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRGlobalUserSubscriptionManager.java Tue Mar 16 17:46:11 2010
@@ -26,8 +26,8 @@ import javax.jcr.Session;
 import javax.jcr.SimpleCredentials;
 
 import org.apache.james.imap.api.display.HumanReadableText;
+import org.apache.james.imap.mailbox.MailboxSession;
 import org.apache.james.imap.mailbox.SubscriptionException;
-import org.apache.james.imap.store.PasswordAwareUser;
 
 /**
  * JCR based SubscriptionManager which use the same username and password to
@@ -51,7 +51,7 @@ public class JCRGlobalUserSubscriptionMa
     }
 
     @Override
-    protected Session getSession(PasswordAwareUser user) throws SubscriptionException {
+    protected Session getSession(MailboxSession session) throws SubscriptionException {
         try {
             return getRepository().login(new SimpleCredentials(username, password), getWorkspace());
         } catch (LoginException e) {

Modified: james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRMailbox.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRMailbox.java?rev=923896&r1=923895&r2=923896&view=diff
==============================================================================
--- james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRMailbox.java (original)
+++ james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRMailbox.java Tue Mar 16 17:46:11 2010
@@ -47,15 +47,17 @@ import org.apache.james.imap.store.mail.
 import org.apache.james.imap.store.mail.model.MailboxMembership;
 import org.apache.james.imap.store.mail.model.PropertyBuilder;
 
+/**
+ * JCR implementation of a {@link StoreMailbox}
+ *
+ */
 public class JCRMailbox extends StoreMailbox{
 
     private final Repository repository;
     private final String workspace;
     private final Log log;
     private final String uuid;
-    public final static String MESSAGE_MAPPER = "MESSAGE_MAPPER";
-    public final static String MAILBOX_MAPPER = "MAILBOX_MAPPER";
-
+    
     public JCRMailbox(final org.apache.james.imap.jcr.mail.model.JCRMailbox mailbox, final MailboxSession session, final Repository repository, final String workspace, final Log log) {
         super(mailbox, session );
         this.repository = repository;
@@ -99,18 +101,20 @@ public class JCRMailbox extends StoreMai
 
     @Override
     protected MessageMapper createMessageMapper(MailboxSession session) throws MailboxException {
-        PasswordAwareUser user = (PasswordAwareUser)getMailboxSession().getUser();
-
-        JCRMessageMapper messageMapper = new JCRMessageMapper(getSession(user), getMailboxUUID(), log);
+        Session jcrSession = getSession(session);
+        JCRUtils.addJCRSession(session, jcrSession);
+        
+        JCRMessageMapper messageMapper = new JCRMessageMapper(jcrSession, getMailboxUUID(), log);
         
         return messageMapper;
 
     }
 
     protected JCRMailboxMapper createMailboxMapper(MailboxSession session) throws MailboxException {
-
-        PasswordAwareUser user = (PasswordAwareUser) getMailboxSession().getUser();
-        JCRMailboxMapper mapper = new JCRMailboxMapper(getSession(user), log);
+        Session jcrSession = getSession(session);
+        JCRUtils.addJCRSession(session, jcrSession);
+        
+        JCRMailboxMapper mapper = new JCRMailboxMapper(jcrSession, log);
         return mapper;
 
     }
@@ -134,7 +138,9 @@ public class JCRMailbox extends StoreMai
      * @return session
      * @throws MailboxException
      */
-    protected Session getSession(PasswordAwareUser user) throws SubscriptionException {
+    protected Session getSession(MailboxSession session) throws SubscriptionException {
+        PasswordAwareUser user = (PasswordAwareUser) getMailboxSession().getUser();
+
         try {
             return repository.login(new SimpleCredentials(user.getUserName(), user.getPassword().toCharArray()), getWorkspace());
         } catch (LoginException e) {
@@ -156,13 +162,13 @@ public class JCRMailbox extends StoreMai
         return workspace;
     }
 
+    /**
+     * Return JCR Repository
+     * 
+     * @return repository
+     */
     protected Repository getRepository() {
         return repository;
     }
 
-
-    @Override
-    protected void onLogout(MailboxSession session) {
-     
-    }
 }

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=923896&r1=923895&r2=923896&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 Tue Mar 16 17:46:11 2010
@@ -19,6 +19,7 @@
 package org.apache.james.imap.jcr;
 
 import java.util.ArrayList;
+import java.util.List;
 import java.util.Locale;
 
 import javax.jcr.LoginException;
@@ -71,7 +72,11 @@ public class JCRMailboxManager extends S
     @Override
     protected MailboxMapper createMailboxMapper(MailboxSession session) throws MailboxException {
 
-        JCRMailboxMapper mapper = new JCRMailboxMapper(getSession(session), getLog());
+        Session jcrSession = getSession(session);
+
+        JCRUtils.addJCRSession(session, jcrSession);
+        
+        JCRMailboxMapper mapper = new JCRMailboxMapper(jcrSession, getLog());
         return mapper;
 
     }
@@ -86,7 +91,8 @@ public class JCRMailboxManager extends S
     protected Session getSession(MailboxSession s) throws MailboxException {
         PasswordAwareUser user = (PasswordAwareUser) s.getUser();
         try {
-            return repository.login(new SimpleCredentials(user.getUserName(), user.getPassword().toCharArray()), getWorkspace());
+            Session session =  repository.login(new SimpleCredentials(user.getUserName(), user.getPassword().toCharArray()), getWorkspace());
+            return session;
         } catch (LoginException e) {
             throw new MailboxException(HumanReadableText.INVALID_LOGIN, e);
         } catch (NoSuchWorkspaceException e) {
@@ -135,12 +141,32 @@ public class JCRMailboxManager extends S
         return workspace;
     }
 
+    /**
+     * Get the JCR Repository
+     * 
+     * @return repository
+     */
     protected Repository getRepository() {
         return repository;
     }
 
-    @Override
-    protected void onLogout(MailboxSession session) {
-        
+
+    /**
+     * Logout from all openen JCR Sessions
+     */
+    public void endProcessingRequest(MailboxSession session) {
+        List<Session> sessions = JCRUtils.getJCRSessions(session);
+        for (int i = 0 ; i < sessions.size(); i++) {
+            Session jcrSession = sessions.get(i);
+            if (jcrSession.isLive()) {
+                try {
+                    jcrSession.logout();
+                } catch (Exception e) {
+                    // just catch exceptions on logout
+                }
+            }
+        }
     }
+    
+    
 }

Modified: james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRSubscriptionManager.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRSubscriptionManager.java?rev=923896&r1=923895&r2=923896&view=diff
==============================================================================
--- james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRSubscriptionManager.java (original)
+++ james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRSubscriptionManager.java Tue Mar 16 17:46:11 2010
@@ -58,9 +58,11 @@ public class JCRSubscriptionManager exte
 
     @Override
     protected SubscriptionMapper createMapper(MailboxSession session) throws SubscriptionException {
-        PasswordAwareUser pUser = (PasswordAwareUser) session.getUser();
+        Session jcrSession = getSession(session);
+        JCRUtils.addJCRSession(session, jcrSession);
         
-        JCRSubscriptionMapper mapper = new JCRSubscriptionMapper(getSession(pUser), logger);
+        
+        JCRSubscriptionMapper mapper = new JCRSubscriptionMapper(jcrSession, logger);
 
         return mapper;
     }
@@ -77,7 +79,9 @@ public class JCRSubscriptionManager exte
      * @return session
      * @throws MailboxException
      */
-    protected Session getSession(PasswordAwareUser user) throws SubscriptionException {
+    protected Session getSession(MailboxSession session) throws SubscriptionException {
+        PasswordAwareUser user = (PasswordAwareUser) session.getUser();
+
         try {
             return repository.login(new SimpleCredentials(user.getUserName(), user.getPassword().toCharArray()), getWorkspace());
         } catch (LoginException e) {

Modified: james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRUtils.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRUtils.java?rev=923896&r1=923895&r2=923896&view=diff
==============================================================================
--- james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRUtils.java (original)
+++ james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRUtils.java Tue Mar 16 17:46:11 2010
@@ -18,10 +18,31 @@
  ****************************************************************/
 package org.apache.james.imap.jcr;
 
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.jcr.Session;
+
 import org.apache.jackrabbit.util.Text;
+import org.apache.james.imap.mailbox.MailboxSession;
 
+/**
+ * Utilities used for JCR 
+ *
+ */
 public class JCRUtils implements JCRImapConstants{
 
+    /**
+     * Identifier of stored JCR Session 
+     */
+    public final static String JCR_SESSIONS = "JCR_SESSIONS";
+    
+    /**
+     * Create a path which can be used for nodes. It handles the escaping etc
+     * 
+     * @param subNodes
+     * @return completePath
+     */
 	public static String createPath(String... subNodes) {
 		StringBuffer pathBuf = new StringBuffer();
 		
@@ -41,4 +62,39 @@ public class JCRUtils implements JCRImap
         return pathBuf.toString();
 		
 	}
+	
+	/**
+	 * Return a List of JCR Sessions for the given MailboxSession
+	 * 
+	 * @param session
+	 * @return jcrSessionList
+	 */
+	@SuppressWarnings("unchecked")
+    public static List<Session> getJCRSessions(MailboxSession session) {
+	    List<Session> sessions = null;
+	    if (session != null) {
+	        sessions = (List<Session>) session.getAttributes().get(JCR_SESSIONS);
+	    }
+	    if (sessions == null) {
+	        sessions = new ArrayList<Session>();
+	    }
+	    return sessions;
+	}
+	
+	/**
+	 * Add the JCR Session to the MailboxSession
+	 * @param session
+	 * @param jcrSession
+	 */
+    @SuppressWarnings("unchecked")
+    public static void addJCRSession(MailboxSession session, Session jcrSession) {
+        if (session != null) {
+            List<Session> sessions = (List<Session>) session.getAttributes().get(JCR_SESSIONS); 
+            if (sessions == null) {
+                sessions = new ArrayList<Session>();
+            }
+            sessions.add(jcrSession);
+            session.getAttributes().put(JCR_SESSIONS, sessions); 
+        }
+    }
 }

Modified: james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/JCRMailboxMapper.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/JCRMailboxMapper.java?rev=923896&r1=923895&r2=923896&view=diff
==============================================================================
--- james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/JCRMailboxMapper.java (original)
+++ james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/JCRMailboxMapper.java Tue Mar 16 17:46:11 2010
@@ -36,6 +36,7 @@ import org.apache.james.imap.api.display
 import org.apache.james.imap.jcr.AbstractJCRMapper;
 import org.apache.james.imap.jcr.JCRUtils;
 import org.apache.james.imap.jcr.mail.model.JCRMailbox;
+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;
@@ -220,41 +221,48 @@ public class JCRMailboxMapper extends Ab
      */
     public void save(Mailbox mailbox) throws StorageException {
         
-        String nodePath = JCRUtils.createPath(PATH,mailbox.getName());
+        String nodePath = JCRUtils.createPath(PATH, mailbox.getName());
         try {
-            createPathIfNotExists();
+            createNodeIfNotExists(PATH);
             JCRMailbox jcrMailbox = (JCRMailbox)mailbox;
-            
+            JCRMailbox savedMailbox = null;
 
+            try {
+                savedMailbox = (JCRMailbox) findMailboxByName(mailbox.getName());
+            } catch (MailboxNotFoundException e) {
+                // no mailbox with this name..
+            }
+            
             Node node;
-            if (jcrMailbox.isPersistent() == false) {
+            if (savedMailbox == null) {
                 node = getSession().getRootNode().addNode(nodePath);
                 node.addMixin(JcrConstants.MIX_REFERENCEABLE);
             } else {
-                node = jcrMailbox.getNode();
+                node = savedMailbox.getNode();
             }
             
             jcrMailbox.merge(node);
 
         } catch (RepositoryException e) {
-        	e.printStackTrace();
+            e.printStackTrace();
             throw new StorageException(HumanReadableText.SAVE_FAILED, e);
         }
     }
     
     public Mailbox consumeNextUid(String uuid) throws StorageException, MailboxNotFoundException {
 
-        JCRMailbox mailbox = (JCRMailbox) findMailboxByUUID(uuid);
-        mailbox.consumeUid();
+        final JCRMailbox mailbox = (JCRMailbox) findMailboxByUUID(uuid);
+        try {
+            execute(new Transaction() {
+                
+                public void run() throws MailboxException {
+                    mailbox.consumeUid();
+                }
+            });
+        } catch (MailboxException e) {
+            throw (StorageException)e;
+        }
         return mailbox;
 
     }
-    
-    protected void createPathIfNotExists() throws RepositoryException, PathNotFoundException {
-
-        if (getSession().getRootNode().hasNode(JCRUtils.createPath(PATH)) == false) {
-            getSession().getRootNode().addNode(JCRUtils.createPath(PATH));
-        }
-    }
-
 }

Modified: james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/JCRMessageMapper.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/JCRMessageMapper.java?rev=923896&r1=923895&r2=923896&view=diff
==============================================================================
--- james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/JCRMessageMapper.java (original)
+++ james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/JCRMessageMapper.java Tue Mar 16 17:46:11 2010
@@ -219,7 +219,7 @@ public class JCRMessageMapper extends Ab
         List<MailboxMembership> list = new ArrayList<MailboxMembership>();
         
         String queryString = "//" + PATH + "//element(*)[@" + JCRMailboxMembership.MAILBOX_UUID_PROPERTY +"='" + uuid +"']";
- 
+        getSession().refresh(true);
         QueryManager manager = getSession().getWorkspace().getQueryManager();
         QueryResult result = manager.createQuery(queryString, Query.XPATH).execute();
 
@@ -306,7 +306,7 @@ public class JCRMessageMapper extends Ab
             switch (type) {
                 default:
                 case ALL:
-                    results = findDeletedMessagesInMailbox(uuid);
+                    results = findMessagesInMailbox(uuid);
                     break;
                 case FROM:
                     results = findDeletedMessagesInMailboxAfterUID(uuid, from);
@@ -318,6 +318,11 @@ public class JCRMessageMapper extends Ab
                     results = findDeletedMessagesInMailboxBetweenUIDs(uuid, from, to);
                     break;       
             }
+            for (int i = 0; i < results.size();i++) {
+                MailboxMembership membership = results.get(i);
+                System.out.println("UID= " + membership.getUid() + " DELETED=" + membership.isDeleted());
+            }
+            //System.out.println("DELETE FOUND=" + results.size() + " TYPE="+ type.toString());
             return results;
         } catch (RepositoryException e) {
             e.printStackTrace();
@@ -387,19 +392,17 @@ public class JCRMessageMapper extends Ab
     public void save(MailboxMembership message) throws StorageException {
         JCRMailboxMembership membership = (JCRMailboxMembership) message;
         try {
-            createPathIfNotExists();
+            createNodeIfNotExists(PATH);
+            String path = JCRUtils.createPath(PATH, String.valueOf(membership.getUid()));
             Node messageNode;
-
-            if (membership.isPersistent() == false) {
-                messageNode = getSession().getRootNode().addNode(JCRUtils.createPath(PATH, String.valueOf(membership.getUid())));
-                messageNode.addMixin(JcrConstants.MIX_REFERENCEABLE);
-
+            
+            if (getSession().getRootNode().hasNode(path)) {
+                messageNode = getSession().getRootNode().getNode(path);
             } else {
-                messageNode = membership.getNode();
+                messageNode = getSession().getRootNode().addNode(path);
+                messageNode.addMixin(JcrConstants.MIX_REFERENCEABLE);
             }
-            
             membership.merge(messageNode);
-       
         } catch (RepositoryException e) {
             e.printStackTrace();
             throw new StorageException(HumanReadableText.SAVE_FAILED, e);
@@ -466,11 +469,4 @@ public class JCRMessageMapper extends Ab
         final String jql = queryBuilder.toString();
         return jql;
     }
-    
-
-    protected void createPathIfNotExists() throws RepositoryException, PathNotFoundException {
-        if (getSession().getRootNode().hasNode(JCRUtils.createPath(PATH)) == false) {
-            getSession().getRootNode().addNode(JCRUtils.createPath(PATH));
-        }
-    }
 }

Modified: james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/model/JCRMailboxMembership.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/model/JCRMailboxMembership.java?rev=923896&r1=923895&r2=923896&view=diff
==============================================================================
--- james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/model/JCRMailboxMembership.java (original)
+++ james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/model/JCRMailboxMembership.java Tue Mar 16 17:46:11 2010
@@ -373,7 +373,7 @@ public class JCRMailboxMembership extend
 	public void unsetRecent() {
 		if (isPersistent()) {
 			try {
-				node.getProperty(RECENT_PROPERTY).setValue(false);
+				node.setProperty(RECENT_PROPERTY, false);
 
 			} catch (RepositoryException e) {
 				logger.error("Unable to access property " + RECENT_PROPERTY, e);

Modified: james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/model/JCRMessage.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/model/JCRMessage.java?rev=923896&r1=923895&r2=923896&view=diff
==============================================================================
--- james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/model/JCRMessage.java (original)
+++ james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/model/JCRMessage.java Tue Mar 16 17:46:11 2010
@@ -303,13 +303,15 @@ public class JCRMessage extends Abstract
         node.setProperty(BODY_START_OCTET_PROPERTY, getBodyStartOctet());
 
         Node headersNode;
+        // check if some headers are already stored on this.
+        // if so remove the node just to be sure we get fresh data
         if (node.hasNode(HEADERS_NODE)) {
             headersNode = node.getNode(HEADERS_NODE);
             headersNode.remove();
-        } else {
-            headersNode = node.addNode(HEADERS_NODE);
         }
         
+        headersNode = node.addNode(HEADERS_NODE);
+        
         for (int i = 0; i < getHeaders().size(); i++) {
             JCRHeader header = (JCRHeader) getHeaders().get(i);
             Node headerNode = headersNode.addNode(header.getFieldName());
@@ -318,12 +320,15 @@ public class JCRMessage extends Abstract
       
         Node propertiesNode;
         
+        // check if some properties are already stored on this.
+        // if so remove the node just to be sure we get fresh data
         if (node.hasNode(PROPERTIES_NODE)) {
             propertiesNode = node.getNode(PROPERTIES_NODE);
             propertiesNode.remove();
-        } else {
-            propertiesNode = node.addNode(PROPERTIES_NODE);
-        }
+        } 
+        
+        propertiesNode = node.addNode(PROPERTIES_NODE);
+
         
         for (int i = 0; i < getProperties().size(); i++) {
             JCRProperty prop = (JCRProperty) getProperties().get(i);

Modified: james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/user/JCRSubscriptionMapper.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/user/JCRSubscriptionMapper.java?rev=923896&r1=923895&r2=923896&view=diff
==============================================================================
--- james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/user/JCRSubscriptionMapper.java (original)
+++ james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/user/JCRSubscriptionMapper.java Tue Mar 16 17:46:11 2010
@@ -34,7 +34,6 @@ import org.apache.commons.logging.Log;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.jcr.AbstractJCRMapper;
 import org.apache.james.imap.jcr.JCRUtils;
-import org.apache.james.imap.jcr.Persistent;
 import org.apache.james.imap.jcr.user.model.JCRSubscription;
 import org.apache.james.imap.mailbox.SubscriptionException;
 import org.apache.james.imap.store.user.SubscriptionMapper;
@@ -64,18 +63,18 @@ public class JCRSubscriptionMapper exten
      * .james.imap.store.user.model.Subscription)
      */
     public void delete(Subscription subscription) throws SubscriptionException {
-        // Check if the subscription was persistent in JCR if not don't do
-        // anything
-        if (subscription instanceof Persistent) {
-            try {
 
-                Node node = ((Persistent) subscription).getNode();
+        JCRSubscription sub = (JCRSubscription) subscription;
+        try {
+
+            Node node = sub.getNode();
+            if (node != null) {
                 node.remove();
-            } catch (PathNotFoundException e) {
-                // do nothing
-            } catch (RepositoryException e) {
-                throw new SubscriptionException(HumanReadableText.DELETED_FAILED, e);
             }
+        } catch (PathNotFoundException e) {
+            // do nothing
+        } catch (RepositoryException e) {
+            throw new SubscriptionException(HumanReadableText.DELETED_FAILED, e);
         }
 
     }
@@ -125,11 +124,7 @@ public class JCRSubscriptionMapper exten
 
     }
 
-    protected void createPathIfNotExists(String path) throws RepositoryException, PathNotFoundException {
-        if (getSession().getRootNode().hasNode(JCRUtils.createPath(path)) == false) {
-            getSession().getRootNode().addNode(JCRUtils.createPath(path));
-        }
-    }
+
     
     /*
      * (non-Javadoc)
@@ -143,16 +138,17 @@ public class JCRSubscriptionMapper exten
         String mailbox = subscription.getMailbox();
         String nodename = JCRUtils.createPath(PATH, username, mailbox);
         try {
-            createPathIfNotExists(PATH);
-            
-            // just a hack for now
-            createPathIfNotExists(JCRUtils.createPath(PATH,username));
+
             
             Node node;
             JCRSubscription sub = (JCRSubscription) findFindMailboxSubscriptionForUser(username, mailbox);
             
             // its a new subscription
             if (sub == null) {
+                createNodeIfNotExists(PATH);
+                // just a hack for now
+                createNodeIfNotExists(JCRUtils.createPath(PATH,username));
+                
                 node = getSession().getRootNode().addNode(nodename);
             } else {
                 node = sub.getNode();

Modified: james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAMailbox.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAMailbox.java?rev=923896&r1=923895&r2=923896&view=diff
==============================================================================
--- james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAMailbox.java (original)
+++ james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAMailbox.java Tue Mar 16 17:46:11 2010
@@ -48,7 +48,6 @@ public abstract class JPAMailbox extends
 
     protected final EntityManagerFactory entityManagerFactory;
 
-    public final static String MESSAGE_MAPPER = "MESSAGE_MAPPER";
     public JPAMailbox(final Mailbox mailbox, MailboxSession session, final EntityManagerFactory entityManagerfactory) {
         super(mailbox, session);
         this.entityManagerFactory = entityManagerfactory;
@@ -104,12 +103,5 @@ public abstract class JPAMailbox extends
         final JPAMailboxMapper mapper = createMailboxMapper(getMailboxSession());
         final Mailbox mailbox = mapper.consumeNextUid(mailboxId);
         return mailbox;
-    }
-
-    @Override
-    protected void onLogout(MailboxSession session) {
-        
-    }    
-    
-    
+    } 
 }

Modified: james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/openjpa/OpenJPAMailboxManager.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/openjpa/OpenJPAMailboxManager.java?rev=923896&r1=923895&r2=923896&view=diff
==============================================================================
--- james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/openjpa/OpenJPAMailboxManager.java (original)
+++ james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/openjpa/OpenJPAMailboxManager.java Tue Mar 16 17:46:11 2010
@@ -53,10 +53,4 @@ public class OpenJPAMailboxManager exten
         result = new OpenJPAMailbox(mailboxRow, session, entityManagerFactory);
         return result;
     }
-
-    @Override
-    protected void onLogout(MailboxSession session) {
-        // TODO Auto-generated method stub
-        
-    }
 }

Modified: james/imap/trunk/mailbox/pom.xml
URL: http://svn.apache.org/viewvc/james/imap/trunk/mailbox/pom.xml?rev=923896&r1=923895&r2=923896&view=diff
==============================================================================
--- james/imap/trunk/mailbox/pom.xml (original)
+++ james/imap/trunk/mailbox/pom.xml Tue Mar 16 17:46:11 2010
@@ -51,7 +51,7 @@
     </dependency>
     <dependency>
       <groupId>org.jmock</groupId>
-      <artifactId>jmock-junit3</artifactId>
+      <artifactId>jmock-junit4</artifactId>
       <scope>test</scope>
     </dependency>
   </dependencies>

Modified: james/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/MailboxManager.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/MailboxManager.java?rev=923896&r1=923895&r2=923896&view=diff
==============================================================================
--- james/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/MailboxManager.java (original)
+++ james/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/MailboxManager.java Tue Mar 16 17:46:11 2010
@@ -244,4 +244,18 @@ public interface MailboxManager {
      * @throws MailboxException
      */
     void addListener(String mailboxName, MailboxListener listener, MailboxSession session) throws MailboxException;
+    
+    /**
+     * Start the processing of a request for the given MailboxSession. If the user is not logged in already then the MailboxSession will be null
+     * 
+     * @param session 
+     */
+    void startProcessingRequest(MailboxSession session);
+    
+    /**
+     * End the processing of a request for the given MailboxSession. If the user is not logged in already then the MailboxSession will be null
+     * 
+     * @param session 
+     */
+    void endProcessingRequest(MailboxSession session);
 }

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=923896&r1=923895&r2=923896&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 Tue Mar 16 17:46:11 2010
@@ -64,6 +64,10 @@ public class InMemoryMailboxManager exte
     }
 
 
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.imap.store.mail.MailboxMapper#countMailboxesWithName(java.lang.String)
+     */
     public long countMailboxesWithName(String name) throws StorageException {
         int total = 0;
         for (final InMemoryMailbox mailbox:mailboxesById.values()) {
@@ -74,18 +78,34 @@ public class InMemoryMailboxManager exte
         return total;
     }
 
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.imap.store.mail.MailboxMapper#delete(org.apache.james.imap.store.mail.model.Mailbox)
+     */
     public void delete(Mailbox mailbox) throws StorageException {
         mailboxesById.remove(mailbox.getMailboxId());
     }
 
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.imap.store.mail.MailboxMapper#deleteAll()
+     */
     public void deleteAll() throws StorageException {
         mailboxesById.clear();
     }
 
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.imap.store.mail.MailboxMapper#findMailboxById(long)
+     */
     public Mailbox findMailboxById(long mailboxId) throws StorageException, MailboxNotFoundException {
         return mailboxesById.get(mailboxesById);
     }
 
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.imap.store.mail.MailboxMapper#findMailboxByName(java.lang.String)
+     */
     public Mailbox findMailboxByName(String name) throws StorageException, MailboxNotFoundException {
         Mailbox result = null;
         for (final InMemoryMailbox mailbox:mailboxesById.values()) {
@@ -97,6 +117,10 @@ public class InMemoryMailboxManager exte
         return result;
     }
 
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.imap.store.mail.MailboxMapper#findMailboxWithNameLike(java.lang.String)
+     */
     public List<Mailbox> findMailboxWithNameLike(String name) throws StorageException {
         final String regex = name.replace("%", ".*");
         List<Mailbox> results = new ArrayList<Mailbox>();
@@ -108,6 +132,10 @@ public class InMemoryMailboxManager exte
         return results;
     }
 
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.imap.store.mail.MailboxMapper#existsMailboxStartingWith(java.lang.String)
+     */
     public boolean existsMailboxStartingWith(String mailboxName) throws StorageException {
         boolean result = false;
         for (final InMemoryMailbox mailbox:mailboxesById.values()) {
@@ -119,10 +147,18 @@ public class InMemoryMailboxManager exte
         return result;
     }
 
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.imap.store.mail.MailboxMapper#save(org.apache.james.imap.store.mail.model.Mailbox)
+     */
     public void save(Mailbox mailbox) throws StorageException {
         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 void execute(Transaction transaction) throws MailboxException {
         transaction.run();
     }
@@ -144,18 +180,5 @@ public class InMemoryMailboxManager exte
             
         });
     }
-
-    /**
-     * 
-     */
-    public void destroy() {
-        // Nothing todo
-    }
-
-    @Override
-    protected void onLogout(MailboxSession session) {
-        // Nothing todo
-        
-    }
     
 }

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=923896&r1=923895&r2=923896&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 Tue Mar 16 17:46:11 2010
@@ -190,18 +190,4 @@ public class InMemoryStoreMailbox extend
     public void execute(Transaction transaction) throws MailboxException {
         transaction.run();
     }
-
-    /*
-     * (non-Javadoc)
-     * @see org.apache.james.imap.store.transaction.TransactionalMapper#destroy()
-     */
-    public void destroy() {
-        // nothing todo
-    }
-
-    @Override
-    protected void onLogout(MailboxSession session) {
-        // Nothing todo
-        
-    }
 }

Modified: james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java?rev=923896&r1=923895&r2=923896&view=diff
==============================================================================
--- james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java (original)
+++ james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java Tue Mar 16 17:46:11 2010
@@ -120,7 +120,12 @@ abstract public class AbstractMailboxPro
             responder.respond(response);
 
         } else {
+            getMailboxManager().startProcessingRequest(ImapSessionUtils.getMailboxSession(session));
+           
             doProcess(message, session, tag, command, responder);
+            
+            getMailboxManager().endProcessingRequest(ImapSessionUtils.getMailboxSession(session));
+
         }
     }
 
@@ -308,7 +313,7 @@ abstract public class AbstractMailboxPro
         return mailboxName;
     }
     
-    public MailboxManager getMailboxManager() throws MailboxException {
+    public MailboxManager getMailboxManager() {
         return mailboxManager;
     }
 

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=923896&r1=923895&r2=923896&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 Tue Mar 16 17:46:11 2010
@@ -124,10 +124,10 @@ public abstract class StoreMailbox imple
             MailboxSession mailboxSession, boolean isRecent, Flags flagsToBeSet)
     throws MailboxException {
         final Mailbox mailbox = reserveNextUid();
-
         if (mailbox == null) {
             throw new MailboxNotFoundException("Mailbox has been deleted");
         } else {
+            
             try {
                 // To be thread safe, we first get our own copy and the
                 // exclusive
@@ -358,10 +358,8 @@ public abstract class StoreMailbox imple
                     results.add(member.getUid());
                     if (reset) {
                         member.unsetRecent();
-                        
-                        // persist this to db
-                        mapper.save(member);
                     }
+                    mapper.save(member);
                 }
             }
             
@@ -605,5 +603,4 @@ public abstract class StoreMailbox imple
         return new MailboxMetaData(recent, permanentFlags, uidValidity, uidNext, messageCount, unseenCount, firstUnseen, isWriteable());
     }
     
-    protected abstract void onLogout(MailboxSession session);
 }

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=923896&r1=923895&r2=923896&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 Tue Mar 16 17:46:11 2010
@@ -474,30 +474,13 @@ public abstract class StoreMailboxManage
         }
     }
     
-    /*
-     * (non-Javadoc)
-     * @see org.apache.james.imap.mailbox.MailboxManager#logout(org.apache.james.imap.mailbox.MailboxSession, boolean)
+    /**
+     * Default do nothing. Should be overriden by subclass if needed
      */
     public void logout(MailboxSession session, boolean force) throws MailboxException {
-        if (session != null) {
-            if (subscriber instanceof StoreSubscriptionManager) {
-                ((StoreSubscriptionManager) subscriber).onLogout(session);
-            }
-            StoreMailbox mailbox = (StoreMailbox) session.getAttributes().get(MAILBOX);
-            if (mailbox != null) {
-                mailbox.onLogout(session);
-            }
-            onLogout(session);
-        }
+        // Do nothing by default
     }
-    
-    /**
-     * Get called on logout if the session is not null
-     * 
-     * @param session
-     */
-    protected abstract void onLogout(MailboxSession session);
-    
+
     /**
      * Return the delemiter to use
      * 
@@ -506,4 +489,26 @@ public abstract class StoreMailboxManage
     protected char getDelimiter() {
     	return delimiter;
     }
+
+
+    /**
+     * End processing of Request for session. Default is to do nothing.
+     * 
+     * Implementations should override this if they need todo anything special
+     */
+    public void endProcessingRequest(MailboxSession session) {
+        // Default do nothing
+        
+    }
+
+
+    /**
+     * Start processing of Request for session. Default is to do nothing.
+     * Implementations should override this if they need todo anything special
+     */
+    public void startProcessingRequest(MailboxSession session) {
+        // Default do nothing
+    }
+    
+    
 }

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=923896&r1=923895&r2=923896&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 Tue Mar 16 17:46:11 2010
@@ -49,10 +49,5 @@ public interface TransactionalMapper {
          */
         public void run() throws MailboxException;
     }
-    
-    /**
-     * Destroy the mapper
-     */
-    public void destroy();
 
 }

Modified: james/imap/trunk/torque/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailboxManager.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/torque/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailboxManager.java?rev=923896&r1=923895&r2=923896&view=diff
==============================================================================
--- james/imap/trunk/torque/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailboxManager.java (original)
+++ james/imap/trunk/torque/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailboxManager.java Tue Mar 16 17:46:11 2010
@@ -411,4 +411,18 @@ public class TorqueMailboxManager implem
         // fine
     }
 
+    /**
+     * Do nothing
+     */
+    public void endProcessingRequest(MailboxSession session) {
+        // Do nothing 
+    }
+
+    /**
+     * Do nothing
+     */
+    public void startProcessingRequest(MailboxSession session) {
+        // Do nothing        
+    }
+
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org