Deal with OS-specific jars
authorMathieu Baudier <mbaudier@argeo.org>
Wed, 24 May 2023 08:34:04 +0000 (10:34 +0200)
committerMathieu Baudier <mbaudier@argeo.org>
Wed, 24 May 2023 08:34:04 +0000 (10:34 +0200)
org.argeo.init/src/org/argeo/init/a2/A2Contribution.java
org.argeo.init/src/org/argeo/init/a2/ProvisioningManager.java
org.argeo.init/src/org/argeo/init/osgi/OsgiBoot.java

index a4b720056fda21036a2946f449add9b7e7622985..9de09cecfe1100271d3291462bdb2c2d2f8f4b92 100644 (file)
@@ -14,6 +14,7 @@ public class A2Contribution implements Comparable<A2Contribution> {
        final static String CLASSPATH = "classpath";
 
        final static String DEFAULT = "default";
+       final static String LIB = "lib";
 
        private final ProvisioningSource source;
        private final String id;
@@ -87,4 +88,64 @@ public class A2Contribution implements Comparable<A2Contribution> {
                }
        }
 
+       static String localOsArchRelativePath() {
+               return Os.local().toString() + "/" + Arch.local().toString();
+       }
+
+       static enum Os {
+               LINUX, WIN32, MACOSX, UNKOWN;
+
+               @Override
+               public String toString() {
+                       return name().toLowerCase();
+               }
+
+               public static Os local() {
+                       String osStr = System.getProperty("os.name").toLowerCase();
+                       if (osStr.startsWith("linux"))
+                               return LINUX;
+                       if (osStr.startsWith("win"))
+                               return WIN32;
+                       if (osStr.startsWith("mac"))
+                               return MACOSX;
+                       return UNKOWN;
+               }
+
+       }
+
+       static enum Arch {
+               X86_64, AARCH64, X86, POWERPC, UNKOWN;
+
+               @Override
+               public String toString() {
+                       return name().toLowerCase();
+               }
+
+               public static Arch local() {
+                       String archStr = System.getProperty("os.arch").toLowerCase();
+                       return switch (archStr) {
+                       case "x86_64":
+                       case "amd64":
+                       case "x86-64": {
+                               yield X86_64;
+                       }
+                       case "aarch64":
+                       case "arm64": {
+                               yield AARCH64;
+                       }
+                       case "x86":
+                       case "i386":
+                       case "i686": {
+                               yield X86;
+                       }
+                       case "powerpc":
+                       case "ppc": {
+                               yield POWERPC;
+                       }
+                       default:
+                               yield UNKOWN;
+                       };
+               }
+       }
+
 }
index cbb296f4c1b780240ddd610ac3257fd8d8218476..6a0836bdfdea80ffc6727140e49d2dd3dcd3a470 100644 (file)
@@ -85,6 +85,17 @@ public class ProvisioningManager {
                                                source.load();
                                                addSource(source);
                                                OsgiBootUtils.info("Registered " + uri + " as source");
+
+                                               // OS specific / native
+                                               String localRelPath = A2Contribution.localOsArchRelativePath();
+                                               Path localLibBase = base.resolve(A2Contribution.LIB).resolve(localRelPath);
+                                               if (Files.exists(localLibBase)) {
+                                                       FsA2Source libSource = new FsA2Source(localLibBase, xOr,
+                                                                       SCHEME_A2_REFERENCE.equals(u.getScheme()));
+                                                       libSource.load();
+                                                       addSource(libSource);
+                                                       OsgiBootUtils.info("Registered OS-specific " + uri + " as source (" + localRelPath + ")");
+                                               }
                                        } else {
                                                OsgiBootUtils.debug("Source " + base + " does not exist, ignoring.");
                                        }
index 884461b12b5b0e5bb322ddd96705c619af6a0f1f..2e96db3b37a769774f0c7b7d980ec1cb494549dd 100644 (file)
@@ -98,19 +98,25 @@ public class OsgiBoot implements OsgiBootConstants {
                                        queryPart = source.substring(qmIndex);
                                        source = source.substring(0, qmIndex);
                                }
+                               // TODO centralise in A" package?
                                if (source.trim().equals(A2Source.DEFAULT_A2_URI)) {
                                        if (Files.exists(homePath))
                                                provisioningManager.registerSource(
                                                                A2Source.SCHEME_A2 + "://" + homePath.toString() + "/.local/share/a2" + queryPart);
                                        provisioningManager.registerSource(A2Source.SCHEME_A2 + ":///usr/local/share/a2" + queryPart);
+                                       provisioningManager.registerSource(A2Source.SCHEME_A2 + ":///usr/local/lib/a2" + queryPart);
                                        provisioningManager.registerSource(A2Source.SCHEME_A2 + ":///usr/share/a2" + queryPart);
+                                       provisioningManager.registerSource(A2Source.SCHEME_A2 + ":///usr/lib/a2" + queryPart);
                                } else if (source.trim().equals(A2Source.DEFAULT_A2_REFERENCE_URI)) {
                                        if (Files.exists(homePath))
                                                provisioningManager.registerSource(A2Source.SCHEME_A2_REFERENCE + "://" + homePath.toString()
                                                                + "/.local/share/a2" + queryPart);
                                        provisioningManager
                                                        .registerSource(A2Source.SCHEME_A2_REFERENCE + ":///usr/local/share/a2" + queryPart);
+                                       provisioningManager
+                                                       .registerSource(A2Source.SCHEME_A2_REFERENCE + ":///usr/local/lib/a2" + queryPart);
                                        provisioningManager.registerSource(A2Source.SCHEME_A2_REFERENCE + ":///usr/share/a2" + queryPart);
+                                       provisioningManager.registerSource(A2Source.SCHEME_A2_REFERENCE + ":///usr/lib/a2" + queryPart);
                                } else {
                                        provisioningManager.registerSource(source + queryPart);
                                }