You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by rd...@apache.org on 2009/03/31 23:32:08 UTC

svn commit: r760659 - in /james/imap/trunk: api/src/main/java/org/apache/james/imap/api/ decode/src/main/java/org/apache/james/imap/decode/parser/ message/src/main/java/org/apache/james/imap/encode/ message/src/main/java/org/apache/james/imap/message/r...

Author: rdonkin
Date: Tue Mar 31 21:32:07 2009
New Revision: 760659

URL: http://svn.apache.org/viewvc?rev=760659&view=rev
Log:
Codec and processor for IMAP Namespaces IMAP-76  https://issues.apache.org/jira/browse/IMAP-76

Added:
    james/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/parser/NamespaceCommandParser.java   (with props)
    james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/NamespaceResponseEncoder.java   (with props)
    james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/NamespaceRequest.java   (with props)
    james/imap/trunk/message/src/main/java/org/apache/james/imap/message/response/NamespaceResponse.java   (with props)
    james/imap/trunk/message/src/test/java/org/apache/james/imap/encode/NamespaceResponseEncoderTest.java   (with props)
    james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/NamespaceProcessor.java   (with props)
    james/imap/trunk/processor/src/test/java/org/apache/james/imap/processor/NamespaceProcessorTest.java   (with props)
Modified:
    james/imap/trunk/api/src/main/java/org/apache/james/imap/api/Imap4Rev1MessageFactory.java
    james/imap/trunk/api/src/main/java/org/apache/james/imap/api/ImapConstants.java
    james/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/parser/NoopCommandParser.java
    james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/BaseImap4Rev1MessageFactory.java

Modified: james/imap/trunk/api/src/main/java/org/apache/james/imap/api/Imap4Rev1MessageFactory.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/api/src/main/java/org/apache/james/imap/api/Imap4Rev1MessageFactory.java?rev=760659&r1=760658&r2=760659&view=diff
==============================================================================
--- james/imap/trunk/api/src/main/java/org/apache/james/imap/api/Imap4Rev1MessageFactory.java (original)
+++ james/imap/trunk/api/src/main/java/org/apache/james/imap/api/Imap4Rev1MessageFactory.java Tue Mar 31 21:32:07 2009
@@ -125,4 +125,6 @@
 
     public ImapMessage createUnsubscribeMessage(final ImapCommand command,
             final String mailboxName, final String tag);
+    
+    public ImapMessage createNamespaceMessage(final ImapCommand command, final String tag);
 }

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=760659&r1=760658&r2=760659&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 Mar 31 21:32:07 2009
@@ -143,6 +143,8 @@
 
     public String RFC822_MESSAGE_ID = "Message-ID";
 
+    public static final String NAMESPACE_COMMAND_NAME = "NAMESPACE";
+
     public static final char BACK_SLASH = '\\';
 
     public static final String STATUS_UNSEEN = "UNSEEN";

Added: james/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/parser/NamespaceCommandParser.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/parser/NamespaceCommandParser.java?rev=760659&view=auto
==============================================================================
--- james/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/parser/NamespaceCommandParser.java (added)
+++ james/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/parser/NamespaceCommandParser.java Tue Mar 31 21:32:07 2009
@@ -0,0 +1,43 @@
+/****************************************************************
+ * 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.commons.logging.Log;
+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.decode.ImapRequestLineReader;
+import org.apache.james.imap.decode.ProtocolException;
+import org.apache.james.imap.decode.base.AbstractImapCommandParser;
+
+public class NamespaceCommandParser extends AbstractImapCommandParser {
+
+    public NamespaceCommandParser() {
+        super(
+                ImapCommand
+                        .authenticatedStateCommand(ImapConstants.NAMESPACE_COMMAND_NAME));
+    }
+
+    @Override
+    protected ImapMessage decode(ImapCommand command,
+            ImapRequestLineReader request, String tag, Log logger)
+            throws ProtocolException {
+        return getMessageFactory().createNamespaceMessage(command, tag);
+    }
+}

Propchange: james/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/parser/NamespaceCommandParser.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: james/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/parser/NoopCommandParser.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/parser/NoopCommandParser.java?rev=760659&r1=760658&r2=760659&view=diff
==============================================================================
--- james/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/parser/NoopCommandParser.java (original)
+++ james/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/parser/NoopCommandParser.java Tue Mar 31 21:32:07 2009
@@ -35,8 +35,7 @@
     protected ImapMessage decode(ImapCommand command,
             ImapRequestLineReader request, String tag, Log logger) throws ProtocolException {
         endLine(request);
-        final ImapMessage result = getMessageFactory().createNoopMessage(
-                command, tag);
+        final ImapMessage result = getMessageFactory().createNoopMessage(command, tag);
         return result;
     }
 

Added: james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/NamespaceResponseEncoder.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/NamespaceResponseEncoder.java?rev=760659&view=auto
==============================================================================
--- james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/NamespaceResponseEncoder.java (added)
+++ james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/NamespaceResponseEncoder.java Tue Mar 31 21:32:07 2009
@@ -0,0 +1,81 @@
+/****************************************************************
+ * 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.encode;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.process.ImapSession;
+import org.apache.james.imap.encode.base.AbstractChainedImapEncoder;
+import org.apache.james.imap.message.response.NamespaceResponse;
+import org.apache.james.imap.message.response.NamespaceResponse.Namespace;
+
+/**
+ * Encodes namespace responses.
+ */
+public class NamespaceResponseEncoder extends AbstractChainedImapEncoder {
+
+    public NamespaceResponseEncoder(ImapEncoder next) {
+        super(next);
+    }
+
+    @Override
+    protected void doEncode(ImapMessage acceptableMessage,
+            ImapResponseComposer composer, ImapSession session)
+            throws IOException {
+        final NamespaceResponse response = (NamespaceResponse) acceptableMessage;
+        composer.untagged();
+
+        final List<NamespaceResponse.Namespace> personal = response
+                .getPersonal();
+        encode(personal, composer);
+        final List<NamespaceResponse.Namespace> users = response.getUsers();
+        encode(users, composer);
+        final List<NamespaceResponse.Namespace> shared = response.getShared();
+        encode(shared, composer);
+    }
+
+    private void encode(List<Namespace> namespaces,
+            ImapResponseComposer composer) throws IOException {
+        if (namespaces == null || namespaces.isEmpty()) {
+            composer.nil();
+        } else {
+            composer.openParen();
+            for (NamespaceResponse.Namespace namespace : namespaces) {
+                encode(namespace, composer);
+            }
+            composer.closeParen();
+        }
+    }
+
+    private void encode(Namespace namespace, ImapResponseComposer composer)
+            throws IOException {
+        composer.openParen();
+        composer.quote(namespace.getPrefix());
+        composer.quote(Character.toString(namespace.getDeliminator()));
+        composer.closeParen();
+    }
+
+    @Override
+    protected boolean isAcceptable(ImapMessage message) {
+        return message instanceof NamespaceResponse;
+    }
+
+}

Propchange: james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/NamespaceResponseEncoder.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/BaseImap4Rev1MessageFactory.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/BaseImap4Rev1MessageFactory.java?rev=760659&r1=760658&r2=760659&view=diff
==============================================================================
--- james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/BaseImap4Rev1MessageFactory.java (original)
+++ james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/BaseImap4Rev1MessageFactory.java Tue Mar 31 21:32:07 2009
@@ -167,4 +167,8 @@
     public StatusResponse bye(HumanReadableTextKey displayTextKey) {
         return statusResponseFactory.bye(displayTextKey);
     }
+
+	public ImapMessage createNamespaceMessage(ImapCommand command, String tag) {
+		return new NamespaceRequest(command, tag);
+	}
 }

Added: james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/NamespaceRequest.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/NamespaceRequest.java?rev=760659&view=auto
==============================================================================
--- james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/NamespaceRequest.java (added)
+++ james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/NamespaceRequest.java Tue Mar 31 21:32:07 2009
@@ -0,0 +1,31 @@
+/****************************************************************
+ * 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;
+
+/**
+ * Describes a NAMESPACE command.
+ */
+public class NamespaceRequest extends AbstractImapRequest {
+
+    public NamespaceRequest(ImapCommand command, String tag) {
+        super(tag, command);
+    }
+}

Propchange: james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/NamespaceRequest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: james/imap/trunk/message/src/main/java/org/apache/james/imap/message/response/NamespaceResponse.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/message/src/main/java/org/apache/james/imap/message/response/NamespaceResponse.java?rev=760659&view=auto
==============================================================================
--- james/imap/trunk/message/src/main/java/org/apache/james/imap/message/response/NamespaceResponse.java (added)
+++ james/imap/trunk/message/src/main/java/org/apache/james/imap/message/response/NamespaceResponse.java Tue Mar 31 21:32:07 2009
@@ -0,0 +1,102 @@
+/****************************************************************
+ * 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.response;
+
+import java.util.List;
+
+import org.apache.james.imap.api.message.response.ImapResponseMessage;
+
+/**
+ * Describes a NAMESPACE response.
+ */
+public class NamespaceResponse implements ImapResponseMessage {
+
+    private final List<Namespace> personal;
+
+    private final List<Namespace> users;
+
+    private final List<Namespace> shared;
+
+    public NamespaceResponse(final List<Namespace> personal,
+            final List<Namespace> users, final List<Namespace> shared) {
+        super();
+        this.personal = personal;
+        this.users = users;
+        this.shared = shared;
+    }
+
+    /**
+     * Gets the personal namespace.
+     * 
+     * @return possibly null
+     */
+    public List<Namespace> getPersonal() {
+        return personal;
+    }
+
+    /**
+     * Gets shared namespaces.
+     * 
+     * @return possibly null
+     */
+    public List<Namespace> getShared() {
+        return shared;
+    }
+
+    /**
+     * Gets the namespaces for other users.
+     * 
+     * @return possibly null
+     */
+    public List<Namespace> getUsers() {
+        return users;
+    }
+
+    /**
+     * Describes a namespace.
+     */
+    public static final class Namespace {
+        private final String prefix;
+
+        private final char deliminator;
+
+        public Namespace(final String prefix, final char deliminator) {
+            super();
+            this.prefix = prefix;
+            this.deliminator = deliminator;
+        }
+
+        /**
+         * Gets the deliminator used to separate mailboxes.
+         * 
+         * @return not null
+         */
+        public char getDeliminator() {
+            return deliminator;
+        }
+
+        /**
+         * Gets the leading prefix used by this namespace. 
+         * @return not null
+         */
+        public String getPrefix() {
+            return prefix;
+        }
+    }
+}

Propchange: james/imap/trunk/message/src/main/java/org/apache/james/imap/message/response/NamespaceResponse.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: james/imap/trunk/message/src/test/java/org/apache/james/imap/encode/NamespaceResponseEncoderTest.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/message/src/test/java/org/apache/james/imap/encode/NamespaceResponseEncoderTest.java?rev=760659&view=auto
==============================================================================
--- james/imap/trunk/message/src/test/java/org/apache/james/imap/encode/NamespaceResponseEncoderTest.java (added)
+++ james/imap/trunk/message/src/test/java/org/apache/james/imap/encode/NamespaceResponseEncoderTest.java Tue Mar 31 21:32:07 2009
@@ -0,0 +1,223 @@
+/****************************************************************
+ * 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.encode;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.process.ImapSession;
+import org.apache.james.imap.message.response.NamespaceResponse;
+import org.jmock.Expectations;
+import org.jmock.Sequence;
+import org.jmock.integration.junit3.MockObjectTestCase;
+
+public class NamespaceResponseEncoderTest extends MockObjectTestCase {
+
+    ImapSession dummySession;
+
+    ImapResponseComposer mockComposer;
+
+    NamespaceResponseEncoder subject;
+
+    protected void setUp() throws Exception {
+        super.setUp();
+        dummySession = mock(ImapSession.class);
+        final ImapEncoder stubNextEncoderInChain = mock(ImapEncoder.class);
+        subject = new NamespaceResponseEncoder(stubNextEncoderInChain);
+        mockComposer = mock(ImapResponseComposer.class);
+    }
+
+    protected void tearDown() throws Exception {
+        super.tearDown();
+    }
+
+    public void testOneSharedNamespaceShouldWriteNilThenPrefixThenDeliminatorThenNil()
+            throws Exception {
+        final String aPrefix = "A Prefix";
+        final String aDeliminator = "@";
+        checking(new Expectations() {
+            {
+                final Sequence sequence = sequence("Composition order");
+                oneOf(mockComposer).untagged();
+                inSequence(sequence);
+                oneOf(mockComposer).nil();
+                inSequence(sequence);
+                oneOf(mockComposer).nil();
+                inSequence(sequence);
+                oneOf(mockComposer).openParen();
+                inSequence(sequence);
+                oneOf(mockComposer).openParen();
+                inSequence(sequence);
+                oneOf(mockComposer).quote(aPrefix);
+                inSequence(sequence);
+                oneOf(mockComposer).quote(aDeliminator);
+                inSequence(sequence);
+                oneOf(mockComposer).closeParen();
+                inSequence(sequence);
+                oneOf(mockComposer).closeParen();
+                inSequence(sequence);
+            }
+        });
+        List<NamespaceResponse.Namespace> namespaces = new ArrayList<NamespaceResponse.Namespace>();
+        namespaces.add(new NamespaceResponse.Namespace(aPrefix, aDeliminator
+                .charAt(0)));
+        subject.doEncode(new NamespaceResponse(null, null, namespaces),
+                mockComposer, dummySession);
+    }
+
+    public void testOneUsersNamespaceShouldWriteNilThenPrefixThenDeliminatorThenNil()
+            throws Exception {
+        final String aPrefix = "A Prefix";
+        final String aDeliminator = "@";
+        checking(new Expectations() {
+            {
+                final Sequence sequence = sequence("Composition order");
+                oneOf(mockComposer).untagged();
+                inSequence(sequence);
+                oneOf(mockComposer).nil();
+                inSequence(sequence);
+                oneOf(mockComposer).openParen();
+                inSequence(sequence);
+                oneOf(mockComposer).openParen();
+                inSequence(sequence);
+                oneOf(mockComposer).quote(aPrefix);
+                inSequence(sequence);
+                oneOf(mockComposer).quote(aDeliminator);
+                inSequence(sequence);
+                oneOf(mockComposer).closeParen();
+                inSequence(sequence);
+                oneOf(mockComposer).closeParen();
+                inSequence(sequence);
+                oneOf(mockComposer).nil();
+                inSequence(sequence);
+            }
+        });
+        List<NamespaceResponse.Namespace> namespaces = new ArrayList<NamespaceResponse.Namespace>();
+        namespaces.add(new NamespaceResponse.Namespace(aPrefix, aDeliminator
+                .charAt(0)));
+        subject.doEncode(new NamespaceResponse(null, namespaces, null),
+                mockComposer, dummySession);
+    }
+
+    public void testOnePersonalNamespaceShouldWritePrefixThenDeliminatorThenNilNil()
+            throws Exception {
+        final String aPrefix = "A Prefix";
+        final String aDeliminator = "@";
+        checking(new Expectations() {
+            {
+                final Sequence sequence = sequence("Composition order");
+                oneOf(mockComposer).untagged();
+                inSequence(sequence);
+                oneOf(mockComposer).openParen();
+                inSequence(sequence);
+                oneOf(mockComposer).openParen();
+                inSequence(sequence);
+                oneOf(mockComposer).quote(aPrefix);
+                inSequence(sequence);
+                oneOf(mockComposer).quote(aDeliminator);
+                inSequence(sequence);
+                oneOf(mockComposer).closeParen();
+                inSequence(sequence);
+                oneOf(mockComposer).closeParen();
+                inSequence(sequence);
+                oneOf(mockComposer).nil();
+                inSequence(sequence);
+                oneOf(mockComposer).nil();
+                inSequence(sequence);
+            }
+        });
+        List<NamespaceResponse.Namespace> namespaces = new ArrayList<NamespaceResponse.Namespace>();
+        namespaces.add(new NamespaceResponse.Namespace(aPrefix, aDeliminator
+                .charAt(0)));
+        subject.doEncode(new NamespaceResponse(namespaces, null, null),
+                mockComposer, dummySession);
+    }
+
+    public void testTwoPersonalNamespaceShouldWritePrefixThenDeliminatorThenNilNil()
+            throws Exception {
+        final String aPrefix = "A Prefix";
+        final String aDeliminator = "@";
+        final String anotherPrefix = "Another Prefix";
+        final String anotherDeliminator = "^";
+        checking(new Expectations() {
+            {
+                final Sequence sequence = sequence("Composition order");
+                oneOf(mockComposer).untagged();
+                inSequence(sequence);
+                oneOf(mockComposer).openParen();
+                inSequence(sequence);
+                oneOf(mockComposer).openParen();
+                inSequence(sequence);
+                oneOf(mockComposer).quote(aPrefix);
+                inSequence(sequence);
+                oneOf(mockComposer).quote(aDeliminator);
+                inSequence(sequence);
+                oneOf(mockComposer).closeParen();
+                inSequence(sequence);
+                oneOf(mockComposer).openParen();
+                inSequence(sequence);
+                oneOf(mockComposer).quote(anotherPrefix);
+                inSequence(sequence);
+                oneOf(mockComposer).quote(anotherDeliminator);
+                inSequence(sequence);
+                oneOf(mockComposer).closeParen();
+                inSequence(sequence);
+                oneOf(mockComposer).closeParen();
+                inSequence(sequence);
+                oneOf(mockComposer).nil();
+                inSequence(sequence);
+                oneOf(mockComposer).nil();
+                inSequence(sequence);
+            }
+        });
+        List<NamespaceResponse.Namespace> namespaces = new ArrayList<NamespaceResponse.Namespace>();
+        namespaces.add(new NamespaceResponse.Namespace(aPrefix, aDeliminator
+                .charAt(0)));
+        namespaces.add(new NamespaceResponse.Namespace(anotherPrefix,
+                anotherDeliminator.charAt(0)));
+        subject.doEncode(new NamespaceResponse(namespaces, null, null),
+                mockComposer, dummySession);
+    }
+
+    public void testAllNullShouldWriteAllNIL() throws Exception {
+        checking(new Expectations() {
+            {
+                final Sequence sequence = sequence("Composition order");
+                oneOf(mockComposer).untagged();
+                inSequence(sequence);
+                oneOf(mockComposer).nil();
+                inSequence(sequence);
+                oneOf(mockComposer).nil();
+                inSequence(sequence);
+                oneOf(mockComposer).nil();
+                inSequence(sequence);
+            }
+        });
+        subject.doEncode(new NamespaceResponse(null, null, null), mockComposer,
+                dummySession);
+    }
+
+    public void testNamespaceResponseIsAcceptable() throws Exception {
+        assertFalse(subject.isAcceptable(mock(ImapMessage.class)));
+        assertTrue(subject
+                .isAcceptable(new NamespaceResponse(null, null, null)));
+    }
+
+}

Propchange: james/imap/trunk/message/src/test/java/org/apache/james/imap/encode/NamespaceResponseEncoderTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/NamespaceProcessor.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/NamespaceProcessor.java?rev=760659&view=auto
==============================================================================
--- james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/NamespaceProcessor.java (added)
+++ james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/NamespaceProcessor.java Tue Mar 31 21:32:07 2009
@@ -0,0 +1,64 @@
+/****************************************************************
+ * 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.ArrayList;
+import java.util.List;
+
+import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.message.request.ImapRequest;
+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.message.request.NamespaceRequest;
+import org.apache.james.imap.message.response.NamespaceResponse;
+import org.apache.james.imap.mailbox.MailboxManager;
+import org.apache.james.imap.mailbox.MailboxManagerProvider;
+
+/**
+ * Processes a NAMESPACE command into a suitable set of responses.
+ */
+public class NamespaceProcessor extends AbstractMailboxProcessor {
+
+    private final NamespaceResponse response;
+    
+    public NamespaceProcessor(ImapProcessor next,
+            MailboxManagerProvider mailboxManagerProvider,
+            StatusResponseFactory factory) {
+        super(next, mailboxManagerProvider, factory);
+        final List<NamespaceResponse.Namespace> personalSpaces = new ArrayList<NamespaceResponse.Namespace>();
+        personalSpaces.add(new NamespaceResponse.Namespace("", MailboxManager.HIERARCHY_DELIMITER));
+        response = new NamespaceResponse(personalSpaces, null, null);
+    }
+
+    @Override
+    protected void doProcess(ImapRequest message, ImapSession session,
+            String tag, ImapCommand command, Responder responder) {
+        responder.respond(response);
+        unsolicitedResponses(session, responder, false);
+        okComplete(command, tag, responder);
+    }
+
+    @Override
+    protected boolean isAcceptable(ImapMessage message) {
+        return message instanceof NamespaceRequest;
+    }
+
+}

Propchange: james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/NamespaceProcessor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: james/imap/trunk/processor/src/test/java/org/apache/james/imap/processor/NamespaceProcessorTest.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/processor/src/test/java/org/apache/james/imap/processor/NamespaceProcessorTest.java?rev=760659&view=auto
==============================================================================
--- james/imap/trunk/processor/src/test/java/org/apache/james/imap/processor/NamespaceProcessorTest.java (added)
+++ james/imap/trunk/processor/src/test/java/org/apache/james/imap/processor/NamespaceProcessorTest.java Tue Mar 31 21:32:07 2009
@@ -0,0 +1,48 @@
+/****************************************************************
+ * 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 org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.message.response.StatusResponseFactory;
+import org.apache.james.imap.api.process.ImapProcessor;
+import org.apache.james.imap.mailbox.MailboxManagerProvider;
+import org.apache.james.imap.message.request.NamespaceRequest;
+import org.jmock.integration.junit3.MockObjectTestCase;
+
+public class NamespaceProcessorTest extends MockObjectTestCase {
+
+    NamespaceProcessor subject;
+    StatusResponseFactory mockStatusResponse;
+    
+    protected void setUp() throws Exception {
+        super.setUp();
+        mockStatusResponse = mock(StatusResponseFactory.class);
+        subject = new NamespaceProcessor(mock(ImapProcessor.class), mock(MailboxManagerProvider.class), mockStatusResponse);
+    }
+
+    protected void tearDown() throws Exception {
+        super.tearDown();
+    }
+    
+    public void testShouldAcceptNamespaceRequests() throws Exception {
+        assertFalse(subject.isAcceptable(mock(ImapMessage.class)));
+        assertTrue(subject.isAcceptable(new NamespaceRequest(ImapCommand.anyStateCommand("Name"), "TAG")));
+    }
+}

Propchange: james/imap/trunk/processor/src/test/java/org/apache/james/imap/processor/NamespaceProcessorTest.java
------------------------------------------------------------------------------
    svn:eol-style = native



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