15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package jdk.internal.jimage;
27
28 import java.io.IOException;
29 import java.io.UncheckedIOException;
30 import java.nio.file.Path;
31 import java.nio.file.Paths;
32 import java.util.concurrent.ConcurrentHashMap;
33 import java.util.Map;
34 import java.util.Objects;
35
36 /**
37 * Factory to get ImageReader
38 *
39 * @implNote This class needs to maintain JDK 8 source compatibility.
40 *
41 * It is used internally in the JDK to implement jimage/jrtfs access,
42 * but also compiled and delivered as part of the jrtfs.jar to support access
43 * to the jimage file provided by the shipped JDK by tools running on JDK 8.
44 */
45 public class ImageReaderFactory {
46 private ImageReaderFactory() {}
47
48 private static final String JAVA_HOME = System.getProperty("java.home");
49 private static final Path BOOT_MODULES_JIMAGE =
50 Paths.get(JAVA_HOME, "lib", "modules");
51
52 private static final Map<Path, ImageReader> readers = new ConcurrentHashMap<>();
53
54 /**
55 * Returns an {@code ImageReader} to read from the given image file
56 */
57 public static ImageReader get(Path jimage) throws IOException {
58 Objects.requireNonNull(jimage);
59 ImageReader reader = readers.get(jimage);
60 if (reader != null) {
61 return reader;
62 }
63 reader = ImageReader.open(jimage);
64 // potential race with other threads opening the same URL
65 ImageReader r = readers.putIfAbsent(jimage, reader);
66 if (r == null) {
67 return reader;
68 } else {
69 reader.close();
70 return r;
71 }
72 }
73
74 /**
75 * Returns the {@code ImageReader} to read the image file in this
76 * run-time image.
77 *
78 * @throws UncheckedIOException if an I/O error occurs
79 */
80 public static ImageReader getImageReader() {
81 try {
82 return get(BOOT_MODULES_JIMAGE);
83 } catch (IOException ioe) {
84 throw new UncheckedIOException(ioe);
85 }
86 }
87 }
|
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package jdk.internal.jimage;
27
28 import java.io.IOException;
29 import java.io.UncheckedIOException;
30 import java.nio.file.Path;
31 import java.nio.file.Paths;
32 import java.util.concurrent.ConcurrentHashMap;
33 import java.util.Map;
34 import java.util.Objects;
35 import java.util.function.Function;
36
37 /**
38 * Factory to get ImageReader
39 *
40 * @implNote This class needs to maintain JDK 8 source compatibility.
41 *
42 * It is used internally in the JDK to implement jimage/jrtfs access,
43 * but also compiled and delivered as part of the jrtfs.jar to support access
44 * to the jimage file provided by the shipped JDK by tools running on JDK 8.
45 */
46 public class ImageReaderFactory {
47 private ImageReaderFactory() {}
48
49 private static final String JAVA_HOME = System.getProperty("java.home");
50 private static final Path BOOT_MODULES_JIMAGE =
51 Paths.get(JAVA_HOME, "lib", "modules");
52
53 private static final Map<Path, ImageReader> readers = new ConcurrentHashMap<>();
54
55 /**
56 * Returns an {@code ImageReader} to read from the given image file
57 */
58 public static ImageReader get(Path jimage) throws IOException {
59 Objects.requireNonNull(jimage);
60 try {
61 return readers.computeIfAbsent(jimage, OPENER);
62 } catch (UncheckedIOException io) {
63 throw io.getCause();
64 }
65 }
66
67 private static Function<Path, ImageReader> OPENER = new Function<Path, ImageReader>() {
68 public ImageReader apply(Path path) {
69 try {
70 return ImageReader.open(path);
71 } catch (IOException io) {
72 throw new UncheckedIOException(io);
73 }
74 }
75 };
76
77 /**
78 * Returns the {@code ImageReader} to read the image file in this
79 * run-time image.
80 *
81 * @throws UncheckedIOException if an I/O error occurs
82 */
83 public static ImageReader getImageReader() {
84 try {
85 return get(BOOT_MODULES_JIMAGE);
86 } catch (IOException ioe) {
87 throw new UncheckedIOException(ioe);
88 }
89 }
90 }
|