Author: norman Date: Wed Jun 8 19:17:01 2011 New Revision: 1133515 URL: http://svn.apache.org/viewvc?rev=1133515&view=rev Log: Add support for ENABLE extension. See IMAP-315
Added: james/imap/trunk/message/src/main/java/org/apache/james/imap/decode/parser/EnableParser.java james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/EnableResponseEncoder.java james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/EnableRequest.java james/imap/trunk/message/src/main/java/org/apache/james/imap/message/response/EnableResponse.java james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/EnableProcessor.java james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/PermitEnableCapabilityProcessor.java Modified: james/imap/trunk/api/src/main/java/org/apache/james/imap/api/ImapConstants.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=1133515&r1=1133514&r2=1133515&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 Wed Jun 8 19:17:01 2011 @@ -97,6 +97,8 @@ public interface ImapConstants { public static final String SUPPORTS_XLIST = "XLIST"; + public static final String SUPPORTS_ENABLE = "ENABLE"; + public static final String INBOX_NAME = "INBOX"; public static final String MIME_TYPE_TEXT = "TEXT"; @@ -202,6 +204,8 @@ public interface ImapConstants { public static final String AUTHENTICATE_COMMAND_NAME = "AUTHENTICATE"; public static final String APPEND_COMMAND_NAME = "APPEND"; + + public static final String ENABLE_COMMAND_NAME = "ENABLE"; public static final String LIST_RESPONSE_NAME = "LIST"; Added: james/imap/trunk/message/src/main/java/org/apache/james/imap/decode/parser/EnableParser.java URL: http://svn.apache.org/viewvc/james/imap/trunk/message/src/main/java/org/apache/james/imap/decode/parser/EnableParser.java?rev=1133515&view=auto ============================================================================== --- james/imap/trunk/message/src/main/java/org/apache/james/imap/decode/parser/EnableParser.java (added) +++ james/imap/trunk/message/src/main/java/org/apache/james/imap/decode/parser/EnableParser.java Wed Jun 8 19:17:01 2011 @@ -0,0 +1,53 @@ +/**************************************************************** + * 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 java.util.ArrayList; +import java.util.List; + +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.api.process.ImapSession; +import org.apache.james.imap.decode.DecodingException; +import org.apache.james.imap.decode.ImapRequestLineReader; +import org.apache.james.imap.decode.base.AbstractImapCommandParser; +import org.apache.james.imap.message.request.EnableRequest; + +public class EnableParser extends AbstractImapCommandParser { + + public EnableParser() { + super(ImapCommand.authenticatedStateCommand(ImapConstants.ENABLE_COMMAND_NAME)); + } + + @Override + protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, String tag, ImapSession session) throws DecodingException { + List<String> caps = new ArrayList<String>(); + String cap = request.astring(); + caps.add(cap); + while (request.nextChar() == ' ') { + request.consume(); + cap = request.astring(); + caps.add(cap); + } + request.eol(); + return new EnableRequest(tag, command, caps); + } + +} Added: james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/EnableResponseEncoder.java URL: http://svn.apache.org/viewvc/james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/EnableResponseEncoder.java?rev=1133515&view=auto ============================================================================== --- james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/EnableResponseEncoder.java (added) +++ james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/EnableResponseEncoder.java Wed Jun 8 19:17:01 2011 @@ -0,0 +1,69 @@ +/**************************************************************** + * 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.ImapConstants; +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.EnableResponse; + +/** + * Encodes <code>Enable</code> response. + */ +public class EnableResponseEncoder extends AbstractChainedImapEncoder { + + public EnableResponseEncoder(ImapEncoder next) { + super(next); + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.james.imap.encode.base.AbstractChainedImapEncoder#doEncode + * (org.apache.james.imap.api.ImapMessage, + * org.apache.james.imap.encode.ImapResponseComposer, + * org.apache.james.imap.api.process.ImapSession) + */ + protected void doEncode(ImapMessage acceptableMessage, ImapResponseComposer composer, ImapSession session) throws IOException { + final EnableResponse response = (EnableResponse) acceptableMessage; + List<String> capabilities = response.getCapabilities(); + composer.untagged(); + composer.message(ImapConstants.ENABLE_COMMAND_NAME); + for (String capability : capabilities) { + composer.message(capability); + } + composer.end(); + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.james.imap.encode.base.AbstractChainedImapEncoder#isAcceptable + * (org.apache.james.imap.api.ImapMessage) + */ + protected boolean isAcceptable(ImapMessage message) { + return (message instanceof EnableResponse); + } +} Added: james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/EnableRequest.java URL: http://svn.apache.org/viewvc/james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/EnableRequest.java?rev=1133515&view=auto ============================================================================== --- james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/EnableRequest.java (added) +++ james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/EnableRequest.java Wed Jun 8 19:17:01 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.message.request; + +import java.util.List; + +import org.apache.james.imap.api.ImapCommand; + +public class EnableRequest extends AbstractImapRequest{ + + private final List<String> capabilities; + + public EnableRequest(final String tag, final ImapCommand command, List<String> capabilities) { + super(tag, command); + this.capabilities = capabilities; + } + + public List<String> getCapabilities() { + return capabilities; + } +} Added: james/imap/trunk/message/src/main/java/org/apache/james/imap/message/response/EnableResponse.java URL: http://svn.apache.org/viewvc/james/imap/trunk/message/src/main/java/org/apache/james/imap/message/response/EnableResponse.java?rev=1133515&view=auto ============================================================================== --- james/imap/trunk/message/src/main/java/org/apache/james/imap/message/response/EnableResponse.java (added) +++ james/imap/trunk/message/src/main/java/org/apache/james/imap/message/response/EnableResponse.java Wed Jun 8 19:17:01 2011 @@ -0,0 +1,29 @@ +/**************************************************************** + * 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; + +public class EnableResponse extends CapabilityResponse{ + + public EnableResponse(List<String> capabilities) { + super(capabilities); + } + +} Added: james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/EnableProcessor.java URL: http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/EnableProcessor.java?rev=1133515&view=auto ============================================================================== --- james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/EnableProcessor.java (added) +++ james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/EnableProcessor.java Wed Jun 8 19:17:01 2011 @@ -0,0 +1,110 @@ +/**************************************************************** + * 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 static org.apache.james.imap.api.ImapConstants.SUPPORTS_ENABLE; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.apache.james.imap.api.ImapCommand; +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.EnableRequest; +import org.apache.james.imap.message.response.EnableResponse; +import org.apache.james.mailbox.MailboxManager; + +public class EnableProcessor extends AbstractMailboxProcessor<EnableRequest> implements CapabilityImplementingProcessor { + + private final List<PermitEnableCapabilityProcessor> capabilities = new ArrayList<PermitEnableCapabilityProcessor>(); + private final static String ENABLED_CAPABILITIES = "ENABLED_CAPABILITIES"; + + public EnableProcessor(final ImapProcessor next, final MailboxManager mailboxManager, final StatusResponseFactory factory, final List<PermitEnableCapabilityProcessor> capabilities) { + this(next, mailboxManager, factory); + this.capabilities.addAll(capabilities); + + } + + public EnableProcessor(final ImapProcessor next, final MailboxManager mailboxManager, final StatusResponseFactory factory) { + super(EnableRequest.class, next, mailboxManager, factory); + } + + + /* + * (non-Javadoc) + * @see org.apache.james.imap.processor.AbstractMailboxProcessor#doProcess(org.apache.james.imap.api.message.request.ImapRequest, org.apache.james.imap.api.process.ImapSession, java.lang.String, org.apache.james.imap.api.ImapCommand, org.apache.james.imap.api.process.ImapProcessor.Responder) + */ + protected void doProcess(EnableRequest request, ImapSession session, String tag, ImapCommand command, Responder responder) { + List<String> caps = request.getCapabilities(); + Set<String> enabledCaps = new HashSet<String>(); + for (int i = 0; i < caps.size(); i++) { + String cap = caps.get(i); + for (int a = 0; a < capabilities.size(); a++) { + if (capabilities.get(a).getPermitEnableCapabilities(session).contains(cap)) { + enabledCaps.add(cap); + } + } + } + getEnabledCapabilities(session).addAll(enabledCaps); + + responder.respond(new EnableResponse(new ArrayList<String>(enabledCaps))); + + unsolicitedResponses(session, responder, false); + okComplete(command, tag, responder); + } + + + /** + * Add a {@link PermitEnableCapabilityProcessor} which can be enabled + * + * @param implementor + */ + public void addProcessor(PermitEnableCapabilityProcessor implementor) { + capabilities.add(implementor); + } + + @SuppressWarnings("unchecked") + public static Set<String> getEnabledCapabilities(ImapSession session) { + Set<String> caps = (Set<String>) session.getAttribute(ENABLED_CAPABILITIES); + + if (caps == null) { + caps = new HashSet<String>(); + session.setAttribute(ENABLED_CAPABILITIES, caps); + } + return caps; + } + + /* + * (non-Javadoc) + * + * @see org.apache.james.imap.processor.CapabilityImplementingProcessor# + * getImplementedCapabilities(org.apache.james.imap.api.process.ImapSession) + */ + public List<String> getImplementedCapabilities(ImapSession session) { + final List<String> capabilities = new ArrayList<String>(); + capabilities.add(SUPPORTS_ENABLE); + + return capabilities; + } + +} Added: james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/PermitEnableCapabilityProcessor.java URL: http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/PermitEnableCapabilityProcessor.java?rev=1133515&view=auto ============================================================================== --- james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/PermitEnableCapabilityProcessor.java (added) +++ james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/PermitEnableCapabilityProcessor.java Wed Jun 8 19:17:01 2011 @@ -0,0 +1,29 @@ +/**************************************************************** + * 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 org.apache.james.imap.api.process.ImapSession; + +public interface PermitEnableCapabilityProcessor extends CapabilityImplementingProcessor{ + + public List<String> getPermitEnableCapabilities(ImapSession session); + +} --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org