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