test/langtools/tools/javac/file/MultiReleaseJar/MultiReleaseJarAwareSJFM.java
author darcy
Fri, 02 Feb 2018 10:31:05 -0800
changeset 48724 9a00756a58d0
parent 47216 71c04702a3d5
permissions -rw-r--r--
8196627: Update MultiReleaseJarAwareSJFM.java to be version agnostic Reviewed-by: vromero
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
37394
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
     1
/*
48724
9a00756a58d0 8196627: Update MultiReleaseJarAwareSJFM.java to be version agnostic
darcy
parents: 47216
diff changeset
     2
 * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved.
37394
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
     4
 *
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
     7
 * published by the Free Software Foundation.
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
     8
 *
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    13
 * accompanied this code).
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    14
 *
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    18
 *
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    21
 * questions.
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    22
 */
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    23
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    24
/*
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    25
 * @test
48724
9a00756a58d0 8196627: Update MultiReleaseJarAwareSJFM.java to be version agnostic
darcy
parents: 47216
diff changeset
    26
 * @bug 8149757 8144062 8196627
37394
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    27
 * @summary Test that StandardJavaFileManager uses the correct version of a
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    28
 * class from a multi-release jar on classpath
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    29
 * @library /tools/lib
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    30
 * @modules jdk.compiler/com.sun.tools.javac.api
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    31
 *          jdk.compiler/com.sun.tools.javac.main
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    32
 * @build toolbox.ToolBox
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    33
 * @run testng MultiReleaseJarAwareSJFM
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    34
 */
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    35
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    36
import org.testng.Assert;
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    37
import org.testng.annotations.AfterClass;
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    38
import org.testng.annotations.BeforeClass;
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    39
import org.testng.annotations.DataProvider;
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    40
import org.testng.annotations.Test;
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    41
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    42
import javax.tools.FileObject;
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    43
import javax.tools.JavaFileManager;
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    44
import javax.tools.StandardJavaFileManager;
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    45
import javax.tools.ToolProvider;
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    46
import java.io.File;
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    47
import java.io.IOException;
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    48
import java.io.InputStream;
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    49
import java.lang.invoke.MethodHandle;
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    50
import java.lang.invoke.MethodHandles;
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    51
import java.lang.invoke.MethodType;
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    52
import java.util.List;
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    53
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    54
import toolbox.JarTask;
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    55
import toolbox.JavacTask;
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    56
import toolbox.ToolBox;
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    57
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    58
public class MultiReleaseJarAwareSJFM {
48724
9a00756a58d0 8196627: Update MultiReleaseJarAwareSJFM.java to be version agnostic
darcy
parents: 47216
diff changeset
    59
    private static final int CURRENT_VERSION = Runtime.version().major();
37394
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    60
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    61
    private final String version8 =
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    62
            "package version;\n" +
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    63
            "\n" +
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    64
            "public class Version {\n" +
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    65
            "    public int getVersion() {\n" +
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    66
            "        return 8;\n" +
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    67
            "    }\n" +
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    68
            "}\n";
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    69
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    70
    private final String version9 =
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    71
            "package version;\n" +
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    72
            "\n" +
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    73
            "public class Version {\n" +
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    74
            "    public int getVersion() {\n" +
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    75
            "        int version = (new PackagePrivate()).getVersion();\n" +
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    76
            "        if (version == 9) return 9;\n" +
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    77
            "        return version;\n" +
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    78
            "    }\n" +
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    79
            "}\n";
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    80
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    81
    private final String packagePrivate =
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    82
            "package version;\n" +
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    83
            "\n" +
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    84
            "class PackagePrivate {\n" +
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    85
            "    int getVersion() {\n" +
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    86
            "        return 9;\n" +
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    87
            "    }\n" +
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    88
            "}\n";
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    89
48724
9a00756a58d0 8196627: Update MultiReleaseJarAwareSJFM.java to be version agnostic
darcy
parents: 47216
diff changeset
    90
    private final String versionCurrent =
37394
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    91
            "package version;\n" +
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    92
            "\n" +
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    93
            "public class Version {\n" +
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    94
            "    public int getVersion() {\n" +
48724
9a00756a58d0 8196627: Update MultiReleaseJarAwareSJFM.java to be version agnostic
darcy
parents: 47216
diff changeset
    95
            "        return " + CURRENT_VERSION +";\n" +
37394
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    96
            "    }\n" +
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    97
            "}\n";
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    98
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
    99
    private final String manifest =
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   100
            "Manifest-Version: 1.0\n" +
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   101
            "Multi-Release: true\n";
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   102
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   103
    private final ToolBox tb = new ToolBox();
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   104
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   105
    private final JavaFileManager.Location jloc = new JavaFileManager.Location() {
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   106
        @Override
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   107
        public String getName() {
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   108
            return "Multi-Release Jar";
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   109
        }
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   110
        @Override
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   111
        public boolean isOutputLocation() {
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   112
            return false;
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   113
        }
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   114
    };
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   115
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   116
    @BeforeClass
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   117
    public void setup() throws Exception {
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   118
        tb.createDirectories("classes",
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   119
                "classes/META-INF/versions/9",
48724
9a00756a58d0 8196627: Update MultiReleaseJarAwareSJFM.java to be version agnostic
darcy
parents: 47216
diff changeset
   120
                "classes/META-INF/versions/" + CURRENT_VERSION);
37394
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   121
        new JavacTask(tb)
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   122
                .outdir("classes")
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   123
                .sources(version8)
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   124
                .run();
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   125
        new JavacTask(tb)
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   126
                .outdir("classes/META-INF/versions/9")
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   127
                .sources(version9, packagePrivate)
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   128
                .run();
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   129
        new JavacTask(tb)
48724
9a00756a58d0 8196627: Update MultiReleaseJarAwareSJFM.java to be version agnostic
darcy
parents: 47216
diff changeset
   130
                .outdir("classes/META-INF/versions/" + CURRENT_VERSION)
9a00756a58d0 8196627: Update MultiReleaseJarAwareSJFM.java to be version agnostic
darcy
parents: 47216
diff changeset
   131
                .sources(versionCurrent)
37394
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   132
                .run();
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   133
        new JarTask(tb, "multi-release.jar")
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   134
                .manifest(manifest)
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   135
                .baseDir("classes")
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   136
                .files("version/Version.class",
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   137
                        "META-INF/versions/9/version/Version.class",
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   138
                        "META-INF/versions/9/version/PackagePrivate.class",
48724
9a00756a58d0 8196627: Update MultiReleaseJarAwareSJFM.java to be version agnostic
darcy
parents: 47216
diff changeset
   139
                        "META-INF/versions/" + CURRENT_VERSION + "/version/Version.class")
37394
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   140
                .run();
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   141
    }
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   142
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   143
    @AfterClass
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   144
    public void teardown() throws Exception {
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   145
        tb.deleteFiles(
48724
9a00756a58d0 8196627: Update MultiReleaseJarAwareSJFM.java to be version agnostic
darcy
parents: 47216
diff changeset
   146
                "classes/META-INF/versions/" + CURRENT_VERSION + "/version/Version.class",
9a00756a58d0 8196627: Update MultiReleaseJarAwareSJFM.java to be version agnostic
darcy
parents: 47216
diff changeset
   147
                "classes/META-INF/versions/" + CURRENT_VERSION + "/version",
9a00756a58d0 8196627: Update MultiReleaseJarAwareSJFM.java to be version agnostic
darcy
parents: 47216
diff changeset
   148
                "classes/META-INF/versions/" + CURRENT_VERSION,
37394
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   149
                "classes/META-INF/versions/9/version/Version.class",
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   150
                "classes/META-INF/versions/9/version/PackagePrivate.class",
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   151
                "classes/META-INF/versions/9/version",
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   152
                "classes/META-INF/versions/9",
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   153
                "classes/META-INF/versions",
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   154
                "classes/META-INF",
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   155
                "classes/version/Version.class",
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   156
                "classes/version",
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   157
                "classes",
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   158
                "multi-release.jar"
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   159
        );
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   160
    }
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   161
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   162
    @DataProvider(name = "versions")
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   163
    public Object[][] data() {
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   164
        return new Object[][] {
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   165
                {"", 8},
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   166
                {"8", 8},
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   167
                {"9", 9},
38526
6f5838874afc 8144062: Move jdk.Version to java.lang.Runtime.Version
iris
parents: 37394
diff changeset
   168
                {"runtime", Runtime.version().major()}
37394
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   169
        };
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   170
    }
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   171
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   172
    @Test(dataProvider = "versions")
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   173
    public void test(String version, int expected) throws Throwable {
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   174
        StandardJavaFileManager jfm = ToolProvider.getSystemJavaCompiler().getStandardFileManager(null, null, null);
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   175
        jfm.setLocation(jloc, List.of(new File("multi-release.jar")));
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   176
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   177
        if (version.length() > 0) {
40763
209113892b0d 8165109: langtools/test switches to use new CLI options
mchung
parents: 38526
diff changeset
   178
            jfm.handleOption("--multi-release", List.of(version).iterator());
37394
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   179
        }
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   180
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   181
        CustomClassLoader cldr = new CustomClassLoader(jfm);
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   182
        Class<?> versionClass = cldr.loadClass("version.Version");
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   183
        MethodType mt = MethodType.methodType(int.class);
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   184
        MethodHandle mh = MethodHandles.lookup().findVirtual(versionClass, "getVersion", mt);
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   185
        int v = (int)mh.invoke(versionClass.newInstance());
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   186
        Assert.assertEquals(v, expected);
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   187
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   188
        jfm.close();
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   189
    }
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   190
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   191
    private class CustomClassLoader extends ClassLoader {
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   192
        private final JavaFileManager jfm;
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   193
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   194
        public CustomClassLoader(JavaFileManager jfm) {
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   195
            super(null);
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   196
            this.jfm = jfm;
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   197
        }
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   198
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   199
        @Override
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   200
        protected Class<?> findClass(String name) throws ClassNotFoundException {
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   201
            int n = name.lastIndexOf('.');
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   202
            String pkg = n == -1 ? "" : name.substring(0, n);
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   203
            String cls = name.substring(n + 1) + ".class";
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   204
            byte[] b;
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   205
            try {
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   206
                FileObject obj = jfm.getFileForInput(jloc, pkg, cls);
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   207
                try (InputStream is = obj.openInputStream()) {
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   208
                    b = is.readAllBytes();
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   209
                }
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   210
            } catch (IOException x) {
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   211
                throw new ClassNotFoundException(x.getMessage(), x);
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   212
            }
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   213
            return defineClass(name, b, 0, b.length);
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   214
        }
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   215
    }
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   216
}
c36230ee15d9 8149757: Implement Multi-Release JAR aware JavacFileManager for javac
jjg
parents:
diff changeset
   217