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