Author: rgoers
Date: Tue Nov 2 14:30:48 2010
New Revision: 1030062
URL: http://svn.apache.org/viewvc?rev=1030062&view=rev
Log:
Fix VFS 305 - add encoding option for FTP provider. Add test case for VFS-322
Added:
commons/proper/vfs/trunk/core/src/test/java/org/apache/commons/vfs/provider/tar/test/LargeTarTestCase.java
Modified:
commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs/provider/ftp/FtpClientFactory.java
commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs/provider/ftp/FtpFileSystemConfigBuilder.java
commons/proper/vfs/trunk/src/changes/changes.xml
Modified:
commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs/provider/ftp/FtpClientFactory.java
URL:
http://svn.apache.org/viewvc/commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs/provider/ftp/FtpClientFactory.java?rev=1030062&r1=1030061&r2=1030062&view=diff
==============================================================================
---
commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs/provider/ftp/FtpClientFactory.java
(original)
+++
commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs/provider/ftp/FtpClientFactory.java
Tue Nov 2 14:30:48 2010
@@ -181,6 +181,14 @@ public final class FtpClientFactory
{
client.enterLocalPassiveMode();
}
+
+ String controlEncoding =
FtpFileSystemConfigBuilder.getInstance().getControlEncoding(fileSystemOptions);
+ if (controlEncoding != null)
+ {
+ client.setControlEncoding(controlEncoding);
+ }
+
+
}
catch (final IOException e)
{
Modified:
commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs/provider/ftp/FtpFileSystemConfigBuilder.java
URL:
http://svn.apache.org/viewvc/commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs/provider/ftp/FtpFileSystemConfigBuilder.java?rev=1030062&r1=1030061&r2=1030062&view=diff
==============================================================================
---
commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs/provider/ftp/FtpFileSystemConfigBuilder.java
(original)
+++
commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs/provider/ftp/FtpFileSystemConfigBuilder.java
Tue Nov 2 14:30:48 2010
@@ -46,6 +46,8 @@ public final class FtpFileSystemConfigBu
FtpFileSystemConfigBuilder.class.getName() +
".SERVER_TIME_ZONE_ID";
private static final String SHORT_MONTH_NAMES =
FtpFileSystemConfigBuilder.class.getName() + ".SHORT_MONTH_NAMES";
+ private static final String ENCODING =
+ FtpFileSystemConfigBuilder.class.getName() + ".ENCODING";
private FtpFileSystemConfigBuilder()
{
@@ -306,4 +308,17 @@ public final class FtpFileSystemConfigBu
setParam(opts, SHORT_MONTH_NAMES, clone);
}
+
+ /**
+ * see {...@link org.apache.commons.net.ftp.FTP#setControlEncoding} for
details and examples.
+ * @param opts The FileSystemOptions.
+ * @param shortMonthNames an array of short month name Strings.
+ */
+ public void setControlEncoding(FileSystemOptions opts, String encoding){
+ setParam(opts, ENCODING, encoding);
+ }
+
+ public String getControlEncoding(FileSystemOptions opts) {
+ return (String) getParam(opts, ENCODING);
+ }
}
Added:
commons/proper/vfs/trunk/core/src/test/java/org/apache/commons/vfs/provider/tar/test/LargeTarTestCase.java
URL:
http://svn.apache.org/viewvc/commons/proper/vfs/trunk/core/src/test/java/org/apache/commons/vfs/provider/tar/test/LargeTarTestCase.java?rev=1030062&view=auto
==============================================================================
---
commons/proper/vfs/trunk/core/src/test/java/org/apache/commons/vfs/provider/tar/test/LargeTarTestCase.java
(added)
+++
commons/proper/vfs/trunk/core/src/test/java/org/apache/commons/vfs/provider/tar/test/LargeTarTestCase.java
Tue Nov 2 14:30:48 2010
@@ -0,0 +1,184 @@
+package org.apache.commons.vfs.provider.tar.test;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+
+import junit.framework.TestCase;
+import org.apache.commons.compress.archivers.ArchiveStreamFactory;
+import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
+import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream;
+import org.apache.commons.compress.compressors.CompressorStreamFactory;
+import org.apache.commons.compress.compressors.gzip.GzipCompressorOutputStream;
+import org.apache.commons.compress.utils.IOUtils;
+import org.apache.commons.vfs.CacheStrategy;
+import org.apache.commons.vfs.FileObject;
+import org.apache.commons.vfs.cache.SoftRefFilesCache;
+import org.apache.commons.vfs.impl.DefaultFileSystemManager;
+import org.apache.commons.vfs.provider.local.DefaultLocalFileProvider;
+import org.apache.commons.vfs.provider.tar.TarFileProvider;
+
+//@SuppressWarnings("nls")
+public class LargeTarTestCase extends TestCase {
+ private final static String baseDir = "target/test-classes/test-data/";
+
+ private DefaultFileSystemManager manager;
+ private final static String largeFilePath = baseDir;
+ private final static String largeFileName = "largefile";
+
+
+ public void setUp() throws Exception {
+ manager = new DefaultFileSystemManager();
+
+ manager.setFilesCache(new SoftRefFilesCache());
+ manager.setCacheStrategy(CacheStrategy.ON_RESOLVE);
+
+ manager.addProvider("file", new DefaultLocalFileProvider());
+ manager.addProvider("tgz", new TarFileProvider());
+ manager.addProvider("tar", new TarFileProvider());
+
+ createLargeFile(largeFilePath, largeFileName);
+ }
+
+ public void testLargeFile() throws Exception {
+ File realFile = new File(largeFilePath + largeFileName + ".tar.gz");
+
+ FileObject file = manager.resolveFile("tgz:file://" +
realFile.getCanonicalPath() + "!/");
+
+ assertNotNull(file);
+ List files = Arrays.asList(file.getChildren());
+
+ assertNotNull(files);
+ assertEquals(1, files.size());
+ FileObject f = (FileObject) files.get(0);
+
+ assertTrue("Expected file not found: " + largeFileName + ".txt",
+ f.getName().getBaseName().equals(largeFileName + ".txt"));
+ }
+
+/*
+ public void testFileCheck() throws Exception {
+ String[] expectedFiles = {
+ "plugins.tsv",
+ "languages.tsv",
+ "browser_type.tsv",
+ "timezones.tsv",
+ "color_depth.tsv",
+ "resolution.tsv",
+ "connection_type.tsv",
+ "search_engines.tsv",
+ "javascript_version.tsv",
+ "operating_systems.tsv",
+ "country.tsv",
+ "browser.tsv"
+ };
+
+ fileCheck(expectedFiles, "tar:file://c:/temp/data/data/data-small.tar");
+ } */
+
+ protected void fileCheck(String[] expectedFiles, String tarFile) throws
Exception {
+ assertNotNull(manager);
+ FileObject file = manager.resolveFile(tarFile);
+
+ assertNotNull(file);
+ List files = Arrays.asList(file.getChildren());
+
+ assertNotNull(files);
+ for(int i=0; i < expectedFiles.length; ++i) {
+ String expectedFile = expectedFiles[i];
+ assertTrue("Expected file not found: " + expectedFile,
fileExists(expectedFile, files));
+ }
+ }
+
+ /**
+ * Search for the expected file in a given list, without using the full path
+ * @param expectedFile
+ * @param files
+ * @return
+ */
+ protected boolean fileExists(String expectedFile, List files) {
+ Iterator iter = files.iterator();
+ while (iter.hasNext()) {
+ FileObject file = (FileObject) iter.next();
+ if(file.getName().getBaseName().equals(expectedFile)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ protected boolean endsWith(String testString, String[] testList) {
+ for(int i=0; i < testList.length; ++i) {
+ String testItem = testList[i];
+ if(testString.endsWith(testItem)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ //@SuppressWarnings("unused")
+ protected void createLargeFile(String path, String name) throws Exception {
+ long _1K = 1024;
+ long _1M = 1024 * _1K;
+ long _256M = 256 * _1M;
+ long _512M = 512 * _1M;
+ long _1G = 1024 * _1M;
+
+ // File size of 3 GB
+ long fileSize = 3 * _1G;
+
+ File tarGzFile = new File(path + name + ".tar.gz");
+
+ if(!tarGzFile.exists()) {
+ System.out.println("This test is a bit slow. It needs to write a 3GB
file to your hard drive");
+
+ // Create archive
+ OutputStream outTarFileStream = new FileOutputStream(path + name +
".tar");
+
+ TarArchiveOutputStream outTarStream = (TarArchiveOutputStream)new
ArchiveStreamFactory()
+ .createArchiveOutputStream(ArchiveStreamFactory.TAR, outTarFileStream);
+
+ // Create archive contents
+ TarArchiveEntry tarArchiveEntry = new TarArchiveEntry(name + ".txt");
+ tarArchiveEntry.setSize(fileSize);
+
+ outTarStream.putArchiveEntry(tarArchiveEntry);
+ for(long i = 0; i < fileSize; i++) {
+ outTarStream.write('a');
+ }
+
+ outTarStream.closeArchiveEntry();
+ outTarStream.close();
+
+ outTarFileStream.close();
+
+ // Create compressed archive
+ OutputStream outGzipFileStream = new FileOutputStream(path + name +
".tar.gz");
+
+ GzipCompressorOutputStream outGzipStream =
(GzipCompressorOutputStream)new CompressorStreamFactory()
+ .createCompressorOutputStream(CompressorStreamFactory.GZIP,
outGzipFileStream);
+
+ // Compress archive
+ InputStream inTarFileStream = new FileInputStream(path + name + ".tar");
+ // TODO: Change to a Piped Stream to conserve disk space
+ IOUtils.copy(inTarFileStream, outGzipStream);
+ inTarFileStream.close();
+
+ outGzipStream.close();
+ outGzipFileStream.close();
+
+ // Cleanup original tar
+ File tarFile = new File(path + name + ".tar");
+ if(tarFile.exists()) {
+ tarFile.delete();
+ }
+ }
+ }
+}
Modified: commons/proper/vfs/trunk/src/changes/changes.xml
URL:
http://svn.apache.org/viewvc/commons/proper/vfs/trunk/src/changes/changes.xml?rev=1030062&r1=1030061&r2=1030062&view=diff
==============================================================================
--- commons/proper/vfs/trunk/src/changes/changes.xml (original)
+++ commons/proper/vfs/trunk/src/changes/changes.xml Tue Nov 2 14:30:48 2010
@@ -23,6 +23,9 @@
<body>
<release version="2.0" date="in SVN" description="">
+ <action dev="rgoers" type="fix" issue="VFS-305" due-to="Tom">
+ Add encoding option to FTP provider.
+ </action>
<action dev="rgoers" type="fix" issue="VFS-315" due-to="David
Hausladen">
Fix potential NullPointerException if the DavProperty is null or
contains null values.
</action>