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]

Reply via email to