Author: rdonkin
Date: Thu Jan 31 13:41:48 2008
New Revision: 617248

URL: http://svn.apache.org/viewvc?rev=617248&view=rev
Log:
LSUB implementation.

Modified:
    
james/server/trunk/imap-api/src/main/java/org/apache/james/api/imap/display/HumanReadableTextKey.java
    
james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imap/message/response/imap4rev1/server/AbstractListingResponse.java
    
james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imap/message/response/imap4rev1/server/LSubResponse.java
    
james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/encode/imap4rev1/server/LSubResponseEncoderTest.java
    
james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/encode/imap4rev1/server/SearchResponseEncoderTest.java
    
james/server/trunk/imap-mailbox-processor-function/src/main/java/org/apache/james/imapserver/processor/imap4rev1/Imap4Rev1ProcessorFactory.java
    
james/server/trunk/imap-mailbox-processor-function/src/main/java/org/apache/james/imapserver/processor/imap4rev1/LSubProcessor.java
    
james/server/trunk/imap-mailbox-processor-function/src/test/java/org/apache/james/imapserver/processor/imap4rev1/LSubProcessorTest.java

Modified: 
james/server/trunk/imap-api/src/main/java/org/apache/james/api/imap/display/HumanReadableTextKey.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/imap-api/src/main/java/org/apache/james/api/imap/display/HumanReadableTextKey.java?rev=617248&r1=617247&r2=617248&view=diff
==============================================================================
--- 
james/server/trunk/imap-api/src/main/java/org/apache/james/api/imap/display/HumanReadableTextKey.java
 (original)
+++ 
james/server/trunk/imap-api/src/main/java/org/apache/james/api/imap/display/HumanReadableTextKey.java
 Thu Jan 31 13:41:48 2008
@@ -26,6 +26,10 @@
  */
 public class HumanReadableTextKey {
 
+    public static final HumanReadableTextKey GENERIC_LSUB_FAILURE 
+    = new 
HumanReadableTextKey("org.apache.james.imap.GENERIC_SUBSCRIPTION_FAILURE", 
+    "Cannot list subscriptions."); 
+    
     public static final HumanReadableTextKey GENERIC_UNSUBSCRIPTION_FAILURE 
     = new 
HumanReadableTextKey("org.apache.james.imap.GENERIC_SUBSCRIPTION_FAILURE", 
     "Cannot unsubscribe."); 

Modified: 
james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imap/message/response/imap4rev1/server/AbstractListingResponse.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imap/message/response/imap4rev1/server/AbstractListingResponse.java?rev=617248&r1=617247&r2=617248&view=diff
==============================================================================
--- 
james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imap/message/response/imap4rev1/server/AbstractListingResponse.java
 (original)
+++ 
james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imap/message/response/imap4rev1/server/AbstractListingResponse.java
 Thu Jan 31 13:41:48 2008
@@ -161,8 +161,7 @@
     {
         final String TAB = " ";
         
-        String retValue = getClass() + " ( "
-            + super.toString() + TAB
+        String retValue = getClass().getName() + " ( "
             + "noInferiors = " + this.noInferiors + TAB
             + "noSelect = " + this.noSelect + TAB
             + "marked = " + this.marked + TAB

Modified: 
james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imap/message/response/imap4rev1/server/LSubResponse.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imap/message/response/imap4rev1/server/LSubResponse.java?rev=617248&r1=617247&r2=617248&view=diff
==============================================================================
--- 
james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imap/message/response/imap4rev1/server/LSubResponse.java
 (original)
+++ 
james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imap/message/response/imap4rev1/server/LSubResponse.java
 Thu Jan 31 13:41:48 2008
@@ -24,9 +24,7 @@
  * Values an IMAP4rev1 <code>LIST</code> response.
  */
 public final class LSubResponse extends AbstractListingResponse implements 
ImapResponseMessage {
-    public LSubResponse(final boolean noInferiors, final boolean noSelect, 
-                        final boolean marked, final boolean unmarked, 
-                        final String hierarchyDelimiter, final String name) {
-        super(noInferiors, noSelect, marked, unmarked, hierarchyDelimiter, 
name);
+    public LSubResponse(final String name, final String hierarchyDelimiter, 
final boolean noSelect) {
+        super(false, noSelect, false, false, hierarchyDelimiter, name);
     }
 }

Modified: 
james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/encode/imap4rev1/server/LSubResponseEncoderTest.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/encode/imap4rev1/server/LSubResponseEncoderTest.java?rev=617248&r1=617247&r2=617248&view=diff
==============================================================================
--- 
james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/encode/imap4rev1/server/LSubResponseEncoderTest.java
 (original)
+++ 
james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/encode/imap4rev1/server/LSubResponseEncoderTest.java
 Thu Jan 31 13:41:48 2008
@@ -49,54 +49,29 @@
 
     public void testIsAcceptable() {
         assertFalse(encoder.isAcceptable(new ListResponse(true, true, true, 
true, ".", "name")));
-        assertTrue(encoder.isAcceptable(new LSubResponse(true, true, true, 
true, ".", "name")));
+        assertTrue(encoder.isAcceptable(new LSubResponse("name", ".", true)));
         assertFalse(encoder.isAcceptable((ImapMessage) 
mock(ImapMessage.class).proxy()));
         assertFalse(encoder.isAcceptable(null));
     }
     
     public void testName() throws Exception {
         composer.expects(once()).method("listResponse").with(same("LSUB"), 
NULL, same("."), same("INBOX.name"));      
-        encoder.encode(new LSubResponse(false, false, false, false, ".", 
"INBOX.name"), (ImapResponseComposer) composer.proxy());
+        encoder.encode(new LSubResponse("INBOX.name", ".", false), 
(ImapResponseComposer) composer.proxy());
     }
     
     public void testDelimiter() throws Exception {
         composer.expects(once()).method("listResponse").with(same("LSUB"), 
NULL, same("@"), same("INBOX.name"));      
-        encoder.encode(new LSubResponse(false, false, false, false, "@", 
"INBOX.name"), (ImapResponseComposer) composer.proxy());
+        encoder.encode(new LSubResponse("INBOX.name", "@", false), 
(ImapResponseComposer) composer.proxy());
     }
     
     public void testNoDelimiter() throws Exception {
         composer.expects(once()).method("listResponse").with(same("LSUB"), 
NULL, NULL, same("INBOX.name"));      
-        encoder.encode(new LSubResponse(false, false, false, false, null, 
"INBOX.name"), (ImapResponseComposer) composer.proxy());
-    }
-    
-    public void testAllAttributes() throws Exception {
-        String[] all = {ImapConstants.NAME_ATTRIBUTE_NOINFERIORS, 
ImapConstants.NAME_ATTRIBUTE_NOSELECT, 
-                ImapConstants.NAME_ATTRIBUTE_MARKED, 
ImapConstants.NAME_ATTRIBUTE_UNMARKED};
-        composer.expects(once()).method("listResponse").with(same("LSUB"), 
eq(Arrays.asList(all)), same("."), same("INBOX.name"));      
-        encoder.encode(new LSubResponse(true, true, true, true, ".", 
"INBOX.name"), (ImapResponseComposer) composer.proxy());
-    }
-    
-    public void testNoInferiors() throws Exception {
-        String[] values = {ImapConstants.NAME_ATTRIBUTE_NOINFERIORS};
-        composer.expects(once()).method("listResponse").with(same("LSUB"), 
eq(Arrays.asList(values)), same("."), same("INBOX.name"));      
-        encoder.encode(new LSubResponse(true, false, false, false, ".", 
"INBOX.name"), (ImapResponseComposer) composer.proxy());
+        encoder.encode(new LSubResponse("INBOX.name", null, false), 
(ImapResponseComposer) composer.proxy());
     }
     
     public void testNoSelect() throws Exception {
         String[] values = {ImapConstants.NAME_ATTRIBUTE_NOSELECT};
         composer.expects(once()).method("listResponse").with(same("LSUB"), 
eq(Arrays.asList(values)), same("."), same("INBOX.name"));      
-        encoder.encode(new LSubResponse(false, true, false, false, ".", 
"INBOX.name"), (ImapResponseComposer) composer.proxy());
-    }
-    
-    public void testMarked() throws Exception {
-        String[] values = {ImapConstants.NAME_ATTRIBUTE_MARKED};
-        composer.expects(once()).method("listResponse").with(same("LSUB"), 
eq(Arrays.asList(values)), same("."), same("INBOX.name"));      
-        encoder.encode(new LSubResponse(false, false, true, false, ".", 
"INBOX.name"), (ImapResponseComposer) composer.proxy());
-    }
-    
-    public void testUnmarked() throws Exception {
-        String[] values = {ImapConstants.NAME_ATTRIBUTE_UNMARKED};
-        composer.expects(once()).method("listResponse").with(same("LSUB"), 
eq(Arrays.asList(values)), same("."), same("INBOX.name"));      
-        encoder.encode(new LSubResponse(false, false, false, true, ".", 
"INBOX.name"), (ImapResponseComposer) composer.proxy());
+        encoder.encode(new LSubResponse("INBOX.name", ".", true), 
(ImapResponseComposer) composer.proxy());
     }
 }

Modified: 
james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/encode/imap4rev1/server/SearchResponseEncoderTest.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/encode/imap4rev1/server/SearchResponseEncoderTest.java?rev=617248&r1=617247&r2=617248&view=diff
==============================================================================
--- 
james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/encode/imap4rev1/server/SearchResponseEncoderTest.java
 (original)
+++ 
james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/encode/imap4rev1/server/SearchResponseEncoderTest.java
 Thu Jan 31 13:41:48 2008
@@ -49,7 +49,7 @@
 
     public void testIsAcceptable() {
         assertTrue(encoder.isAcceptable(new ListResponse(true, true, true, 
true, ".", "name")));
-        assertFalse(encoder.isAcceptable(new LSubResponse(true, true, true, 
true, ".", "name")));
+        assertFalse(encoder.isAcceptable(new LSubResponse("name", ".", true)));
         assertFalse(encoder.isAcceptable((ImapMessage) 
mock(ImapMessage.class).proxy()));
         assertFalse(encoder.isAcceptable(null));
     }

Modified: 
james/server/trunk/imap-mailbox-processor-function/src/main/java/org/apache/james/imapserver/processor/imap4rev1/Imap4Rev1ProcessorFactory.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/imap-mailbox-processor-function/src/main/java/org/apache/james/imapserver/processor/imap4rev1/Imap4Rev1ProcessorFactory.java?rev=617248&r1=617247&r2=617248&view=diff
==============================================================================
--- 
james/server/trunk/imap-mailbox-processor-function/src/main/java/org/apache/james/imapserver/processor/imap4rev1/Imap4Rev1ProcessorFactory.java
 (original)
+++ 
james/server/trunk/imap-mailbox-processor-function/src/main/java/org/apache/james/imapserver/processor/imap4rev1/Imap4Rev1ProcessorFactory.java
 Thu Jan 31 13:41:48 2008
@@ -71,7 +71,7 @@
         final StatusProcessor statusProcessor = new StatusProcessor(
                 noopProcessor, mailboxManagerProvider, statusResponseFactory);
         final LSubProcessor lsubProcessor = new LSubProcessor(statusProcessor,
-                mailboxManagerProvider, statusResponseFactory);
+                mailboxManagerProvider, statusResponseFactory, subscriber);
         final ListProcessor listProcessor = new ListProcessor(lsubProcessor,
                 mailboxManagerProvider, statusResponseFactory);
         final SearchProcessor searchProcessor = new SearchProcessor(

Modified: 
james/server/trunk/imap-mailbox-processor-function/src/main/java/org/apache/james/imapserver/processor/imap4rev1/LSubProcessor.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/imap-mailbox-processor-function/src/main/java/org/apache/james/imapserver/processor/imap4rev1/LSubProcessor.java?rev=617248&r1=617247&r2=617248&view=diff
==============================================================================
--- 
james/server/trunk/imap-mailbox-processor-function/src/main/java/org/apache/james/imapserver/processor/imap4rev1/LSubProcessor.java
 (original)
+++ 
james/server/trunk/imap-mailbox-processor-function/src/main/java/org/apache/james/imapserver/processor/imap4rev1/LSubProcessor.java
 Thu Jan 31 13:41:48 2008
@@ -19,35 +19,34 @@
 
 package org.apache.james.imapserver.processor.imap4rev1;
 
-import org.apache.avalon.framework.logger.Logger;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+
 import org.apache.james.api.imap.ImapCommand;
 import org.apache.james.api.imap.ImapConstants;
 import org.apache.james.api.imap.ImapMessage;
-import org.apache.james.api.imap.ProtocolException;
+import org.apache.james.api.imap.display.HumanReadableTextKey;
 import org.apache.james.api.imap.message.request.ImapRequest;
-import org.apache.james.api.imap.message.response.ImapResponseMessage;
 import 
org.apache.james.api.imap.message.response.imap4rev1.StatusResponseFactory;
 import org.apache.james.api.imap.process.ImapProcessor;
 import org.apache.james.api.imap.process.ImapSession;
 import org.apache.james.imap.message.request.imap4rev1.LsubRequest;
 import org.apache.james.imap.message.response.imap4rev1.server.LSubResponse;
 import 
org.apache.james.imapserver.processor.base.AbstractMailboxAwareProcessor;
-import org.apache.james.imapserver.processor.base.AuthorizationException;
 import org.apache.james.imapserver.processor.base.ImapSessionUtils;
-import org.apache.james.imapserver.store.MailboxException;
-import org.apache.james.mailboxmanager.ListResult;
-import org.apache.james.mailboxmanager.MailboxManagerException;
-import org.apache.james.mailboxmanager.impl.ListResultImpl;
 import org.apache.james.mailboxmanager.manager.MailboxExpression;
-import org.apache.james.mailboxmanager.manager.MailboxManager;
 import org.apache.james.mailboxmanager.manager.MailboxManagerProvider;
 import org.apache.james.services.User;
 
 public class LSubProcessor extends AbstractMailboxAwareProcessor {
 
-    public LSubProcessor(final ImapProcessor next,
-            final MailboxManagerProvider mailboxManagerProvider, final 
StatusResponseFactory factory) {
+    final IMAPSubscriber subscriber;
+    
+    public LSubProcessor(final ImapProcessor next, final 
MailboxManagerProvider mailboxManagerProvider, 
+            final StatusResponseFactory factory, final IMAPSubscriber 
subscriber) {
         super(next, mailboxManagerProvider, factory);
+        this.subscriber = subscriber;
     }
 
     protected boolean isAcceptable(ImapMessage message) {
@@ -55,197 +54,76 @@
     }
 
     protected void doProcess(ImapRequest message,
-            ImapSession session, String tag, ImapCommand command, Responder 
responder)
-            throws MailboxException, AuthorizationException, ProtocolException 
{
+            ImapSession session, String tag, ImapCommand command, Responder 
responder) {
         final LsubRequest request = (LsubRequest) message;
-        final String baseReferenceName = request.getBaseReferenceName();
-        final String mailboxPatternString = request.getMailboxPattern();
-        doProcess(baseReferenceName,
-                mailboxPatternString, session, tag, command, responder);
-    }
-
-    protected ImapResponseMessage createResponse(boolean noInferior, boolean 
noSelect, boolean marked, boolean unmarked, String hierarchyDelimiter, String 
mailboxName) {
-        return new LSubResponse(noInferior, noSelect, marked, unmarked, 
hierarchyDelimiter, mailboxName);
-    }
-    
-
-    protected final void doProcess(
-            final String baseReferenceName, 
-            final String mailboxPattern,
-            final ImapSession session, 
-            final String tag, ImapCommand command,
-            final Responder responder)
-            throws MailboxException, AuthorizationException, ProtocolException 
{
-
-        String referenceName = baseReferenceName;
-        // Should the #user.userName section be removed from names returned?
-        final boolean removeUserPrefix;
-
-        final ListResult[] listResults;
-
-        final User user = ImapSessionUtils.getUser(session);
-        final String personalNamespace = ImapConstants.USER_NAMESPACE
-                + ImapConstants.HIERARCHY_DELIMITER_CHAR + user.getUserName();
+        final String referenceName = request.getBaseReferenceName();
+        final String mailboxPattern = request.getMailboxPattern();
 
-        if (mailboxPattern.length() == 0) {
-            // An empty mailboxPattern signifies a request for the hierarchy
-            // delimiter
-            // and root name of the referenceName argument
-
-            String referenceRoot;
-            if (referenceName.startsWith(ImapConstants.NAMESPACE_PREFIX)) {
-                // A qualified reference name - get the first element,
-                // and don't remove the user prefix
-                removeUserPrefix = false;
-                int firstDelimiter = referenceName
-                        .indexOf(ImapConstants.HIERARCHY_DELIMITER_CHAR);
-                if (firstDelimiter == -1) {
-                    referenceRoot = referenceName;
-                } else {
-                    referenceRoot = referenceName.substring(0, firstDelimiter);
-                }
+        try {
+            if (mailboxPattern.length() == 0) {
+                respondWithHierarchyDelimiter(responder);
+                
             } else {
-                // A relative reference name - need to remove user prefix from
-                // results.
-                referenceRoot = "";
-                removeUserPrefix = true;
-
-            }
+                listSubscriptions(session, responder, referenceName, 
mailboxPattern);
+            }        
 
-            // Get the mailbox for the reference name.
-            listResults = new ListResult[1];
-            listResults[0] = new ListResultImpl(referenceRoot,
-                    ImapConstants.HIERARCHY_DELIMITER);
-        } else {
-
-            // If the mailboxPattern is fully qualified, ignore the
-            // reference name.
-            if (mailboxPattern.charAt(0) == 
ImapConstants.NAMESPACE_PREFIX_CHAR) {
-                referenceName = "";
-            }
-
-            // If the search pattern is relative, need to remove user prefix
-            // from results.
-            removeUserPrefix = ((referenceName + mailboxPattern).charAt(0) != 
ImapConstants.NAMESPACE_PREFIX_CHAR);
-
-            if (removeUserPrefix) {
-                referenceName = personalNamespace + "." + referenceName;
+            okComplete(command, tag, responder);
+            
+        } catch (SubscriptionException e) {
+            getLogger().debug("Subscription failed", e);
+            final HumanReadableTextKey exceptionKey = e.getKey();
+            final HumanReadableTextKey displayTextKey;
+            if (exceptionKey == null) {
+                displayTextKey = HumanReadableTextKey.GENERIC_LSUB_FAILURE;
+            } else {
+                displayTextKey = exceptionKey;
             }
-
-            listResults = doList(session, referenceName, mailboxPattern);
+            no(command, tag, responder, displayTextKey);
         }
-
-        int prefixLength = personalNamespace.length();
-
-        for (int i = 0; i < listResults.length; i++) {
-            final ListResult listResult = listResults[i];
-            processResult(responder, removeUserPrefix, prefixLength, 
listResult);
-        }   
-        
-        okComplete(command, tag, responder);
     }
 
-    void processResult(final Responder responder, final boolean 
removeUserPrefix, 
-            int prefixLength, final ListResult listResult) {
-        final String delimiter = listResult.getHierarchyDelimiter();
-        final String mailboxName = mailboxName(removeUserPrefix, prefixLength, 
listResult);
-
-        final String[] attrs = listResult.getAttributes();
-        boolean noInferior = false;
-        boolean noSelect = false;
-        boolean marked = false;
-        boolean unmarked = false;
-        if (attrs != null) {
-            final int length = attrs.length;
-            for (int i=0;i<length;i++) {
-                final String attribute = attrs[i];
-                if 
(ImapConstants.NAME_ATTRIBUTE_NOINFERIORS.equals(attribute)) {
-                    noInferior = true;
-                } else if 
(ImapConstants.NAME_ATTRIBUTE_NOSELECT.equals(attribute)) {
-                    noSelect = true;
-                    // RFC 3501 does not allow Marked or Unmarked on a 
NoSelect mailbox
-                    if (marked || unmarked) {
-                        logMarkedUnmarkedNoSelectMailbox(mailboxName);
-                        marked = false;
-                        unmarked = false;
-                    }
-                } else if 
(ImapConstants.NAME_ATTRIBUTE_MARKED.equals(attribute)) {
-                    if (noSelect) {
-                        // RFC 3501 does not allow NoSelect mailboxes to be 
Marked
-                        marked = false;
-                        logMarkedUnmarkedNoSelectMailbox(mailboxName);
-                    } else {
-                        marked = true;
-                        if (unmarked) {
-                            // RFC3501 does not allow marked and unmarked to 
be returned
-                            // When the mailbox has both marked and unmarked 
set,
-                            // the implementation is free to choose which to 
return.
-                            // Choose to return marked.
-                            logMarkedUnmarkedMailbox(mailboxName);
-                            unmarked = false;
-                        }
-                    }
-                } else if 
(ImapConstants.NAME_ATTRIBUTE_UNMARKED.equals(attribute)) {
-                    if (noSelect) {
-                        // RFC 3501 does not allow NoSelect mailboxes to be 
UnMarked
-                        marked = false;
-                        logMarkedUnmarkedNoSelectMailbox(mailboxName);
-                    } else {
-                        if (marked) {
-                            // RFC3501 does not allow marked and unmarked to 
be returned
-                            // When the mailbox has both marked and unmarked 
set,
-                            // the implementation is free to choose which to 
return.
-                            // Choose to return marked.
-                            logMarkedUnmarkedMailbox(mailboxName);
-                        } else {
-                            unmarked = true;
-                        }
-                    }
-                }
-            }
+    private void listSubscriptions(ImapSession session, Responder responder, 
final String referenceName, final String mailboxPattern) throws 
SubscriptionException {
+        final User user = ImapSessionUtils.getUser(session);
+        final String userName = user.getUserName();
+        final Collection mailboxes = subscriber.subscriptions(userName);
+        final MailboxExpression expression 
+            = new MailboxExpression(referenceName, mailboxPattern, '*', '%');
+        final Collection mailboxResponses = new ArrayList();
+        for (final Iterator it=mailboxes.iterator();it.hasNext();) {
+            final String mailboxName = (String) it.next();
+            respond(responder, expression, mailboxName, true, mailboxes, 
mailboxResponses);
         }
-        
-        responder.respond(createResponse(noInferior, noSelect, marked, 
unmarked, 
-                delimiter, mailboxName));
     }
 
-    private void logMarkedUnmarkedNoSelectMailbox(final String mailboxName) {
-        final Logger logger = getLogger();
-        if (logger != null && logger.isDebugEnabled()) {
-            logger.debug("Marked or unmarked flags set on NoSelect mailbox: " 
+ mailboxName);
-        }
-    }
-    
-    private void logMarkedUnmarkedMailbox(final String mailboxName) {
-        final Logger logger = getLogger();
-        if (logger != null && logger.isDebugEnabled()) {
-            logger.debug("Marked and unmarked flags set on mailbox: " + 
mailboxName);
+    private void respond(Responder responder, final MailboxExpression 
expression, final String mailboxName, 
+            final boolean originalSubscription, final Collection mailboxes, 
final Collection mailboxResponses) {
+        if (expression.isExpressionMatch(mailboxName, 
ImapConstants.HIERARCHY_DELIMITER_CHAR)) {
+            if (!mailboxResponses.contains(mailboxName))
+            {
+                final LSubResponse response = new LSubResponse(mailboxName, 
ImapConstants.HIERARCHY_DELIMITER, !originalSubscription);
+                responder.respond(response);
+                mailboxResponses.add(mailboxName);
+            }
         }
-    }
-
-    private String mailboxName(final boolean removeUserPrefix, int 
prefixLength, final ListResult listResult) {
-        final String mailboxName;
-        final String name = listResult.getName();
-        if (removeUserPrefix) {
-            if (name.length() <= prefixLength) {
-                mailboxName = "";
-            } else {
-                mailboxName = name.substring(prefixLength + 1);
+        else
+        {
+            final int lastDelimiter = 
mailboxName.lastIndexOf(ImapConstants.HIERARCHY_DELIMITER_CHAR);
+            if (lastDelimiter > 0) {
+                final String parentMailbox = mailboxName.substring(0, 
lastDelimiter);
+                if (!mailboxes.contains(parentMailbox)) {
+                    respond(responder, expression, parentMailbox, false, 
mailboxes, mailboxResponses);
+                }
             }
-        } else {
-            mailboxName = name;
         }
-        return mailboxName;
     }
-   
-    protected final ListResult[] doList(ImapSession session, String base,
-            String pattern) throws MailboxException {
-        try {
-            final MailboxManager mailboxManager = getMailboxManager(session);
-            final ListResult[] result = mailboxManager.list(new 
MailboxExpression(base,pattern, '*', '%'));
-            return result;
-        } catch (MailboxManagerException e) {
-            throw new MailboxException(e);
-        }
+
+    /** 
+     * An empty mailboxPattern signifies a request for the hierarchy delimiter
+     * and root name of the referenceName argument
+     * @param referenceName IMAP reference name, possibly null
+     */
+    private void respondWithHierarchyDelimiter(final Responder responder) {
+        final LSubResponse response = new LSubResponse("", 
ImapConstants.HIERARCHY_DELIMITER, true);
+        responder.respond(response);
     }
 }

Modified: 
james/server/trunk/imap-mailbox-processor-function/src/test/java/org/apache/james/imapserver/processor/imap4rev1/LSubProcessorTest.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/imap-mailbox-processor-function/src/test/java/org/apache/james/imapserver/processor/imap4rev1/LSubProcessorTest.java?rev=617248&r1=617247&r2=617248&view=diff
==============================================================================
--- 
james/server/trunk/imap-mailbox-processor-function/src/test/java/org/apache/james/imapserver/processor/imap4rev1/LSubProcessorTest.java
 (original)
+++ 
james/server/trunk/imap-mailbox-processor-function/src/test/java/org/apache/james/imapserver/processor/imap4rev1/LSubProcessorTest.java
 Thu Jan 31 13:41:48 2008
@@ -19,20 +19,36 @@
 
 package org.apache.james.imapserver.processor.imap4rev1;
 
+import java.util.ArrayList;
+import java.util.Collection;
+
 import org.apache.james.api.imap.ImapCommand;
 import org.apache.james.api.imap.ImapConstants;
+import org.apache.james.api.imap.display.HumanReadableTextKey;
+import org.apache.james.api.imap.message.response.imap4rev1.StatusResponse;
 import 
org.apache.james.api.imap.message.response.imap4rev1.StatusResponseFactory;
 import org.apache.james.api.imap.process.ImapProcessor;
 import org.apache.james.api.imap.process.ImapSession;
+import org.apache.james.imap.message.request.imap4rev1.LsubRequest;
 import org.apache.james.imap.message.response.imap4rev1.server.LSubResponse;
+import org.apache.james.imapserver.processor.base.ImapSessionUtils;
 import org.apache.james.mailboxmanager.ListResult;
 import org.apache.james.mailboxmanager.manager.MailboxManagerProvider;
+import org.apache.james.services.User;
 import org.jmock.Mock;
 import org.jmock.MockObjectTestCase;
 
 public class LSubProcessorTest extends MockObjectTestCase {
 
-
+    private static final String ROOT = "ROOT";
+    private static final String PARENT = ROOT  + 
ImapConstants.HIERARCHY_DELIMITER + "PARENT";
+    private static final String CHILD_ONE = PARENT + 
ImapConstants.HIERARCHY_DELIMITER + "CHILD_ONE";
+    private static final String CHILD_TWO = PARENT + 
ImapConstants.HIERARCHY_DELIMITER + "CHILD_TWO";
+    private static final String MAILBOX_C = "C.MAILBOX";
+    private static final String MAILBOX_B = "B.MAILBOX";
+    private static final String MAILBOX_A = "A.MAILBOX";
+    private static final String USER = "A User";
+    private static final String TAG = "TAG";
     LSubProcessor processor;
     Mock next;
     Mock provider;
@@ -41,125 +57,148 @@
     Mock session;
     Mock command;
     Mock serverResponseFactory;
+    Mock subscriber;
+    Mock user;
+    Mock statusResponse;
+    Collection subscriptions;
+    ImapCommand imapCommand;
+    private ImapProcessor.Responder responderImpl;
     
     protected void setUp() throws Exception {
+        subscriptions = new ArrayList();
+        user = mock(User.class);
         serverResponseFactory = mock(StatusResponseFactory.class);
         session = mock(ImapSession.class);
         command = mock(ImapCommand.class);
+        imapCommand = (ImapCommand) command.proxy();
         next = mock(ImapProcessor.class);
         responder = mock(ImapProcessor.Responder.class);
         result = mock(ListResult.class);
+        subscriber = mock(IMAPSubscriber.class);
         provider = mock(MailboxManagerProvider.class);
-        processor = createProcessor((ImapProcessor) next.proxy(), 
-                (MailboxManagerProvider) provider.proxy(), 
(StatusResponseFactory) serverResponseFactory.proxy());
+        statusResponse = mock(StatusResponse.class);
+        responderImpl = (ImapProcessor.Responder) responder.proxy();
+        processor = new LSubProcessor((ImapProcessor) next.proxy(), 
(MailboxManagerProvider) provider.proxy(), 
+                (StatusResponseFactory) serverResponseFactory.proxy(), 
(IMAPSubscriber) subscriber.proxy());
     }
 
     protected void tearDown() throws Exception {
         super.tearDown();
     }
-
-    LSubProcessor createProcessor(ImapProcessor next, MailboxManagerProvider 
provider, StatusResponseFactory factory) {
-        return new LSubProcessor(next, provider, factory);
-    }
-
-    LSubResponse createResponse(boolean noinferior, boolean noselect, boolean 
marked, 
-            boolean unmarked, String hierarchyDelimiter, String mailboxName) {
-        return new LSubResponse(noinferior, noselect, marked, unmarked, 
hierarchyDelimiter, mailboxName);
+    
+    public void testHierarchy() throws Exception {
+        subscriptions.add(MAILBOX_A);
+        subscriptions.add(MAILBOX_B);
+        subscriptions.add(MAILBOX_C);
+        
+        responder.expects(once()).method("respond")
+            .with(eq(new LSubResponse("", ImapConstants.HIERARCHY_DELIMITER, 
true)));
+        
+        expectOk();
+        
+        LsubRequest request = new LsubRequest(imapCommand,"", "", TAG);
+        processor.doProcess(request, (ImapSession) session.proxy(), TAG, 
imapCommand, 
+                responderImpl);
+        
+    }
+    
+    public void testShouldRespondToRegexWithSubscribedMailboxes() throws 
Exception {
+        subscriptions.add(MAILBOX_A);
+        subscriptions.add(MAILBOX_B);
+        subscriptions.add(MAILBOX_C);
+        subscriptions.add(CHILD_ONE);
+        subscriptions.add(CHILD_TWO);
+        
+        responder.expects(once()).method("respond")
+            .with(eq(new LSubResponse(CHILD_ONE, 
ImapConstants.HIERARCHY_DELIMITER, false)));        
+        
+        responder.expects(once()).method("respond")
+            .with(eq(new LSubResponse(CHILD_TWO, 
ImapConstants.HIERARCHY_DELIMITER, false)));  
+        
+        expectSubscriptions();
+        expectOk();
+        
+        LsubRequest request = new LsubRequest(imapCommand,"", PARENT + 
ImapConstants.HIERARCHY_DELIMITER + "%", TAG);
+        processor.doProcess(request, (ImapSession) session.proxy(), TAG, 
imapCommand, 
+                responderImpl);
+        
+    }
+    
+    public void 
testShouldRespondNoSelectToRegexWithParentsOfSubscribedMailboxes() throws 
Exception {
+        subscriptions.add(MAILBOX_A);
+        subscriptions.add(MAILBOX_B);
+        subscriptions.add(MAILBOX_C);
+        subscriptions.add(CHILD_ONE);
+        subscriptions.add(CHILD_TWO);
+        
+        responder.expects(once()).method("respond")
+            .with(eq(new LSubResponse(PARENT, 
ImapConstants.HIERARCHY_DELIMITER, true)));         
+        
+        expectSubscriptions();
+        expectOk();
+        
+        LsubRequest request = new LsubRequest(imapCommand,"", ROOT + 
ImapConstants.HIERARCHY_DELIMITER + "%", TAG);
+        processor.doProcess(request, (ImapSession) session.proxy(), TAG, 
imapCommand, 
+                responderImpl);
+        
+    }
+    
+    public void 
testShouldRespondSelectToRegexWithParentOfSubscribedMailboxesWhenParentSubscribed()
 throws Exception {
+        subscriptions.add(MAILBOX_A);
+        subscriptions.add(MAILBOX_B);
+        subscriptions.add(MAILBOX_C);
+        subscriptions.add(PARENT);
+        subscriptions.add(CHILD_ONE);
+        subscriptions.add(CHILD_TWO);
+        
+        responder.expects(once()).method("respond")
+            .with(eq(new LSubResponse(PARENT, 
ImapConstants.HIERARCHY_DELIMITER, false)));         
+        
+        expectSubscriptions();
+        expectOk();
+        
+        LsubRequest request = new LsubRequest(imapCommand,"", ROOT + 
ImapConstants.HIERARCHY_DELIMITER + "%", TAG);
+        processor.doProcess(request, (ImapSession) session.proxy(), TAG, 
imapCommand, 
+                responderImpl);
+        
+    }
+
+    public void testSelectAll() throws Exception {
+        subscriptions.add(MAILBOX_A);
+        responder.expects(once()).method("respond")
+            .with(eq(new LSubResponse(MAILBOX_A, 
ImapConstants.HIERARCHY_DELIMITER, false)));
+        subscriptions.add(MAILBOX_B);
+        responder.expects(once()).method("respond")
+            .with(eq(new LSubResponse(MAILBOX_B, 
ImapConstants.HIERARCHY_DELIMITER, false)));
+        subscriptions.add(MAILBOX_C);
+        responder.expects(once()).method("respond")
+            .with(eq(new LSubResponse(MAILBOX_C, 
ImapConstants.HIERARCHY_DELIMITER, false)));
+        
+        expectSubscriptions();
+        expectOk();
+        
+        LsubRequest request = new LsubRequest(imapCommand,"", "*", TAG);
+        processor.doProcess(request, (ImapSession) session.proxy(), TAG, 
imapCommand, 
+                responderImpl);
+        
+    }
+    
+    private void expectOk() {
+        StatusResponse response = (StatusResponse) statusResponse.proxy();
+        serverResponseFactory.expects(once()).method("taggedOk")
+            .with(eq(TAG), same(imapCommand), 
eq(HumanReadableTextKey.COMPLETED))
+                .will(returnValue(response));
+        responder.expects(once()).method("respond").with(same(response));
+    }
+    
+    private void expectSubscriptions() {
+        user.expects(once()).method("getUserName").will(returnValue(USER));
+        session.expects(once()).method("getAttribute")
+            .with(eq(ImapSessionUtils.MAILBOX_USER_ATTRIBUTE_SESSION_KEY))
+                .will(returnValue((User) user.proxy()));
+        
+        subscriber.expects(once()).method("subscriptions")
+            .with(eq(USER))
+                .will(returnValue(subscriptions));
     }
-
-    void setUpResult(String[] attributes, String hierarchyDelimiter, String 
name) {
-        
result.expects(once()).method("getAttributes").will(returnValue(attributes));
-        
result.expects(once()).method("getHierarchyDelimiter").will(returnValue(hierarchyDelimiter));
-        result.expects(once()).method("getName").will(returnValue(name));
-    }
-    
-    public void testNoInferiors() throws Exception {
-        String[] attributes = {"\\noise", 
ImapConstants.NAME_ATTRIBUTE_NOINFERIORS, "\\bogus"};
-        setUpResult(attributes, ".", "#INBOX");
-        responder.expects(once()).method("respond").with(
-                eq(createResponse(true, false, false, false, ".", "#INBOX")));
-        processor.processResult((ImapProcessor.Responder) responder.proxy(), 
-                false, 0, (ListResult) result.proxy());
-    }
-    
-    public void testNoSelect() throws Exception {
-        String[] attributes = {"\\noise", 
ImapConstants.NAME_ATTRIBUTE_NOSELECT, "\\bogus"};
-        setUpResult(attributes, ".", "#INBOX");
-        responder.expects(once()).method("respond").with(
-                eq(createResponse(false, true, false, false, ".", "#INBOX")));
-        processor.processResult((ImapProcessor.Responder) responder.proxy(), 
-                false, 0, (ListResult) result.proxy());
-    }
-    
-    public void testUnMarked() throws Exception {
-        String[] attributes = {"\\noise", 
ImapConstants.NAME_ATTRIBUTE_UNMARKED, "\\bogus"};
-        setUpResult(attributes, ".", "#INBOX");
-        responder.expects(once()).method("respond").with(
-                eq(createResponse(false, false, false, true, ".", "#INBOX")));
-        processor.processResult((ImapProcessor.Responder) responder.proxy(), 
-                false, 0, (ListResult) result.proxy());
-    }
-    
-    public void testMarked() throws Exception {
-        String[] attributes = {"\\noise", ImapConstants.NAME_ATTRIBUTE_MARKED, 
"\\bogus"};
-        setUpResult(attributes, ".", "#INBOX");
-        responder.expects(once()).method("respond").with(
-                eq(createResponse(false, false, true, false, ".", "#INBOX")));
-        processor.processResult((ImapProcessor.Responder) responder.proxy(), 
-                false, 0, (ListResult) result.proxy());
-    }
-    
-    public void testMarkedAndUnmarked() throws Exception {
-        String[] attributes = {"\\noise", ImapConstants.NAME_ATTRIBUTE_MARKED, 
ImapConstants.NAME_ATTRIBUTE_UNMARKED, "\\bogus"};
-        setUpResult(attributes, ".", "#INBOX");
-        responder.expects(once()).method("respond").with(
-                eq(createResponse(false, false, true, false, ".", "#INBOX")));
-        processor.processResult((ImapProcessor.Responder) responder.proxy(), 
-                false, 0, (ListResult) result.proxy());
-    }
-    
-    public void testUnmarkedAndMarked() throws Exception {
-        String[] attributes = {"\\noise", 
ImapConstants.NAME_ATTRIBUTE_UNMARKED, ImapConstants.NAME_ATTRIBUTE_MARKED, 
"\\bogus"};
-        setUpResult(attributes, ".", "#INBOX");
-        responder.expects(once()).method("respond").with(
-                eq(createResponse(false, false, true, false, ".", "#INBOX")));
-        processor.processResult((ImapProcessor.Responder) responder.proxy(), 
-                false, 0, (ListResult) result.proxy());
-    }
-    
-    public void testNoSelectUnmarkedAndMarked() throws Exception {
-        String[] attributes = {"\\noise", 
ImapConstants.NAME_ATTRIBUTE_NOSELECT, ImapConstants.NAME_ATTRIBUTE_UNMARKED, 
ImapConstants.NAME_ATTRIBUTE_MARKED, "\\bogus"};
-        setUpResult(attributes, ".", "#INBOX");
-        responder.expects(once()).method("respond").with(
-                eq(createResponse(false, true, false, false, ".", "#INBOX")));
-        processor.processResult((ImapProcessor.Responder) responder.proxy(), 
-                false, 0, (ListResult) result.proxy());
-    }
-    
-    public void testUnmarkedAndMarkedNoSelect() throws Exception {
-        String[] attributes = {"\\noise",  
ImapConstants.NAME_ATTRIBUTE_UNMARKED, ImapConstants.NAME_ATTRIBUTE_MARKED, 
ImapConstants.NAME_ATTRIBUTE_NOSELECT, "\\bogus"};
-        setUpResult(attributes, ".", "#INBOX");
-        responder.expects(once()).method("respond").with(
-                eq(createResponse(false, true, false, false, ".", "#INBOX")));
-        processor.processResult((ImapProcessor.Responder) responder.proxy(), 
-                false, 0, (ListResult) result.proxy());
-    }
-    
-    public void testUnmarkedNoSelectAndMarked() throws Exception {
-        String[] attributes = {"\\noise",  
ImapConstants.NAME_ATTRIBUTE_UNMARKED, ImapConstants.NAME_ATTRIBUTE_NOSELECT, 
ImapConstants.NAME_ATTRIBUTE_MARKED, "\\bogus"};
-        setUpResult(attributes, ".", "#INBOX");
-        responder.expects(once()).method("respond").with(
-                eq(createResponse(false, true, false, false, ".", "#INBOX")));
-        processor.processResult((ImapProcessor.Responder) responder.proxy(), 
-                false, 0, (ListResult) result.proxy());
-    }
-    
-    public void testNoinferiorsUnmarkedNoSelectAndMarked() throws Exception {
-        String[] attributes = {"\\noise",  
ImapConstants.NAME_ATTRIBUTE_NOINFERIORS, 
ImapConstants.NAME_ATTRIBUTE_UNMARKED, ImapConstants.NAME_ATTRIBUTE_NOSELECT, 
ImapConstants.NAME_ATTRIBUTE_MARKED, "\\bogus"};
-        setUpResult(attributes, ".", "#INBOX");
-        responder.expects(once()).method("respond").with(
-                eq(createResponse(true, true, false, false, ".", "#INBOX")));
-        processor.processResult((ImapProcessor.Responder) responder.proxy(), 
-                false, 0, (ListResult) result.proxy());
-    }    
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to