scohen 2005/05/28 10:05:44
Modified: src/main/org/apache/tools/ant/taskdefs/optional/net
FTPConfigurator.java FTP.java
src/testcases/org/apache/tools/ant/taskdefs/optional/net
FTPTest.java
src/etc/testcases/taskdefs/optional/net ftp.xml
Log:
Convert ftp task systemTypeKey and timestampGranularity attributes to using
the EnumeratedAttribute pattern
and add some JUnit tests of the new configuration stuff.
Revision Changes Path
1.3 +4 -1
ant/src/main/org/apache/tools/ant/taskdefs/optional/net/FTPConfigurator.java
Index: FTPConfigurator.java
===================================================================
RCS file:
/home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/optional/net/FTPConfigurator.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- FTPConfigurator.java 14 May 2005 13:14:14 -0000 1.2
+++ FTPConfigurator.java 28 May 2005 17:05:44 -0000 1.3
@@ -37,14 +37,17 @@
* @return the client as configured.
*/
static FTPClient configure(FTPClient client, FTP task) {
+ task.log("custom configuration", Project.MSG_VERBOSE);
FTPClientConfig config;
String systemTypeKey = task.getSystemTypeKey();
- if (systemTypeKey != null) {
+ if (systemTypeKey != null && !"".equals(systemTypeKey)) {
config = new FTPClientConfig(systemTypeKey);
task.log("custom config: system key = "
+ systemTypeKey, Project.MSG_VERBOSE);
} else {
config = new FTPClientConfig();
+ task.log("custom config: system key = default (UNIX)",
+ Project.MSG_VERBOSE);
}
String defaultDateFormatConfig = task.getDefaultDateFormatConfig();
1.75 +91 -33
ant/src/main/org/apache/tools/ant/taskdefs/optional/net/FTP.java
Index: FTP.java
===================================================================
RCS file:
/home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/optional/net/FTP.java,v
retrieving revision 1.74
retrieving revision 1.75
diff -u -r1.74 -r1.75
--- FTP.java 22 May 2005 18:48:42 -0000 1.74
+++ FTP.java 28 May 2005 17:05:44 -0000 1.75
@@ -101,6 +101,7 @@
private boolean verbose = false;
private boolean newerOnly = false;
private long timeDiffMillis = 0;
+ private long granularityMillis = 0L;
private boolean timeDiffAuto = false;
private int action = SEND_FILES;
private Vector filesets = new Vector();
@@ -114,14 +115,13 @@
private boolean preserveLastModified = false;
private String chmod = null;
private String umask = null;
- private String systemTypeKey = null;
+ private FTPSystemType systemTypeKey = FTPSystemType.getDefault();
private String defaultDateFormatConfig = null;
private String recentDateFormatConfig = null;
private String serverLanguageCodeConfig = null;
private String serverTimeZoneConfig = null;
private String shortMonthNamesConfig = null;
- private String timestampGranularity = null;
- private long serverTimestampGranularity = 0L;
+ private Granularity timestampGranularity = Granularity.getDefault();
private boolean isConfigurationSet = false;
protected static final String[] ACTION_STRS = {
@@ -1268,8 +1268,8 @@
* the default value of null will be kept.
* @see org.apache.commons.net.ftp.FTPClientConfig
*/
- public void setSystemTypeKey(String systemKey) {
- if (systemKey != null && !systemKey.equals(""))
+ public void setSystemTypeKey(FTPSystemType systemKey) {
+ if (systemKey != null && !systemKey.getValue().equals(""))
{
this.systemTypeKey = systemKey;
configurationHasBeenSet();
@@ -1361,7 +1361,7 @@
* @return Returns the systemTypeKey.
*/
String getSystemTypeKey() {
- return systemTypeKey;
+ return systemTypeKey.getValue();
}
/**
* @return Returns the defaultDateFormatConfig.
@@ -1396,13 +1396,13 @@
/**
* @return Returns the timestampGranularity.
*/
- String getTimestampGranularity() {
+ Granularity getTimestampGranularity() {
return timestampGranularity;
}
/**
* @param timestampGranularity The timestampGranularity to set.
*/
- public void setTimestampGranularity(String timestampGranularity) {
+ public void setTimestampGranularity(Granularity timestampGranularity) {
if (null == timestampGranularity || "".equals(timestampGranularity))
{
return;
}
@@ -1517,29 +1517,8 @@
}
} else {
if (this.newerOnly) {
- if (action == SEND_FILES) {
- if
("NONE".equalsIgnoreCase(this.timestampGranularity))
- {
- this.serverTimestampGranularity = 0L;
- }
- else if
("MINUTE".equalsIgnoreCase(this.timestampGranularity))
- {
- this.serverTimestampGranularity =
GRANULARITY_MINUTE;
- }
- else
- {
- this.serverTimestampGranularity =
GRANULARITY_MINUTE;
- }
- } else if (action == GET_FILES) {
- if
("MINUTE".equalsIgnoreCase(this.timestampGranularity))
- {
- this.serverTimestampGranularity =
GRANULARITY_MINUTE;
- }
- else
- {
- this.serverTimestampGranularity = 0L;
- }
- }
+ this.granularityMillis =
+ this.timestampGranularity.getMilliseconds(action);
}
for (int i = 0; i < dsfiles.length; i++) {
switch (action) {
@@ -1799,13 +1778,13 @@
if (this.action == SEND_FILES) {
return remoteTimestamp
+ this.timeDiffMillis
- + this.serverTimestampGranularity
+ + this.granularityMillis
>= localTimestamp;
} else {
return localTimestamp
>= remoteTimestamp
+ this.timeDiffMillis
- + this.serverTimestampGranularity;
+ + this.granularityMillis;
}
}
@@ -2300,5 +2279,84 @@
return SEND_FILES;
}
}
+ /**
+ * represents one of the valid timestamp adjustment values
+ * recognized by the <code>timestampGranularity</code> attribute.<p>
+
+ * A timestamp adjustment may be used in file transfers for checking
+ * uptodateness. MINUTE means to add one minute to the server
+ * timestamp. This is done because FTP servers typically list
+ * timestamps HH:mm and client FileSystems typically use HH:mm:ss.
+ *
+ * The default is to use MINUTE for PUT actions and NONE for GET
+ * actions, since GETs have the <code>preserveLastModified</code>
+ * option, which takes care of the problem in most use cases where
+ * this level of granularity is an issue.
+ *
+ */
+ public static class Granularity extends EnumeratedAttribute {
+
+ private static final String[] VALID_GRANULARITIES = {
+ "", "MINUTE", "NONE"
+ };
+ /*
+ * @return the list of valid Granularity values
+ */
+ public String[] getValues() {
+ // TODO Auto-generated method stub
+ return VALID_GRANULARITIES;
+ }
+ /**
+ * returns the number of milliseconds associated with
+ * the attribute, which can vary in some cases depending
+ * on the value of the action parameter.
+ * @param action SEND_FILES or GET_FILES
+ * @return the number of milliseconds associated with
+ * the attribute, in the context of the supplied action
+ */
+ public long getMilliseconds(int action) {
+ String granularityU = getValue().toUpperCase(Locale.US);
+ long granularity = 0L;
+ if ("".equals(granularityU)) {
+ if (action == SEND_FILES) {
+ return GRANULARITY_MINUTE;
+ }
+ } else if ("MINUTE".equals(granularityU)) {
+ return GRANULARITY_MINUTE;
+ }
+ return 0L;
+ }
+ static final Granularity getDefault() {
+ Granularity g = new Granularity();
+ g.setValue("");
+ return g;
+ }
+
+ }
+ /**
+ * one of the valid system type keys recognized by the systemTypeKey
+ * attribute.
+ */
+ public static class FTPSystemType extends EnumeratedAttribute {
+
+ private static final String[] VALID_SYSTEM_TYPES = {
+ "", "UNIX", "VMS", "WINDOWS", "OS/2", "OS/400",
+ "MVS"
+ };
+
+
+ /*
+ * @return the list of valid system types.
+ */
+ public String[] getValues() {
+ return VALID_SYSTEM_TYPES;
+ }
+
+ static final FTPSystemType getDefault() {
+ FTPSystemType ftpst = new FTPSystemType();
+ ftpst.setValue("");
+ return ftpst;
+ }
+ }
}
1.17 +115 -12
ant/src/testcases/org/apache/tools/ant/taskdefs/optional/net/FTPTest.java
Index: FTPTest.java
===================================================================
RCS file:
/home/cvs/ant/src/testcases/org/apache/tools/ant/taskdefs/optional/net/FTPTest.java,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -r1.16 -r1.17
--- FTPTest.java 22 May 2005 02:58:47 -0000 1.16
+++ FTPTest.java 28 May 2005 17:05:44 -0000 1.17
@@ -16,25 +16,23 @@
*/
package org.apache.tools.ant.taskdefs.optional.net;
+import java.io.File;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Vector;
+
+import org.apache.commons.net.ftp.FTPClient;
import org.apache.tools.ant.BuildEvent;
import org.apache.tools.ant.BuildFileTest;
-import org.apache.tools.ant.BuildListener;
-import org.apache.tools.ant.BuildLogger;
import org.apache.tools.ant.DefaultLogger;
import org.apache.tools.ant.DirectoryScanner;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.taskdefs.condition.Os;
import org.apache.tools.ant.types.FileSet;
-import org.apache.tools.ant.taskdefs.optional.net.FTP;
-import org.apache.tools.ant.util.JavaEnvUtils;
import org.apache.tools.ant.util.regexp.RegexpMatcher;
import org.apache.tools.ant.util.regexp.RegexpMatcherFactory;
-import org.apache.tools.ant.taskdefs.condition.Os;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.Vector;
-
-import org.apache.commons.net.ftp.FTPClient;
public class FTPTest extends BuildFileTest{
// keep track of what operating systems are supported here.
@@ -593,6 +591,42 @@
}
/**
+ * This class enables the use of the log to count the number
+ * of times a message has been emitted.
+ */
+ private class LogCounter extends DefaultLogger {
+ private Map searchMap = new HashMap();
+ private int matchCount;
+
+ public void addLogMessageToSearch(String message) {
+ searchMap.put(message, new Integer(0));
+ }
+
+ /*
+ * @param event the build event that is being logged.
+ */
+ public void messageLogged(BuildEvent event) {
+ String message = event.getMessage();
+ Integer mcnt = (Integer) searchMap.get(message);
+ if (null != mcnt) {
+ searchMap.put(message, new Integer(mcnt.intValue() + 1));
+ }
+ super.messageLogged(event);
+ }
+
+ /**
+ * @return the number of times that the looked for message was sent
+ * to the log
+ */
+ public int getMatchCount(String message) {
+ Integer mcnt = (Integer) searchMap.get(message);
+ if (null != mcnt) {
+ return mcnt.intValue();
+ }
+ return 0;
+ }
+ }
+ /**
* Tests the combination of the newer parameter and the
* serverTimezoneConfig parameter in the PUT action. The default
* configuration is an ftp server on localhost which formats
@@ -619,7 +653,76 @@
getProject().executeTarget("timed.test.get.older");
assertEquals(3, log.getCount());
}
+
+
+ /**
+ * Tests that the presence of one of the server config params forces
+ * the system type to Unix if not specified.
+ */
+ public void testConfiguration1() {
+ int[] expectedCounts = {
+ 1,1,0,1,0,0
+ };
+ performConfigTest("configuration.1", expectedCounts);
+
+ }
+
+ /**
+ * Tests the systemTypeKey attribute.
+ */
+ public void testConfiguration2() {
+ int[] expectedCounts = {
+ 1,0,0,1,1,0
+ };
+ performConfigTest("configuration.2", expectedCounts);
+
+ }
+
+ /**
+ * Tests the systemTypeKey attribute with UNIX specified.
+ */
+ public void testConfiguration3() {
+ int[] expectedCounts = {
+ 1,0,1,0,0,1
+ };
+ performConfigTest("configuration.3", expectedCounts);
+
+ }
+ /**
+ * Tests the systemTypeKey attribute.
+ */
+ public void testConfigurationNone() {
+ int[] expectedCounts = {
+ 0,0,0,0,0,0
+ };
+ performConfigTest("configuration.none", expectedCounts);
+
+ }
+
+ private void performConfigTest(String target, int[] expectedCounts) {
+ String[] messages = new String[]{
+ "custom configuration",
+ "custom config: system key = default (UNIX)",
+ "custom config: system key = UNIX",
+ "custom config: server time zone ID = " +
getProject().getProperty("ftp.server.timezone"),
+ "custom config: system key = WINDOWS",
+ "custom config: default date format = yyyy/MM/dd HH:mm"
+
+ };
+ LogCounter counter = new LogCounter();
+ for (int i=0; i < messages.length; i++) {
+ counter.addLogMessageToSearch(messages[i]);
+ }
+
+ getProject().addBuildListener(counter);
+ getProject().executeTarget(target);
+ for (int i=0; i < messages.length; i++) {
+ assertEquals("target "+target+":message "+ i, expectedCounts[i],
counter.getMatchCount(messages[i]));
+ }
+
+ }
+
/**
* this test is inspired by a user reporting that deletions of
directories with the ftp task do not work
*/
1.11 +55 -0 ant/src/etc/testcases/taskdefs/optional/net/ftp.xml
Index: ftp.xml
===================================================================
RCS file: /home/cvs/ant/src/etc/testcases/taskdefs/optional/net/ftp.xml,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- ftp.xml 22 May 2005 18:48:42 -0000 1.10
+++ ftp.xml 28 May 2005 17:05:44 -0000 1.11
@@ -14,6 +14,7 @@
<property name="tstamp.format" value="yyyy-MM-dd HH:mm"/>
<property name="server.timestamp.granularity.millis" value="60000"/>
<property name="ftp.server.timezone" value="GMT"/>
+ <property name="ftp.listing.file" value="/dev/null"/>
<fileset dir="${tmp.get.dir}" id="fileset-destination-with-selector">
<include name="alpha/**"/>
@@ -191,5 +192,59 @@
</fileset>
</ftp>
</target>
+
+ <target name="configuration.1">
+ <ftp action="list"
+ server="${ftp.host}"
+ userid="${ftp.user}"
+ password="${ftp.password}"
+ separator="${ftp.filesep}"
+ remotedir="${tmp.remote}"
+ serverTimeZoneConfig="${ftp.server.timezone}"
+ listing="${ftp.listing.file}"
+ >
+ <fileset dir="${tmp.local}"/>
+ </ftp>
+ </target>
+ <target name="configuration.2">
+ <ftp action="list"
+ server="${ftp.host}"
+ userid="${ftp.user}"
+ password="${ftp.password}"
+ separator="${ftp.filesep}"
+ remotedir="${tmp.remote}"
+ serverTimeZoneConfig="${ftp.server.timezone}"
+ listing="${ftp.listing.file}"
+ systemTypeKey="WINDOWS"
+ >
+ <fileset dir="${tmp.local}"/>
+ </ftp>
+ </target>
+ <target name="configuration.3">
+ <ftp action="list"
+ server="${ftp.host}"
+ userid="${ftp.user}"
+ password="${ftp.password}"
+ separator="${ftp.filesep}"
+ remotedir="${tmp.remote}"
+ defaultDateFormatConfig="yyyy/MM/dd HH:mm"
+ listing="${ftp.listing.file}"
+ systemTypeKey="UNIX"
+ >
+ <fileset dir="${tmp.local}"/>
+ </ftp>
+ </target>
+ <target name="configuration.none">
+ <ftp action="list"
+ server="${ftp.host}"
+ userid="${ftp.user}"
+ password="${ftp.password}"
+ separator="${ftp.filesep}"
+ remotedir="${tmp.remote}"
+ listing="${ftp.listing.file}"
+ >
+ <fileset dir="${tmp.local}"/>
+ </ftp>
+ </target>
</project>
\ No newline at end of file
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]