Lately I’ve been playing with commons virtual file system
(commons-vfs), which is a really cool way to make your application file
system independent. You can write the same code to access files in your
local file system, samba servers, sftp servers, http, webdav,… see the complete list.
FileSystemManager fileSystemManager = VFS.getManager(); FileObject from = fileSystemManager.resolveFile(getFrom()); FileObject to = fileSystemManager.resolveFile(getTo(), getFileSystemOptions()); to.copyFrom(from, new AllFileSelector());
The application context with Spring would be something like the
following. You can see that setting the file system options it’s a pita
because they don’t follow the beans convention and you need to call
different methods instead of setting bean properties. I hop they change
ths in next versions.
<bean id="myBean" class="TestBean"> <property name="from" value="http://www.myserver.com/filename"/> <property name="to" value="sftp://username:password@myserver.com/home/whatever"/> <property name="fileSystemOptions" ref="sftpFileSystemOptions"/> </bean> <bean id="sftpFileSystemConfigBuilder" class="org.apache.commons.vfs.provider.sftp.SftpFileSystemConfigBuilder" factory-method="getInstance"/> <bean id="sftpFileSystemOptions" class="org.apache.commons.vfs.FileSystemOptions"/> <bean id="sftpFileSystemOptions_disableStrictHostKeyChecking" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> <property name="targetObject" ref="sftpFileSystemConfigBuilder"/> <property name="targetMethod" value="setStrictHostKeyChecking"/> <property name="arguments"> <list> <ref local="sftpFileSystemOptions"/> <value>no</value> </list> </property> </bean> <!-- use private key instead of password --> <bean id="sftpFileSystemOptions_setIdentities" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> <property name="targetObject" ref="sftpFileSystemConfigBuilder"/> <property name="targetMethod" value="setIdentities"/> <property name="arguments"> <list> <ref local="sftpFileSystemOptions"/> <list><value>Path to the ssh identity file</value></list> </list> </property> </bean>
Another drawback is that you need to build from sources, no releases are available yet 😦
Does it support extended attributes if supported by the underlying filesystem?
Each filesystem has its own FileSystemConfigBuilder that allows you to create a filesystem dependant FileSystemOptions object. So sftp has identity file support which has no sense in http, for instance.
Is that what you asked for?
Just googled your blog now.
Maybe the DelegatingFileSystemOptionsBuilder is of some help, at least it should allow you to easily create one.
The idea behind this class is to use strings only to create the configuration, so the following code snipped is the same:
FileSystemOptions opts = new FileSystemOptions();
SftpFileSystemConfigBuilder.getInstance().setIdentities(opts, new File[]{new File(“path/to/ident.dsa”)});
FileSystemOptions optsDel = new FileSystemOptions();
DelegatingFileSystemOptionsBuilder delegate = new DelegatingFileSystemOptionsBuilder(VFS.getManager());
delegate.setConfigString(optsDel, “sftp”, “identities”, “path/to/ident.dsa”);
The “DelegatingFileSystemOptionsBuilder” heavily uses reflection to use (in this example) the SftpFileSystemConfigBuilder then and convert the string to the correct argument type.
Let me know if this is of some help.
Also you can find already built nightlies here: http://cvs.apache.org/builds/jakarta-commons/nightly/commons-vfs/
Your work is great. Happy New Year! And Marry Cristmass!
Can vfs be utilized in a EJB, i.e., does vfs use java.io file access?
I have no idea, you would need to ask in the apache commons mailing list