Author: norman
Date: Tue Feb 1 06:10:11 2011
New Revision: 1065914
URL: http://svn.apache.org/viewvc?rev=1065914&view=rev
Log:
Add support for XLIST command. See IMAP-250. Thanks fore the patch
Added:
james/imap/trunk/api/src/main/java/org/apache/james/imap/api/process/MailboxType.java
james/imap/trunk/api/src/main/java/org/apache/james/imap/api/process/MailboxTyper.java
james/imap/trunk/message/src/main/java/org/apache/james/imap/decode/parser/XListCommandParser.java
james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/XListResponseEncoder.java
james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/XListRequest.java
james/imap/trunk/message/src/main/java/org/apache/james/imap/message/response/XListResponse.java
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/XListProcessor.java
Modified:
james/imap/trunk/api/src/main/java/org/apache/james/imap/api/ImapConstants.java
james/imap/trunk/message/src/main/java/org/apache/james/imap/decode/parser/ImapParserFactory.java
james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/ListingEncodingUtils.java
james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/main/DefaultImapEncoderFactory.java
james/imap/trunk/message/src/main/java/org/apache/james/imap/message/response/AbstractListingResponse.java
james/imap/trunk/message/src/main/java/org/apache/james/imap/message/response/LSubResponse.java
james/imap/trunk/message/src/main/java/org/apache/james/imap/message/response/ListResponse.java
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/DefaultProcessorChain.java
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/ListProcessor.java
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/base/AbstractChainedProcessor.java
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/main/DefaultImapProcessorFactory.java
james/imap/trunk/processor/src/test/java/org/apache/james/imap/processor/ListProcessorTest.java
Modified:
james/imap/trunk/api/src/main/java/org/apache/james/imap/api/ImapConstants.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/api/src/main/java/org/apache/james/imap/api/ImapConstants.java?rev=1065914&r1=1065913&r2=1065914&view=diff
==============================================================================
---
james/imap/trunk/api/src/main/java/org/apache/james/imap/api/ImapConstants.java
(original)
+++
james/imap/trunk/api/src/main/java/org/apache/james/imap/api/ImapConstants.java
Tue Feb 1 06:10:11 2011
@@ -95,6 +95,11 @@ public interface ImapConstants {
public static final String SUPPORTS_IDLE = "IDLE";
+ public static final String SUPPORTS_XLIST = "XLIST";
+
+ public static final char NAMESPACE_PREFIX_CHAR = '#';
+
+ public static final String NAMESPACE_PREFIX =
String.valueOf(NAMESPACE_PREFIX_CHAR);
public static final String INBOX_NAME = "INBOX";
@@ -177,6 +182,8 @@ public interface ImapConstants {
public static final String LOGIN_COMMAND_NAME = "LOGIN";
public static final String LIST_COMMAND_NAME = "LIST";
+
+ public static final String XLIST_COMMAND_NAME = "XLIST";
public static final String FETCH_COMMAND_NAME = "FETCH";
@@ -201,6 +208,8 @@ public interface ImapConstants {
public static final String APPEND_COMMAND_NAME = "APPEND";
public static final String LIST_RESPONSE_NAME = "LIST";
+
+ public static final String XLIST_RESPONSE_NAME = "XLIST";
public static final String LSUB_RESPONSE_NAME = "LSUB";
Added:
james/imap/trunk/api/src/main/java/org/apache/james/imap/api/process/MailboxType.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/api/src/main/java/org/apache/james/imap/api/process/MailboxType.java?rev=1065914&view=auto
==============================================================================
---
james/imap/trunk/api/src/main/java/org/apache/james/imap/api/process/MailboxType.java
(added)
+++
james/imap/trunk/api/src/main/java/org/apache/james/imap/api/process/MailboxType.java
Tue Feb 1 06:10:11 2011
@@ -0,0 +1,45 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one *
+ * or more contributor license agreements. See the NOTICE file *
+ * distributed with this work for additional information *
+ * regarding copyright ownership. The ASF licenses this file *
+ * to you under the Apache License, Version 2.0 (the *
+ * "License"); you may not use this file except in compliance *
+ * with the License. You may obtain a copy of the License at *
+ * *
+ * http://www.apache.org/licenses/LICENSE-2.0 *
+ * *
+ * Unless required by applicable law or agreed to in writing, *
+ * software distributed under the License is distributed on an *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
+ * KIND, either express or implied. See the License for the *
+ * specific language governing permissions and limitations *
+ * under the License. *
+ ****************************************************************/
+package org.apache.james.imap.api.process;
+
+/**
+ * Represents well-known mailbox types along with their string representations
+ * used by XLIST command
+ *
+ */
+public enum MailboxType {
+
+ INBOX("\\Inbox"),
+ DRAFTS("\\Drafts"),
+ TRASH("\\Trash"),
+ SPAM("\\Spam"),
+ SENT("\\Sent"),
+ STARRED("\\Starred"),
+ ALLMAIL("\\AllMail"),
+ OTHER(null);
+ private String attributeName;
+
+ MailboxType(String attributeName) {
+ this.attributeName = attributeName;
+ }
+
+ public String getAttributeName() {
+ return attributeName;
+ }
+}
Added:
james/imap/trunk/api/src/main/java/org/apache/james/imap/api/process/MailboxTyper.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/api/src/main/java/org/apache/james/imap/api/process/MailboxTyper.java?rev=1065914&view=auto
==============================================================================
---
james/imap/trunk/api/src/main/java/org/apache/james/imap/api/process/MailboxTyper.java
(added)
+++
james/imap/trunk/api/src/main/java/org/apache/james/imap/api/process/MailboxTyper.java
Tue Feb 1 06:10:11 2011
@@ -0,0 +1,37 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one *
+ * or more contributor license agreements. See the NOTICE file *
+ * distributed with this work for additional information *
+ * regarding copyright ownership. The ASF licenses this file *
+ * to you under the Apache License, Version 2.0 (the *
+ * "License"); you may not use this file except in compliance *
+ * with the License. You may obtain a copy of the License at *
+ * *
+ * http://www.apache.org/licenses/LICENSE-2.0 *
+ * *
+ * Unless required by applicable law or agreed to in writing, *
+ * software distributed under the License is distributed on an *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
+ * KIND, either express or implied. See the License for the *
+ * specific language governing permissions and limitations *
+ * under the License. *
+ ****************************************************************/
+package org.apache.james.imap.api.process;
+
+import org.apache.james.mailbox.MailboxPath;
+
+/**
+ *
+ */
+public interface MailboxTyper {
+
+ /**
+ * Returns MailboxType based on mailbox path
+ *
+ * @param session current ImapSession
+ * @param path path of mailbox, which type is being queried
+ * @return MailboxType value for passed mailbox, if there's no special
+ * function for particular mailbox, return OTHER.
+ */
+ MailboxType getMailboxType(ImapSession session, MailboxPath path);
+}
Modified:
james/imap/trunk/message/src/main/java/org/apache/james/imap/decode/parser/ImapParserFactory.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/message/src/main/java/org/apache/james/imap/decode/parser/ImapParserFactory.java?rev=1065914&r1=1065913&r2=1065914&view=diff
==============================================================================
---
james/imap/trunk/message/src/main/java/org/apache/james/imap/decode/parser/ImapParserFactory.java
(original)
+++
james/imap/trunk/message/src/main/java/org/apache/james/imap/decode/parser/ImapParserFactory.java
Tue Feb 1 06:10:11 2011
@@ -80,6 +80,8 @@ public class ImapParserFactory implement
UnsubscribeCommandParser.class);
_imapCommands.put(ImapConstants.LIST_COMMAND_NAME,
ListCommandParser.class);
+ _imapCommands.put(ImapConstants.XLIST_COMMAND_NAME,
+ XListCommandParser.class);
_imapCommands.put(ImapConstants.LSUB_COMMAND_NAME,
LsubCommandParser.class);
_imapCommands.put(ImapConstants.STATUS_COMMAND_NAME,
Added:
james/imap/trunk/message/src/main/java/org/apache/james/imap/decode/parser/XListCommandParser.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/message/src/main/java/org/apache/james/imap/decode/parser/XListCommandParser.java?rev=1065914&view=auto
==============================================================================
---
james/imap/trunk/message/src/main/java/org/apache/james/imap/decode/parser/XListCommandParser.java
(added)
+++
james/imap/trunk/message/src/main/java/org/apache/james/imap/decode/parser/XListCommandParser.java
Tue Feb 1 06:10:11 2011
@@ -0,0 +1,44 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one *
+ * or more contributor license agreements. See the NOTICE file *
+ * distributed with this work for additional information *
+ * regarding copyright ownership. The ASF licenses this file *
+ * to you under the Apache License, Version 2.0 (the *
+ * "License"); you may not use this file except in compliance *
+ * with the License. You may obtain a copy of the License at *
+ * *
+ * http://www.apache.org/licenses/LICENSE-2.0 *
+ * *
+ * Unless required by applicable law or agreed to in writing, *
+ * software distributed under the License is distributed on an *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
+ * KIND, either express or implied. See the License for the *
+ * specific language governing permissions and limitations *
+ * under the License. *
+ ****************************************************************/
+package org.apache.james.imap.decode.parser;
+
+import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.ImapConstants;
+import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.message.request.XListRequest;
+
+/**
+ * Parse XLIST commands
+ *
+ */
+public class XListCommandParser extends ListCommandParser {
+
+ public XListCommandParser() {
+
super(ImapCommand.authenticatedStateCommand(ImapConstants.XLIST_COMMAND_NAME));
+ }
+
+ @Override
+ protected ImapMessage createMessage(ImapCommand command,
+ final String referenceName, final String mailboxPattern,
+ final String tag) {
+ final ImapMessage result = new XListRequest(command,
+ referenceName, mailboxPattern, tag);
+ return result;
+ }
+}
Modified:
james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/ListingEncodingUtils.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/ListingEncodingUtils.java?rev=1065914&r1=1065913&r2=1065914&view=diff
==============================================================================
---
james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/ListingEncodingUtils.java
(original)
+++
james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/ListingEncodingUtils.java
Tue Feb 1 06:10:11 2011
@@ -24,6 +24,7 @@ import java.util.ArrayList;
import java.util.List;
import org.apache.james.imap.api.ImapConstants;
+import org.apache.james.imap.api.process.MailboxType;
import org.apache.james.imap.message.response.AbstractListingResponse;
/**
@@ -63,6 +64,9 @@ public class ListingEncodingUtils {
if (response.hasNoChildren()) {
attributes.add(ImapConstants.NAME_ATTRIBUTE_HAS_NO_CHILDREN);
}
+ if (!MailboxType.OTHER.equals(response.getType())) {
+ attributes.add(response.getType().getAttributeName());
+ }
} else {
attributes = null;
}
Added:
james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/XListResponseEncoder.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/XListResponseEncoder.java?rev=1065914&view=auto
==============================================================================
---
james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/XListResponseEncoder.java
(added)
+++
james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/XListResponseEncoder.java
Tue Feb 1 06:10:11 2011
@@ -0,0 +1,34 @@
+package org.apache.james.imap.encode;
+
+import java.io.IOException;
+
+import org.apache.james.imap.encode.base.AbstractChainedImapEncoder;
+import org.apache.james.imap.message.response.AbstractListingResponse;
+import org.apache.james.imap.message.response.XListResponse;
+
+import org.apache.james.imap.api.ImapConstants;
+import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.process.ImapSession;
+
+/**
+ *
+ * @author ihsahn
+ */
+public class XListResponseEncoder extends AbstractChainedImapEncoder {
+
+ public XListResponseEncoder(ImapEncoder next) {
+ super(next);
+ }
+
+ protected void doEncode(final ImapMessage acceptableMessage,
+ final ImapResponseComposer composer, ImapSession session) throws
IOException {
+ final AbstractListingResponse response = (AbstractListingResponse)
acceptableMessage;
+ ListingEncodingUtils.encodeListingResponse(
+ ImapConstants.XLIST_RESPONSE_NAME, composer, response);
+ }
+
+
+ protected boolean isAcceptable(ImapMessage message) {
+ return (message instanceof XListResponse);
+ }
+}
Modified:
james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/main/DefaultImapEncoderFactory.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/main/DefaultImapEncoderFactory.java?rev=1065914&r1=1065913&r2=1065914&view=diff
==============================================================================
---
james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/main/DefaultImapEncoderFactory.java
(original)
+++
james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/main/DefaultImapEncoderFactory.java
Tue Feb 1 06:10:11 2011
@@ -35,6 +35,7 @@ import org.apache.james.imap.encode.Rece
import org.apache.james.imap.encode.MailboxStatusResponseEncoder;
import org.apache.james.imap.encode.SearchResponseEncoder;
import org.apache.james.imap.encode.StatusResponseEncoder;
+import org.apache.james.imap.encode.XListResponseEncoder;
import org.apache.james.imap.encode.base.EndImapEncoder;
/**
@@ -70,8 +71,10 @@ public class DefaultImapEncoderFactory i
searchResponseEncoder);
final ListResponseEncoder listResponseEncoder = new
ListResponseEncoder(
lsubResponseEncoder);
- final FlagsResponseEncoder flagsResponseEncoder = new
FlagsResponseEncoder(
+ final XListResponseEncoder xListResponseEncoder = new
XListResponseEncoder(
listResponseEncoder);
+ final FlagsResponseEncoder flagsResponseEncoder = new
FlagsResponseEncoder(
+ xListResponseEncoder);
final CapabilityResponseEncoder capabilityResponseEncoder = new
CapabilityResponseEncoder(
flagsResponseEncoder);
final ContinuationResponseEncoder continuationResponseEncoder = new
ContinuationResponseEncoder(
Added:
james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/XListRequest.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/XListRequest.java?rev=1065914&view=auto
==============================================================================
---
james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/XListRequest.java
(added)
+++
james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/XListRequest.java
Tue Feb 1 06:10:11 2011
@@ -0,0 +1,33 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one *
+ * or more contributor license agreements. See the NOTICE file *
+ * distributed with this work for additional information *
+ * regarding copyright ownership. The ASF licenses this file *
+ * to you under the Apache License, Version 2.0 (the *
+ * "License"); you may not use this file except in compliance *
+ * with the License. You may obtain a copy of the License at *
+ * *
+ * http://www.apache.org/licenses/LICENSE-2.0 *
+ * *
+ * Unless required by applicable law or agreed to in writing, *
+ * software distributed under the License is distributed on an *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
+ * KIND, either express or implied. See the License for the *
+ * specific language governing permissions and limitations *
+ * under the License. *
+ ****************************************************************/
+package org.apache.james.imap.message.request;
+
+import org.apache.james.imap.api.ImapCommand;
+
+/**
+ * XLIST command request
+ */
+public class XListRequest extends ListRequest {
+
+ public XListRequest(final ImapCommand command, final String referenceName,
+ final String mailboxPattern, final String tag) {
+ super(command, referenceName, mailboxPattern, tag);
+ }
+
+}
Modified:
james/imap/trunk/message/src/main/java/org/apache/james/imap/message/response/AbstractListingResponse.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/message/src/main/java/org/apache/james/imap/message/response/AbstractListingResponse.java?rev=1065914&r1=1065913&r2=1065914&view=diff
==============================================================================
---
james/imap/trunk/message/src/main/java/org/apache/james/imap/message/response/AbstractListingResponse.java
(original)
+++
james/imap/trunk/message/src/main/java/org/apache/james/imap/message/response/AbstractListingResponse.java
Tue Feb 1 06:10:11 2011
@@ -19,6 +19,7 @@
package org.apache.james.imap.message.response;
+import org.apache.james.imap.api.process.MailboxType;
/**
* <code>LIST</code> and <code>LSUB</code> return identical data.
@@ -40,12 +41,14 @@ public abstract class AbstractListingRes
private final char hierarchyDelimiter;
private final String name;
+
+ private MailboxType type;
public AbstractListingResponse(final boolean noInferiors,
final boolean noSelect, final boolean marked,
final boolean unmarked, boolean hasChildren,
boolean hasNoChildren, final String name,
- final char hierarchyDelimiter) {
+ final char hierarchyDelimiter,final MailboxType type) {
super();
this.noInferiors = noInferiors;
this.noSelect = noSelect;
@@ -55,6 +58,7 @@ public abstract class AbstractListingRes
this.noChildren = hasNoChildren;
this.name = name;
this.hierarchyDelimiter = hierarchyDelimiter;
+ this.type=type;
}
/**
@@ -127,6 +131,15 @@ public abstract class AbstractListingRes
public boolean hasChildren() {
return children;
}
+
+ /**
+ * returns type of the mailbox
+ * @return mailbox type
+ */
+ public MailboxType getType() {
+ return type;
+ }
+
/**
* Are any name attributes set?
@@ -135,7 +148,7 @@ public abstract class AbstractListingRes
* {@link #isMarked()} or {@link #isUnmarked(){
*/
public final boolean isNameAttributed() {
- return noInferiors || noSelect || marked || unmarked || children ||
noChildren;
+ return noInferiors || noSelect || marked || unmarked || children ||
noChildren || (!MailboxType.OTHER.equals(type));
}
@Override
@@ -144,6 +157,7 @@ public abstract class AbstractListingRes
int result = 1;
result = PRIME * result + (children ? 1231 : 1237);
result = PRIME * result + hierarchyDelimiter;
+ result = PRIME * result + type.ordinal();
result = PRIME * result + (marked ? 1231 : 1237);
result = PRIME * result + ((name == null) ? 0 : name.hashCode());
result = PRIME * result + (noChildren ? 1231 : 1237);
@@ -181,6 +195,8 @@ public abstract class AbstractListingRes
return false;
if (unmarked != other.unmarked)
return false;
+ if (!type.equals(other.type))
+ return false;
return true;
}
@@ -197,6 +213,7 @@ public abstract class AbstractListingRes
+ "marked = " + this.marked + TAB + "unmarked = "
+ this.unmarked + TAB + "hierarchyDelimiter = "
+ this.hierarchyDelimiter + TAB + "name = " + this.name + TAB
+ + "type = " + this.type + TAB
+ " )";
return retValue;
Modified:
james/imap/trunk/message/src/main/java/org/apache/james/imap/message/response/LSubResponse.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/message/src/main/java/org/apache/james/imap/message/response/LSubResponse.java?rev=1065914&r1=1065913&r2=1065914&view=diff
==============================================================================
---
james/imap/trunk/message/src/main/java/org/apache/james/imap/message/response/LSubResponse.java
(original)
+++
james/imap/trunk/message/src/main/java/org/apache/james/imap/message/response/LSubResponse.java
Tue Feb 1 06:10:11 2011
@@ -19,6 +19,7 @@
package org.apache.james.imap.message.response;
import org.apache.james.imap.api.message.response.ImapResponseMessage;
+import org.apache.james.imap.api.process.MailboxType;
/**
* Values an IMAP4rev1 <code>LIST</code> response.
@@ -26,6 +27,6 @@ import org.apache.james.imap.api.message
public final class LSubResponse extends AbstractListingResponse implements
ImapResponseMessage {
public LSubResponse(final String name, final boolean noSelect, final char
delimiter) {
- super(false, noSelect, false, false, false, false, name, delimiter);
+ super(false, noSelect, false, false, false, false, name,
delimiter,MailboxType.OTHER);
}
}
Modified:
james/imap/trunk/message/src/main/java/org/apache/james/imap/message/response/ListResponse.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/message/src/main/java/org/apache/james/imap/message/response/ListResponse.java?rev=1065914&r1=1065913&r2=1065914&view=diff
==============================================================================
---
james/imap/trunk/message/src/main/java/org/apache/james/imap/message/response/ListResponse.java
(original)
+++
james/imap/trunk/message/src/main/java/org/apache/james/imap/message/response/ListResponse.java
Tue Feb 1 06:10:11 2011
@@ -19,6 +19,7 @@
package org.apache.james.imap.message.response;
import org.apache.james.imap.api.message.response.ImapResponseMessage;
+import org.apache.james.imap.api.process.MailboxType;
/**
* Values an IMAP4rev1 <code>LIST</code> response.
@@ -29,6 +30,6 @@ public final class ListResponse extends
public ListResponse(final boolean noInferiors, final boolean noSelect,
final boolean marked, final boolean unmarked,
boolean hasChildren, boolean hasNoChildren, final String name,
final char delimiter) {
- super(noInferiors, noSelect, marked, unmarked, hasChildren,
hasNoChildren, name, delimiter);
+ super(noInferiors, noSelect, marked, unmarked, hasChildren,
hasNoChildren, name, delimiter,MailboxType.OTHER);
}
}
Added:
james/imap/trunk/message/src/main/java/org/apache/james/imap/message/response/XListResponse.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/message/src/main/java/org/apache/james/imap/message/response/XListResponse.java?rev=1065914&view=auto
==============================================================================
---
james/imap/trunk/message/src/main/java/org/apache/james/imap/message/response/XListResponse.java
(added)
+++
james/imap/trunk/message/src/main/java/org/apache/james/imap/message/response/XListResponse.java
Tue Feb 1 06:10:11 2011
@@ -0,0 +1,19 @@
+package org.apache.james.imap.message.response;
+
+import org.apache.james.imap.api.message.response.ImapResponseMessage;
+import org.apache.james.imap.api.process.MailboxType;
+
+/**
+ * XLIST command response
+ *
+ * @author ihsahn
+ */
+public class XListResponse extends AbstractListingResponse implements
+ ImapResponseMessage {
+
+ public XListResponse(final boolean noInferiors, final boolean noSelect,
+ final boolean marked, final boolean unmarked,
+ boolean hasChildren, boolean hasNoChildren, final String name,
final char delimiter,final MailboxType type) {
+ super(noInferiors, noSelect, marked, unmarked, hasChildren,
hasNoChildren, name, delimiter,type);
+ }
+}
Modified:
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/DefaultProcessorChain.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/DefaultProcessorChain.java?rev=1065914&r1=1065913&r2=1065914&view=diff
==============================================================================
---
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/DefaultProcessorChain.java
(original)
+++
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/DefaultProcessorChain.java
Tue Feb 1 06:10:11 2011
@@ -22,6 +22,7 @@ package org.apache.james.imap.processor;
import org.apache.james.imap.api.message.response.StatusResponseFactory;
import org.apache.james.imap.api.process.ImapProcessor;
+import org.apache.james.imap.api.process.MailboxTyper;
import org.apache.james.imap.processor.fetch.FetchProcessor;
import org.apache.james.mailbox.MailboxManager;
import org.apache.james.mailbox.SubscriptionManager;
@@ -35,8 +36,8 @@ public class DefaultProcessorChain {
final ImapProcessor chainEndProcessor,
final MailboxManager mailboxManager,
final SubscriptionManager subscriptionManager,
- final StatusResponseFactory statusResponseFactory) {
- return createDefaultChain(chainEndProcessor, mailboxManager,
subscriptionManager, statusResponseFactory, 100);
+ final StatusResponseFactory statusResponseFactory,MailboxTyper
mailboxTyper) {
+ return createDefaultChain(chainEndProcessor, mailboxManager,
subscriptionManager, statusResponseFactory, mailboxTyper,100);
}
@@ -44,7 +45,7 @@ public class DefaultProcessorChain {
final ImapProcessor chainEndProcessor,
final MailboxManager mailboxManager,
final SubscriptionManager subscriptionManager,
- final StatusResponseFactory statusResponseFactory, int batchSize) {
+ final StatusResponseFactory statusResponseFactory, MailboxTyper
mailboxTyper,int batchSize) {
final SystemMessageProcessor systemProcessor = new
SystemMessageProcessor(chainEndProcessor, mailboxManager);
final LogoutProcessor logoutProcessor = new LogoutProcessor(
systemProcessor, mailboxManager, statusResponseFactory);
@@ -90,7 +91,9 @@ public class DefaultProcessorChain {
idleProcessor, mailboxManager, statusResponseFactory);
final LSubProcessor lsubProcessor = new LSubProcessor(statusProcessor,
mailboxManager, subscriptionManager, statusResponseFactory);
- final ListProcessor listProcessor = new ListProcessor(lsubProcessor,
+ final XListProcessor xlistProcessor = new XListProcessor(lsubProcessor,
+ mailboxManager, statusResponseFactory,mailboxTyper);
+ final ListProcessor listProcessor = new ListProcessor(xlistProcessor,
mailboxManager, statusResponseFactory);
final SearchProcessor searchProcessor = new SearchProcessor(
listProcessor, mailboxManager, statusResponseFactory);
@@ -99,6 +102,7 @@ public class DefaultProcessorChain {
final NamespaceProcessor namespaceProcessor = new NamespaceProcessor(
selectProcessor, mailboxManager, statusResponseFactory);
+ capabilityProcessor.addProcessor(xlistProcessor);
final ImapProcessor fetchProcessor = new
FetchProcessor(namespaceProcessor,
mailboxManager, statusResponseFactory, batchSize);
Modified:
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/ListProcessor.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/ListProcessor.java?rev=1065914&r1=1065913&r2=1065914&view=diff
==============================================================================
---
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/ListProcessor.java
(original)
+++
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/ListProcessor.java
Tue Feb 1 06:10:11 2011
@@ -29,6 +29,8 @@ import org.apache.james.imap.api.message
import org.apache.james.imap.api.message.response.StatusResponseFactory;
import org.apache.james.imap.api.process.ImapProcessor;
import org.apache.james.imap.api.process.ImapSession;
+import org.apache.james.imap.api.process.MailboxType;
+import org.apache.james.imap.api.process.MailboxTyper;
import org.apache.james.imap.message.request.ListRequest;
import org.apache.james.imap.message.response.ListResponse;
import org.apache.james.mailbox.MailboxConstants;
@@ -58,12 +60,12 @@ public class ListProcessor extends Abstr
final String baseReferenceName = request.getBaseReferenceName();
final String mailboxPatternString = request.getMailboxPattern();
doProcess(baseReferenceName, mailboxPatternString, session, tag,
- command, responder);
+ command, responder,null);
}
protected ImapResponseMessage createResponse(boolean noInferior,
boolean noSelect, boolean marked, boolean unmarked,
- boolean hasChildren, boolean hasNoChildren, String mailboxName,
char delimiter) {
+ boolean hasChildren, boolean hasNoChildren, String mailboxName,
char delimiter,MailboxType type) {
return new ListResponse(noInferior, noSelect, marked, unmarked,
hasChildren, hasNoChildren, mailboxName, delimiter);
}
@@ -90,7 +92,7 @@ public class ListProcessor extends Abstr
*/
protected final void doProcess(final String referenceName,
final String mailboxName, final ImapSession session,
- final String tag, ImapCommand command, final Responder responder) {
+ final String tag, ImapCommand command, final Responder
responder,final MailboxTyper mailboxTyper) {
try {
// Should the namespace section be returned or not?
final boolean isRelative;
@@ -125,7 +127,7 @@ public class ListProcessor extends Abstr
MailboxPath rootPath = new MailboxPath(referenceRoot, "", "");
results = new ArrayList<MailboxMetaData>(1);
results.add(SimpleMailboxMetaData.createNoSelect(rootPath,
mailboxSession.getPathDelimiter()));
- }
+ }
else {
// If the mailboxPattern is fully qualified, ignore the
reference name.
String finalReferencename = referenceName;
@@ -148,7 +150,7 @@ public class ListProcessor extends Abstr
}
for (final MailboxMetaData metaData: results) {
- processResult(responder, isRelative, metaData);
+ processResult(responder, isRelative,
metaData,getMailboxType(session,mailboxTyper,metaData.getPath()));
}
okComplete(command, tag, responder);
@@ -157,7 +159,7 @@ public class ListProcessor extends Abstr
}
}
- void processResult(final Responder responder, final boolean relative,
final MailboxMetaData listResult) {
+ void processResult(final Responder responder, final boolean relative,
final MailboxMetaData listResult,final MailboxType mailboxType) {
final char delimiter = listResult.getHierarchyDelimiter();
final String mailboxName = mailboxName(relative, listResult.getPath(),
delimiter);
@@ -182,7 +184,22 @@ public class ListProcessor extends Abstr
break;
}
responder.respond(createResponse(noInferior, noSelect, marked,
- unmarked, hasChildren, hasNoChildren, mailboxName, delimiter));
+ unmarked, hasChildren, hasNoChildren, mailboxName,
delimiter,mailboxType));
+ }
+
+ /**
+ * retrieve mailboxType for specified mailboxPath using provided
MailboxTyper
+ * @param session current imap session
+ * @param mailboxTyper provided MailboxTyper used to retrieve mailbox type
+ * @param path mailbox's path
+ * @return MailboxType value
+ */
+ private MailboxType getMailboxType(ImapSession session, MailboxTyper
mailboxTyper, MailboxPath path) {
+ MailboxType result = MailboxType.OTHER;
+ if (mailboxTyper != null) {
+ result = mailboxTyper.getMailboxType(session, path);
+ }
+ return result;
}
}
Added:
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/XListProcessor.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/XListProcessor.java?rev=1065914&view=auto
==============================================================================
---
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/XListProcessor.java
(added)
+++
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/XListProcessor.java
Tue Feb 1 06:10:11 2011
@@ -0,0 +1,92 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one *
+ * or more contributor license agreements. See the NOTICE file *
+ * distributed with this work for additional information *
+ * regarding copyright ownership. The ASF licenses this file *
+ * to you under the Apache License, Version 2.0 (the *
+ * "License"); you may not use this file except in compliance *
+ * with the License. You may obtain a copy of the License at *
+ * *
+ * http://www.apache.org/licenses/LICENSE-2.0 *
+ * *
+ * Unless required by applicable law or agreed to in writing, *
+ * software distributed under the License is distributed on an *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
+ * KIND, either express or implied. See the License for the *
+ * specific language governing permissions and limitations *
+ * under the License. *
+ ****************************************************************/
+package org.apache.james.imap.processor;
+
+import java.util.List;
+import static org.apache.james.imap.api.ImapConstants.SUPPORTS_XLIST;
+import java.util.Arrays;
+import java.util.Collections;
+import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.message.response.ImapResponseMessage;
+
+import org.apache.james.imap.api.message.response.StatusResponseFactory;
+import org.apache.james.imap.api.process.ImapProcessor;
+import org.apache.james.imap.api.process.ImapSession;
+import org.apache.james.imap.api.process.MailboxType;
+import org.apache.james.imap.api.process.MailboxTyper;
+import org.apache.james.imap.message.request.ListRequest;
+import org.apache.james.imap.message.request.XListRequest;
+import org.apache.james.imap.message.response.XListResponse;
+import org.apache.james.mailbox.MailboxManager;
+
+/**
+ * Processes XLIST command
+ *
+ */
+public class XListProcessor extends ListProcessor implements
CapabilityImplementingProcessor {
+
+ private MailboxTyper mailboxTyper;
+
+ //some interface
+ public XListProcessor(final ImapProcessor next,
+ final MailboxManager mailboxManager,
+ final StatusResponseFactory factory,
+ final MailboxTyper mailboxTyper) {
+ super(next, mailboxManager, factory);
+ this.mailboxTyper=mailboxTyper;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
org.apache.james.imap.processor.CapabilityImplementingProcessor#getImplementedCapabilities(org.apache.james.imap.api.process.ImapSession)
+ */
+ public List<String> getImplementedCapabilities(ImapSession session) {
+ //if there's no mailboxTyper, do not annnoyce XLIST capability
+ if (mailboxTyper==null)
+ {
+ return Collections.emptyList();
+ }
+
+ return Arrays.asList(SUPPORTS_XLIST);
+ }
+
+ @Override
+ protected boolean isAcceptable(ImapMessage message) {
+ return (message instanceof XListRequest) ;
+ }
+
+ @Override
+ protected void doProcess(ListRequest message, ImapSession session,
+ String tag, ImapCommand command, Responder responder) {
+ final XListRequest request = (XListRequest) message;
+ final String baseReferenceName = request.getBaseReferenceName();
+ final String mailboxPatternString = request.getMailboxPattern();
+ doProcess(baseReferenceName, mailboxPatternString, session, tag,
+ command, responder,mailboxTyper);
+ }
+
+ @Override
+ protected ImapResponseMessage createResponse(boolean noInferior,
+ boolean noSelect, boolean marked, boolean unmarked,
+ boolean hasChildren, boolean hasNoChildren, String mailboxName,
char delimiter,MailboxType type) {
+ return new XListResponse(noInferior, noSelect, marked, unmarked,
+ hasChildren, hasNoChildren, mailboxName, delimiter,type);
+ }
+}
Modified:
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/base/AbstractChainedProcessor.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/base/AbstractChainedProcessor.java?rev=1065914&r1=1065913&r2=1065914&view=diff
==============================================================================
---
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/base/AbstractChainedProcessor.java
(original)
+++
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/base/AbstractChainedProcessor.java
Tue Feb 1 06:10:11 2011
@@ -61,7 +61,7 @@ abstract public class AbstractChainedPro
* <code>ImapMessage</code>, not null
* @return true if the given message is processable by this processable
*/
- private boolean isAcceptable(final ImapMessage message) {
+ protected boolean isAcceptable(final ImapMessage message) {
return acceptableClass.isInstance(message);
}
Modified:
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/main/DefaultImapProcessorFactory.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/main/DefaultImapProcessorFactory.java?rev=1065914&r1=1065913&r2=1065914&view=diff
==============================================================================
---
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/main/DefaultImapProcessorFactory.java
(original)
+++
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/main/DefaultImapProcessorFactory.java
Tue Feb 1 06:10:11 2011
@@ -21,6 +21,7 @@ package org.apache.james.imap.processor.
import org.apache.james.imap.api.message.response.StatusResponseFactory;
import org.apache.james.imap.api.process.ImapProcessor;
+import org.apache.james.imap.api.process.MailboxTyper;
import org.apache.james.imap.message.response.UnpooledStatusResponseFactory;
import org.apache.james.imap.processor.DefaultProcessorChain;
import org.apache.james.imap.processor.base.ImapResponseMessageProcessor;
@@ -34,17 +35,21 @@ import org.apache.james.mailbox.Subscrip
public class DefaultImapProcessorFactory {
public static final ImapProcessor createDefaultProcessor(final
MailboxManager mailboxManager, final SubscriptionManager subscriptionManager) {
+ return createXListSupportingProcessor(mailboxManager,
subscriptionManager, null);
+ }
+
+ public static final ImapProcessor createXListSupportingProcessor(final
MailboxManager mailboxManager, final SubscriptionManager subscriptionManager,
MailboxTyper mailboxTyper) {
final StatusResponseFactory statusResponseFactory = new
UnpooledStatusResponseFactory();
final UnknownRequestProcessor unknownRequestImapProcessor = new
UnknownRequestProcessor(
statusResponseFactory);
final ImapProcessor imap4rev1Chain = DefaultProcessorChain
.createDefaultChain(unknownRequestImapProcessor,
- mailboxManager, subscriptionManager,
statusResponseFactory);
+ mailboxManager, subscriptionManager,
statusResponseFactory, mailboxTyper);
final ImapProcessor result = new ImapResponseMessageProcessor(
imap4rev1Chain);
return result;
}
-
+
private MailboxManager mailboxManager;
public final MailboxManager getMailboxManager() {
@@ -71,4 +76,15 @@ public class DefaultImapProcessorFactory
public ImapProcessor buildImapProcessor() {
return createDefaultProcessor(mailboxManager, subscriptionManager);
}
+
+ private MailboxTyper mailboxTyper;
+
+ public MailboxTyper getMailboxTyper() {
+ return mailboxTyper;
+ }
+
+ public void setMailboxTyper(MailboxTyper mailboxTyper) {
+ this.mailboxTyper = mailboxTyper;
+ }
+
}
Modified:
james/imap/trunk/processor/src/test/java/org/apache/james/imap/processor/ListProcessorTest.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/processor/src/test/java/org/apache/james/imap/processor/ListProcessorTest.java?rev=1065914&r1=1065913&r2=1065914&view=diff
==============================================================================
---
james/imap/trunk/processor/src/test/java/org/apache/james/imap/processor/ListProcessorTest.java
(original)
+++
james/imap/trunk/processor/src/test/java/org/apache/james/imap/processor/ListProcessorTest.java
Tue Feb 1 06:10:11 2011
@@ -23,6 +23,7 @@ import org.apache.james.imap.api.ImapCom
import org.apache.james.imap.api.message.response.StatusResponseFactory;
import org.apache.james.imap.api.process.ImapProcessor;
import org.apache.james.imap.api.process.ImapSession;
+import org.apache.james.imap.api.process.MailboxType;
import org.apache.james.imap.message.response.ListResponse;
import org.apache.james.mailbox.MailboxManager;
import org.apache.james.mailbox.MailboxMetaData;
@@ -98,7 +99,7 @@ public class ListProcessorTest {
mockery.checking(new Expectations() {{
oneOf(responder).respond(with(equal(createResponse(false, false,
false, false, true, false, '.', "INBOX"))));
}});
- processor.processResult(responder, false, result);
+ processor.processResult(responder, false, result,MailboxType.OTHER);
}
@Test
@@ -107,7 +108,7 @@ public class ListProcessorTest {
mockery.checking(new Expectations() {{
oneOf(responder).respond(with(equal(createResponse(false, false,
false, false, false, true, '.', "INBOX"))));
}});
- processor.processResult(responder, false, result);
+ processor.processResult(responder, false, result,MailboxType.OTHER);
}
@Test
@@ -116,7 +117,7 @@ public class ListProcessorTest {
mockery.checking(new Expectations() {{
oneOf(responder).respond(with(equal(createResponse(true, false,
false, false, false, false, '.', "INBOX"))));
}});
- processor.processResult(responder, false, result);
+ processor.processResult(responder, false, result,MailboxType.OTHER);
}
@Test
@@ -125,7 +126,7 @@ public class ListProcessorTest {
mockery.checking(new Expectations() {{
oneOf(responder).respond(with(equal(createResponse(false, true,
false, false, false, false, '.', "INBOX"))));
}});
- processor.processResult(responder, false, result);
+ processor.processResult(responder, false, result,MailboxType.OTHER);
}
@Test
@@ -134,7 +135,7 @@ public class ListProcessorTest {
mockery.checking(new Expectations() {{
oneOf(responder).respond(with(equal(createResponse(false, false,
false, true, false, false, '.', "INBOX"))));
}});
- processor.processResult(responder, false, result);
+ processor.processResult(responder, false, result,MailboxType.OTHER);
}
@Test
@@ -143,6 +144,6 @@ public class ListProcessorTest {
mockery.checking(new Expectations() {{
oneOf(responder).respond(with(equal(createResponse(false, false,
true, false, false, false, '.', "INBOX"))));
}});
- processor.processResult(responder, false, result);
+ processor.processResult(responder, false, result,MailboxType.OTHER);
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]