Albert
Thanks so much for your suggestion. In my environment, I tried to make the changes you suggested, however the

   *org.apache.commons.net.ftp.FtpClient*

class in my environment does not support *setAutodetectUTF8(boolean)*.

Instead, I changed my version of *FtpClientFactory *so that *setControlEncoding()* is invoked before the connection is made, see green block below.

   76           FTPFileEntryParserFactory myFactory =
   77
   
FtpFileSystemConfigBuilder.getInstance().getEntryParserFactory(fileSystemOptions);
   78            if (myFactory != null)
   79            {
   80                client.setParserFactory(myFactory);
   81            }
   82
   83            try
   84            {
   85                String controlEncoding =
   
FtpFileSystemConfigBuilder.getInstance().getControlEncoding(fileSystemOptions);
   86                if (controlEncoding != null)
   87                {
   88 client.setControlEncoding(controlEncoding);
   89                }
   90                client.connect(hostname, port);
   91
   92                int reply = client.getReplyCode();

After building *commons-vfs2-2.0.jar*, the above change allowed my testcase to pass and I was able to see the correct file names on my target system.

I note that the javadoc for FtpClient.setAutodetectUTF8() <https://commons.apache.org/proper/commons-net/apidocs/org/apache/commons/net/ftp/FTPClient.html#setAutodetectUTF8%28boolean%29> does mention that it should be "/invoked before a connection is established/". Perhaps the same is true fororg.apache.commons.net.ftp.Ftp.setControlEncoding() <https://commons.apache.org/proper/commons-net/apidocs/org/apache/commons/net/ftp/FTP.html#setControlEncoding%28java.lang.String%29>.

Thanks
Geoff

On 09/04/2015 21:05, Albert Briner wrote:
Geoff,

Nicely put together test case. I was able to reproduce your outcome closely 
(different FTP server).

What made it work for me was the following change to the VFS source:

Index: FtpClientFactory.java
===================================================================
--- FtpClientFactory.java       (revision 1535203)
+++ FtpClientFactory.java       (working copy)
@@ -150,7 +150,11 @@
                      {
                          client.setControlEncoding(controlEncoding);
                      }
-
+                    else
+                    {
+                        client.setAutodetectUTF8(true);
+                    }
+
                      client.connect(hostname, port);
final int reply = client.getReplyCode();


… and then not specify any encoding in the test code. I don't know whether this 
is the right thing to do in general, but it made all your test cases succeed 
for me.

Albert


On 16/03/2015 11:07, Geoff Watters wrote:
All

I am using*commons-vfs2-2.0.jar* and am running into problems when
file names contain non-ascii characters. According to
https://issues.apache.org/jira/browse/VFS-305 this has been
fixed/shipped in 2.0. In my environment I am able to create such file
names when using ftp on the command-line (Red Hat Enterprise Linux
Server release 5.8 (Tikanga)).

When I execute the following sample code, I get the output shown below.

public class FtpTest {
     public static void main(String[] args) throws FileSystemException
     {
         String host="hhh";
         String user = "uuu";
         String password = "ppp";
         String destDir = "/tmp";
         FileSystemOptions opts = new FileSystemOptions();
FtpFileSystemConfigBuilder.getInstance().setControlEncoding(opts,
"UTF-8");

         DefaultFileSystemManager manager = new
DefaultFileSystemManager();
         manager.addProvider("ftp", new FtpFileProvider());
         manager.init();

         String root="ftp://"+user+":"+password+"@"+host+destDir;
         // Specify a number of directories that should be created
under destDir
         String[] lRoots = new String[4];
         lRoots[0]= root+"/ftpDebug";
         lRoots[1]= root+"/ftp\u7684Debug";  // insert a non-ascii char
         lRoots[2]= root+"/ftp\u7685Debug";  // insert a different
non-ascii char
         lRoots[3]= root+"/ftp\u7684Debug";  // insert the same
non-ascii char

         // Verify the ControlEncoding
         System.out.println("ControlEncoding is
"+FtpFileSystemConfigBuilder.getInstance().getControlEncoding(opts));

         int dirCount=0;
         for (String lRoot: lRoots) {
             System.out.println(dirCount+") Process directory
["+lRoot+"]");
             FileObject newDir = manager.resolveFile(lRoot, opts);
             if (!newDir.exists()) {
                 try {
                     System.out.println(dirCount+") "+lRoot+" ::Dir
Does Not Exist so Create It ");
                     newDir.createFolder();
                     if (newDir.exists())
                         System.out.println(dirCount+") "+lRoot+"
::Creation Successful ");
                     else
                         System.out.println(dirCount+") "+lRoot+"
::Creation Fails ");
                 }
                 catch (Exception ex) {
                     System.out.println(dirCount+") "+lRoot + " raised
"+ex);
                 }
             }
             else
                 System.out.println(dirCount+") "+lRoot+" ::Dir Already
Exists ");
             dirCount++;
         }
     }
}

The output from running the above is:-

ControlEncoding is UTF-8
0) Process directory [ftp://uuu:ppp@hhh/tmp/ftpDebug]
0) ftp://uuu:ppp@hhh/tmp/ftpDebug ::Dir Does Not Exist so Create It
0) ftp://uuu:ppp@hhh/tmp/ftpDebug ::Creation Successful
1) Process directory [ftp://uuu:ppp@hhh/tmp/ftpªDebug]
1) ftp://uuu:ppp@hhh/tmp/ftpªDebug ::Dir Does Not Exist so Create It
1) ftp://uuu:ppp@hhh/tmp/ftpªDebug ::Creation Successful
2) Process directory [ftp://uuu:ppp@hhh/tmp/ftp%Gçš…%@Debug]
2) ftp://uuu:ppp@hhh/tmp/ftp%Gçš…%@Debug ::Dir Does Not Exist so
Create It
2) ftp://uuu:ppp@hhh/tmp/ftp%Gçš…%@Debug raised
org.apache.commons.vfs2.FileSystemException: Could not create
folder "ftp://uuu:***@hhh/tmp/ftp%Gçš…%@Debug".
3) Process directory [ftp://uuu:ppp@hhh/tmp/ftpªDebug]
3) ftp://uuu:ppp@hhh/tmp/ftpªDebug ::Dir Does Not Exist so Create It
3) ftp://uuu:ppp@hhh/tmp/ftpªDebug raised
org.apache.commons.vfs2.FileSystemException: Could not create folder
"ftp://uuu:***@hhh/tmp/ftpªDebug";.

After step 1) I see a directory called*/tmp/ftp?Debug*.
I think this is causing the subsequent creation problem in step 2) and
step 3).
When a directory such as "*ftp\u7684Debug*" does exist, then
*exists*() returns the correct result of true, but *createFolder*()
creates a directory with name "*ftp?Debug*".

Thanks in advance
Geoff





---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscr...@commons.apache.org
For additional commands, e-mail: user-h...@commons.apache.org


Reply via email to