< prev index next >

src/jdk.zipfs/share/classes/jdk/nio/zipfs/JarFileSystem.java

Print this page

        

@@ -58,22 +58,24 @@
         return super.getInode(lookup.apply(path));
     }
 
     JarFileSystem(ZipFileSystemProvider provider, Path zfpath, Map<String,?> env) throws IOException {
         super(provider, zfpath, env);
-        if (isMultiReleaseJar()) {
+        Object o = getRuntimeVersion(env);
+        if (isMultiReleaseJar() && (o != null)) {
             int version;
-            Object o = env.get("multi-release");
             if (o instanceof String) {
                 String s = (String)o;
                 if (s.equals("runtime")) {
                     version = Runtime.version().feature();
+                } else if (s.matches("^[1-9][0-9]*$")) {
+                    version = Version.parse(s).feature();
                 } else {
-                    version = Integer.parseInt(s);
+                    throw new IllegalArgumentException("Invalid runtime version");
                 }
             } else if (o instanceof Integer) {
-                version = (Integer)o;
+                version = Version.parse(((Integer)o).toString()).feature();
             } else if (o instanceof Version) {
                 version = ((Version)o).feature();
             } else {
                 throw new IllegalArgumentException("env parameter must be String, Integer, "
                         + "or Version");

@@ -81,10 +83,28 @@
             createVersionedLinks(version < 0 ? 0 : version);
             setReadOnly();
         }
     }
 
+    /**
+     * Utility method to get the release version for a multi-release JAR.  It
+     * first checks the documented property {@code releaseVersion} and if not
+     * found checks the original property {@code multi-release}
+     * @param env  ZIP FS map
+     * @return  release version or null if it is not specified
+     */
+    private Object getRuntimeVersion(Map<String, ?> env) {
+
+        Object o = null;
+        if( env.containsKey(ZipFileSystemProvider.RELEASE_VERSION)) {
+            o = env.get(ZipFileSystemProvider.RELEASE_VERSION);
+        } else {
+            o = env.get(ZipFileSystemProvider.MULTI_RELEASE);
+        }
+        return   o;
+    }
+
     private boolean isMultiReleaseJar() throws IOException {
         try (InputStream is = newInputStream(getBytes("/META-INF/MANIFEST.MF"))) {
             String multiRelease = new Manifest(is).getMainAttributes()
                 .getValue(Attributes.Name.MULTI_RELEASE);
             return "true".equalsIgnoreCase(multiRelease);
< prev index next >