src/share/classes/org/openjdk/jigsaw/SimpleLibrary.java

Print this page

        

@@ -151,27 +151,37 @@
         private static final int MINOR_VERSION = 1;
 
         private static final int DEFLATED = 1 << 0;
 
         private File parent;
+        // location of native libs for this library (may be outside the library)
+        private File natlibs;
+        // location of native cmds for this library (may be outside the library)
+        private File natcmds;
+
         private Set<StorageOption> opts;
 
         public File parent() { return parent; }
+        public File natlibs() { return natlibs; }
+        public File natcmds() { return natcmds; }
         public boolean isDeflated() {
            return opts.contains(StorageOption.DEFLATED);
         }
 
-        private Header(File root, File p, Set<StorageOption> opts) {
+        private Header(File root, File p, File natlibs, File natcmds,
+                       Set<StorageOption> opts) {
             super(MAJOR_VERSION, MINOR_VERSION,
                   FileConstants.Type.LIBRARY_HEADER,
                   new File(root, FILE));
             this.parent = p;
+            this.natlibs = natlibs;
+            this.natcmds = natcmds;
             this.opts = new HashSet<>(opts);
         }
 
         private Header(File root) {
-            this(root, null, Collections.<StorageOption>emptySet());
+            this(root, null, null, null, Collections.<StorageOption>emptySet());
         }
 
         protected void storeRest(DataOutputStream out)
             throws IOException
         {

@@ -180,10 +190,16 @@
                 flags |= DEFLATED;
             out.writeShort(flags);
             out.writeByte((parent != null) ? 1 : 0);
             if (parent != null)
                 out.writeUTF(parent.toString());
+            out.writeByte((natlibs != null) ? 1 : 0);
+            if (natlibs != null)
+                out.writeUTF(natlibs.toString());
+            out.writeByte((natcmds != null) ? 1 : 0);
+            if (natcmds != null)
+                out.writeUTF(natcmds.toString());
         }
 
         protected void loadRest(DataInputStream in)
             throws IOException
         {

@@ -192,10 +208,16 @@
             if ((flags & DEFLATED) == DEFLATED)
                 opts.add(StorageOption.DEFLATED);
             int b = in.readByte();
             if (b != 0)
                 parent = new File(in.readUTF());
+            b = in.readByte();
+            if (b != 0)
+                natlibs = new File(in.readUTF());
+            b = in.readByte();
+            if (b != 0)
+                natcmds = new File(in.readUTF());
         }
 
         private static Header load(File f)
             throws IOException
         {

@@ -206,19 +228,23 @@
 
     }
 
     private final File root;
     private final File canonicalRoot;
-    private File parentPath = null;
-    private SimpleLibrary parent = null;
+    private File parentPath;
+    private File natlibs;
+    private File natcmds;
+    private SimpleLibrary parent;
     private final Header hd;
 
     public String name() { return root.toString(); }
     public File root() { return canonicalRoot; }
     public int majorVersion() { return hd.majorVersion; }
     public int minorVersion() { return hd.minorVersion; }
     public SimpleLibrary parent() { return parent; }
+    public File natlibs() { return natlibs; }
+    public File natcmds() { return natcmds; }
     public boolean isDeflated() { return hd.isDeflated(); }
 
     private URI location = null;
     public URI location() {
         if (location == null)

@@ -231,23 +257,29 @@
         return (this.getClass().getName()
                 + "[" + canonicalRoot
                 + ", v" + hd.majorVersion + "." + hd.minorVersion + "]");
     }
 
-    private SimpleLibrary(File path, boolean create, File parentPath, Set<StorageOption> opts)
+    private SimpleLibrary(File path, boolean create, File parentPath,
+                          File natlibs, File natcmds, Set<StorageOption> opts)
         throws IOException
     {
         root = path;
         canonicalRoot = root.getCanonicalFile();
         if (root.exists()) {
+            //TODO: root exists, but we are creating????
             if (!root.isDirectory())
                 throw new IOException(root + ": Exists but is not a directory");
             hd = Header.load(root);
             if (hd.parent() != null) {
                 parent = open(hd.parent());
-                parentPath = hd.parent();
+                this.parentPath = hd.parent();
             }
+            if (hd.natlibs() != null)
+                this.natlibs = hd.natlibs();
+            if (hd.natcmds() != null)
+                this.natcmds = hd.natcmds();
             return;
         }
         if (!create)
             throw new FileNotFoundException(root.toString());
         if (parentPath != null) {

@@ -254,37 +286,53 @@
             this.parent = open(parentPath);
             this.parentPath = this.parent.root();
         }
         if (!root.mkdirs())
             throw new IOException(root + ": Cannot create library directory");
-        hd = new Header(canonicalRoot, this.parentPath, opts);
+        if (natlibs != null)
+            // resolve against the working dir, and store the absolute path
+            this.natlibs = natlibs.getCanonicalFile();
+        if (natcmds != null)
+            this.natcmds = natcmds.getCanonicalFile();
+        hd = new Header(canonicalRoot, this.parentPath, this.natlibs,
+                        this.natcmds, opts);
         hd.store();
     }
 
-    public static SimpleLibrary create(File path, File parent, Set<StorageOption> opts)
+    public static SimpleLibrary create(File path, File parent, File natlibs,
+                                       File natcmds, Set<StorageOption> opts)
         throws IOException
     {
-        return new SimpleLibrary(path, true, parent, opts);
+        return new SimpleLibrary(path, true, parent, natlibs, natcmds, opts);
     }
 
+    public static SimpleLibrary create(File path, File parent,
+                                       Set<StorageOption> opts)
+        throws IOException
+    {
+        return new SimpleLibrary(path, true, parent, null, null, opts);
+    }
+
     public static SimpleLibrary create(File path, File parent)
         throws IOException 
     {
-        return new SimpleLibrary(path, true, parent, Collections.<StorageOption>emptySet());
+        return new SimpleLibrary(path, true, parent, null, null,
+                                 Collections.<StorageOption>emptySet());
     }
 
     public static SimpleLibrary create(File path, Set<StorageOption> opts)
         throws IOException
     {
         // ## Should default parent to $JAVA_HOME/lib/modules
-        return new SimpleLibrary(path, true, null, opts);
+        return new SimpleLibrary(path, true, null, null, null, opts);
     }
 
     public static SimpleLibrary open(File path)
         throws IOException
     {
-        return new SimpleLibrary(path, false, null, Collections.<StorageOption>emptySet());
+        return new SimpleLibrary(path, false, null, null, null,
+                                 Collections.<StorageOption>emptySet());
     }
 
     private static final JigsawModuleSystem jms
         = JigsawModuleSystem.instance();
 

@@ -967,11 +1015,11 @@
         throws ConfigurationException, IOException, SignatureException
     {
         BufferedInputStream bin = new BufferedInputStream(is);
         DataInputStream in = new DataInputStream(bin);
         File md = null;
-        try (ModuleFile.Reader mr = new ModuleFile.Reader(in)) {
+        try (ModuleFile.Reader mr = new ModuleFile.Reader(in, this)) {
             byte[] mib = mr.readStart();
             ModuleInfo mi = jms.parseModuleInfo(mib);
             md = moduleDir(mi.id());
             ModuleId mid = mi.id();
             if (md.exists())

@@ -1336,14 +1384,18 @@
     }
 
     public File findLocalNativeLibrary(ModuleId mid, String name)
         throws IOException
     {
-        File md = findModuleDir(mid);
-        if (md == null)
+        File f = natlibs();
+        if (f == null) {
+            f = findModuleDir(mid);
+            if (f == null)
             return null;
-        File f = new File(new File(md, "lib"), name);
+            f = new File(f, "lib");
+        }
+        f = new File(f, name);
         if (!f.exists())
             return null;
         return f;
     }