aboutsummaryrefslogtreecommitdiff
path: root/src/cz/crcs/ectester/standalone/libs/NativeECLibrary.java
diff options
context:
space:
mode:
authorJ08nY2018-10-16 00:58:39 +0200
committerJ08nY2018-10-16 00:58:39 +0200
commit2b073e59b5e8661aac85e89b86a7fe4e657a268f (patch)
tree06081d0b40f7fb8cb25024cf34717f1ae1b1066d /src/cz/crcs/ectester/standalone/libs/NativeECLibrary.java
parent7e9917742785a9fd532a52231e95ddad5775555f (diff)
parent40ec0fea381a6538f5498b9fb75706ef9fa79f59 (diff)
downloadECTester-2b073e59b5e8661aac85e89b86a7fe4e657a268f.tar.gz
ECTester-2b073e59b5e8661aac85e89b86a7fe4e657a268f.tar.zst
ECTester-2b073e59b5e8661aac85e89b86a7fe4e657a268f.zip
Diffstat (limited to 'src/cz/crcs/ectester/standalone/libs/NativeECLibrary.java')
-rw-r--r--src/cz/crcs/ectester/standalone/libs/NativeECLibrary.java82
1 files changed, 48 insertions, 34 deletions
diff --git a/src/cz/crcs/ectester/standalone/libs/NativeECLibrary.java b/src/cz/crcs/ectester/standalone/libs/NativeECLibrary.java
index 6b98cc1..ff23fd9 100644
--- a/src/cz/crcs/ectester/standalone/libs/NativeECLibrary.java
+++ b/src/cz/crcs/ectester/standalone/libs/NativeECLibrary.java
@@ -47,39 +47,19 @@ public abstract class NativeECLibrary extends ProviderECLibrary {
appData = Paths.get(System.getProperty("user.home"), ".local", "share");
}
}
+ /* Resolve and create the ECTester directories in appData. */
Path libDir = appData.resolve("ECTesterStandalone");
File libDirFile = libDir.toFile();
+ Path libReqDir = libDir.resolve("lib");
+ File libReqDirFile = libReqDir.toFile();
Path libPath = libDir.resolve(resource + "." + suffix);
- File libFile = libPath.toFile();
- URL jarURL = NativeECLibrary.class.getResource(LIB_RESOURCE_DIR + resource + "." + suffix);
- if (jarURL == null) {
- return false;
- }
- URLConnection jarConnection = jarURL.openConnection();
-
- /* Only write the file if it does not exist,
- * or if the existing one is older than the
- * one in the JAR.
- */
- boolean write = false;
- if (libDirFile.isDirectory() && libFile.isFile()) {
- long jarModified = jarConnection.getLastModified();
-
- long libModified = Files.getLastModifiedTime(libPath).toMillis();
- if (jarModified > libModified) {
- write = true;
- }
- } else {
- libDir.toFile().mkdirs();
- libFile.createNewFile();
- write = true;
- }
+ /* Create directory for shims and for requirements. */
+ libDirFile.mkdirs();
+ libReqDirFile.mkdirs();
- if (write) {
- Files.copy(jarConnection.getInputStream(), libPath, StandardCopyOption.REPLACE_EXISTING);
- }
- jarConnection.getInputStream().close();
+ /* Write the shim. */
+ writeNewer(resource + "." + suffix, libPath);
/*
* Need to hack in /usr/local/lib to path.
@@ -98,12 +78,24 @@ public abstract class NativeECLibrary extends ProviderECLibrary {
}
}
- for (String requirement : requriements) {
- System.loadLibrary(requirement);
- }
-
- if (suffix.equals("so")) {
- System.setProperty("java.library.path", path);
+ /* Load the requirements, if they are bundled, write them in and load them. */
+ try {
+ for (String requirement : requriements) {
+ if (requirement.endsWith(suffix)) {
+ /* The requirement is bundled, write it */
+ Path reqPath = libReqDir.resolve(requirement);
+ writeNewer(requirement, reqPath);
+ System.load(reqPath.toString());
+ } else {
+ System.loadLibrary(requirement);
+ }
+ }
+ } catch (UnsatisfiedLinkError ule) {
+ return false;
+ } finally {
+ if (suffix.equals("so")) {
+ System.setProperty("java.library.path", path);
+ }
}
System.load(libPath.toString());
@@ -116,5 +108,27 @@ public abstract class NativeECLibrary extends ProviderECLibrary {
return false;
}
+ private boolean isNewer(URLConnection jarConn, Path realPath) throws IOException {
+ if (realPath.toFile().isFile()) {
+ long jarModified = jarConn.getLastModified();
+ long realModified = Files.getLastModifiedTime(realPath).toMillis();
+ return jarModified > realModified;
+ }
+ return true;
+ }
+
+ private boolean writeNewer(String resource, Path outPath) throws IOException {
+ URL reqURL = NativeECLibrary.class.getResource(LIB_RESOURCE_DIR + resource);
+ if (reqURL == null) {
+ return false;
+ }
+ URLConnection reqConn = reqURL.openConnection();
+ if (isNewer(reqConn, outPath)) {
+ Files.copy(reqConn.getInputStream(), outPath, StandardCopyOption.REPLACE_EXISTING);
+ }
+ reqConn.getInputStream().close();
+ return true;
+ }
+
abstract Provider createProvider();
}