Author: norman
Date: Sun Dec 26 11:43:25 2010
New Revision: 1052879

URL: http://svn.apache.org/viewvc?rev=1052879&view=rev
Log:
Allow to inject an AbstractDelegatingMailboxListener which is a special 
MailboxListener implementation that take care of delegate work to other 
MailboxListener. See MAILBOX-22

Added:
    
james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/MailboxListenerSupport.java
    
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/AbstractDelegatingMailboxListener.java
Modified:
    
james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/MailboxManager.java
    
james/mailbox/trunk/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
    
james/mailbox/trunk/jcr/src/test/java/org/apache/james/mailbox/jcr/JCRHostSystem.java
    
james/mailbox/trunk/jcr/src/test/java/org/apache/james/mailbox/jcr/JCRMailboxManagerTest.java
    
james/mailbox/trunk/jcr/src/test/java/org/apache/james/mailbox/jcr/JCRStressTest.java
    
james/mailbox/trunk/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAHostSystem.java
    
james/mailbox/trunk/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAMailboxManagerTest.java
    
james/mailbox/trunk/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAStressTest.java
    
james/mailbox/trunk/maildir/src/test/java/org/apache/james/mailbox/functional/maildir/MaildirHostSystem.java
    
james/mailbox/trunk/maildir/src/test/java/org/apache/james/mailbox/functional/maildir/MaildirMailboxManagerTest.java
    
james/mailbox/trunk/maildir/src/test/java/org/apache/james/mailbox/functional/maildir/MaildirStressTest.java
    
james/mailbox/trunk/memory/src/test/java/org/apache/james/mailbox/inmemory/InMemoryHostSystem.java
    
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/DelegatingMailboxListener.java
    
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java

Added: 
james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/MailboxListenerSupport.java
URL: 
http://svn.apache.org/viewvc/james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/MailboxListenerSupport.java?rev=1052879&view=auto
==============================================================================
--- 
james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/MailboxListenerSupport.java
 (added)
+++ 
james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/MailboxListenerSupport.java
 Sun Dec 26 11:43:25 2010
@@ -0,0 +1,39 @@
+/****************************************************************
+ * 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.mailbox;
+
+public interface MailboxListenerSupport {
+
+
+    /**
+     * <p>Implementations of Mailbox may interpret the fact that someone is
+     * listening and do some caching and even postpone persistence until
+     * everyone has removed itself.
+     * </p><p>
+     * Listeners should return true from {...@link MailboxListener#isClosed()}
+     * when they are ready to be removed.
+     * </p>
+     * @param mailboxPath not null
+     * @param listener not null
+     * @param session not null
+     * @throws MailboxException
+     */
+    void addListener(MailboxPath mailboxPath, MailboxListener listener, 
MailboxSession session) throws MailboxException;
+}

Modified: 
james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/MailboxManager.java
URL: 
http://svn.apache.org/viewvc/james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/MailboxManager.java?rev=1052879&r1=1052878&r2=1052879&view=diff
==============================================================================
--- 
james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/MailboxManager.java
 (original)
+++ 
james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/MailboxManager.java
 Sun Dec 26 11:43:25 2010
@@ -57,7 +57,7 @@ import org.apache.commons.logging.Log;
  * </p>
  */
 
-public interface MailboxManager extends RequestAware {
+public interface MailboxManager extends RequestAware, MailboxListenerSupport {
 
     /**
      * Return the delimter to use for folders
@@ -194,20 +194,6 @@ public interface MailboxManager extends 
     void logout(MailboxSession session, boolean force) throws MailboxException;
 
 
-    /**
-     * <p>Implementations of Mailbox may interpret the fact that someone is
-     * listening and do some caching and even postpone persistence until
-     * everyone has removed itself.
-     * </p><p>
-     * Listeners should return true from {...@link MailboxListener#isClosed()}
-     * when they are ready to be removed.
-     * </p>
-     * @param mailboxPath not null
-     * @param listener not null
-     * @param session not null
-     * @throws MailboxException
-     */
-    void addListener(MailboxPath mailboxPath, MailboxListener listener, 
MailboxSession session) throws MailboxException;
  
     /**
      * Return a unmodifiable {...@link List} of {...@link MailboxPath} objects

Modified: 
james/mailbox/trunk/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
URL: 
http://svn.apache.org/viewvc/james/mailbox/trunk/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java?rev=1052879&r1=1052878&r2=1052879&view=diff
==============================================================================
--- 
james/mailbox/trunk/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
 (original)
+++ 
james/mailbox/trunk/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
 Sun Dec 26 11:43:25 2010
@@ -169,8 +169,9 @@ public abstract class MailboxManagerTest
      * Implement this method to create the mailboxManager.
      * 
      * @return
+     * @throws MailboxException 
      */
-    protected abstract void createMailboxManager();
+    protected abstract void createMailboxManager() throws MailboxException;
     
     /**
      * Setter to inject the mailboxManager.

Modified: 
james/mailbox/trunk/jcr/src/test/java/org/apache/james/mailbox/jcr/JCRHostSystem.java
URL: 
http://svn.apache.org/viewvc/james/mailbox/trunk/jcr/src/test/java/org/apache/james/mailbox/jcr/JCRHostSystem.java?rev=1052879&r1=1052878&r2=1052879&view=diff
==============================================================================
--- 
james/mailbox/trunk/jcr/src/test/java/org/apache/james/mailbox/jcr/JCRHostSystem.java
 (original)
+++ 
james/mailbox/trunk/jcr/src/test/java/org/apache/james/mailbox/jcr/JCRHostSystem.java
 Sun Dec 26 11:43:25 2010
@@ -74,6 +74,8 @@ public class JCRHostSystem extends ImapH
             JCRMailboxSessionMapperFactory mf = new 
JCRMailboxSessionMapperFactory(sessionRepos);
 
             mailboxManager = new JCRMailboxManager(mf, userManager, 
uidProvider);
+            mailboxManager.init();
+
             final ImapProcessor defaultImapProcessorFactory = 
DefaultImapProcessorFactory.createDefaultProcessor(mailboxManager, new 
JCRSubscriptionManager(mf));
             resetUserMetaData();
             MailboxSession session = 
mailboxManager.createSystemSession("test", new SimpleLog("TestLog"));

Modified: 
james/mailbox/trunk/jcr/src/test/java/org/apache/james/mailbox/jcr/JCRMailboxManagerTest.java
URL: 
http://svn.apache.org/viewvc/james/mailbox/trunk/jcr/src/test/java/org/apache/james/mailbox/jcr/JCRMailboxManagerTest.java?rev=1052879&r1=1052878&r2=1052879&view=diff
==============================================================================
--- 
james/mailbox/trunk/jcr/src/test/java/org/apache/james/mailbox/jcr/JCRMailboxManagerTest.java
 (original)
+++ 
james/mailbox/trunk/jcr/src/test/java/org/apache/james/mailbox/jcr/JCRMailboxManagerTest.java
 Sun Dec 26 11:43:25 2010
@@ -73,7 +73,7 @@ public class JCRMailboxManagerTest exten
     /* (non-Javadoc)
      * @see org.apache.james.mailbox.MailboxManagerTest#createMailboxManager()
      */
-    protected void createMailboxManager() {
+    protected void createMailboxManager() throws MailboxException {
 
         new File(JACKRABBIT_HOME).delete();
 
@@ -99,8 +99,9 @@ public class JCRMailboxManagerTest exten
         JCRCachingUidProvider uidProvider = new 
JCRCachingUidProvider(sessionRepos);
 
         JCRMailboxSessionMapperFactory mf = new 
JCRMailboxSessionMapperFactory(sessionRepos);
-        setMailboxManager(new JCRMailboxManager(mf, null, uidProvider));
-
+        JCRMailboxManager manager = new JCRMailboxManager(mf, null, 
uidProvider);
+        manager.init();
+        setMailboxManager(manager);
     }
 
 }

Modified: 
james/mailbox/trunk/jcr/src/test/java/org/apache/james/mailbox/jcr/JCRStressTest.java
URL: 
http://svn.apache.org/viewvc/james/mailbox/trunk/jcr/src/test/java/org/apache/james/mailbox/jcr/JCRStressTest.java?rev=1052879&r1=1052878&r2=1052879&view=diff
==============================================================================
--- 
james/mailbox/trunk/jcr/src/test/java/org/apache/james/mailbox/jcr/JCRStressTest.java
 (original)
+++ 
james/mailbox/trunk/jcr/src/test/java/org/apache/james/mailbox/jcr/JCRStressTest.java
 Sun Dec 26 11:43:25 2010
@@ -26,6 +26,7 @@ import org.apache.commons.logging.impl.S
 import org.apache.jackrabbit.core.RepositoryImpl;
 import org.apache.jackrabbit.core.config.RepositoryConfig;
 import org.apache.james.imap.functional.AbstractStressTest;
+import org.apache.james.mailbox.MailboxException;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.jcr.GlobalMailboxSessionJCRRepository;
@@ -48,7 +49,7 @@ public class JCRStressTest extends Abstr
    
     
     @Before
-    public void setUp() throws RepositoryException {
+    public void setUp() throws RepositoryException, MailboxException {
 
         new File(JACKRABBIT_HOME).delete();
 
@@ -66,6 +67,7 @@ public class JCRStressTest extends Abstr
 
         JCRMailboxSessionMapperFactory mf = new 
JCRMailboxSessionMapperFactory(sessionRepos);
         mailboxManager = new JCRMailboxManager(mf, null, uidProvider);
+        mailboxManager.init();
 
     }
     

Modified: 
james/mailbox/trunk/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAHostSystem.java
URL: 
http://svn.apache.org/viewvc/james/mailbox/trunk/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAHostSystem.java?rev=1052879&r1=1052878&r2=1052879&view=diff
==============================================================================
--- 
james/mailbox/trunk/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAHostSystem.java
 (original)
+++ 
james/mailbox/trunk/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAHostSystem.java
 Sun Dec 26 11:43:25 2010
@@ -82,6 +82,7 @@ public class JPAHostSystem extends ImapH
 
         JPAMailboxSessionMapperFactory mf = new 
JPAMailboxSessionMapperFactory(entityManagerFactory);
         mailboxManager = new OpenJPAMailboxManager(mf, userManager, 
uidProvider);
+        mailboxManager.init();
         SubscriptionManager subscriptionManager = new 
JPASubscriptionManager(mf);
         final ImapProcessor defaultImapProcessorFactory = 
DefaultImapProcessorFactory.createDefaultProcessor(mailboxManager, 
subscriptionManager);
         resetUserMetaData();

Modified: 
james/mailbox/trunk/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAMailboxManagerTest.java
URL: 
http://svn.apache.org/viewvc/james/mailbox/trunk/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAMailboxManagerTest.java?rev=1052879&r1=1052878&r2=1052879&view=diff
==============================================================================
--- 
james/mailbox/trunk/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAMailboxManagerTest.java
 (original)
+++ 
james/mailbox/trunk/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAMailboxManagerTest.java
 Sun Dec 26 11:43:25 2010
@@ -78,7 +78,7 @@ public class JPAMailboxManagerTest exten
      * @see org.apache.james.mailbox.MailboxManagerTest#createMailboxManager()
      */
     @Override
-    protected void createMailboxManager() {
+    protected void createMailboxManager() throws MailboxException {
         
         HashMap<String, String> properties = new HashMap<String, String>();
         properties.put("openjpa.ConnectionDriverName", "org.h2.Driver");
@@ -100,8 +100,10 @@ public class JPAMailboxManagerTest exten
         JPACachingUidProvider uidProvider = new 
JPACachingUidProvider(entityManagerFactory);
         JPAMailboxSessionMapperFactory mf = new 
JPAMailboxSessionMapperFactory(entityManagerFactory);
 
-        setMailboxManager(new OpenJPAMailboxManager(mf, null, uidProvider));
-
+        JPAMailboxManager mailboxManager = new OpenJPAMailboxManager(mf, null, 
uidProvider);
+        mailboxManager.init();
+        
+        setMailboxManager(mailboxManager);
     }
 
 }

Modified: 
james/mailbox/trunk/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAStressTest.java
URL: 
http://svn.apache.org/viewvc/james/mailbox/trunk/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAStressTest.java?rev=1052879&r1=1052878&r2=1052879&view=diff
==============================================================================
--- 
james/mailbox/trunk/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAStressTest.java
 (original)
+++ 
james/mailbox/trunk/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAStressTest.java
 Sun Dec 26 11:43:25 2010
@@ -54,7 +54,7 @@ public class JPAStressTest extends Abstr
     private EntityManagerFactory entityManagerFactory;
     
     @Before
-    public void setUp() {
+    public void setUp() throws MailboxException {
         
         HashMap<String, String> properties = new HashMap<String, String>();
         properties.put("openjpa.ConnectionDriverName", "org.h2.Driver");
@@ -77,7 +77,8 @@ public class JPAStressTest extends Abstr
         JPACachingUidProvider uidProvider = new 
JPACachingUidProvider(entityManagerFactory);
         JPAMailboxSessionMapperFactory mf = new 
JPAMailboxSessionMapperFactory(entityManagerFactory);
         mailboxManager = new OpenJPAMailboxManager(mf, null, uidProvider);
-        
+        mailboxManager.init();
+
         // Set the lock timeout via SQL because of a bug in openJPA
         // https://issues.apache.org/jira/browse/OPENJPA-1656
         setH2LockTimeout();

Modified: 
james/mailbox/trunk/maildir/src/test/java/org/apache/james/mailbox/functional/maildir/MaildirHostSystem.java
URL: 
http://svn.apache.org/viewvc/james/mailbox/trunk/maildir/src/test/java/org/apache/james/mailbox/functional/maildir/MaildirHostSystem.java?rev=1052879&r1=1052878&r2=1052879&view=diff
==============================================================================
--- 
james/mailbox/trunk/maildir/src/test/java/org/apache/james/mailbox/functional/maildir/MaildirHostSystem.java
 (original)
+++ 
james/mailbox/trunk/maildir/src/test/java/org/apache/james/mailbox/functional/maildir/MaildirHostSystem.java
 Sun Dec 26 11:43:25 2010
@@ -27,6 +27,7 @@ import org.apache.james.imap.functional.
 import org.apache.james.imap.functional.InMemoryUserManager;
 import org.apache.james.imap.main.DefaultImapDecoderFactory;
 import org.apache.james.imap.processor.main.DefaultImapProcessorFactory;
+import org.apache.james.mailbox.MailboxException;
 import org.apache.james.mailbox.maildir.MaildirMailboxManager;
 import org.apache.james.mailbox.maildir.MaildirMailboxSessionMapperFactory;
 import org.apache.james.mailbox.maildir.MaildirStore;
@@ -46,13 +47,14 @@ public class MaildirHostSystem extends I
         return new MaildirHostSystem();
     }
     
-    public MaildirHostSystem() {
+    public MaildirHostSystem() throws MailboxException {
         userManager = new InMemoryUserManager();
         MaildirStore store = new MaildirStore(MAILDIR_HOME + "/%user");
         mailboxSessionMapperFactory = new 
MaildirMailboxSessionMapperFactory(store);
         MaildirSubscriptionManager sm = new 
MaildirSubscriptionManager(mailboxSessionMapperFactory);
         mailboxManager = new 
MaildirMailboxManager(mailboxSessionMapperFactory, userManager, store);
-        
+        mailboxManager.init();
+
         final ImapProcessor defaultImapProcessorFactory = 
DefaultImapProcessorFactory.createDefaultProcessor(mailboxManager, sm);
         configure(new DefaultImapDecoderFactory().buildImapDecoder(),
                 new DefaultImapEncoderFactory().buildImapEncoder(),

Modified: 
james/mailbox/trunk/maildir/src/test/java/org/apache/james/mailbox/functional/maildir/MaildirMailboxManagerTest.java
URL: 
http://svn.apache.org/viewvc/james/mailbox/trunk/maildir/src/test/java/org/apache/james/mailbox/functional/maildir/MaildirMailboxManagerTest.java?rev=1052879&r1=1052878&r2=1052879&view=diff
==============================================================================
--- 
james/mailbox/trunk/maildir/src/test/java/org/apache/james/mailbox/functional/maildir/MaildirMailboxManagerTest.java
 (original)
+++ 
james/mailbox/trunk/maildir/src/test/java/org/apache/james/mailbox/functional/maildir/MaildirMailboxManagerTest.java
 Sun Dec 26 11:43:25 2010
@@ -84,7 +84,9 @@ public class MaildirMailboxManagerTest e
     private void doTestListWithMaildirStoreConfiguration(String 
maildirStoreConfiguration) throws MailboxException, 
UnsupportedEncodingException {
         MaildirStore store = new MaildirStore(MAILDIR_HOME + 
maildirStoreConfiguration);
         MaildirMailboxSessionMapperFactory mf = new 
MaildirMailboxSessionMapperFactory(store);
-        setMailboxManager(new MaildirMailboxManager(mf, null, store));
+        MaildirMailboxManager manager = new MaildirMailboxManager(mf, null, 
store);
+        manager.init();
+        setMailboxManager(manager);
         super.testList();
         try {
             tearDown();

Modified: 
james/mailbox/trunk/maildir/src/test/java/org/apache/james/mailbox/functional/maildir/MaildirStressTest.java
URL: 
http://svn.apache.org/viewvc/james/mailbox/trunk/maildir/src/test/java/org/apache/james/mailbox/functional/maildir/MaildirStressTest.java?rev=1052879&r1=1052878&r2=1052879&view=diff
==============================================================================
--- 
james/mailbox/trunk/maildir/src/test/java/org/apache/james/mailbox/functional/maildir/MaildirStressTest.java
 (original)
+++ 
james/mailbox/trunk/maildir/src/test/java/org/apache/james/mailbox/functional/maildir/MaildirStressTest.java
 Sun Dec 26 11:43:25 2010
@@ -37,11 +37,13 @@ public class MaildirStressTest extends A
     private MaildirMailboxManager mailboxManager;
     
     @Before
-    public void setUp() {
+    public void setUp() throws MailboxException {
         MaildirStore store = new MaildirStore(MAILDIR_HOME + "/%user");
 
         MaildirMailboxSessionMapperFactory mf = new 
MaildirMailboxSessionMapperFactory(store);
         mailboxManager = new MaildirMailboxManager(mf, null, store);
+        mailboxManager.init();
+
     }
     
     @After

Modified: 
james/mailbox/trunk/memory/src/test/java/org/apache/james/mailbox/inmemory/InMemoryHostSystem.java
URL: 
http://svn.apache.org/viewvc/james/mailbox/trunk/memory/src/test/java/org/apache/james/mailbox/inmemory/InMemoryHostSystem.java?rev=1052879&r1=1052878&r2=1052879&view=diff
==============================================================================
--- 
james/mailbox/trunk/memory/src/test/java/org/apache/james/mailbox/inmemory/InMemoryHostSystem.java
 (original)
+++ 
james/mailbox/trunk/memory/src/test/java/org/apache/james/mailbox/inmemory/InMemoryHostSystem.java
 Sun Dec 26 11:43:25 2010
@@ -25,6 +25,7 @@ import org.apache.james.imap.functional.
 import org.apache.james.imap.functional.InMemoryUserManager;
 import org.apache.james.imap.main.DefaultImapDecoderFactory;
 import org.apache.james.imap.processor.main.DefaultImapProcessorFactory;
+import org.apache.james.mailbox.MailboxException;
 import org.apache.james.mailbox.inmemory.InMemoryMailboxManager;
 import org.apache.james.mailbox.inmemory.InMemoryMailboxSessionMapperFactory;
 import org.apache.james.mailbox.inmemory.InMemorySubscriptionManager;
@@ -42,7 +43,7 @@ public class InMemoryHostSystem extends 
         return host;
     }
     
-    private InMemoryHostSystem() {
+    private InMemoryHostSystem() throws MailboxException {
         initFields();
     }
     
@@ -56,11 +57,13 @@ public class InMemoryHostSystem extends 
         initFields();
     }
     
-    private void initFields() {
+    private void initFields() throws MailboxException {
         userManager = new InMemoryUserManager();
         factory = new InMemoryMailboxSessionMapperFactory();
         InMemoryCachingUidProvider uidProvider = new 
InMemoryCachingUidProvider();
         mailboxManager = new InMemoryMailboxManager(factory, userManager, 
uidProvider);
+        mailboxManager.init();
+
         final ImapProcessor defaultImapProcessorFactory = 
DefaultImapProcessorFactory.createDefaultProcessor(mailboxManager, new 
InMemorySubscriptionManager(factory));
         configure(new DefaultImapDecoderFactory().buildImapDecoder(),
                 new DefaultImapEncoderFactory().buildImapEncoder(),

Added: 
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/AbstractDelegatingMailboxListener.java
URL: 
http://svn.apache.org/viewvc/james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/AbstractDelegatingMailboxListener.java?rev=1052879&view=auto
==============================================================================
--- 
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/AbstractDelegatingMailboxListener.java
 (added)
+++ 
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/AbstractDelegatingMailboxListener.java
 Sun Dec 26 11:43:25 2010
@@ -0,0 +1,103 @@
+/****************************************************************
+ * 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.mailbox.store;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.james.mailbox.MailboxException;
+import org.apache.james.mailbox.MailboxListener;
+import org.apache.james.mailbox.MailboxListenerSupport;
+import org.apache.james.mailbox.MailboxPath;
+import org.apache.james.mailbox.MailboxSession;
+
+public abstract class AbstractDelegatingMailboxListener implements 
MailboxListener, MailboxListenerSupport{
+
+    /**
+     * Receive the event and dispatch it to the right {...@link 
MailboxListener} depending on {...@link Event#getMailboxPath()}
+     */
+    public void event(Event event) {
+        MailboxPath path = event.getMailboxPath();
+        Map<MailboxPath, List<MailboxListener>> listeners = getListeners();
+
+        List<MailboxListener> mListeners = listeners.get(path);
+        if (mListeners != null && mListeners.isEmpty() == false) {
+            List<MailboxListener> closedListener = new 
ArrayList<MailboxListener>();
+            
+            int sz = mListeners.size();
+            for (int i = 0; i < sz; i++) {
+                MailboxListener l = mListeners.get(i);
+                if (l.isClosed()) {
+                    closedListener.add(l);
+                } else {
+                    l.event(event);
+                }
+            }
+            
+            if (event instanceof MailboxDeletion) {
+                // remove listeners if the mailbox was deleted
+                listeners.remove(path);
+            } else if (event instanceof MailboxRenamed) {
+                // handle rename events
+                MailboxRenamed renamed = (MailboxRenamed) event;
+                List<MailboxListener> l = listeners.remove(path);
+                if (l != null) {
+                    listeners.put(renamed.getNewPath(), l);
+                }
+            }
+            if (closedListener.isEmpty() == false) {
+                mListeners.removeAll(closedListener);
+                if (mListeners.isEmpty()) {
+                    listeners.remove(path);
+                }
+            }
+        }        
+    }
+
+    /**
+     * Is never closed
+     */
+    public boolean isClosed() {
+        return false;
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see 
org.apache.james.mailbox.MailboxListenerSupport#addListener(org.apache.james.mailbox.MailboxPath,
 org.apache.james.mailbox.MailboxListener, 
org.apache.james.mailbox.MailboxSession)
+     */
+    public synchronized void addListener(MailboxPath path, MailboxListener 
listener, MailboxSession session) throws MailboxException {
+        Map<MailboxPath, List<MailboxListener>> listeners = getListeners();
+        List<MailboxListener> mListeners = listeners.get(path);
+        if (mListeners == null) {
+            mListeners = new ArrayList<MailboxListener>();
+            listeners.put(path, mListeners);
+        }
+        if (mListeners.contains(listener) == false) {
+            mListeners.add(listener);
+        }        
+    }
+
+    /**
+     * Return the {...@link Map} which is used to store the {...@link 
MailboxListener}
+     * 
+     * @return listeners
+     */
+    protected abstract Map<MailboxPath, List<MailboxListener>> getListeners();
+}

Modified: 
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/DelegatingMailboxListener.java
URL: 
http://svn.apache.org/viewvc/james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/DelegatingMailboxListener.java?rev=1052879&r1=1052878&r2=1052879&view=diff
==============================================================================
--- 
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/DelegatingMailboxListener.java
 (original)
+++ 
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/DelegatingMailboxListener.java
 Sun Dec 26 11:43:25 2010
@@ -19,7 +19,6 @@
 
 package org.apache.james.mailbox.store;
 
-import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -31,67 +30,13 @@ import org.apache.james.mailbox.MailboxP
  * Receive a {...@link Event} and delegate it to an other {...@link 
MailboxListener} depending on the registered name
  *
  */
-public class DelegatingMailboxListener implements MailboxListener{
+public class DelegatingMailboxListener extends 
AbstractDelegatingMailboxListener{
 
     private Map<MailboxPath, List<MailboxListener>> listeners = new 
HashMap<MailboxPath, List<MailboxListener>>();
 
-    public synchronized void addListener(MailboxPath path, MailboxListener 
listener) {
-        List<MailboxListener> mListeners = listeners.get(path);
-        if (mListeners == null) {
-            mListeners = new ArrayList<MailboxListener>();
-            listeners.put(path, mListeners);
-        }
-        if (mListeners.contains(listener) == false) {
-            mListeners.add(listener);
-        }
-    }
-    
-    
-    /*
-     * (non-Javadoc)
-     * @see 
org.apache.james.mailbox.MailboxListener#event(org.apache.james.mailbox.MailboxListener.Event)
-     */
-    public synchronized void event(Event event) {
-        MailboxPath path = event.getMailboxPath();
-        List<MailboxListener> mListeners = listeners.get(path);
-        if (mListeners != null && mListeners.isEmpty() == false) {
-            List<MailboxListener> closedListener = new 
ArrayList<MailboxListener>();
-            
-            int sz = mListeners.size();
-            for (int i = 0; i < sz; i++) {
-                MailboxListener l = mListeners.get(i);
-                if (l.isClosed()) {
-                    closedListener.add(l);
-                } else {
-                    l.event(event);
-                }
-            }
-            
-            if (event instanceof MailboxDeletion) {
-                // remove listeners if the mailbox was deleted
-                listeners.remove(path);
-            } else if (event instanceof MailboxRenamed) {
-                // handle rename events
-                MailboxRenamed renamed = (MailboxRenamed) event;
-                List<MailboxListener> l = listeners.remove(path);
-                if (l != null) {
-                    listeners.put(renamed.getNewPath(), l);
-                }
-            }
-            if (closedListener.isEmpty() == false) {
-                mListeners.removeAll(closedListener);
-                if (mListeners.isEmpty()) {
-                    listeners.remove(path);
-                }
-            }
-        }
-    }
-
-    /**
-     * Is never closed
-     */
-    public boolean isClosed() {
-        return false;
+    @Override
+    protected Map<MailboxPath, List<MailboxListener>> getListeners() {
+        return listeners;
     }
     
 }

Modified: 
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
URL: 
http://svn.apache.org/viewvc/james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java?rev=1052879&r1=1052878&r2=1052879&view=diff
==============================================================================
--- 
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
 (original)
+++ 
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
 Sun Dec 26 11:43:25 2010
@@ -67,7 +67,7 @@ public abstract class StoreMailboxManage
     public static final char SQL_WILDCARD_CHAR = '%';
     
     private final MailboxEventDispatcher dispatcher = new 
MailboxEventDispatcher();
-    private final DelegatingMailboxListener delegatingListener = new 
DelegatingMailboxListener();   
+    private AbstractDelegatingMailboxListener delegatingListener = null;  
     protected final MailboxMapperFactory<Id> mailboxSessionMapperFactory;    
     
     private final Authenticator authenticator;
@@ -84,10 +84,37 @@ public abstract class StoreMailboxManage
         this.locker = locker;
         this.mailboxSessionMapperFactory = mailboxSessionMapperFactory;
         this.uidProvider = uidProvider;
-        // The dispatcher need to have the delegating listener added
-        dispatcher.addMailboxListener(delegatingListener);
+       
     }
    
+    /**
+     * Init the {...@link MailboxManager}
+     * 
+     * @throws MailboxException
+     */
+    public void init() throws MailboxException{
+        // The dispatcher need to have the delegating listener added
+        dispatcher.addMailboxListener(getDelegationListener());
+    }
+    
+    protected AbstractDelegatingMailboxListener getDelegationListener() {
+        if (delegatingListener == null) {
+            delegatingListener = new DelegatingMailboxListener();
+        }
+        return delegatingListener;
+    }
+    
+    /**
+     * Set the {...@link AbstractDelegatingMailboxListener} to use with this 
{...@link MailboxManager} instance. If none is set here a {...@link 
DelegatingMailboxListener} instance will
+     * be created lazy
+     * 
+     * @param delegatingListener
+     */
+    public void setDelegatingMailboxListener(AbstractDelegatingMailboxListener 
delegatingListener) {
+        this.delegatingListener = delegatingListener;
+    }
+    
+    
     protected Log getLog() {
         return log;
     }
@@ -411,7 +438,7 @@ public abstract class StoreMailboxManage
      * @see 
org.apache.james.mailbox.MailboxManager#addListener(org.apache.james.imap.api.MailboxPath,
 org.apache.james.mailbox.MailboxListener, 
org.apache.james.mailbox.MailboxSession)
      */
     public void addListener(MailboxPath path, MailboxListener listener, 
MailboxSession session) throws MailboxException {
-        delegatingListener.addListener(path, listener);
+        delegatingListener.addListener(path, listener, session);
     }
 
      /**



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

Reply via email to