use of org.apache.commons.vfs2.VFS in project accumulo by apache.
the class AccumuloVFSClassLoader method generateVfs.
public static FileSystemManager generateVfs() throws FileSystemException {
DefaultFileSystemManager vfs = new DefaultFileSystemManager();
vfs.addProvider("res", new org.apache.commons.vfs2.provider.res.ResourceFileProvider());
vfs.addProvider("zip", new org.apache.commons.vfs2.provider.zip.ZipFileProvider());
vfs.addProvider("gz", new org.apache.commons.vfs2.provider.gzip.GzipFileProvider());
vfs.addProvider("ram", new org.apache.commons.vfs2.provider.ram.RamFileProvider());
vfs.addProvider("file", new org.apache.commons.vfs2.provider.local.DefaultLocalFileProvider());
vfs.addProvider("jar", new org.apache.commons.vfs2.provider.jar.JarFileProvider());
vfs.addProvider("http", new org.apache.commons.vfs2.provider.http.HttpFileProvider());
vfs.addProvider("https", new org.apache.commons.vfs2.provider.https.HttpsFileProvider());
vfs.addProvider("ftp", new org.apache.commons.vfs2.provider.ftp.FtpFileProvider());
vfs.addProvider("ftps", new org.apache.commons.vfs2.provider.ftps.FtpsFileProvider());
vfs.addProvider("war", new org.apache.commons.vfs2.provider.jar.JarFileProvider());
vfs.addProvider("par", new org.apache.commons.vfs2.provider.jar.JarFileProvider());
vfs.addProvider("ear", new org.apache.commons.vfs2.provider.jar.JarFileProvider());
vfs.addProvider("sar", new org.apache.commons.vfs2.provider.jar.JarFileProvider());
vfs.addProvider("ejb3", new org.apache.commons.vfs2.provider.jar.JarFileProvider());
vfs.addProvider("tmp", new org.apache.commons.vfs2.provider.temp.TemporaryFileProvider());
vfs.addProvider("tar", new org.apache.commons.vfs2.provider.tar.TarFileProvider());
vfs.addProvider("tbz2", new org.apache.commons.vfs2.provider.tar.TarFileProvider());
vfs.addProvider("tgz", new org.apache.commons.vfs2.provider.tar.TarFileProvider());
vfs.addProvider("bz2", new org.apache.commons.vfs2.provider.bzip2.Bzip2FileProvider());
vfs.addProvider("hdfs", new HdfsFileProvider());
vfs.addExtensionMap("jar", "jar");
vfs.addExtensionMap("zip", "zip");
vfs.addExtensionMap("gz", "gz");
vfs.addExtensionMap("tar", "tar");
vfs.addExtensionMap("tbz2", "tar");
vfs.addExtensionMap("tgz", "tar");
vfs.addExtensionMap("bz2", "bz2");
vfs.addMimeTypeMap("application/x-tar", "tar");
vfs.addMimeTypeMap("application/x-gzip", "gz");
vfs.addMimeTypeMap("application/zip", "zip");
vfs.setFileContentInfoFactory(new FileContentInfoFilenameFactory());
vfs.setFilesCache(new SoftRefFilesCache());
File cacheDir = computeTopCacheDir();
vfs.setReplicator(new UniqueFileReplicator(cacheDir));
vfs.setCacheStrategy(CacheStrategy.ON_RESOLVE);
vfs.init();
vfsInstances.add(new WeakReference<>(vfs));
return vfs;
}
use of org.apache.commons.vfs2.VFS in project accumulo by apache.
the class AccumuloVFSClassLoader method resolve.
static FileObject[] resolve(FileSystemManager vfs, String uris, ArrayList<FileObject> pathsToMonitor) throws FileSystemException {
if (uris == null)
return new FileObject[0];
ArrayList<FileObject> classpath = new ArrayList<>();
pathsToMonitor.clear();
for (String path : uris.split(",")) {
path = path.trim();
if (path.equals(""))
continue;
path = AccumuloClassLoader.replaceEnvVars(path, System.getenv());
FileObject fo = vfs.resolveFile(path);
switch(fo.getType()) {
case FILE:
case FOLDER:
classpath.add(fo);
pathsToMonitor.add(fo);
break;
case IMAGINARY:
// assume its a pattern
String pattern = fo.getName().getBaseName();
if (fo.getParent() != null && fo.getParent().getType() == FileType.FOLDER) {
pathsToMonitor.add(fo.getParent());
FileObject[] children = fo.getParent().getChildren();
for (FileObject child : children) {
if (child.getType() == FileType.FILE && child.getName().getBaseName().matches(pattern)) {
classpath.add(child);
}
}
} else {
log.warn("ignoring classpath entry {}", fo);
}
break;
default:
log.warn("ignoring classpath entry {}", fo);
break;
}
}
return classpath.toArray(new FileObject[classpath.size()]);
}
use of org.apache.commons.vfs2.VFS in project accumulo by apache.
the class AccumuloReloadingVFSClassLoaderTest method testConstructor.
@Test
public void testConstructor() throws Exception {
FileObject testDir = vfs.resolveFile(folder1.getRoot().toURI().toString());
FileObject[] dirContents = testDir.getChildren();
AccumuloReloadingVFSClassLoader arvcl = new AccumuloReloadingVFSClassLoader(folderPath, vfs, new ReloadingClassLoader() {
@Override
public ClassLoader getClassLoader() {
return ClassLoader.getSystemClassLoader();
}
}, true);
VFSClassLoader cl = (VFSClassLoader) arvcl.getClassLoader();
FileObject[] files = cl.getFileObjects();
Assert.assertArrayEquals(createFileSystems(dirContents), files);
arvcl.close();
}
use of org.apache.commons.vfs2.VFS in project accumulo by apache.
the class AccumuloReloadingVFSClassLoaderTest method testFastDeleteAndReAdd.
// This test fails because of an error with the underlying monitor (ACCUMULO-1507/VFS-487). Uncomment when this has been addressed.
//
// This is caused by the filed being deleted and then readded in the same monitor tick. This causes the file to ultimately register the deletion over any
// other events.
@Test
@Ignore
public void testFastDeleteAndReAdd() throws Exception {
FileObject testDir = vfs.resolveFile(folder1.getRoot().toURI().toString());
FileObject[] dirContents = testDir.getChildren();
AccumuloReloadingVFSClassLoader arvcl = new AccumuloReloadingVFSClassLoader(folderPath, vfs, new ReloadingClassLoader() {
@Override
public ClassLoader getClassLoader() {
return ClassLoader.getSystemClassLoader();
}
}, 1000, true);
FileObject[] files = ((VFSClassLoader) arvcl.getClassLoader()).getFileObjects();
Assert.assertArrayEquals(createFileSystems(dirContents), files);
Class<?> clazz1 = arvcl.getClassLoader().loadClass("test.HelloWorld");
Object o1 = clazz1.newInstance();
Assert.assertEquals("Hello World!", o1.toString());
// Check that the class is the same before the update
Class<?> clazz1_5 = arvcl.getClassLoader().loadClass("test.HelloWorld");
Assert.assertEquals(clazz1, clazz1_5);
assertTrue(new File(folder1.getRoot(), "HelloWorld.jar").delete());
// Update the class
FileUtils.copyURLToFile(this.getClass().getResource("/HelloWorld.jar"), folder1.newFile("HelloWorld.jar"));
// Wait for the monitor to notice
// VFS-487 significantly wait to avoid failure
Thread.sleep(7000);
Class<?> clazz2 = arvcl.getClassLoader().loadClass("test.HelloWorld");
Object o2 = clazz2.newInstance();
Assert.assertEquals("Hello World!", o2.toString());
// This is false because they are loaded by a different classloader
Assert.assertFalse(clazz1.equals(clazz2));
Assert.assertFalse(o1.equals(o2));
arvcl.close();
}
use of org.apache.commons.vfs2.VFS in project accumulo by apache.
the class AccumuloReloadingVFSClassLoaderTest method testModifiedClass.
@Test
@Ignore
public void testModifiedClass() throws Exception {
FileObject testDir = vfs.resolveFile(folder1.getRoot().toURI().toString());
FileObject[] dirContents = testDir.getChildren();
AccumuloReloadingVFSClassLoader arvcl = new AccumuloReloadingVFSClassLoader(folderPath, vfs, new ReloadingClassLoader() {
@Override
public ClassLoader getClassLoader() {
return ClassLoader.getSystemClassLoader();
}
}, 1000, true);
FileObject[] files = ((VFSClassLoader) arvcl.getClassLoader()).getFileObjects();
Assert.assertArrayEquals(createFileSystems(dirContents), files);
ClassLoader loader1 = arvcl.getClassLoader();
Class<?> clazz1 = loader1.loadClass("test.HelloWorld");
Object o1 = clazz1.newInstance();
Assert.assertEquals("Hello World!", o1.toString());
// Check that the class is the same before the update
Class<?> clazz1_5 = arvcl.getClassLoader().loadClass("test.HelloWorld");
Assert.assertEquals(clazz1, clazz1_5);
// java does aggressive caching of jar files. When using java code to read jar files that are created in the same second, it will only see the first jar
// file
Thread.sleep(1000);
assertTrue(new File(folder1.getRoot(), "HelloWorld.jar").delete());
// Update the class
FileUtils.copyURLToFile(this.getClass().getResource("/HelloWorld2.jar"), folder1.newFile("HelloWorld.jar"));
// Wait for the monitor to notice
// VFS-487 significantly wait to avoid failure
Thread.sleep(7000);
Class<?> clazz2 = arvcl.getClassLoader().loadClass("test.HelloWorld");
Object o2 = clazz2.newInstance();
Assert.assertEquals("Hallo Welt", o2.toString());
// This is false because they are loaded by a different classloader
Assert.assertFalse(clazz1.equals(clazz2));
Assert.assertFalse(o1.equals(o2));
Class<?> clazz3 = loader1.loadClass("test.HelloWorld");
Object o3 = clazz3.newInstance();
Assert.assertEquals("Hello World!", o3.toString());
arvcl.close();
}
Aggregations