117f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair/*
217f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair * Copyright 2007 the original author or authors.
317f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair *
417f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair * Licensed under the Apache License, Version 2.0 (the "License");
517f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair * you may not use this file except in compliance with the License.
617f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair * You may obtain a copy of the License at
717f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair *
817f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair *      http://www.apache.org/licenses/LICENSE-2.0
917f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair *
1017f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair * Unless required by applicable law or agreed to in writing, software
1117f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair * distributed under the License is distributed on an "AS IS" BASIS,
1217f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1317f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair * See the License for the specific language governing permissions and
1417f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair * limitations under the License.
1517f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair */
1617f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismairpackage org.mockftpserver.stub.command;
1717f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair
1817f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismairimport org.mockftpserver.core.command.AbstractCommandHandler;
1917f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismairimport org.mockftpserver.core.command.Command;
2017f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismairimport org.mockftpserver.core.command.CommandHandler;
2117f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismairimport org.mockftpserver.core.command.InvocationRecord;
2217f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismairimport org.mockftpserver.core.command.ReplyCodes;
2317f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismairimport org.mockftpserver.core.session.Session;
2417f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismairimport org.mockftpserver.core.util.AssertFailedException;
2517f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair
2617f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair/**
2717f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair * Abstract superclass for CommandHandlers that read from or write to the data connection.
2817f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair * <p>
2917f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair * Return two replies on the control connection: by default a reply code of 150 before the
3017f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair * data transfer across the data connection and another reply of 226 after the data transfer
3117f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair * is complete.
3217f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair * <p>
3317f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair * This class implements the <i>Template Method</i> pattern. Subclasses must implement the abstract
3417f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair * {@link #processData()} method to perform read or writes across the data connection.
3517f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair * <p>
3617f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair * Subclasses can optionally override the {@link #beforeProcessData(Command, Session, InvocationRecord)}
3717f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair * method for logic before the data transfer or the {@link #afterProcessData(Command, Session, InvocationRecord)}
3817f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair * method for logic after the data transfer.
3917f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair * <p>
4017f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair * Subclasses can optionally override the reply code and/or text for the initial reply (before
4117f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair * the data transfer across the data connection) by calling {@link #setPreliminaryReplyCode(int)},
4217f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair * {@link #setPreliminaryReplyMessageKey(String)} and/or {@link #setPreliminaryReplyText(String)}
4317f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair * methods.
4417f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair * <p>
4517f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair * Subclasses can optionally override the reply code and/or text for the final reply (after the
4617f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair * the data transfer is complete) by calling {@link #setFinalReplyCode(int)},
4717f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair * {@link #setFinalReplyMessageKey(String)} and/or {@link #setFinalReplyText(String)} methods.
4817f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair *
4917f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair * @version $Revision$ - $Date$
5017f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair *
5117f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair * @author Chris Mair
5217f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair */
5317f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismairpublic abstract class AbstractStubDataCommandHandler extends AbstractCommandHandler implements CommandHandler {
5417f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair
5517f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair    // The completion reply code sent before the data transfer
5617f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair    protected int preliminaryReplyCode = 0;
5717f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair
5817f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair    // The text for the preliminary reply. If null, use the default message associated with the reply code.
5917f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair    // If not null, this value overrides the preliminaryReplyMessageKey - i.e., this text is used instead of
6017f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair    // a localized message.
6117f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair    protected String preliminaryReplyText = null;
6217f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair
6317f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair    // The message key for the preliminary reply text. If null, use the default message associated with
6417f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair    // the reply code.
6517f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair    protected String preliminaryReplyMessageKey = null;
6617f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair
6717f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair    // The completion reply code sent after data transfer
6817f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair    protected int finalReplyCode = 0;
6917f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair
7017f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair    // The text for the completion reply. If null, use the default message associated with the reply code.
7117f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair    // If not null, this value overrides the finalReplyMessageKey - i.e., this text is used instead of
7217f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair    // a localized message.
7317f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair    protected String finalReplyText = null;
7417f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair
7517f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair    // The message key for the completion reply text. If null, use the default message associated with the reply code
7617f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair    protected String finalReplyMessageKey = null;
7717f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair
7817f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair    /**
7917f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     * Constructor. Initialize the preliminary and final reply code.
8017f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     */
8117f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair    protected AbstractStubDataCommandHandler() {
8217f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair        setPreliminaryReplyCode(ReplyCodes.SEND_DATA_INITIAL_OK);
8317f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair        setFinalReplyCode(ReplyCodes.SEND_DATA_FINAL_OK);
8417f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair    }
8517f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair
8617f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair    /**
8717f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     * Handle the command. Perform the following steps:
8817f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     * <ol>
8917f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     * <li>Invoke the {@link #beforeProcessData()} method</li>
9017f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     * <li>Open the data connection</li>
9117f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     * <li>Send an preliminary reply, default reply code 150</li>
9217f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     * <li>Invoke the {@link #processData()} method</li>
9317f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     * <li>Close the data connection</li>
9417f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     * <li>Send the final reply, default reply code 226</li>
9517f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     * <li>Invoke the {@link #afterProcessData()} method</li>
9617f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     * </ol>
9717f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     *
9817f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     * @see org.mockftpserver.core.command.CommandHandler#handleCommand(Command, Session, InvocationRecord)
9917f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     */
10017f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair    public final void handleCommand(Command command, Session session, InvocationRecord invocationRecord) throws Exception {
10117f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair
10217f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair        beforeProcessData(command, session, invocationRecord);
10317f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair
10417f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair        sendPreliminaryReply(session);
10517f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair        session.openDataConnection();
10617f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair        processData(command, session, invocationRecord);
10717f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair        session.closeDataConnection();
10817f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair        sendFinalReply(session);
10917f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair
11017f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair        afterProcessData(command, session, invocationRecord);
11117f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair    }
11217f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair
11317f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair    /**
11417f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     * Send the final reply. The default implementation sends a reply code of 226 with the
11517f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     * corresponding associated reply text.
11617f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     * @param session - the Session
11717f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     */
11817f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair    protected void sendFinalReply(Session session) {
11917f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair        sendReply(session, finalReplyCode, finalReplyMessageKey, finalReplyText, null);
12017f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair    }
12117f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair
12217f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair    /**
12317f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     * Perform any necessary logic before transferring data across the data connection.
12417f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     * Do nothing by default. Subclasses should override to validate command parameters and
12517f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     * store information in the InvocationRecord.
12617f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     *
12717f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     * @param command - the Command to be handled
12817f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     * @param session - the session on which the Command was submitted
12917f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     * @param invocationRecord - the InvocationRecord; CommandHandlers are expected to add
13017f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     *      handler-specific data to the InvocationRecord, as appropriate
13117f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     *
13217f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     * @throws Exception
13317f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     */
13417f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair    protected void beforeProcessData(Command command, Session session, InvocationRecord invocationRecord) throws Exception {
13517f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair        // Do nothing by default
13617f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair    }
13717f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair
13817f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair    /**
13917f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     * Abstract method placeholder for subclass transfer of data across the data connection.
14017f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     * Subclasses must override. The data connection is opened before this method and is
14117f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     * closed after this method completes.
14217f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     *
14317f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     * @param command - the Command to be handled
14417f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     * @param session - the session on which the Command was submitted
14517f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     * @param invocationRecord - the InvocationRecord; CommandHandlers are expected to add
14617f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     *      handler-specific data to the InvocationRecord, as appropriate
14717f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     *
14817f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     * @throws Exception
14917f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     */
15017f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair    protected abstract void processData(Command command, Session session, InvocationRecord invocationRecord) throws Exception;
15117f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair
15217f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair    /**
15317f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     * Perform any necessary logic after transferring data across the data connection.
15417f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     * Do nothing by default.
15517f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     *
15617f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     * @param command - the Command to be handled
15717f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     * @param session - the session on which the Command was submitted
15817f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     * @param invocationRecord - the InvocationRecord; CommandHandlers are expected to add
15917f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     *      handler-specific data to the InvocationRecord, as appropriate
16017f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     * @throws Exception
16117f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     */
16217f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair    protected void afterProcessData(Command command, Session session, InvocationRecord invocationRecord) throws Exception {
16317f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair       // Do nothing by default
16417f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair    }
16517f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair
16617f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair    /**
16717f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     * Send the preliminary reply for this command on the control connection.
16817f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     *
16917f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     * @param session - the Session
17017f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     */
17117f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair    private void sendPreliminaryReply(Session session) {
17217f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair        sendReply(session, preliminaryReplyCode, preliminaryReplyMessageKey, preliminaryReplyText, null);
17317f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair    }
17417f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair
17517f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair    /**
17617f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     * Set the completion reply code sent after data transfer
17717f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     * @param finalReplyCode - the final reply code
17817f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     *
17917f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     * @throws AssertFailedException - if the finalReplyCode is invalid
18017f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     */
18117f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair    public void setFinalReplyCode(int finalReplyCode) {
18217f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair        assertValidReplyCode(finalReplyCode);
18317f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair        this.finalReplyCode = finalReplyCode;
18417f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair    }
18517f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair
18617f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair    /**
18717f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     * Set the message key for the completion reply text sent after data transfer
18817f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     * @param finalReplyMessageKey - the final reply message key
18917f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     */
19017f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair    public void setFinalReplyMessageKey(String finalReplyMessageKey) {
19117f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair        this.finalReplyMessageKey = finalReplyMessageKey;
19217f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair    }
19317f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair
19417f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair    /**
19517f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     * Set the text of the completion reply sent after data transfer
19617f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     * @param finalReplyText - the final reply text
19717f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     */
19817f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair    public void setFinalReplyText(String finalReplyText) {
19917f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair        this.finalReplyText = finalReplyText;
20017f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair    }
20117f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair
20217f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair    /**
20317f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     * Set the completion reply code sent before data transfer
20417f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     * @param preliminaryReplyCode - the preliminary reply code to set
20517f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     *
20617f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     * @throws AssertFailedException - if the preliminaryReplyCode is invalid
20717f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     */
20817f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair    public void setPreliminaryReplyCode(int preliminaryReplyCode) {
20917f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair        assertValidReplyCode(preliminaryReplyCode);
21017f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair        this.preliminaryReplyCode = preliminaryReplyCode;
21117f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair    }
21217f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair
21317f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair    /**
21417f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     * Set the message key for the completion reply text sent before data transfer
21517f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     * @param preliminaryReplyMessageKey - the preliminary reply message key
21617f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     */
21717f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair    public void setPreliminaryReplyMessageKey(String preliminaryReplyMessageKey) {
21817f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair        this.preliminaryReplyMessageKey = preliminaryReplyMessageKey;
21917f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair    }
22017f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair
22117f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair    /**
22217f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     * Set the text of the completion reply sent before data transfer
22317f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     * @param preliminaryReplyText - the preliminary reply text
22417f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair     */
22517f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair    public void setPreliminaryReplyText(String preliminaryReplyText) {
22617f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair        this.preliminaryReplyText = preliminaryReplyText;
22717f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair    }
22817f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair
22917f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair}
230