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 rd...@apache.org on 2008/03/29 10:23:38 UTC

svn commit: r642521 - in /james/server/trunk: core-library/src/main/java/org/apache/james/mailboxmanager/ core-library/src/main/java/org/apache/james/mailboxmanager/impl/ experimental-seda-imap-function/src/test/resources/org/apache/james/test/function...

Author: rdonkin
Date: Sat Mar 29 02:23:37 2008
New Revision: 642521

URL: http://svn.apache.org/viewvc?rev=642521&view=rev
Log:
Fixed LIST namespace

Modified:
    james/server/trunk/core-library/src/main/java/org/apache/james/mailboxmanager/ListResult.java
    james/server/trunk/core-library/src/main/java/org/apache/james/mailboxmanager/impl/ListResultImpl.java
    james/server/trunk/experimental-seda-imap-function/src/test/resources/org/apache/james/test/functional/imap/scripts/ListNamespace.test
    james/server/trunk/imap-mailbox-processor-function/src/main/java/org/apache/james/imapserver/processor/imap4rev1/ListProcessor.java
    james/server/trunk/imap-mailbox-processor-function/src/test/java/org/apache/james/imapserver/processor/imap4rev1/ListProcessorTest.java
    james/server/trunk/imapserver-function/src/main/java/org/apache/james/imapserver/commands/ListCommand.java
    james/server/trunk/phoenix-deployment/src/test/org/apache/james/experimental/imapserver/ExperimentalAuthenticatedStateTest.java

Modified: james/server/trunk/core-library/src/main/java/org/apache/james/mailboxmanager/ListResult.java
URL: http://svn.apache.org/viewvc/james/server/trunk/core-library/src/main/java/org/apache/james/mailboxmanager/ListResult.java?rev=642521&r1=642520&r2=642521&view=diff
==============================================================================
--- james/server/trunk/core-library/src/main/java/org/apache/james/mailboxmanager/ListResult.java (original)
+++ james/server/trunk/core-library/src/main/java/org/apache/james/mailboxmanager/ListResult.java Sat Mar 29 02:23:37 2008
@@ -22,16 +22,33 @@
 /**
  * Returned by the list method of MailboxRepository and others
  */
-
 public interface ListResult {
     
+    /** Indicates that no RFC3501 Selectability flag is set */
+    public static final int SELECTABILITY_FLAG_NONE = 0;
+    /** Indicates that RFC3501 Selectability is set to \Marked */
+    public static final int SELECTABILITY_FLAG_MARKED = 1;
+    /** Indicates that RFC3501 Selectability is set to \Unmarked */
+    public static final int SELECTABILITY_FLAG_UNMARKED = 2;
+    /** Indicates that RFC3501 Selectability is set to \Noselect */
+    public static final int SELECTABILITY_FLAG_NOSELECT = 3;
+    
     public static final ListResult[] EMPTY_ARRAY = {};
     
     /**
-     * \Noinferiors, \Noselect, \Marked, \Unmarked 
-     * TODO this should be done in a different way..
+     * Is this mailbox <code>\Noinferiors</code> as per RFC3501.
+     * @return true if marked, false otherwise
+     */
+    public boolean isNoInferiors();
+
+    /**
+     * Gets the RFC3501 Selectability flag setting.
+     * @return {@link #SELECTABILITY_FLAG_NONE},
+     * {@link #SELECTABILITY_FLAG_MARKED},
+     * {@link #SELECTABILITY_FLAG_NOSELECT},
+     * or {@link #SELECTABILITY_FLAG_UNMARKED}
      */
-    String[] getAttributes();
+    public int getSelectability();
     
     String getHierarchyDelimiter();
     

Modified: james/server/trunk/core-library/src/main/java/org/apache/james/mailboxmanager/impl/ListResultImpl.java
URL: http://svn.apache.org/viewvc/james/server/trunk/core-library/src/main/java/org/apache/james/mailboxmanager/impl/ListResultImpl.java?rev=642521&r1=642520&r2=642521&view=diff
==============================================================================
--- james/server/trunk/core-library/src/main/java/org/apache/james/mailboxmanager/impl/ListResultImpl.java (original)
+++ james/server/trunk/core-library/src/main/java/org/apache/james/mailboxmanager/impl/ListResultImpl.java Sat Mar 29 02:23:37 2008
@@ -23,18 +23,48 @@
 
 public class ListResultImpl implements ListResult {
 
-    private String name;
-    private String delimiter;
-    private String[] attributes=new String[0];
+    public static ListResult createNoSelect(String name, String delimiter) {
+        return new ListResultImpl(name, delimiter, false, SELECTABILITY_FLAG_NOSELECT);
+    }
+
+    
+    private final String name;
+    private final String delimiter;
+    private final boolean noInferiors;
+    private final int selectability;
 
     public ListResultImpl(String name, String delimiter) {
-        this.name=name;
-        this.delimiter=delimiter;
+        this(name, delimiter, false, SELECTABILITY_FLAG_NONE);
+    }
+   
+    public ListResultImpl(final String name, final String delimiter, final boolean noInferiors, 
+            final int selectability) {
+        super();
+        this.name = name;
+        this.delimiter = delimiter;
+        this.noInferiors = noInferiors;
+        this.selectability = selectability;
     }
 
-    public String[] getAttributes() {
-        return attributes;
+    /**
+     * Is this mailbox <code>\Noinferiors</code> as per RFC3501.
+     * @return true if marked, false otherwise
+     */
+    public final boolean isNoInferiors() {
+        return noInferiors;
     }
+
+    /**
+     * Gets the RFC3501 Selectability flag setting.
+     * @return {@link ListResult#SELECTABILITY_FLAG_NONE},
+     * {@link ListResult#SELECTABILITY_FLAG_MARKED},
+     * {@link ListResult#SELECTABILITY_FLAG_NOSELECT},
+     * or {@link ListResult#SELECTABILITY_FLAG_UNMARKED}
+     */
+    public final int getSelectability() {
+        return selectability;
+    }
+
 
     public String getHierarchyDelimiter() {
         return delimiter;

Modified: james/server/trunk/experimental-seda-imap-function/src/test/resources/org/apache/james/test/functional/imap/scripts/ListNamespace.test
URL: http://svn.apache.org/viewvc/james/server/trunk/experimental-seda-imap-function/src/test/resources/org/apache/james/test/functional/imap/scripts/ListNamespace.test?rev=642521&r1=642520&r2=642521&view=diff
==============================================================================
--- james/server/trunk/experimental-seda-imap-function/src/test/resources/org/apache/james/test/functional/imap/scripts/ListNamespace.test (original)
+++ james/server/trunk/experimental-seda-imap-function/src/test/resources/org/apache/james/test/functional/imap/scripts/ListNamespace.test Sat Mar 29 02:23:37 2008
@@ -20,21 +20,21 @@
 # Rooted in private namespace
 C: e1 LIST "" ""
 S: \* LIST \(\\Noselect\) \"\.\" \"\"
-S: e1 OK LIST completed
+S: e1 OK LIST completed.
 C: e1 LIST "anything" ""
 S: \* LIST \(\\Noselect\) \"\.\" \"\"
-S: e1 OK LIST completed
+S: e1 OK LIST completed.
 C: e1 LIST test ""
 S: \* LIST \(\\Noselect\) \"\.\" \"\"
-S: e1 OK LIST completed
+S: e1 OK LIST completed.
 
 # Rooted in users namespace
 C: e2 LIST "#mail" ""
-S: \* LIST \(\\Noselect\) \"\.\" \#mail
-S: e2 OK LIST completed
+S: \* LIST \(\\Noselect\) \"\.\" \"\#mail\"
+S: e2 OK LIST completed.
 C: e3 LIST "#mail.someone" ""
-S: \* LIST \(\\Noselect\) \"\.\" \#mail
-S: e3 OK LIST completed
+S: \* LIST \(\\Noselect\) \"\.\" \"\#mail\"
+S: e3 OK LIST completed.
 
 # Rooted in shared namespace
 # TODO: shared namespace doesn't currently exist.
@@ -45,11 +45,4 @@
 #S: * LIST (\Noselect) "." #share
 #S: e3 OK LIST completed
 
-# Rooted in unknown namespace
-C: e2 LIST "#unknown" ""
-S: \* LIST \(\\Noselect\) \"\.\" \"\"
-S: e2 OK LIST completed
-C: e3 LIST "#unknown.something" ""
-S: \* LIST \(\\Noselect\) \"\.\" \"\"
-S: e3 OK LIST completed
 

Modified: james/server/trunk/imap-mailbox-processor-function/src/main/java/org/apache/james/imapserver/processor/imap4rev1/ListProcessor.java
URL: http://svn.apache.org/viewvc/james/server/trunk/imap-mailbox-processor-function/src/main/java/org/apache/james/imapserver/processor/imap4rev1/ListProcessor.java?rev=642521&r1=642520&r2=642521&view=diff
==============================================================================
--- james/server/trunk/imap-mailbox-processor-function/src/main/java/org/apache/james/imapserver/processor/imap4rev1/ListProcessor.java (original)
+++ james/server/trunk/imap-mailbox-processor-function/src/main/java/org/apache/james/imapserver/processor/imap4rev1/ListProcessor.java Sat Mar 29 02:23:37 2008
@@ -115,8 +115,7 @@
 
             // Get the mailbox for the reference name.
             listResults = new ListResult[1];
-            listResults[0] = new ListResultImpl(referenceRoot,
-                    ImapConstants.HIERARCHY_DELIMITER);
+            listResults[0] = ListResultImpl.createNoSelect(referenceRoot, ImapConstants.HIERARCHY_DELIMITER);
         } else {
 
             // If the mailboxPattern is fully qualified, ignore the
@@ -151,61 +150,21 @@
         final String delimiter = listResult.getHierarchyDelimiter();
         final String mailboxName = mailboxName(removeUserPrefix, prefixLength, listResult);
 
-        final String[] attrs = listResult.getAttributes();
-        boolean noInferior = false;
+        final boolean noInferior = listResult.isNoInferiors();
         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;
-                        }
-                    }
-                }
-            }
+        switch (listResult.getSelectability()) {
+            case ListResult.SELECTABILITY_FLAG_MARKED:
+                marked = true;
+                break;
+            case ListResult.SELECTABILITY_FLAG_UNMARKED:
+                unmarked = true;
+                break;                
+            case ListResult.SELECTABILITY_FLAG_NOSELECT:
+                noSelect = true;
+                break;
         }
-        
         responder.respond(createResponse(noInferior, noSelect, marked, unmarked, 
                 delimiter, mailboxName));
     }

Modified: james/server/trunk/imap-mailbox-processor-function/src/test/java/org/apache/james/imapserver/processor/imap4rev1/ListProcessorTest.java
URL: http://svn.apache.org/viewvc/james/server/trunk/imap-mailbox-processor-function/src/test/java/org/apache/james/imapserver/processor/imap4rev1/ListProcessorTest.java?rev=642521&r1=642520&r2=642521&view=diff
==============================================================================
--- james/server/trunk/imap-mailbox-processor-function/src/test/java/org/apache/james/imapserver/processor/imap4rev1/ListProcessorTest.java (original)
+++ james/server/trunk/imap-mailbox-processor-function/src/test/java/org/apache/james/imapserver/processor/imap4rev1/ListProcessorTest.java Sat Mar 29 02:23:37 2008
@@ -20,7 +20,6 @@
 package org.apache.james.imapserver.processor.imap4rev1;
 
 import org.apache.james.api.imap.ImapCommand;
-import org.apache.james.api.imap.ImapConstants;
 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;
@@ -66,15 +65,15 @@
         return new ListResponse(noinferior, noselect, marked, unmarked, hierarchyDelimiter, mailboxName);
     }
 
-    void setUpResult(String[] attributes, String hierarchyDelimiter, String name) {
-        result.expects(once()).method("getAttributes").will(returnValue(attributes));
+    void setUpResult(final boolean isNoinferiors, final int selectability, String hierarchyDelimiter, String name) {
+        result.expects(once()).method("isNoInferiors").will(returnValue(isNoinferiors));
+        result.expects(once()).method("getSelectability").will(returnValue(selectability));
         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");
+        setUpResult(true, ListResult.SELECTABILITY_FLAG_NONE, ".", "#INBOX");
         responder.expects(once()).method("respond").with(
                 eq(createResponse(true, false, false, false, ".", "#INBOX")));
         processor.processResult((ImapProcessor.Responder) responder.proxy(), 
@@ -82,8 +81,7 @@
     }
     
     public void testNoSelect() throws Exception {
-        String[] attributes = {"\\noise", ImapConstants.NAME_ATTRIBUTE_NOSELECT, "\\bogus"};
-        setUpResult(attributes, ".", "#INBOX");
+        setUpResult(false, ListResult.SELECTABILITY_FLAG_NOSELECT, ".", "#INBOX");
         responder.expects(once()).method("respond").with(
                 eq(createResponse(false, true, false, false, ".", "#INBOX")));
         processor.processResult((ImapProcessor.Responder) responder.proxy(), 
@@ -91,8 +89,7 @@
     }
     
     public void testUnMarked() throws Exception {
-        String[] attributes = {"\\noise", ImapConstants.NAME_ATTRIBUTE_UNMARKED, "\\bogus"};
-        setUpResult(attributes, ".", "#INBOX");
+        setUpResult(false, ListResult.SELECTABILITY_FLAG_UNMARKED, ".", "#INBOX");
         responder.expects(once()).method("respond").with(
                 eq(createResponse(false, false, false, true, ".", "#INBOX")));
         processor.processResult((ImapProcessor.Responder) responder.proxy(), 
@@ -100,65 +97,10 @@
     }
     
     public void testMarked() throws Exception {
-        String[] attributes = {"\\noise", ImapConstants.NAME_ATTRIBUTE_MARKED, "\\bogus"};
-        setUpResult(attributes, ".", "#INBOX");
+        setUpResult(false, ListResult.SELECTABILITY_FLAG_MARKED, ".", "#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());
-    }
+    }    
 }

Modified: james/server/trunk/imapserver-function/src/main/java/org/apache/james/imapserver/commands/ListCommand.java
URL: http://svn.apache.org/viewvc/james/server/trunk/imapserver-function/src/main/java/org/apache/james/imapserver/commands/ListCommand.java?rev=642521&r1=642520&r2=642521&view=diff
==============================================================================
--- james/server/trunk/imapserver-function/src/main/java/org/apache/james/imapserver/commands/ListCommand.java (original)
+++ james/server/trunk/imapserver-function/src/main/java/org/apache/james/imapserver/commands/ListCommand.java Sat Mar 29 02:23:37 2008
@@ -111,12 +111,21 @@
 
        for (int i = 0; i < listResults.length; i++) {
             StringBuffer message = new StringBuffer( "(" );
-            String[] attrs=listResults[i].getAttributes();
-            for (int j = 0; j < attrs.length; j++) {
-                if (j > 0) {
-                    message.append(' ');
-                }
-                message.append( attrs[j] );
+            boolean spaceNeeded = false;
+            if (listResults[i].isNoInferiors()) {
+                spaceNeeded = true;
+                message.append("\\Noinferiors");
+            }
+            switch (listResults[i].getSelectability()) {
+                case ListResult.SELECTABILITY_FLAG_MARKED:
+                    add(message, spaceNeeded, "\\Marked");
+                    break;
+                case ListResult.SELECTABILITY_FLAG_UNMARKED:
+                    add(message, spaceNeeded, "\\Unmarked");
+                    break;
+                case ListResult.SELECTABILITY_FLAG_NOSELECT:
+                    add(message, spaceNeeded, "\\Noselect");
+                    break;
             }
             message.append( ") \"" );
             message.append( listResults[i].getHierarchyDelimiter() );
@@ -145,6 +154,13 @@
 
         session.unsolicitedResponses( response, false );
         response.commandComplete( this );
+    }
+
+    private void add(StringBuffer message, boolean spaceNeeded, String flag) {
+        if (spaceNeeded) {
+            message.append(' ');
+        }
+        message.append(flag);
     }
 
     protected ListResult[] doList( ImapSession session, String base, String pattern ) throws MailboxException {

Modified: james/server/trunk/phoenix-deployment/src/test/org/apache/james/experimental/imapserver/ExperimentalAuthenticatedStateTest.java
URL: http://svn.apache.org/viewvc/james/server/trunk/phoenix-deployment/src/test/org/apache/james/experimental/imapserver/ExperimentalAuthenticatedStateTest.java?rev=642521&r1=642520&r2=642521&view=diff
==============================================================================
--- james/server/trunk/phoenix-deployment/src/test/org/apache/james/experimental/imapserver/ExperimentalAuthenticatedStateTest.java (original)
+++ james/server/trunk/phoenix-deployment/src/test/org/apache/james/experimental/imapserver/ExperimentalAuthenticatedStateTest.java Sat Mar 29 02:23:37 2008
@@ -25,16 +25,4 @@
     public ExperimentalAuthenticatedStateTest() throws Exception {
         super(HostSystemFactory.createStandardImap());
     }
-    
-    public void testListNamespaceUS() throws Exception {
-        // TODO: root mailbox should be marked as Noselect
-    }
-
-    public void testListNamespaceITALY() throws Exception {
-        // TODO: root mailbox should be marked as Noselect
-    }
-    
-    public void testListNamespaceKOREA() throws Exception {
-        // TODO: root mailbox should be marked as Noselect
-    }
 }



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