100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair/*
200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * Copyright 2007 the original author or authors.
300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair *
400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * Licensed under the Apache License, Version 2.0 (the "License");
500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * you may not use this file except in compliance with the License.
600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * You may obtain a copy of the License at
700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair *
800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair *      http://www.apache.org/licenses/LICENSE-2.0
900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair *
1000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * Unless required by applicable law or agreed to in writing, software
1100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * distributed under the License is distributed on an "AS IS" BASIS,
1200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * See the License for the specific language governing permissions and
1400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * limitations under the License.
1500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair */
1600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairpackage org.mockftpserver.core.command;
1700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
1800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairimport org.slf4j.Logger;
1900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairimport org.slf4j.LoggerFactory;
2000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairimport org.easymock.MockControl;
2100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairimport org.mockftpserver.core.session.Session;
2200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairimport org.mockftpserver.core.util.AssertFailedException;
2300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairimport org.mockftpserver.test.AbstractTestCase;
2400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
2500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairimport java.util.ListResourceBundle;
2600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairimport java.util.ResourceBundle;
2700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
2800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair/**
2900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * Tests for the AbstractTrackingCommandHandler class. The class name is prefixed with an
3000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * underscore so that it is not filtered out by Maven's Surefire test plugin.
3100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair *
3200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * @author Chris Mair
3300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * @version $Revision$ - $Date$
3400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair */
3500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairpublic final class _AbstractTrackingCommandHandlerTest extends AbstractTestCase {
3600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
3700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    private static final Logger LOG = LoggerFactory.getLogger(_AbstractTrackingCommandHandlerTest.class);
3800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    private static final String COMMAND_NAME = "abc";
3900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    private static final Object ARG = "123";
4000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    private static final Object[] ARGS = {ARG};
4100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    private static final Command COMMAND = new Command(COMMAND_NAME, EMPTY);
4200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    private static final Command COMMAND_WITH_ARGS = new Command(COMMAND_NAME, EMPTY);
4300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    private static final int REPLY_CODE1 = 777;
4400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    private static final int REPLY_CODE2 = 888;
4500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    private static final int REPLY_CODE3 = 999;
4600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    private static final String REPLY_TEXT1 = "reply1 ... abcdef";
4700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    private static final String REPLY_TEXT2 = "abc {0} def";
4800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    private static final String REPLY_TEXT2_FORMATTED = "abc 123 def";
4900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    private static final String OVERRIDE_REPLY_TEXT = "overridden reply ... abcdef";
5000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    private static final String MESSAGE_KEY = "key.123";
5100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    private static final String MESSAGE_TEXT = "message.123";
5200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
5300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    private AbstractTrackingCommandHandler commandHandler;
5400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    private Session session;
5500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
5600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    /**
5700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     * Test the handleCommand(Command,Session) method
5800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     */
5900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    public void testHandleCommand() throws Exception {
6000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertEquals("before", 0, commandHandler.numberOfInvocations());
6100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        commandHandler.handleCommand(COMMAND, session);
6200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertEquals("after", 1, commandHandler.numberOfInvocations());
6300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertTrue("locked", commandHandler.getInvocation(0).isLocked());
6400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
6500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
6600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    /**
6700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     * Test the handleCommand(Command,Session) method, passing in a null Command
6800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     */
6900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    public void testHandleCommand_NullCommand() throws Exception {
7000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        try {
7100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair            commandHandler.handleCommand(null, session);
7200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair            fail("Expected AssertFailedException");
7300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        }
7400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        catch (AssertFailedException expected) {
7500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair            LOG.info("Expected: " + expected);
7600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        }
7700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
7800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
7900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    /**
8000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     * Test the handleCommand(Command,Session) method, passing in a null Session
8100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     */
8200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    public void testHandleCommand_NullSession() throws Exception {
8300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        try {
8400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair            commandHandler.handleCommand(COMMAND, null);
8500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair            fail("Expected AssertFailedException");
8600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        }
8700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        catch (AssertFailedException expected) {
8800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair            LOG.info("Expected: " + expected);
8900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        }
9000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
9100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
9200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    /**
9300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     * Test the numberOfInvocations(), addInvocationRecord() and clearInvocationRecord() methods
9400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     */
9500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    public void testInvocationHistory() throws Exception {
9600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        control(session).expectAndDefaultReturn(session.getClientHost(), DEFAULT_HOST);
9700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        replay(session);
9800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
9900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertEquals("none", 0, commandHandler.numberOfInvocations());
10000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        commandHandler.handleCommand(COMMAND, session);
10100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertEquals("1", 1, commandHandler.numberOfInvocations());
10200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        commandHandler.handleCommand(COMMAND, session);
10300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertEquals("2", 2, commandHandler.numberOfInvocations());
10400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        commandHandler.clearInvocations();
10500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertEquals("cleared", 0, commandHandler.numberOfInvocations());
10600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
10700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
10800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    /**
10900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     * Test the getInvocation() method
11000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     *
11100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     * @throws Exception
11200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     */
11300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    public void testGetInvocation() throws Exception {
11400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        control(session).expectAndDefaultReturn(session.getClientHost(), DEFAULT_HOST);
11500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        replay(session);
11600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
11700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        commandHandler.handleCommand(COMMAND, session);
11800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        commandHandler.handleCommand(COMMAND_WITH_ARGS, session);
11900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertSame("1", COMMAND, commandHandler.getInvocation(0).getCommand());
12000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertSame("2", COMMAND_WITH_ARGS, commandHandler.getInvocation(1).getCommand());
12100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
12200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
12300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    /**
12400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     * Test the getInvocation() method, passing in an invalid index
12500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     */
12600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    public void testGetInvocation_IndexOutOfBounds() throws Exception {
12700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        commandHandler.handleCommand(COMMAND, session);
12800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        try {
12900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair            commandHandler.getInvocation(2);
13000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair            fail("Expected IndexOutOfBoundsException");
13100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        }
13200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        catch (IndexOutOfBoundsException expected) {
13300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair            LOG.info("Expected: " + expected);
13400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        }
13500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
13600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
13700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    /**
13800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     * Test the sendReply() method, when no message arguments are specified
13900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     */
14000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    public void testSendReply() {
14100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        session.sendReply(REPLY_CODE1, REPLY_TEXT1);
14200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        session.sendReply(REPLY_CODE1, MESSAGE_TEXT);
14300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        session.sendReply(REPLY_CODE1, OVERRIDE_REPLY_TEXT);
14400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        session.sendReply(REPLY_CODE3, null);
14500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        replay(session);
14600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
14700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        commandHandler.sendReply(session, REPLY_CODE1, null, null, null);
14800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        commandHandler.sendReply(session, REPLY_CODE1, MESSAGE_KEY, null, null);
14900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        commandHandler.sendReply(session, REPLY_CODE1, MESSAGE_KEY, OVERRIDE_REPLY_TEXT, null);
15000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        commandHandler.sendReply(session, REPLY_CODE3, null, null, null);
15100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
15200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verify(session);
15300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
15400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
15500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    /**
15600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     * Test the sendReply() method, passing in message arguments
15700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     */
15800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    public void testSendReply_WithMessageArguments() {
15900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        session.sendReply(REPLY_CODE1, REPLY_TEXT2_FORMATTED);
16000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        replay(session);
16100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
16200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        commandHandler.sendReply(session, REPLY_CODE1, null, REPLY_TEXT2, ARGS);
16300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
16400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verify(session);
16500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
16600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
16700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    /**
16800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     * Test the sendReply() method, passing in a null Session
16900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     */
17000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    public void testSendReply_NullSession() {
17100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        try {
17200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair            commandHandler.sendReply(null, REPLY_CODE1, REPLY_TEXT1, null, null);
17300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair            fail("Expected AssertFailedException");
17400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        }
17500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        catch (AssertFailedException expected) {
17600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair            LOG.info("Expected: " + expected);
17700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        }
17800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
17900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
18000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    /**
18100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     * Test the sendReply() method, passing in an invalid replyCode
18200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     */
18300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    public void testSendReply_InvalidReplyCode() {
18400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        try {
18500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair            commandHandler.sendReply(session, 0, REPLY_TEXT1, null, null);
18600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair            fail("Expected AssertFailedException");
18700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        }
18800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        catch (AssertFailedException expected) {
18900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair            LOG.info("Expected: " + expected);
19000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        }
19100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
19200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
19300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    //-------------------------------------------------------------------------
19400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    // Test setup
19500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    //-------------------------------------------------------------------------
19600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
19700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    /**
19800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     * Perform initialization before each test
19900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     *
20000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     * @see org.mockftpserver.test.AbstractTestCase#setUp()
20100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     */
20200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    protected void setUp() throws Exception {
20300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        super.setUp();
20400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        session = (Session) createMock(Session.class);
20500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        control(session).setDefaultMatcher(MockControl.ARRAY_MATCHER);
20600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        commandHandler = new AbstractTrackingCommandHandler() {
20700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair            public void handleCommand(Command command, Session session, InvocationRecord invocationRecord) throws Exception {
20800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair            }
20900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        };
21000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ResourceBundle replyTextBundle = new ListResourceBundle() {
21100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair            protected Object[][] getContents() {
21200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair                return new Object[][]{
21300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair                        {Integer.toString(REPLY_CODE1), REPLY_TEXT1},
21400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair                        {Integer.toString(REPLY_CODE2), REPLY_TEXT2},
21500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair                        {MESSAGE_KEY, MESSAGE_TEXT}
21600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair                };
21700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair            }
21800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        };
21900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        commandHandler.setReplyTextBundle(replyTextBundle);
22000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
22100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
22200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair}
223