You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by ng...@apache.org on 2008/12/01 21:54:54 UTC
svn commit: r722225 - in /mina/ftpserver/trunk/core/src:
main/java/org/apache/ftpserver/command/
main/java/org/apache/ftpserver/command/impl/
main/java/org/apache/ftpserver/filesystem/nativefs/impl/
main/resources/org/apache/ftpserver/message/ test/jav...
Author: ngn
Date: Mon Dec 1 12:54:54 2008
New Revision: 722225
URL: http://svn.apache.org/viewvc?rev=722225&view=rev
Log:
Implement the MFMT command (FTPSERVER-224)
Added:
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/impl/MFMT.java
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/clienttests/MFMTTest.java
Modified:
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/CommandFactoryFactory.java
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/filesystem/nativefs/impl/NativeFtpFile.java
mina/ftpserver/trunk/core/src/main/resources/org/apache/ftpserver/message/FtpStatus.properties
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/commands/impl/listing/LISTFileFormaterTest.java
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/commands/impl/listing/MLSTFileFormaterTest.java
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/commands/impl/listing/NLSTFileFormaterTest.java
Modified: mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/CommandFactoryFactory.java
URL: http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/CommandFactoryFactory.java?rev=722225&r1=722224&r2=722225&view=diff
==============================================================================
--- mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/CommandFactoryFactory.java (original)
+++ mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/CommandFactoryFactory.java Mon Dec 1 12:54:54 2008
@@ -39,6 +39,7 @@
import org.apache.ftpserver.command.impl.LIST;
import org.apache.ftpserver.command.impl.MD5;
import org.apache.ftpserver.command.impl.MDTM;
+import org.apache.ftpserver.command.impl.MFMT;
import org.apache.ftpserver.command.impl.MKD;
import org.apache.ftpserver.command.impl.MLSD;
import org.apache.ftpserver.command.impl.MLST;
@@ -95,6 +96,7 @@
DEFAULT_COMMAND_MAP.put("LANG", new LANG());
DEFAULT_COMMAND_MAP.put("LIST", new LIST());
DEFAULT_COMMAND_MAP.put("MD5", new MD5());
+ DEFAULT_COMMAND_MAP.put("MFMT", new MFMT());
DEFAULT_COMMAND_MAP.put("MMD5", new MD5());
DEFAULT_COMMAND_MAP.put("MDTM", new MDTM());
DEFAULT_COMMAND_MAP.put("MLST", new MLST());
Added: mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/impl/MFMT.java
URL: http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/impl/MFMT.java?rev=722225&view=auto
==============================================================================
--- mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/impl/MFMT.java (added)
+++ mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/impl/MFMT.java Mon Dec 1 12:54:54 2008
@@ -0,0 +1,163 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.ftpserver.command.impl;
+
+import java.io.IOException;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.TimeZone;
+
+import org.apache.ftpserver.command.AbstractCommand;
+import org.apache.ftpserver.ftplet.FtpFile;
+import org.apache.ftpserver.ftplet.FtpReply;
+import org.apache.ftpserver.ftplet.FtpRequest;
+import org.apache.ftpserver.impl.FtpIoSession;
+import org.apache.ftpserver.impl.FtpServerContext;
+import org.apache.ftpserver.impl.LocalizedFtpReply;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Command for changing the modified time of a file.
+ * <p>
+ * Specified in the following document:
+ * http://www.omz13.com/downloads/draft-somers-ftp-mfxx-00.html#anchor8
+ * </p>
+ * @author The Apache MINA Project (dev@mina.apache.org)
+ * @version $Rev$, $Date$
+ */
+public class MFMT extends AbstractCommand {
+
+ private final Logger LOG = LoggerFactory.getLogger(MFMT.class);
+
+ /**
+ * Execute command.
+ */
+ public void execute(final FtpIoSession session,
+ final FtpServerContext context, final FtpRequest request)
+ throws IOException {
+
+ DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
+
+ // reset state variables
+ session.resetState();
+
+ String argument = request.getArgument();
+
+ if (argument == null || argument.trim().length() == 0) {
+ session
+ .write(LocalizedFtpReply
+ .translate(
+ session,
+ request,
+ context,
+ FtpReply.REPLY_501_SYNTAX_ERROR_IN_PARAMETERS_OR_ARGUMENTS,
+ "MFMT.invalid", null));
+ return;
+ }
+
+ String[] arguments = argument.split(" ");
+
+ if(arguments.length != 2) {
+ session
+ .write(LocalizedFtpReply
+ .translate(
+ session,
+ request,
+ context,
+ FtpReply.REPLY_501_SYNTAX_ERROR_IN_PARAMETERS_OR_ARGUMENTS,
+ "MFMT.invalid", null));
+ return;
+ }
+
+ String timestamp = arguments[0].trim();
+
+ df.setLenient(false);
+ df.setTimeZone(TimeZone.getTimeZone("GMT"));
+
+ try {
+ Date time = df.parse(timestamp);
+
+ String fileName = arguments[1].trim();
+
+ // get file object
+ FtpFile file = null;
+
+ try {
+ file = session.getFileSystemView().getFile(fileName);
+ } catch (Exception ex) {
+ LOG.debug("Exception getting the file object: " + fileName, ex);
+ }
+
+ if (file == null || !file.doesExist()) {
+ session
+ .write(LocalizedFtpReply
+ .translate(
+ session,
+ request,
+ context,
+ FtpReply.REPLY_550_REQUESTED_ACTION_NOT_TAKEN,
+ "MFMT.filemissing", fileName));
+ return;
+ }
+
+ // check file
+ if (!file.isFile()) {
+ session
+ .write(LocalizedFtpReply
+ .translate(
+ session,
+ request,
+ context,
+ FtpReply.REPLY_501_SYNTAX_ERROR_IN_PARAMETERS_OR_ARGUMENTS,
+ "MFMT.invalid", null));
+ return;
+ }
+
+ // all checks okay, lets go
+ file.setLastModified(time.getTime());
+
+ session
+ .write(LocalizedFtpReply
+ .translate(
+ session,
+ request,
+ context,
+ FtpReply.REPLY_213_FILE_STATUS,
+ "MFMT", "ModifyTime=" + timestamp + " " + fileName));
+ return;
+
+ } catch (ParseException e) {
+ session
+ .write(LocalizedFtpReply
+ .translate(
+ session,
+ request,
+ context,
+ FtpReply.REPLY_501_SYNTAX_ERROR_IN_PARAMETERS_OR_ARGUMENTS,
+ "MFMT.invalid", null));
+ return;
+ }
+
+
+ }
+}
Modified: mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/filesystem/nativefs/impl/NativeFtpFile.java
URL: http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/filesystem/nativefs/impl/NativeFtpFile.java?rev=722225&r1=722224&r2=722225&view=diff
==============================================================================
--- mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/filesystem/nativefs/impl/NativeFtpFile.java (original)
+++ mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/filesystem/nativefs/impl/NativeFtpFile.java Mon Dec 1 12:54:54 2008
@@ -187,6 +187,13 @@
}
/**
+ * {@inheritDoc}
+ */
+ public void setLastModified(long time) {
+ file.setLastModified(time);
+ }
+
+ /**
* Check read permission.
*/
public boolean isReadable() {
Modified: mina/ftpserver/trunk/core/src/main/resources/org/apache/ftpserver/message/FtpStatus.properties
URL: http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/main/resources/org/apache/ftpserver/message/FtpStatus.properties?rev=722225&r1=722224&r2=722225&view=diff
==============================================================================
--- mina/ftpserver/trunk/core/src/main/resources/org/apache/ftpserver/message/FtpStatus.properties (original)
+++ mina/ftpserver/trunk/core/src/main/resources/org/apache/ftpserver/message/FtpStatus.properties Mon Dec 1 12:54:54 2008
@@ -67,7 +67,7 @@
425.EPSV=Can't open passive connection.
229.EPSV=Entering Passive Mode ({output.msg})
-211.FEAT=Extensions supported\n SIZE\n MDTM\n REST STREAM\n LANG en;zh-tw;ja;is\n MLST Size;Modify;Type;Perm\n AUTH SSL\n AUTH TLS\n MODE Z\n UTF8\n TVFS\n MD5\n MMD5\nEnd
+211.FEAT=Extensions supported\n SIZE\n MDTM\n REST STREAM\n LANG en;zh-tw;ja;is\n MLST Size;Modify;Type;Perm\n AUTH SSL\n AUTH TLS\n MODE Z\n UTF8\n TVFS\n MD5\n MMD5\n MFMT\nEnd
214=The following commands are implemented.\nABOR APPE CDUP CWD DELE HELP LIST MDTM\nMKD MODE NLST NOOP PASS PASV PORT PWD\nQUIT REST RETR RMD RNFR RNTO SITE SIZE\nSTAT STOR STOU STRU SYST TYPE USER\nEnd of help.
214.ABOR=Syntax\: ABOR
@@ -273,4 +273,8 @@
251.MD5={output.msg}
252.MMD5={output.msg}
504.MD5.invalid=Command Not Implemented for the Specified Argument
-502.MD5.notimplemened=Command Not Implemented
\ No newline at end of file
+502.MD5.notimplemened=Command Not Implemented
+
+501.MFMT={output.msg}
+501.MFMT.invalid=Command Not Implemented for the Specified Arguments
+550.MFMT.filemissing=File missing {output.msg}
\ No newline at end of file
Added: mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/clienttests/MFMTTest.java
URL: http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/clienttests/MFMTTest.java?rev=722225&view=auto
==============================================================================
--- mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/clienttests/MFMTTest.java (added)
+++ mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/clienttests/MFMTTest.java Mon Dec 1 12:54:54 2008
@@ -0,0 +1,131 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.ftpserver.clienttests;
+
+import java.io.File;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.TimeZone;
+
+/**
+*
+* @author The Apache MINA Project (dev@mina.apache.org)
+* @version $Rev$, $Date$
+*
+*/
+public class MFMTTest extends ClientTestTemplate {
+ private static final File TEST_FILE1 = new File(ROOT_DIR, "test1.txt");
+
+ private static final File TEST_DIR1 = new File(ROOT_DIR, "dir1");
+
+ private static final File TEST_FILE_IN_DIR1 = new File(TEST_DIR1,
+ "test4.txt");
+
+ private static final Calendar EXPECTED_TIME = new GregorianCalendar(2002, 6, 17, 21, 7, 15);
+ static {
+ EXPECTED_TIME.setTimeZone(TimeZone.getTimeZone("GMT"));
+ }
+
+
+ protected void setUp() throws Exception {
+ super.setUp();
+
+ assertTrue(TEST_FILE1.createNewFile());
+ assertTrue(TEST_DIR1.mkdir());
+ assertTrue(TEST_FILE_IN_DIR1.createNewFile());
+
+
+ client.login(ADMIN_USERNAME, ADMIN_PASSWORD);
+ }
+
+ public void testNoArgument() throws Exception {
+ // must return 500 or 501 errors
+ assertEquals(501, client.sendCommand("MFMT"));
+ }
+
+ public void testSingleArgument() throws Exception {
+ // must return 500 or 501 errors
+ assertEquals(501, client.sendCommand("MFMT", "20020717210715 "));
+ }
+
+ public void testNoManyArguments() throws Exception {
+ // must return 500 or 501 errors
+ assertEquals(501, client.sendCommand("MFMT", "20020717210715 test1.txt too many"));
+ }
+
+ public void testNonTimestampArgument() throws Exception {
+ // must return 500 or 501 errors
+ assertEquals(501, client.sendCommand("MFMT", "incorrect test1.txt"));
+ }
+
+ public void testNegativeTimestamp() throws Exception {
+ // must return 500 or 501 errors
+ assertEquals(501, client.sendCommand("MFMT", "-20020717210715 test1.txt"));
+ }
+
+ public void testIncorrectTimestamp() throws Exception {
+ // must return 500 or 501 errors
+ assertEquals(501, client.sendCommand("MFMT", "20021317210715 test1.txt"));
+ }
+
+ public void testNotCompleteTimestamp() throws Exception {
+ // must return 500 or 501 errors
+ assertEquals(501, client.sendCommand("MFMT", "20021317 test1.txt"));
+ }
+
+
+ public void testNonExistingFile() throws Exception {
+ // should return 550
+ assertEquals(550, client.sendCommand("MFMT", "20020717210715 dummy.txt"));
+ }
+
+ public void testDirectory() throws Exception {
+ // should return 550
+ assertEquals(501, client.sendCommand("MFMT", "20020717210715 " + TEST_DIR1.getName()));
+ }
+
+
+ public void testFeatures() throws Exception {
+ client.sendCommand("FEAT");
+
+ String result = client.getReplyString();
+
+ assertTrue(result.contains(" MFMT\r\n"));
+ }
+
+ @SuppressWarnings("deprecation")
+ public void testSetTime() throws Exception {
+
+ assertEquals(213, client.sendCommand("MFMT", "20020717210715 test1.txt"));
+
+ assertEquals(EXPECTED_TIME.getTimeInMillis(),TEST_FILE1.lastModified());
+ }
+
+ @SuppressWarnings("deprecation")
+ public void testSetTimeFullPath() throws Exception {
+ assertEquals(213, client.sendCommand("MFMT", "20020717210715 dir1/test4.txt"));
+
+ assertEquals(EXPECTED_TIME.getTimeInMillis(), TEST_FILE_IN_DIR1.lastModified());
+ }
+
+}
Modified: mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/commands/impl/listing/LISTFileFormaterTest.java
URL: http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/commands/impl/listing/LISTFileFormaterTest.java?rev=722225&r1=722224&r2=722225&view=diff
==============================================================================
--- mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/commands/impl/listing/LISTFileFormaterTest.java (original)
+++ mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/commands/impl/listing/LISTFileFormaterTest.java Mon Dec 1 12:54:54 2008
@@ -129,6 +129,11 @@
public boolean move(FtpFile destination) {
return false;
}
+
+ public void setLastModified(long time) {
+ // TODO Auto-generated method stub
+
+ }
}
public void testSingleFile() {
Modified: mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/commands/impl/listing/MLSTFileFormaterTest.java
URL: http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/commands/impl/listing/MLSTFileFormaterTest.java?rev=722225&r1=722224&r2=722225&view=diff
==============================================================================
--- mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/commands/impl/listing/MLSTFileFormaterTest.java (original)
+++ mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/commands/impl/listing/MLSTFileFormaterTest.java Mon Dec 1 12:54:54 2008
@@ -125,6 +125,11 @@
public boolean move(FtpFile destination) {
return false;
}
+
+ public void setLastModified(long time) {
+ // TODO Auto-generated method stub
+
+ }
}
public void testSingleFile() {
Modified: mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/commands/impl/listing/NLSTFileFormaterTest.java
URL: http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/commands/impl/listing/NLSTFileFormaterTest.java?rev=722225&r1=722224&r2=722225&view=diff
==============================================================================
--- mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/commands/impl/listing/NLSTFileFormaterTest.java (original)
+++ mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/commands/impl/listing/NLSTFileFormaterTest.java Mon Dec 1 12:54:54 2008
@@ -121,6 +121,11 @@
public boolean move(FtpFile destination) {
return false;
}
+
+ public void setLastModified(long time) {
+ // TODO Auto-generated method stub
+
+ }
}
public void testSingleFile() {