/* * Copyright 2007 the original author or authors. * * Licensed 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.mockftpserver.core.command; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.ResourceBundle; import org.mockftpserver.core.session.Session; import org.mockftpserver.core.util.Assert; import org.mockftpserver.core.util.AssertFailedException; /** * Composite CommandHandler that manages an internal list of CommandHandlers to which it delegates. * The internal CommandHandlers are maintained in an ordered list. Starting with the first * CommandHandler in the list, each invocation of this composite handler will invoke (delegate to) * the current internal CommandHander. Then it moves on the next CommandHandler in the internal list. *
* The following example replaces the CWD CommandHandler with a SimpleCompositeCommandHandler
.
* The first invocation of the CWD command will fail (reply code 500). The seconds will succeed.
*
*
* StubFtpServer stubFtpServer = new StubFtpServer();
*
* CommandHandler commandHandler1 = new StaticReplyCommandHandler(500);
* CommandHandler commandHandler2 = new CwdCommandHandler();
*
* SimpleCompositeCommandHandler simpleCompositeCommandHandler = new SimpleCompositeCommandHandler();
* simpleCompositeCommandHandler.addCommandHandler(commandHandler1);
* simpleCompositeCommandHandler.addCommandHandler(commandHandler2);
*
* stubFtpServer.setCommandHandler("CWD", simpleCompositeCommandHandler);
*
*
* @version $Revision$ - $Date$
*
* @author Chris Mair
*/
public final class SimpleCompositeCommandHandler implements CommandHandler, ReplyTextBundleAware {
private List commandHandlers = new ArrayList();
private int invocationIndex = 0;
/**
* Add a CommandHandler to the internal list of handlers.
*
* @param commandHandler - the CommandHandler
*
* @throws AssertFailedException - if the commandHandler is null
*/
public void addCommandHandler(CommandHandler commandHandler) {
Assert.notNull(commandHandler, "commandHandler");
commandHandlers.add(commandHandler);
}
/**
* Set the List of CommandHandlers to which to delegate. This replaces any CommandHandlers that
* have been defined previously.
* @param commandHandlers - the complete List of CommandHandlers to which invocations are delegated
*/
public void setCommandHandlers(List commandHandlers) {
Assert.notNull(commandHandlers, "commandHandlers");
this.commandHandlers = new ArrayList(commandHandlers);
}
/**
* Return the CommandHandler corresponding to the specified invocation index. In other words, return
* the CommandHandler instance to which the Nth {@link #handleCommand(Command, Session)} has been or will
* be delegated (where N=index).
* @param index - the index of the desired invocation (zero-based).
* @return the CommandHandler
*
* @throws AssertFailedException - if no CommandHandler is defined for the index or the index is not valid
*/
public CommandHandler getCommandHandler(int index) {
Assert.isTrue(index < commandHandlers.size(), "No CommandHandler defined for index " + index);
Assert.isTrue(index >= 0, "The index cannot be less than zero: " + index);
return (CommandHandler) commandHandlers.get(index);
}
/**
* @see org.mockftpserver.core.command.CommandHandler#handleCommand(org.mockftpserver.core.command.Command, org.mockftpserver.core.session.Session)
*/
public void handleCommand(Command command, Session session) throws Exception {
Assert.notNull(command, "command");
Assert.notNull(session, "session");
Assert.isTrue(commandHandlers.size() > invocationIndex, "No CommandHandler defined for invocation #" + invocationIndex);
CommandHandler commandHandler = (CommandHandler) commandHandlers.get(invocationIndex);
invocationIndex++;
commandHandler.handleCommand(command, session);
}
/**
* Returns null. This is a composite, and has no reply text bundle.
*
* @see org.mockftpserver.core.command.ReplyTextBundleAware#getReplyTextBundle()
*/
public ResourceBundle getReplyTextBundle() {
return null;
}
/**
* Call setReplyTextBundle()
on each of the command handlers within the internal list.
*
* @see org.mockftpserver.core.command.ReplyTextBundleAware#setReplyTextBundle(java.util.ResourceBundle)
*/
public void setReplyTextBundle(ResourceBundle replyTextBundle) {
for (Iterator iter = commandHandlers.iterator(); iter.hasNext();) {
CommandHandler commandHandler = (CommandHandler) iter.next();
ReplyTextBundleUtil.setReplyTextBundleIfAppropriate(commandHandler, replyTextBundle);
}
}
}