160b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair/* 260b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair * Copyright 2007 the original author or authors. 360b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair * 460b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair * Licensed under the Apache License, Version 2.0 (the "License"); 560b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair * you may not use this file except in compliance with the License. 660b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair * You may obtain a copy of the License at 760b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair * 860b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair * http://www.apache.org/licenses/LICENSE-2.0 960b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair * 1060b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair * Unless required by applicable law or agreed to in writing, software 1160b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair * distributed under the License is distributed on an "AS IS" BASIS, 1260b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1360b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair * See the License for the specific language governing permissions and 1460b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair * limitations under the License. 1560b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair */ 1660b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismairpackage org.mockftpserver.core.command; 1760b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair 1860b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismairimport org.apache.log4j.Logger; 1960b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismairimport org.easymock.MockControl; 2060b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismairimport org.mockftpserver.core.session.Session; 2160b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismairimport org.mockftpserver.core.util.AssertFailedException; 2260b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismairimport org.mockftpserver.test.AbstractTest; 2360b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair 2460b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismairimport java.util.ListResourceBundle; 2560b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismairimport java.util.ResourceBundle; 2660b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair 2760b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair/** 2860b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair * Tests for the AbstractTrackingCommandHandler class. The class name is prefixed with an 2960b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair * underscore so that it is not filtered out by Maven's Surefire test plugin. 3060b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair * 3160b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair * @author Chris Mair 3260b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair * @version $Revision$ - $Date$ 3360b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair */ 3460b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismairpublic final class _AbstractTrackingCommandHandlerTest extends AbstractTest { 3560b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair 3660b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair private static final Logger LOG = Logger.getLogger(_AbstractTrackingCommandHandlerTest.class); 3760b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair private static final String COMMAND_NAME = "abc"; 3860b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair private static final Object ARG = "123"; 3960b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair private static final Object[] ARGS = {ARG}; 4060b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair private static final Command COMMAND = new Command(COMMAND_NAME, EMPTY); 4160b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair private static final Command COMMAND_WITH_ARGS = new Command(COMMAND_NAME, EMPTY); 4260b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair private static final int REPLY_CODE1 = 777; 4360b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair private static final int REPLY_CODE2 = 888; 4460b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair private static final int REPLY_CODE3 = 999; 4560b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair private static final String REPLY_TEXT1 = "reply1 ... abcdef"; 4660b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair private static final String REPLY_TEXT2 = "abc {0} def"; 4760b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair private static final String REPLY_TEXT2_FORMATTED = "abc 123 def"; 4860b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair private static final String OVERRIDE_REPLY_TEXT = "overridden reply ... abcdef"; 4960b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair private static final String MESSAGE_KEY = "key.123"; 5060b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair private static final String MESSAGE_TEXT = "message.123"; 5160b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair 5260b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair private AbstractTrackingCommandHandler commandHandler; 5360b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair private Session session; 5460b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair 5560b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair /** 5660b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair * Test the handleCommand(Command,Session) method 5760b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair */ 5860b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair public void testHandleCommand() throws Exception { 5960b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair assertEquals("before", 0, commandHandler.numberOfInvocations()); 6060b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair commandHandler.handleCommand(COMMAND, session); 6160b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair assertEquals("after", 1, commandHandler.numberOfInvocations()); 6260b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair assertTrue("locked", commandHandler.getInvocation(0).isLocked()); 6360b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair } 6460b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair 6560b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair /** 6660b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair * Test the handleCommand(Command,Session) method, passing in a null Command 6760b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair */ 6860b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair public void testHandleCommand_NullCommand() throws Exception { 6960b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair try { 7060b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair commandHandler.handleCommand(null, session); 7160b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair fail("Expected AssertFailedException"); 7260b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair } 7360b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair catch (AssertFailedException expected) { 7460b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair LOG.info("Expected: " + expected); 7560b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair } 7660b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair } 7760b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair 7860b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair /** 7960b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair * Test the handleCommand(Command,Session) method, passing in a null Session 8060b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair */ 8160b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair public void testHandleCommand_NullSession() throws Exception { 8260b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair try { 8360b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair commandHandler.handleCommand(COMMAND, null); 8460b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair fail("Expected AssertFailedException"); 8560b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair } 8660b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair catch (AssertFailedException expected) { 8760b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair LOG.info("Expected: " + expected); 8860b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair } 8960b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair } 9060b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair 9160b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair /** 9260b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair * Test the numberOfInvocations(), addInvocationRecord() and clearInvocationRecord() methods 9360b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair */ 9460b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair public void testInvocationHistory() throws Exception { 9560b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair control(session).expectAndDefaultReturn(session.getClientHost(), DEFAULT_HOST); 9660b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair replay(session); 9760b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair 9860b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair assertEquals("none", 0, commandHandler.numberOfInvocations()); 9960b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair commandHandler.handleCommand(COMMAND, session); 10060b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair assertEquals("1", 1, commandHandler.numberOfInvocations()); 10160b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair commandHandler.handleCommand(COMMAND, session); 10260b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair assertEquals("2", 2, commandHandler.numberOfInvocations()); 10360b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair commandHandler.clearInvocations(); 10460b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair assertEquals("cleared", 0, commandHandler.numberOfInvocations()); 10560b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair } 10660b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair 10760b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair /** 10860b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair * Test the getInvocation() method 10960b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair * 11060b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair * @throws Exception 11160b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair */ 11260b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair public void testGetInvocation() throws Exception { 11360b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair control(session).expectAndDefaultReturn(session.getClientHost(), DEFAULT_HOST); 11460b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair replay(session); 11560b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair 11660b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair commandHandler.handleCommand(COMMAND, session); 11760b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair commandHandler.handleCommand(COMMAND_WITH_ARGS, session); 11860b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair assertSame("1", COMMAND, commandHandler.getInvocation(0).getCommand()); 11960b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair assertSame("2", COMMAND_WITH_ARGS, commandHandler.getInvocation(1).getCommand()); 12060b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair } 12160b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair 12260b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair /** 12360b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair * Test the getInvocation() method, passing in an invalid index 12460b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair */ 12560b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair public void testGetInvocation_IndexOutOfBounds() throws Exception { 12660b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair commandHandler.handleCommand(COMMAND, session); 12760b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair try { 12860b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair commandHandler.getInvocation(2); 12960b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair fail("Expected IndexOutOfBoundsException"); 13060b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair } 13160b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair catch (IndexOutOfBoundsException expected) { 13260b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair LOG.info("Expected: " + expected); 13360b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair } 13460b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair } 13560b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair 13660b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair /** 13760b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair * Test the sendReply() method, when no message arguments are specified 13860b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair */ 13960b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair public void testSendReply() { 14060b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair session.sendReply(REPLY_CODE1, REPLY_TEXT1); 14160b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair session.sendReply(REPLY_CODE1, MESSAGE_TEXT); 14260b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair session.sendReply(REPLY_CODE1, OVERRIDE_REPLY_TEXT); 14360b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair session.sendReply(REPLY_CODE3, null); 14460b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair replay(session); 14560b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair 14660b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair commandHandler.sendReply(session, REPLY_CODE1, null, null, null); 14760b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair commandHandler.sendReply(session, REPLY_CODE1, MESSAGE_KEY, null, null); 14860b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair commandHandler.sendReply(session, REPLY_CODE1, MESSAGE_KEY, OVERRIDE_REPLY_TEXT, null); 14960b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair commandHandler.sendReply(session, REPLY_CODE3, null, null, null); 15060b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair 15160b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair verify(session); 15260b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair } 15360b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair 15460b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair /** 15560b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair * Test the sendReply() method, passing in message arguments 15660b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair */ 15760b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair public void testSendReply_WithMessageArguments() { 15860b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair session.sendReply(REPLY_CODE1, REPLY_TEXT2_FORMATTED); 15960b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair replay(session); 16060b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair 16160b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair commandHandler.sendReply(session, REPLY_CODE1, null, REPLY_TEXT2, ARGS); 16260b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair 16360b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair verify(session); 16460b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair } 16560b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair 16660b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair /** 16760b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair * Test the sendReply() method, passing in a null Session 16860b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair */ 16960b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair public void testSendReply_NullSession() { 17060b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair try { 17160b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair commandHandler.sendReply(null, REPLY_CODE1, REPLY_TEXT1, null, null); 17260b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair fail("Expected AssertFailedException"); 17360b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair } 17460b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair catch (AssertFailedException expected) { 17560b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair LOG.info("Expected: " + expected); 17660b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair } 17760b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair } 17860b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair 17960b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair /** 18060b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair * Test the sendReply() method, passing in an invalid replyCode 18160b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair */ 18260b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair public void testSendReply_InvalidReplyCode() { 18360b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair try { 18460b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair commandHandler.sendReply(session, 0, REPLY_TEXT1, null, null); 18560b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair fail("Expected AssertFailedException"); 18660b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair } 18760b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair catch (AssertFailedException expected) { 18860b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair LOG.info("Expected: " + expected); 18960b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair } 19060b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair } 19160b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair 19260b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair //------------------------------------------------------------------------- 19360b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair // Test setup 19460b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair //------------------------------------------------------------------------- 19560b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair 19660b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair /** 19760b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair * Perform initialization before each test 19860b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair * 19960b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair * @see org.mockftpserver.test.AbstractTest#setUp() 20060b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair */ 20160b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair protected void setUp() throws Exception { 20260b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair super.setUp(); 20360b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair session = (Session) createMock(Session.class); 20460b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair control(session).setDefaultMatcher(MockControl.ARRAY_MATCHER); 20560b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair commandHandler = new AbstractTrackingCommandHandler() { 20660b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair public void handleCommand(Command command, Session session, InvocationRecord invocationRecord) throws Exception { 20760b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair } 20860b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair }; 20960b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair ResourceBundle replyTextBundle = new ListResourceBundle() { 21060b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair protected Object[][] getContents() { 21160b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair return new Object[][]{ 21260b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair {Integer.toString(REPLY_CODE1), REPLY_TEXT1}, 21360b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair {Integer.toString(REPLY_CODE2), REPLY_TEXT2}, 21460b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair {MESSAGE_KEY, MESSAGE_TEXT} 21560b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair }; 21660b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair } 21760b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair }; 21860b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair commandHandler.setReplyTextBundle(replyTextBundle); 21960b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair } 22060b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair 22160b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair} 222