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