1bda3441225e0607b5ced8b538123fd7c7a417910chrismair/* 2bda3441225e0607b5ced8b538123fd7c7a417910chrismair * Copyright 2008 the original author or authors. 3bda3441225e0607b5ced8b538123fd7c7a417910chrismair * 4bda3441225e0607b5ced8b538123fd7c7a417910chrismair * Licensed under the Apache License, Version 2.0 (the "License"); 5bda3441225e0607b5ced8b538123fd7c7a417910chrismair * you may not use this file except in compliance with the License. 6bda3441225e0607b5ced8b538123fd7c7a417910chrismair * You may obtain a copy of the License at 7bda3441225e0607b5ced8b538123fd7c7a417910chrismair * 8bda3441225e0607b5ced8b538123fd7c7a417910chrismair * http://www.apache.org/licenses/LICENSE-2.0 9bda3441225e0607b5ced8b538123fd7c7a417910chrismair * 10bda3441225e0607b5ced8b538123fd7c7a417910chrismair * Unless required by applicable law or agreed to in writing, software 11bda3441225e0607b5ced8b538123fd7c7a417910chrismair * distributed under the License is distributed on an "AS IS" BASIS, 12bda3441225e0607b5ced8b538123fd7c7a417910chrismair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13bda3441225e0607b5ced8b538123fd7c7a417910chrismair * See the License for the specific language governing permissions and 14bda3441225e0607b5ced8b538123fd7c7a417910chrismair * limitations under the License. 15bda3441225e0607b5ced8b538123fd7c7a417910chrismair */ 16bda3441225e0607b5ced8b538123fd7c7a417910chrismairpackage org.mockftpserver.fake.command; 17bda3441225e0607b5ced8b538123fd7c7a417910chrismair 18bda3441225e0607b5ced8b538123fd7c7a417910chrismairimport org.mockftpserver.core.command.Command; 19bda3441225e0607b5ced8b538123fd7c7a417910chrismair 20bda3441225e0607b5ced8b538123fd7c7a417910chrismair/** 21bda3441225e0607b5ced8b538123fd7c7a417910chrismair * CommandHandler for the STOU command. Handler logic: 22bda3441225e0607b5ced8b538123fd7c7a417910chrismair * <ol> 23bda3441225e0607b5ced8b538123fd7c7a417910chrismair * <li>If the user has not logged in, then reply with 530 and terminate</li> 24bda3441225e0607b5ced8b538123fd7c7a417910chrismair * <li>Create new unique filename within the current directory</li> 25bda3441225e0607b5ced8b538123fd7c7a417910chrismair * <li>If the current user does not have write access to the named file, if it already exists, or else to its 26bda3441225e0607b5ced8b538123fd7c7a417910chrismair * parent directory, then reply with 553 and terminate</li> 27bda3441225e0607b5ced8b538123fd7c7a417910chrismair * <li>If the current user does not have execute access to the parent directory, then reply with 553 and terminate</li> 28bda3441225e0607b5ced8b538123fd7c7a417910chrismair * <li>Send an initial reply of 150</li> 29bda3441225e0607b5ced8b538123fd7c7a417910chrismair * <li>Read all available bytes from the data connection and write out to the unique file in the server file system</li> 30bda3441225e0607b5ced8b538123fd7c7a417910chrismair * <li>If file write/store fails, then reply with 553 and terminate</li> 31bda3441225e0607b5ced8b538123fd7c7a417910chrismair * <li>Send a final reply with 226, along with the new unique filename</li> 32bda3441225e0607b5ced8b538123fd7c7a417910chrismair * </ol> 33bda3441225e0607b5ced8b538123fd7c7a417910chrismair * 34bda3441225e0607b5ced8b538123fd7c7a417910chrismair * @author Chris Mair 35bda3441225e0607b5ced8b538123fd7c7a417910chrismair * @version $Revision$ - $Date$ 36bda3441225e0607b5ced8b538123fd7c7a417910chrismair */ 37bda3441225e0607b5ced8b538123fd7c7a417910chrismairpublic class StouCommandHandler extends AbstractStoreFileCommandHandler { 38bda3441225e0607b5ced8b538123fd7c7a417910chrismair 39bda3441225e0607b5ced8b538123fd7c7a417910chrismair /** 40bda3441225e0607b5ced8b538123fd7c7a417910chrismair * @return the message key for the reply message sent with the final (226) reply 41bda3441225e0607b5ced8b538123fd7c7a417910chrismair */ 42bda3441225e0607b5ced8b538123fd7c7a417910chrismair protected String getMessageKey() { 43bda3441225e0607b5ced8b538123fd7c7a417910chrismair return "stou"; 44bda3441225e0607b5ced8b538123fd7c7a417910chrismair } 45bda3441225e0607b5ced8b538123fd7c7a417910chrismair 46bda3441225e0607b5ced8b538123fd7c7a417910chrismair /** 47bda3441225e0607b5ced8b538123fd7c7a417910chrismair * Return the path (absolute or relative) for the output file. 48bda3441225e0607b5ced8b538123fd7c7a417910chrismair */ 49bda3441225e0607b5ced8b538123fd7c7a417910chrismair protected String getOutputFile(Command command) { 50bda3441225e0607b5ced8b538123fd7c7a417910chrismair String baseName = defaultIfNullOrEmpty(command.getOptionalString(0), "Temp"); 51bda3441225e0607b5ced8b538123fd7c7a417910chrismair String suffix = Long.toString(System.currentTimeMillis()); 52bda3441225e0607b5ced8b538123fd7c7a417910chrismair return baseName + suffix; 53bda3441225e0607b5ced8b538123fd7c7a417910chrismair } 54bda3441225e0607b5ced8b538123fd7c7a417910chrismair 55bda3441225e0607b5ced8b538123fd7c7a417910chrismair}