Added: james/server/sandbox/seda-imap/src/java/org/apache/james/imapserver/commands/StandardImapDecoder.java URL: http://svn.apache.org/viewvc/james/server/sandbox/seda-imap/src/java/org/apache/james/imapserver/commands/StandardImapDecoder.java?view=auto&rev=514102 ============================================================================== --- james/server/sandbox/seda-imap/src/java/org/apache/james/imapserver/commands/StandardImapDecoder.java (added) +++ james/server/sandbox/seda-imap/src/java/org/apache/james/imapserver/commands/StandardImapDecoder.java Sat Mar 3 00:44:22 2007 @@ -0,0 +1,88 @@ +/**************************************************************** + * 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.imapserver.commands; + +import org.apache.avalon.framework.logger.AbstractLogEnabled; +import org.apache.avalon.framework.logger.Logger; +import org.apache.james.imapserver.ImapDecoder; +import org.apache.james.imapserver.ImapRequestLineReader; +import org.apache.james.imapserver.ProtocolException; + +public class StandardImapDecoder extends AbstractLogEnabled implements ImapDecoder { + + private static final String INVALID_COMMAND = "Invalid command."; + // TODO: inject dependency + private final ImapCommandParserFactory imapCommands = new ImapCommandParserFactory(); + private static final String REQUEST_SYNTAX = "Protocol Error: Was expecting <tag SPACE command [arguments]>"; + + /** + * @see org.apache.avalon.framework.logger.AbstractLogEnabled#enableLogging(org.apache.avalon.framework.logger.Logger) + */ + public void enableLogging(Logger logger) { + super.enableLogging(logger); + setupLogger(imapCommands); + } + + public ImapCommandMessage decode(ImapRequestLineReader request) { + ImapCommandMessage message; + final Logger logger = getLogger(); + + try { + final String tag = AbstractImapCommandParser.tag( request ); + message = decodeCommandTagged(request, logger, tag); + } + catch ( ProtocolException e ) { + logger.debug("error parsing request", e); + message = new BadResponseMessage( REQUEST_SYNTAX ); + } + return message; + } + + private ImapCommandMessage decodeCommandTagged(final ImapRequestLineReader request, final Logger logger, final String tag) { + ImapCommandMessage message; + if (logger.isDebugEnabled()) { + logger.debug( "Got <tag>: " + tag ); + } + try { + final String commandName = AbstractImapCommandParser.atom( request ); + message = decodeCommandNamed(request, tag, commandName, logger); + } + catch ( ProtocolException e ) { + logger.debug("Error during initial request parsing", e); + message = new ErrorResponseMessage(REQUEST_SYNTAX , tag); + } + return message; + } + + private ImapCommandMessage decodeCommandNamed(final ImapRequestLineReader request, + final String tag, String commandName, final Logger logger) { + ImapCommandMessage message; + if (logger.isDebugEnabled()) { + logger.debug( "Got <command>: " + commandName); + } + final ImapCommandParser command = imapCommands.getParser( commandName ); + if ( command == null ) { + logger.info("Missing command implementation."); + message = new ErrorResponseMessage(INVALID_COMMAND, tag); + } else { + message = command.parse( request, tag ); + } + return message; + } +}
Modified: james/server/sandbox/seda-imap/src/java/org/apache/james/imapserver/commands/StatusCommand.java URL: http://svn.apache.org/viewvc/james/server/sandbox/seda-imap/src/java/org/apache/james/imapserver/commands/StatusCommand.java?view=diff&rev=514102&r1=514101&r2=514102 ============================================================================== --- james/server/sandbox/seda-imap/src/java/org/apache/james/imapserver/commands/StatusCommand.java (original) +++ james/server/sandbox/seda-imap/src/java/org/apache/james/imapserver/commands/StatusCommand.java Sat Mar 3 00:44:22 2007 @@ -19,8 +19,6 @@ package org.apache.james.imapserver.commands; -import org.apache.james.imapserver.ImapRequestLineReader; -import org.apache.james.imapserver.ProtocolException; /** * Handles processeing for the STATUS imap command. @@ -38,8 +36,6 @@ static final String UIDVALIDITY = "UIDVALIDITY"; static final String UNSEEN = "UNSEEN"; - private StatusCommandParser parser = new StatusCommandParser(this); - /** @see ImapCommand#getName */ public String getName() { @@ -50,11 +46,6 @@ public String getArgSyntax() { return ARGS; - } - - protected AbstractImapCommandMessage decode(ImapRequestLineReader request, String tag) throws ProtocolException { - final AbstractImapCommandMessage result = parser.decode(request, tag); - return result; } } /* Modified: james/server/sandbox/seda-imap/src/java/org/apache/james/imapserver/commands/StatusCommandParser.java URL: http://svn.apache.org/viewvc/james/server/sandbox/seda-imap/src/java/org/apache/james/imapserver/commands/StatusCommandParser.java?view=diff&rev=514102&r1=514101&r2=514102 ============================================================================== --- james/server/sandbox/seda-imap/src/java/org/apache/james/imapserver/commands/StatusCommandParser.java (original) +++ james/server/sandbox/seda-imap/src/java/org/apache/james/imapserver/commands/StatusCommandParser.java Sat Mar 3 00:44:22 2007 @@ -20,13 +20,11 @@ import org.apache.james.imapserver.ImapRequestLineReader; import org.apache.james.imapserver.ProtocolException; -import org.apache.james.imapserver.commands.CommandParser.CharacterValidator; -import org.apache.james.imapserver.commands.CommandParser.NoopCharValidator; -class StatusCommandParser extends CommandParser +class StatusCommandParser extends AbstractImapCommandParser { - public StatusCommandParser(ImapCommand command) { - super(command); + public StatusCommandParser() { + super(new StatusCommand()); } StatusDataItems statusDataItems( ImapRequestLineReader request ) Modified: james/server/sandbox/seda-imap/src/java/org/apache/james/imapserver/commands/StoreCommand.java URL: http://svn.apache.org/viewvc/james/server/sandbox/seda-imap/src/java/org/apache/james/imapserver/commands/StoreCommand.java?view=diff&rev=514102&r1=514101&r2=514102 ============================================================================== --- james/server/sandbox/seda-imap/src/java/org/apache/james/imapserver/commands/StoreCommand.java (original) +++ james/server/sandbox/seda-imap/src/java/org/apache/james/imapserver/commands/StoreCommand.java Sat Mar 3 00:44:22 2007 @@ -20,20 +20,16 @@ package org.apache.james.imapserver.commands; -import org.apache.james.imapserver.ImapRequestLineReader; -import org.apache.james.imapserver.ProtocolException; /** * Handles processeing for the STORE imap command. * * @version $Revision: 109034 $ */ -class StoreCommand extends SelectedStateCommand implements UidEnabledCommand +class StoreCommand extends SelectedStateCommand { public static final String NAME = "STORE"; public static final String ARGS = "<Message-set> ['+'|'-']FLAG[.SILENT] <flag-list>"; - - private StoreCommandParser parser = new StoreCommandParser(this); /** @see ImapCommand#getName */ public String getName() @@ -45,15 +41,6 @@ public String getArgSyntax() { return ARGS; - } - - protected AbstractImapCommandMessage decode(ImapRequestLineReader request, String tag) throws ProtocolException { - return decode(request, false, tag); - } - - public AbstractImapCommandMessage decode(ImapRequestLineReader request, boolean useUids, String tag) throws ProtocolException { - final AbstractImapCommandMessage result = parser.decode(this, request, tag, useUids); - return result; } } /* Modified: james/server/sandbox/seda-imap/src/java/org/apache/james/imapserver/commands/StoreCommandParser.java URL: http://svn.apache.org/viewvc/james/server/sandbox/seda-imap/src/java/org/apache/james/imapserver/commands/StoreCommandParser.java?view=diff&rev=514102&r1=514101&r2=514102 ============================================================================== --- james/server/sandbox/seda-imap/src/java/org/apache/james/imapserver/commands/StoreCommandParser.java (original) +++ james/server/sandbox/seda-imap/src/java/org/apache/james/imapserver/commands/StoreCommandParser.java Sat Mar 3 00:44:22 2007 @@ -22,12 +22,11 @@ import org.apache.james.imapserver.ImapRequestLineReader; import org.apache.james.imapserver.ProtocolException; -import org.apache.james.imapserver.commands.CommandParser.NoopCharValidator; class StoreCommandParser extends AbstractUidCommandParser { - public StoreCommandParser(ImapCommand command) { - super(command); + public StoreCommandParser() { + super(new StoreCommand()); } StoreDirective storeDirective( ImapRequestLineReader request ) throws ProtocolException Modified: james/server/sandbox/seda-imap/src/java/org/apache/james/imapserver/commands/SubscribeCommand.java URL: http://svn.apache.org/viewvc/james/server/sandbox/seda-imap/src/java/org/apache/james/imapserver/commands/SubscribeCommand.java?view=diff&rev=514102&r1=514101&r2=514102 ============================================================================== --- james/server/sandbox/seda-imap/src/java/org/apache/james/imapserver/commands/SubscribeCommand.java (original) +++ james/server/sandbox/seda-imap/src/java/org/apache/james/imapserver/commands/SubscribeCommand.java Sat Mar 3 00:44:22 2007 @@ -19,8 +19,6 @@ package org.apache.james.imapserver.commands; -import org.apache.james.imapserver.ImapRequestLineReader; -import org.apache.james.imapserver.ProtocolException; /** * Handles processeing for the SUBSCRIBE imap command. @@ -30,8 +28,6 @@ class SubscribeCommand extends AuthenticatedStateCommand { public static final String NAME = "SUBSCRIBE"; public static final String ARGS = "<mailbox>"; - - private final SubscribeCommandParser parser = new SubscribeCommandParser(this); /** @see ImapCommand#getName */ public String getName() { @@ -41,10 +37,5 @@ /** @see CommandTemplate#getArgSyntax */ public String getArgSyntax() { return ARGS; - } - - protected AbstractImapCommandMessage decode(ImapRequestLineReader request, String tag) throws ProtocolException { - final AbstractImapCommandMessage result = parser.decode(request, tag); - return result; } } Modified: james/server/sandbox/seda-imap/src/java/org/apache/james/imapserver/commands/SubscribeCommandParser.java URL: http://svn.apache.org/viewvc/james/server/sandbox/seda-imap/src/java/org/apache/james/imapserver/commands/SubscribeCommandParser.java?view=diff&rev=514102&r1=514101&r2=514102 ============================================================================== --- james/server/sandbox/seda-imap/src/java/org/apache/james/imapserver/commands/SubscribeCommandParser.java (original) +++ james/server/sandbox/seda-imap/src/java/org/apache/james/imapserver/commands/SubscribeCommandParser.java Sat Mar 3 00:44:22 2007 @@ -21,10 +21,10 @@ import org.apache.james.imapserver.ImapRequestLineReader; import org.apache.james.imapserver.ProtocolException; -class SubscribeCommandParser extends CommandParser { +class SubscribeCommandParser extends AbstractImapCommandParser { - public SubscribeCommandParser(ImapCommand command) { - super(command); + public SubscribeCommandParser() { + super(new SubscribeCommand()); } protected AbstractImapCommandMessage decode(ImapCommand command, ImapRequestLineReader request, String tag) throws ProtocolException { Modified: james/server/sandbox/seda-imap/src/java/org/apache/james/imapserver/commands/UidCommand.java URL: http://svn.apache.org/viewvc/james/server/sandbox/seda-imap/src/java/org/apache/james/imapserver/commands/UidCommand.java?view=diff&rev=514102&r1=514101&r2=514102 ============================================================================== --- james/server/sandbox/seda-imap/src/java/org/apache/james/imapserver/commands/UidCommand.java (original) +++ james/server/sandbox/seda-imap/src/java/org/apache/james/imapserver/commands/UidCommand.java Sat Mar 3 00:44:22 2007 @@ -19,8 +19,6 @@ package org.apache.james.imapserver.commands; -import org.apache.james.imapserver.ImapRequestLineReader; -import org.apache.james.imapserver.ProtocolException; /** * Handles processeing for the UID imap command. @@ -32,8 +30,6 @@ public static final String NAME = "UID"; public static final String ARGS = "<fetch-command>|<store-command>|<copy-command>|<search-command>"; - private ImapCommandFactory commandFactory; - /** @see ImapCommand#getName */ public String getName() { @@ -44,16 +40,5 @@ public String getArgSyntax() { return ARGS; - } - - public void setCommandFactory( ImapCommandFactory imapCommandFactory ) - { - this.commandFactory = imapCommandFactory; - } - - protected AbstractImapCommandMessage decode(ImapRequestLineReader request, String tag) throws ProtocolException { - UidCommandParser parser = new UidCommandParser(this, commandFactory); - final AbstractImapCommandMessage result = parser.decode(request, tag); - return result; } } Modified: james/server/sandbox/seda-imap/src/java/org/apache/james/imapserver/commands/UidCommandParser.java URL: http://svn.apache.org/viewvc/james/server/sandbox/seda-imap/src/java/org/apache/james/imapserver/commands/UidCommandParser.java?view=diff&rev=514102&r1=514101&r2=514102 ============================================================================== --- james/server/sandbox/seda-imap/src/java/org/apache/james/imapserver/commands/UidCommandParser.java (original) +++ james/server/sandbox/seda-imap/src/java/org/apache/james/imapserver/commands/UidCommandParser.java Sat Mar 3 00:44:22 2007 @@ -21,12 +21,16 @@ import org.apache.james.imapserver.ImapRequestLineReader; import org.apache.james.imapserver.ProtocolException; -class UidCommandParser extends CommandParser { - private final ImapCommandFactory commandFactory; +class UidCommandParser extends AbstractImapCommandParser { + private ImapCommandParserFactory commandFactory; - public UidCommandParser(ImapCommand command, final ImapCommandFactory commandFactory) { - super(command); - this.commandFactory = commandFactory; + public UidCommandParser() { + super(new UidCommand()); + } + + public void setCommandFactory( ImapCommandParserFactory imapCommandFactory ) + { + this.commandFactory = imapCommandFactory; } protected AbstractImapCommandMessage decode(ImapCommand command, ImapRequestLineReader request, String tag) throws ProtocolException { @@ -36,13 +40,14 @@ // TODO: this will be easier to fix a little later // TODO: also not sure whether the old implementation shares this flaw String commandName = atom( request ); - ImapCommand helperCommand = commandFactory.getCommand( commandName ); + ImapCommandParser helperCommand = commandFactory.getParser( commandName ); + // TODO: replace abstract class with interface if ( helperCommand == null || - ! (helperCommand instanceof UidEnabledCommand ) ) { + ! (helperCommand instanceof AbstractUidCommandParser ) ) { throw new ProtocolException("Invalid UID command: '" + commandName + "'" ); } - final UidEnabledCommand uidEnabled = (UidEnabledCommand) helperCommand; - final AbstractImapCommandMessage result = uidEnabled.decode( request, true, tag ); + final AbstractUidCommandParser uidEnabled = (AbstractUidCommandParser) helperCommand; + final AbstractImapCommandMessage result = uidEnabled.decode( request, tag, true ); return result; } Modified: james/server/sandbox/seda-imap/src/java/org/apache/james/imapserver/commands/UnsubscribeCommand.java URL: http://svn.apache.org/viewvc/james/server/sandbox/seda-imap/src/java/org/apache/james/imapserver/commands/UnsubscribeCommand.java?view=diff&rev=514102&r1=514101&r2=514102 ============================================================================== --- james/server/sandbox/seda-imap/src/java/org/apache/james/imapserver/commands/UnsubscribeCommand.java (original) +++ james/server/sandbox/seda-imap/src/java/org/apache/james/imapserver/commands/UnsubscribeCommand.java Sat Mar 3 00:44:22 2007 @@ -19,8 +19,6 @@ package org.apache.james.imapserver.commands; -import org.apache.james.imapserver.ImapRequestLineReader; -import org.apache.james.imapserver.ProtocolException; /** * Handles processeing for the UNSUBSCRIBE imap command. @@ -32,8 +30,6 @@ public static final String NAME = "UNSUBSCRIBE"; public static final String ARGS = "<mailbox>"; - private final UnsubscribeCommandParser parser = new UnsubscribeCommandParser(this); - /** @see ImapCommand#getName */ public String getName() { return NAME; @@ -42,10 +38,5 @@ /** @see CommandTemplate#getArgSyntax */ public String getArgSyntax() { return ARGS; - } - - protected AbstractImapCommandMessage decode(ImapRequestLineReader request, String tag) throws ProtocolException { - final AbstractImapCommandMessage result = parser.decode(request, tag); - return result; } } Modified: james/server/sandbox/seda-imap/src/java/org/apache/james/imapserver/commands/UnsubscribeCommandParser.java URL: http://svn.apache.org/viewvc/james/server/sandbox/seda-imap/src/java/org/apache/james/imapserver/commands/UnsubscribeCommandParser.java?view=diff&rev=514102&r1=514101&r2=514102 ============================================================================== --- james/server/sandbox/seda-imap/src/java/org/apache/james/imapserver/commands/UnsubscribeCommandParser.java (original) +++ james/server/sandbox/seda-imap/src/java/org/apache/james/imapserver/commands/UnsubscribeCommandParser.java Sat Mar 3 00:44:22 2007 @@ -21,10 +21,10 @@ import org.apache.james.imapserver.ImapRequestLineReader; import org.apache.james.imapserver.ProtocolException; -class UnsubscribeCommandParser extends CommandParser { +class UnsubscribeCommandParser extends AbstractImapCommandParser { - public UnsubscribeCommandParser(ImapCommand command) { - super(command); + public UnsubscribeCommandParser() { + super(new UnsubscribeCommand()); } protected AbstractImapCommandMessage decode(ImapCommand command, ImapRequestLineReader request, String tag) throws ProtocolException { Added: james/server/sandbox/seda-imap/src/test/org/apache/james/imapserver/commands/BadResponseMessageTest.java URL: http://svn.apache.org/viewvc/james/server/sandbox/seda-imap/src/test/org/apache/james/imapserver/commands/BadResponseMessageTest.java?view=auto&rev=514102 ============================================================================== --- james/server/sandbox/seda-imap/src/test/org/apache/james/imapserver/commands/BadResponseMessageTest.java (added) +++ james/server/sandbox/seda-imap/src/test/org/apache/james/imapserver/commands/BadResponseMessageTest.java Sat Mar 3 00:44:22 2007 @@ -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.imapserver.commands; + +import org.apache.james.imapserver.ImapConstants; +import org.apache.james.imapserver.ImapResponse; +import org.apache.james.imapserver.ImapSession; +import org.apache.james.imapserver.MockImapResponseWriter; +import org.apache.james.imapserver.MockImapSession; + +import junit.framework.TestCase; + +public class BadResponseMessageTest extends TestCase { + + private static final String MESSAGE = "A Message"; + + MockImapResponseWriter writer; + ImapResponse response; + BadResponseMessage message; + ImapSession session; + + protected void setUp() throws Exception { + super.setUp(); + writer = new MockImapResponseWriter(); + response = new ImapResponse(writer); + message = new BadResponseMessage(MESSAGE); + session = new MockImapSession(); + } + + protected void tearDown() throws Exception { + super.tearDown(); + } + + public void testProcessAndEncode() throws Exception { + ImapResponseMessage response = message.process(session); + assertNotNull("Response is required", response); + response.encode(this.response, session); + assertEquals(4, this.writer.operations.size()); + assertEquals(new MockImapResponseWriter.UntaggedOperation(), writer.operations.get(0)); + assertEquals(new MockImapResponseWriter.TextMessageOperation(ImapConstants.BAD), + writer.operations.get(1)); + assertEquals(new MockImapResponseWriter.TextMessageOperation(MESSAGE), + writer.operations.get(2)); + assertEquals(new MockImapResponseWriter.EndOperation(), + writer.operations.get(3)); + } + +} --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
