Skip to content

Commit b19346f

Browse files
authored
Merge pull request #44 from Electrostat-Lab/properties-controllers
Properties controllers API and System Directory Library path
2 parents 3d84dbf + e47b390 commit b19346f

File tree

15 files changed

+550
-88
lines changed

15 files changed

+550
-88
lines changed

snaploader-examples/src/main/java/electrostatic4j/snaploader/examples/TestBasicFeatures.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
import electrostatic4j.snaploader.platform.NativeDynamicLibrary;
4040
import electrostatic4j.snaploader.platform.util.NativeVariant;
4141
import electrostatic4j.snaploader.platform.util.PlatformPredicate;
42-
import electrostatic4j.snaploader.platform.util.PropertiesProvider;
42+
import electrostatic4j.snaploader.platform.util.DefaultPropertiesProvider;
4343
import electrostatic4j.snaploader.LoadingCriterion;
4444

4545
/**
@@ -92,7 +92,7 @@ protected static void printDetails(NativeBinaryLoader loader) {
9292
}
9393

9494
protected static DirectoryPath getLibrariesAbsolutePath() {
95-
return new DirectoryPath(PropertiesProvider.USER_DIR.getSystemProperty(), "libs");
95+
return new DirectoryPath(DefaultPropertiesProvider.USER_DIR.getSystemProperty(), "libs");
9696
}
9797

9898
protected static DirectoryPath getJarFilePath() {
@@ -101,7 +101,7 @@ protected static DirectoryPath getJarFilePath() {
101101

102102
protected static String getNativeDynamicLibraryPath() {
103103
return getLibrariesAbsolutePath().getPath() +
104-
PropertiesProvider.FILE_SEPARATOR.getSystemProperty() +
104+
DefaultPropertiesProvider.FILE_SEPARATOR.getSystemProperty() +
105105
"lib" + getLibraryBaseName() + ".so";
106106
}
107107

snaploader-examples/src/main/java/electrostatic4j/snaploader/examples/TestBasicFeatures2.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
import electrostatic4j.snaploader.platform.NativeDynamicLibrary;
4343
import electrostatic4j.snaploader.platform.util.NativeVariant;
4444
import electrostatic4j.snaploader.platform.util.PlatformPredicate;
45-
import electrostatic4j.snaploader.platform.util.PropertiesProvider;
45+
import electrostatic4j.snaploader.platform.util.DefaultPropertiesProvider;
4646
import electrostatic4j.snaploader.LoadingCriterion;
4747

4848
/**
@@ -55,8 +55,8 @@ public final class TestBasicFeatures2 {
5555

5656
public static void main(String[] args) throws Exception {
5757

58-
final Path compressionPath = Paths.get(PropertiesProvider.USER_DIR.getSystemProperty(), "libs", TestBasicFeatures.getJarFile());
59-
final Path extractionPath = Files.createDirectories(Paths.get(PropertiesProvider.USER_DIR.getSystemProperty(), "libs",
58+
final Path compressionPath = Paths.get(DefaultPropertiesProvider.USER_DIR.getSystemProperty(), "libs", TestBasicFeatures.getJarFile());
59+
final Path extractionPath = Files.createDirectories(Paths.get(DefaultPropertiesProvider.USER_DIR.getSystemProperty(), "libs",
6060
NativeVariant.OS_NAME.getProperty(), NativeVariant.OS_ARCH.getProperty()));
6161

6262
final LibraryInfo libraryInfo = new LibraryInfo(new DirectoryPath(compressionPath.toString()), new DirectoryPath("lib/placeholder"),

snaploader-examples/src/main/java/electrostatic4j/snaploader/examples/TestFilesystemException.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,16 @@
88
import electrostatic4j.snaploader.platform.util.DefaultDynamicLibraries;
99
import electrostatic4j.snaploader.platform.util.NativeVariant;
1010
import electrostatic4j.snaploader.platform.util.PlatformPredicate;
11-
import electrostatic4j.snaploader.platform.util.PropertiesProvider;
11+
import electrostatic4j.snaploader.platform.util.DefaultPropertiesProvider;
1212

13-
import java.io.IOException;
1413
import java.nio.file.Files;
1514
import java.nio.file.Path;
1615
import java.nio.file.Paths;
1716

1817
public final class TestFilesystemException {
1918
public static void main(String[] args) throws Exception {
20-
final Path compressionPath = Paths.get(PropertiesProvider.USER_DIR.getSystemProperty(), "libs", TestBasicFeatures.getJarFile());
21-
final Path extractionPath = Files.createDirectories(Paths.get(PropertiesProvider.USER_DIR.getSystemProperty(), "libs",
19+
final Path compressionPath = Paths.get(DefaultPropertiesProvider.USER_DIR.getSystemProperty(), "libs", TestBasicFeatures.getJarFile());
20+
final Path extractionPath = Files.createDirectories(Paths.get(DefaultPropertiesProvider.USER_DIR.getSystemProperty(), "libs",
2221
NativeVariant.OS_NAME.getProperty(), NativeVariant.OS_ARCH.getProperty()));
2322

2423
final LibraryInfo libraryInfo = new LibraryInfo(new DirectoryPath(compressionPath.toString()), new DirectoryPath("lib/placeholder"),

snaploader-examples/src/main/java/electrostatic4j/snaploader/examples/TestFilesystemMemoryLeak.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
import electrostatic4j.snaploader.filesystem.FileExtractionListener;
3636
import electrostatic4j.snaploader.filesystem.FileExtractor;
3737
import electrostatic4j.snaploader.filesystem.FileLocator;
38-
import electrostatic4j.snaploader.platform.util.PropertiesProvider;
38+
import electrostatic4j.snaploader.platform.util.DefaultPropertiesProvider;
3939
import electrostatic4j.snaploader.util.SnapLoaderLogger;
4040
import java.util.logging.Level;
4141
import java.util.logging.Logger;
@@ -78,12 +78,12 @@ public void onExtractionFinalization(FileExtractor fileExtractor, FileLocator fi
7878

7979
protected static String getZipAbsolutePath() {
8080
return TestBasicFeatures.getLibrariesAbsolutePath().getPath() +
81-
PropertiesProvider.FILE_SEPARATOR.getSystemProperty() + "jmelogo700.zip";
81+
DefaultPropertiesProvider.FILE_SEPARATOR.getSystemProperty() + "jmelogo700.zip";
8282
}
8383

8484
protected static String getExtractionPath() {
8585
return TestBasicFeatures.getLibrariesAbsolutePath().getPath() +
86-
PropertiesProvider.FILE_SEPARATOR.getSystemProperty() + getFilePath();
86+
DefaultPropertiesProvider.FILE_SEPARATOR.getSystemProperty() + getFilePath();
8787
}
8888

8989
protected static String getFilePath() {

snaploader-examples/src/main/java/electrostatic4j/snaploader/examples/TestNativeDllLoader.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ public final class TestNativeDllLoader {
1212
public static void main(String[] args) throws Exception {
1313
final NativeDynamicLibrary[] baseLibs = new NativeDynamicLibrary[] {
1414
DefaultDynamicLibraries.ANDROID_ALL,
15-
new NativeDynamicLibrary("linux/x86-64/com/github/stephengoldd", PlatformPredicate.LINUX_X86_64),
16-
new NativeDynamicLibrary("windows/x86-64/com/github/stephengoldd", PlatformPredicate.WIN_X86_64),
15+
new NativeDynamicLibrary("linux/x86-64/com/github/stephengold", PlatformPredicate.LINUX_X86_64),
16+
new NativeDynamicLibrary("windows/x86-64/com/github/stephengold", PlatformPredicate.WIN_X86_64),
1717
};
1818

1919
final NativeDynamicLibrary[] cpuEnhancedLibs = new NativeDynamicLibrary[]{
@@ -24,7 +24,7 @@ public static void main(String[] args) throws Exception {
2424
"avx", "avx2", "sse4_1", "sse4_2")),
2525
};
2626
final LibraryInfo info = new LibraryInfo(new DirectoryPath("linux/x86-64/com/github/stephengold"),
27-
"joltjnid", DirectoryPath.USER_DIR);
27+
"joltjni", DirectoryPath.USER_DIR);
2828
final NativeDllLoader nativeDllLoader = new NativeDllLoader(baseLibs, cpuEnhancedLibs, info, true, true);
2929
nativeDllLoader.loadCpuEnhancedLibs(LoadingCriterion.INCREMENTAL_LOADING);
3030
}

snaploader-examples/src/main/java/electrostatic4j/snaploader/examples/TestRetryExhaustionException.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
import electrostatic4j.snaploader.platform.util.DefaultDynamicLibraries;
4444
import electrostatic4j.snaploader.platform.util.NativeVariant;
4545
import electrostatic4j.snaploader.platform.util.PlatformPredicate;
46-
import electrostatic4j.snaploader.platform.util.PropertiesProvider;
46+
import electrostatic4j.snaploader.platform.util.DefaultPropertiesProvider;
4747

4848
/**
4949
* Tests retry exhaustion on a broken library.
@@ -53,8 +53,8 @@
5353
public class TestRetryExhaustionException {
5454
public static void main(String[] args) throws Exception {
5555

56-
final Path compressionPath = Paths.get(PropertiesProvider.USER_DIR.getSystemProperty(), "libs", "corrupted-lib.jar");
57-
final Path extractionPath = Files.createDirectories(Paths.get(PropertiesProvider.USER_DIR.getSystemProperty(), "libs",
56+
final Path compressionPath = Paths.get(DefaultPropertiesProvider.USER_DIR.getSystemProperty(), "libs", "corrupted-lib.jar");
57+
final Path extractionPath = Files.createDirectories(Paths.get(DefaultPropertiesProvider.USER_DIR.getSystemProperty(), "libs",
5858
NativeVariant.OS_NAME.getProperty(), NativeVariant.OS_ARCH.getProperty()));
5959

6060
final LibraryInfo libraryInfo = new LibraryInfo(new DirectoryPath(compressionPath.toString()), new DirectoryPath("lib/placeholder"),

snaploader-examples/src/main/java/electrostatic4j/snaploader/examples/TestZipExtractor.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
import electrostatic4j.snaploader.filesystem.FileExtractionListener;
3636
import electrostatic4j.snaploader.filesystem.FileExtractor;
3737
import electrostatic4j.snaploader.filesystem.FileLocator;
38-
import electrostatic4j.snaploader.platform.util.PropertiesProvider;
38+
import electrostatic4j.snaploader.platform.util.DefaultPropertiesProvider;
3939
import electrostatic4j.snaploader.throwable.FilesystemResourceScavengingException;
4040

4141
import java.util.zip.ZipFile;
@@ -80,12 +80,12 @@ public void onExtractionFinalization(FileExtractor fileExtractor, FileLocator fi
8080

8181
protected static String getZipAbsolutePath() {
8282
return TestBasicFeatures.getLibrariesAbsolutePath().getPath() +
83-
PropertiesProvider.FILE_SEPARATOR.getSystemProperty() + "jmelogo700.zip";
83+
DefaultPropertiesProvider.FILE_SEPARATOR.getSystemProperty() + "jmelogo700.zip";
8484
}
8585

8686
protected static String getExtractionPath() {
8787
return TestBasicFeatures.getLibrariesAbsolutePath().getPath() +
88-
PropertiesProvider.FILE_SEPARATOR.getSystemProperty() + getFilePath();
88+
DefaultPropertiesProvider.FILE_SEPARATOR.getSystemProperty() + getFilePath();
8989
}
9090

9191
protected static String getFilePath() {

snaploader-examples/src/main/java/electrostatic4j/snaploader/examples/api/NativeDllLoader.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -348,4 +348,13 @@ protected void signalImminentFailure(CallingStackMetaData callingStackMetaData)
348348
// signal an imminent failure and crash the application
349349
Runtime.getRuntime().exit(-callingStackMetaData.getErrorCause().hashCode());
350350
}
351+
352+
/**
353+
* Retrieves the associated native binary loader object.
354+
*
355+
* @return a native binary loader object that is associated wtih this object.
356+
*/
357+
public NativeBinaryLoader getLoader() {
358+
return loader;
359+
}
351360
}

snaploader/src/main/java/electrostatic4j/snaploader/NativeBinaryLoader.java

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@
3232

3333
package electrostatic4j.snaploader;
3434

35+
import java.io.File;
3536
import java.io.IOException;
37+
import java.nio.file.FileSystems;
3638
import java.util.Arrays;
3739
import java.util.List;
3840
import java.util.jar.JarFile;
@@ -45,6 +47,8 @@
4547
import electrostatic4j.snaploader.library.LibraryLocator;
4648
import electrostatic4j.snaploader.platform.NativeDynamicLibrary;
4749
import electrostatic4j.snaploader.platform.util.NativeVariant;
50+
import electrostatic4j.snaploader.platform.util.PropertiesControllerNamespace;
51+
import electrostatic4j.snaploader.platform.util.PropertiesController;
4852
import electrostatic4j.snaploader.throwable.LoadingRetryExhaustionException;
4953
import electrostatic4j.snaploader.throwable.UnSupportedSystemError;
5054
import electrostatic4j.snaploader.util.CallingStackMetaData;
@@ -89,11 +93,15 @@ public class NativeBinaryLoader {
8993

9094
protected int numberOfLoadingFailure = 0;
9195

96+
private LoadingCriterion loadingCriterion; // cache the loading criterion for system controller use
97+
9298
/**
9399
* Instantiates a native dynamic library loader to extract and load a system-specific native dynamic library.
94100
*/
95101
public NativeBinaryLoader(final LibraryInfo libraryInfo) {
96102
this.libraryInfo = libraryInfo;
103+
// initialize the system controller object
104+
PropertiesControllerNamespace.systemDirectoryController.initialize();
97105
}
98106

99107
/**
@@ -176,14 +184,17 @@ public NativeBinaryLoader loadLibrary(LoadingCriterion criterion) throws Excepti
176184
}
177185
// commands and loads the library from the system directories
178186
if (NativeVariant.Os.isAndroid() || criterion == LoadingCriterion.SYSTEM_LOAD) {
179-
loadSystemBinary();
187+
loadSystemBinary(nativeDynamicLibrary);
188+
loadingCriterion = LoadingCriterion.SYSTEM_LOAD;
180189
return this;
181190
}
182191
if (criterion == LoadingCriterion.INCREMENTAL_LOADING && nativeDynamicLibrary.isExtracted()) {
183192
loadBinary(nativeDynamicLibrary, criterion);
193+
loadingCriterion = LoadingCriterion.INCREMENTAL_LOADING;
184194
return this;
185195
}
186196
cleanExtractBinary(nativeDynamicLibrary);
197+
loadingCriterion = LoadingCriterion.CLEAN_EXTRACTION;
187198
return this;
188199
}
189200

@@ -196,6 +207,10 @@ public NativeDynamicLibrary getNativeDynamicLibrary() {
196207
return nativeDynamicLibrary;
197208
}
198209

210+
public PropertiesController getSystemDirectoryController() {
211+
return PropertiesControllerNamespace.systemDirectoryController;
212+
}
213+
199214
/**
200215
* Enables the logging for this object, default value is false.
201216
*
@@ -271,12 +286,27 @@ public NativeBinaryLoader setMaxNumberOfLoadingFailure(int maxNumberOfLoadingFai
271286
}
272287

273288
/**
274-
* Loads a native binary from the system directories into the process virtual
289+
* Loads a native binary from the customized system directories into the process virtual
275290
* address space using the library basename in a platform-dependent way.
276291
*/
277-
protected void loadSystemBinary() {
292+
protected void loadSystemBinary(NativeDynamicLibrary dynamicLibrary) {
293+
SnapLoaderLogger.log(Level.INFO, getClass().getName(), "loadSystemBinary", "Loading library from the system: "
294+
+ Arrays.toString(PropertiesControllerNamespace.systemDirectoryController.toList()));
278295
try {
279-
System.loadLibrary(libraryInfo.getBaseName());
296+
// use custom system directories for desktop ONLY!
297+
if (NativeVariant.Os.isDesktop()) {
298+
PropertiesControllerNamespace.systemDirectoryController.iterate(path -> {
299+
final File lib = new File(FileSystems.getDefault()
300+
.getPath(path.toString(),
301+
dynamicLibrary.getLibraryFile()).toString());
302+
if (lib.exists()) {
303+
System.load(lib.getAbsolutePath());
304+
}
305+
return "";
306+
});
307+
} else {
308+
System.loadLibrary(libraryInfo.getBaseName());
309+
}
280310
SnapLoaderLogger.log(Level.INFO, getClass().getName(), "loadSystemBinary", "Successfully loaded library from the system: "
281311
+ libraryInfo.getBaseName());
282312
if (nativeBinaryLoadingListener != null) {

snaploader/src/main/java/electrostatic4j/snaploader/filesystem/DirectoryPath.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232

3333
package electrostatic4j.snaploader.filesystem;
3434

35-
import electrostatic4j.snaploader.platform.util.PropertiesProvider;
35+
import electrostatic4j.snaploader.platform.util.DefaultPropertiesProvider;
3636

3737
/**
3838
* A class denotes and provides a directory absolute path.
@@ -45,13 +45,13 @@ public final class DirectoryPath {
4545
* An alias object for the current working directory absolute path.
4646
*/
4747
public static final DirectoryPath USER_DIR =
48-
new DirectoryPath(PropertiesProvider.USER_DIR.getSystemProperty());
48+
new DirectoryPath(DefaultPropertiesProvider.USER_DIR.getSystemProperty());
4949

5050
/**
5151
* An alias object for the root user home directory absolute path.
5252
*/
5353
public static final DirectoryPath USER_HOME =
54-
new DirectoryPath(PropertiesProvider.USER_HOME.getSystemProperty());
54+
new DirectoryPath(DefaultPropertiesProvider.USER_HOME.getSystemProperty());
5555

5656
/**
5757
* When combined with the
@@ -85,7 +85,7 @@ public DirectoryPath(final String root, final String... entries) {
8585
if (entry == null) {
8686
continue;
8787
}
88-
path = getPath() + PropertiesProvider.FILE_SEPARATOR.getSystemProperty() + entry;
88+
path = getPath() + DefaultPropertiesProvider.FILE_SEPARATOR.getSystemProperty() + entry;
8989
}
9090
}
9191

0 commit comments

Comments
 (0)