2424 */
2525package jdk .internal .jimage ;
2626
27- import java .io .ByteArrayInputStream ;
2827import java .io .IOException ;
29- import java .io .InputStream ;
3028import java .lang .reflect .InvocationTargetException ;
3129import java .lang .reflect .Method ;
3230import java .nio .ByteBuffer ;
4139import java .util .stream .IntStream ;
4240import jdk .internal .jimage .decompressor .Decompressor ;
4341
42+ import static jdk .internal .jimage .BasicImageReader .ImageError .Reason .BAD_VERSION ;
43+ import static jdk .internal .jimage .BasicImageReader .ImageError .Reason .CORRUPT_JIMAGE ;
44+ import static jdk .internal .jimage .BasicImageReader .ImageError .Reason .INVALID_JIMAGE ;
45+
4446/**
4547 * @implNote This class needs to maintain JDK 8 source compatibility.
4648 *
@@ -144,10 +146,10 @@ public Void run() {
144146 if (channel .read (headerBuffer , 0L ) == headerSize ) {
145147 headerBuffer .rewind ();
146148 } else {
147- throw new IOException ( "\" " + name + "\" is not an image file" );
149+ throw new ImageError ( INVALID_JIMAGE , "\" " + name + "\" is not an image file" );
148150 }
149151 } else if (headerBuffer .capacity () < headerSize ) {
150- throw new IOException ( "\" " + name + "\" is not an image file" );
152+ throw new ImageError ( INVALID_JIMAGE , "\" " + name + "\" is not an image file" );
151153 }
152154
153155 // Interpret the image file header
@@ -164,7 +166,7 @@ public Void run() {
164166
165167 // Interpret the image index
166168 if (memoryMap .capacity () < indexSize ) {
167- throw new IOException ( "The image file \" " + name + "\" is corrupted" );
169+ throw new ImageError ( CORRUPT_JIMAGE , "The image file \" " + name + "\" is corrupted" );
168170 }
169171 redirect = intBuffer (memoryMap , header .getRedirectOffset (), header .getRedirectSize ());
170172 offsets = intBuffer (memoryMap , header .getOffsetsOffset (), header .getOffsetsSize ());
@@ -191,14 +193,14 @@ private ImageHeader readHeader(IntBuffer buffer) throws IOException {
191193 ImageHeader result = ImageHeader .readFrom (buffer );
192194
193195 if (result .getMagic () != ImageHeader .MAGIC ) {
194- throw new IOException ( "\" " + name + "\" is not an image file" );
196+ throw new ImageError ( INVALID_JIMAGE , "\" " + name + "\" is not an image file" );
195197 }
196198
197199 if (result .getMajorVersion () != ImageHeader .MAJOR_VERSION ||
198- result .getMinorVersion () != ImageHeader .MINOR_VERSION ) {
199- throw new IOException ( "The image file \" " + name + "\" is not " +
200- "the correct version. Major: " + result .getMajorVersion () +
201- ". Minor: " + result .getMinorVersion ());
200+ result .getMinorVersion () != ImageHeader .MINOR_VERSION ) {
201+ throw new ImageError ( BAD_VERSION , "The image file \" " + name + "\" is not " +
202+ "the correct version. Major: " + result .getMajorVersion () +
203+ ". Minor: " + result .getMinorVersion ());
202204 }
203205
204206 return result ;
@@ -457,10 +459,31 @@ public ByteBuffer getResourceBuffer(ImageLocation loc) {
457459 return null ;
458460 }
459461
460- public InputStream getResourceStream (ImageLocation loc ) {
461- Objects .requireNonNull (loc );
462- byte [] bytes = getResource (loc );
462+ /**
463+ * Specialized {@link IOException} thrown during construction which provides
464+ * a semantic reason for failure.
465+ */
466+ public final static class ImageError extends IOException {
467+ private static final long serialVersionUID = 6002259582237888214L ;
468+
469+ public enum Reason {
470+ /** The file being opened does not appear to be a jimage file. */
471+ INVALID_JIMAGE ,
472+ /** The jimage file being opened is corrupted. */
473+ CORRUPT_JIMAGE ,
474+ /** The jimage file being opened has the wrong version. */
475+ BAD_VERSION ,
476+ }
477+
478+ private final Reason reason ;
463479
464- return new ByteArrayInputStream (bytes );
480+ public ImageError (Reason reason , String message ) {
481+ super (message );
482+ this .reason = reason ;
483+ }
484+
485+ public Reason getReason () {
486+ return reason ;
487+ }
465488 }
466489}
0 commit comments