# HG changeset patch # User redestad # Date 1489602136 -3600 # Wed Mar 15 19:22:16 2017 +0100 # Node ID 5287c7c05b71c9d45301a3ea6c9df726027b766a # Parent fccdf07c7c6731e7e41e8bcc86cf905eaf6565ad 8176709: JarFileSystem::isMultiReleaseJar is incorrect Reviewed-by: mchung diff --git a/src/jdk.zipfs/share/classes/jdk/nio/zipfs/JarFileSystem.java b/src/jdk.zipfs/share/classes/jdk/nio/zipfs/JarFileSystem.java --- a/src/jdk.zipfs/share/classes/jdk/nio/zipfs/JarFileSystem.java +++ b/src/jdk.zipfs/share/classes/jdk/nio/zipfs/JarFileSystem.java @@ -28,10 +28,12 @@ import java.io.IOException; import java.io.InputStream; import java.lang.Runtime.Version; +import java.nio.file.NoSuchFileException; import java.nio.file.Path; import java.util.Arrays; import java.util.HashMap; import java.util.Map; +import java.util.Objects; import java.util.TreeMap; import java.util.function.Consumer; import java.util.function.Function; @@ -86,12 +88,12 @@ } } - private boolean isMultiReleaseJar() { + private boolean isMultiReleaseJar() throws IOException { try (InputStream is = newInputStream(getBytes("/META-INF/MANIFEST.MF"))) { - return (new Manifest(is)).getMainAttributes() - .containsKey(new Attributes.Name("Multi-Release")); - // fixme change line above after JarFile integration to contain Attributes.Name.MULTI_RELEASE - } catch (IOException x) { + String multiRelease = new Manifest(is).getMainAttributes() + .getValue(Attributes.Name.MULTI_RELEASE); + return "true".equalsIgnoreCase(multiRelease); + } catch (NoSuchFileException x) { return false; } } diff --git a/test/jdk/nio/zipfs/MultiReleaseJarTest.java b/test/jdk/nio/zipfs/MultiReleaseJarTest.java --- a/test/jdk/nio/zipfs/MultiReleaseJarTest.java +++ b/test/jdk/nio/zipfs/MultiReleaseJarTest.java @@ -23,7 +23,7 @@ /* * @test - * @bug 8144355 8144062 + * @bug 8144355 8144062 8176709 * @summary Test aliasing additions to ZipFileSystem for multi-release jar files * @library /lib/testlibrary/java/util/jar * @build Compiler JarBuilder CreateMultiReleaseTestJars @@ -42,6 +42,7 @@ import java.nio.file.*; import java.util.HashMap; import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; import org.testng.Assert; import org.testng.annotations.*; @@ -50,6 +51,7 @@ final private int MAJOR_VERSION = Runtime.version().major(); final private String userdir = System.getProperty("user.dir","."); + final private CreateMultiReleaseTestJars creator = new CreateMultiReleaseTestJars(); final private Map stringEnv = new HashMap<>(); final private Map integerEnv = new HashMap<>(); final private Map versionEnv = new HashMap<>(); @@ -63,7 +65,6 @@ @BeforeClass public void initialize() throws Exception { - CreateMultiReleaseTestJars creator = new CreateMultiReleaseTestJars(); creator.compileEntries(); creator.buildUnversionedJar(); creator.buildMultiReleaseJar(); @@ -187,6 +188,44 @@ } } + @Test + public void testIsMultiReleaseJar() throws Exception { + testCustomMultiReleaseValue("true", true); + testCustomMultiReleaseValue("true\r\nOther: value", true); + testCustomMultiReleaseValue("true\nOther: value", true); + testCustomMultiReleaseValue("true\rOther: value", true); + + testCustomMultiReleaseValue("false", false); + testCustomMultiReleaseValue(" true", false); + testCustomMultiReleaseValue("true ", false); + testCustomMultiReleaseValue("true\n ", false); + testCustomMultiReleaseValue("true\r ", false); + testCustomMultiReleaseValue("true\n true", false); + testCustomMultiReleaseValue("true\r\n true", false); + } + + private static final AtomicInteger JAR_COUNT = new AtomicInteger(0); + + private void testCustomMultiReleaseValue(String value, boolean expected) + throws Exception { + String fileName = "custom-mr" + JAR_COUNT.incrementAndGet() + ".jar"; + creator.buildCustomMultiReleaseJar(fileName, value, Map.of(), + /*addEntries*/true); + + Map env = Map.of("multi-release", "runtime"); + Path filePath = Paths.get(userdir, fileName); + String ssp = filePath.toUri().toString(); + URI customJar = new URI("jar", ssp , null); + try (FileSystem fs = FileSystems.newFileSystem(customJar, env)) { + if (expected) { + Assert.assertTrue(readAndCompare(fs, MAJOR_VERSION)); + } else { + Assert.assertTrue(readAndCompare(fs, 8)); + } + } + Files.delete(filePath); + } + private static class ByteArrayClassLoader extends ClassLoader { final private FileSystem fs; diff --git a/test/lib/testlibrary/java/util/jar/CreateMultiReleaseTestJars.java b/test/lib/testlibrary/java/util/jar/CreateMultiReleaseTestJars.java --- a/test/lib/testlibrary/java/util/jar/CreateMultiReleaseTestJars.java +++ b/test/lib/testlibrary/java/util/jar/CreateMultiReleaseTestJars.java @@ -109,9 +109,17 @@ public void buildCustomMultiReleaseJar(String filename, String multiReleaseValue, Map extraAttributes) throws IOException { + buildCustomMultiReleaseJar(filename, multiReleaseValue, extraAttributes, false); + } + + public void buildCustomMultiReleaseJar(String filename, String multiReleaseValue, + Map extraAttributes, boolean addEntries) throws IOException { JarBuilder jb = new JarBuilder(filename); extraAttributes.entrySet() .forEach(entry -> jb.addAttribute(entry.getKey(), entry.getValue())); + if (addEntries) { + addEntries(jb); + } jb.addAttribute("Multi-Release", multiReleaseValue); jb.build(); }