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]