* make sure to load 7-Zip-JBinding via the system classloader and not the Groovy RootLoader
This commit is contained in:
parent
4b073df2d5
commit
44bd9e2480
|
@ -2,74 +2,55 @@
|
|||
package net.sourceforge.filebot.archive;
|
||||
|
||||
|
||||
import static org.apache.commons.io.FilenameUtils.*;
|
||||
|
||||
import java.io.Closeable;
|
||||
import java.io.File;
|
||||
import java.io.FileFilter;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.ArrayList;
|
||||
import java.util.EnumMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Scanner;
|
||||
import java.util.Set;
|
||||
import java.util.TreeSet;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import com.sun.jna.Platform;
|
||||
|
||||
import net.sf.sevenzipjbinding.ArchiveFormat;
|
||||
import net.sf.sevenzipjbinding.IArchiveOpenCallback;
|
||||
import net.sf.sevenzipjbinding.IInStream;
|
||||
import net.sf.sevenzipjbinding.ISevenZipInArchive;
|
||||
import net.sf.sevenzipjbinding.PropID;
|
||||
import net.sf.sevenzipjbinding.SevenZip;
|
||||
import net.sf.sevenzipjbinding.SevenZipException;
|
||||
import net.sf.sevenzipjbinding.SevenZipNativeInitializationException;
|
||||
import net.sourceforge.filebot.MediaTypes;
|
||||
import net.sourceforge.tuned.FileUtilities.ExtensionFileFilter;
|
||||
|
||||
|
||||
public class Archive implements Closeable {
|
||||
|
||||
private static boolean nativeLibrariesLoaded = false;
|
||||
|
||||
|
||||
private static synchronized void requireNativeLibraries() throws SevenZipNativeInitializationException {
|
||||
if (nativeLibrariesLoaded) {
|
||||
return;
|
||||
}
|
||||
|
||||
// initialize 7z-JBinding native libs
|
||||
try {
|
||||
if (Platform.isWindows()) {
|
||||
System.loadLibrary(Platform.is64Bit() ? "libgcc_s_sjlj-1" : "mingwm10");
|
||||
}
|
||||
|
||||
System.loadLibrary("7-Zip-JBinding");
|
||||
SevenZip.initLoadedLibraries();
|
||||
nativeLibrariesLoaded = true;
|
||||
} catch (Throwable e) {
|
||||
throw new SevenZipNativeInitializationException("Failed to load 7z-JBinding: " + e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private ISevenZipInArchive inArchive;
|
||||
private Closeable openVolume;
|
||||
private ArchiveOpenVolumeCallback openVolume;
|
||||
|
||||
|
||||
public Archive(File file) throws IOException, SevenZipException, SevenZipNativeInitializationException {
|
||||
public Archive(File file) throws Exception {
|
||||
// initialize 7-Zip-JBinding
|
||||
requireNativeLibraries();
|
||||
|
||||
if (!file.exists()) {
|
||||
throw new FileNotFoundException(file.getAbsolutePath());
|
||||
}
|
||||
|
||||
ArchiveOpenVolumeCallback openVolumeCallback = new ArchiveOpenVolumeCallback();
|
||||
IInStream inStream = openVolumeCallback.getStream(file.getAbsolutePath());
|
||||
// 7-Zip-JBinding NATIVE LIBS MUST BE LOADED WITH SYSTEM CLASSLOADER
|
||||
Class<?> clazz = ClassLoader.getSystemClassLoader().loadClass("net.sourceforge.filebot.archive.SevenZipLoader");
|
||||
Method m = clazz.getMethod("open", new Class[] { IInStream.class, IArchiveOpenCallback.class });
|
||||
|
||||
inArchive = SevenZip.openInArchive(null, inStream, openVolumeCallback);
|
||||
openVolume = openVolumeCallback;
|
||||
try {
|
||||
openVolume = new ArchiveOpenVolumeCallback();
|
||||
inArchive = (ISevenZipInArchive) m.invoke(null, openVolume.getStream(file.getAbsolutePath()), openVolume);
|
||||
} catch (InvocationTargetException e) {
|
||||
throw (Exception) e.getTargetException();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -99,7 +80,9 @@ public class Archive implements Closeable {
|
|||
boolean isFolder = (Boolean) inArchive.getProperty(i, PropID.IS_FOLDER);
|
||||
if (!isFolder) {
|
||||
String path = (String) inArchive.getProperty(i, PropID.PATH);
|
||||
paths.add(new File(path));
|
||||
if (path != null) {
|
||||
paths.add(new File(path));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -124,13 +107,32 @@ public class Archive implements Closeable {
|
|||
}
|
||||
|
||||
|
||||
public static Set<String> getArchiveTypes() {
|
||||
Set<String> extensions = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
|
||||
|
||||
// application data
|
||||
extensions.addAll(MediaTypes.getDefault().getExtensionList("archive"));
|
||||
|
||||
// formats provided by the library
|
||||
for (ArchiveFormat it : ArchiveFormat.values()) {
|
||||
extensions.add(it.getMethodName());
|
||||
}
|
||||
|
||||
return extensions;
|
||||
}
|
||||
|
||||
|
||||
public static final FileFilter VOLUME_ONE_FILTER = new FileFilter() {
|
||||
|
||||
private Pattern volume = Pattern.compile("[.]r[0-9]+$|[.]part[0-9]+|[.][0-9]+$", Pattern.CASE_INSENSITIVE);
|
||||
private FileFilter archives = new ExtensionFileFilter(getArchiveTypes());
|
||||
|
||||
|
||||
@Override
|
||||
public boolean accept(File path) {
|
||||
if (!archives.accept(path))
|
||||
return false;
|
||||
|
||||
Matcher matcher = volume.matcher(path.getName());
|
||||
if (matcher.find()) {
|
||||
Scanner scanner = new Scanner(matcher.group()).useDelimiter("\\D+");
|
||||
|
@ -139,15 +141,9 @@ public class Archive implements Closeable {
|
|||
}
|
||||
}
|
||||
|
||||
String ext = getExtension(path.getName());
|
||||
for (ArchiveFormat it : ArchiveFormat.values()) {
|
||||
if (it.getMethodName().equalsIgnoreCase(ext)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -0,0 +1,46 @@
|
|||
|
||||
package net.sourceforge.filebot.archive;
|
||||
|
||||
|
||||
import com.sun.jna.Platform;
|
||||
|
||||
import net.sf.sevenzipjbinding.IArchiveOpenCallback;
|
||||
import net.sf.sevenzipjbinding.IInStream;
|
||||
import net.sf.sevenzipjbinding.ISevenZipInArchive;
|
||||
import net.sf.sevenzipjbinding.SevenZip;
|
||||
import net.sf.sevenzipjbinding.SevenZipNativeInitializationException;
|
||||
|
||||
|
||||
public class SevenZipLoader {
|
||||
|
||||
private static boolean nativeLibrariesLoaded = false;
|
||||
|
||||
|
||||
private static synchronized void requireNativeLibraries() throws SevenZipNativeInitializationException {
|
||||
if (nativeLibrariesLoaded) {
|
||||
return;
|
||||
}
|
||||
|
||||
// initialize 7z-JBinding native libs
|
||||
try {
|
||||
if (Platform.isWindows()) {
|
||||
System.loadLibrary(Platform.is64Bit() ? "libgcc_s_sjlj-1" : "mingwm10");
|
||||
}
|
||||
|
||||
System.loadLibrary("7-Zip-JBinding");
|
||||
SevenZip.initLoadedLibraries(); // NATIVE LIBS MUST BE LOADED WITH SYSTEM CLASSLOADER
|
||||
nativeLibrariesLoaded = true;
|
||||
} catch (Throwable e) {
|
||||
throw new SevenZipNativeInitializationException("Failed to load 7z-JBinding: " + e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static ISevenZipInArchive open(IInStream stream, IArchiveOpenCallback callback) throws Exception {
|
||||
// initialize 7-Zip-JBinding
|
||||
requireNativeLibraries();
|
||||
|
||||
return SevenZip.openInArchive(null, stream, callback);
|
||||
}
|
||||
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
// filebot -script "fn:sysinfo" -trust-script
|
||||
// filebot -script "fn:sysinfo"
|
||||
|
||||
// FileBot 2.62 (r993)
|
||||
println net.sourceforge.filebot.Settings.applicationIdentifier
|
||||
|
@ -14,8 +14,7 @@ try {
|
|||
// 7-Zip-JBinding: OK
|
||||
try {
|
||||
print '7-Zip-JBinding: '
|
||||
new net.sourceforge.filebot.archive.Archive(null) // load 7-Zip-JBinding native libs
|
||||
} catch(NullPointerException e) {
|
||||
ClassLoader.systemClassLoader.loadClass("net.sourceforge.filebot.archive.SevenZipLoader") // load 7-Zip-JBinding native libs
|
||||
println "OK"
|
||||
} catch(Throwable error) {
|
||||
println error
|
||||
|
|
Loading…
Reference in New Issue