< prev index next >

src/java.base/share/classes/jdk/internal/module/SystemModuleFinders.java

Print this page

397             return READER;
398         }
399     }
400 
401     /**
402      * A ModuleReader for reading resources from a module linked into the
403      * run-time image.
404      */
405     private static class SystemModuleReader implements ModuleReader {
406         private final String module;
407         private volatile boolean closed;
408 
409         SystemModuleReader(String module) {
410             this.module = module;
411         }
412 
413         /**
414          * Returns {@code true} if the given resource exists, {@code false}
415          * if not found.
416          */
417         private boolean containsResource(String resourcePath) throws IOException {
418             Objects.requireNonNull(resourcePath);
419             if (closed)
420                 throw new IOException("ModuleReader is closed");
421             ImageReader imageReader = SystemImage.reader();
422             if (imageReader != null) {
423                 ImageReader.Node node = imageReader.findNode("/modules" + resourcePath);
424                 return node != null && node.isResource();
425             } else {
426                 // not an images build
427                 return false;
428             }
429         }
430 
431         @Override
432         public Optional<URI> find(String name) throws IOException {
433             Objects.requireNonNull(name);
434             String resourcePath = "/" + module + "/" + name;
435             if (containsResource(resourcePath)) {
436                 URI u = JNUA.create("jrt", resourcePath);
437                 return Optional.of(u);
438             } else {
439                 return Optional.empty();
440             }
441         }
442 
443         @Override
444         public Optional<InputStream> open(String name) throws IOException {
445             return read(name).map(this::toInputStream);
446         }
447 
448         private InputStream toInputStream(ByteBuffer bb) { // ## -> ByteBuffer?
449             try {
450                 int rem = bb.remaining();
451                 byte[] bytes = new byte[rem];
452                 bb.get(bytes);
453                 return new ByteArrayInputStream(bytes);
454             } finally {
455                 release(bb);
456             }
457         }
458 
459         /**
460          * Returns the node for the given resource if found. If the name references
461          * a non-resource node, then {@code null} is returned.
462          */
463         private ImageReader.Node findResource(ImageReader reader, String name) throws IOException {
464             Objects.requireNonNull(name);
465             if (closed) {
466                 throw new IOException("ModuleReader is closed");
467             }
468             String nodeName = "/modules/" + module + "/" + name;
469             ImageReader.Node node = reader.findNode(nodeName);
470             return (node != null && node.isResource()) ? node : null;
471         }
472 
473         @Override
474         public Optional<ByteBuffer> read(String name) throws IOException {
475             ImageReader reader = SystemImage.reader();
476             return Optional.ofNullable(findResource(reader, name))
477                     .map(reader::getResourceBuffer);
478         }
479 
480         @Override
481         public void release(ByteBuffer bb) {
482             Objects.requireNonNull(bb);
483             ImageReader.releaseByteBuffer(bb);
484         }
485 
486         @Override
487         public Stream<String> list() throws IOException {
488             if (closed)
489                 throw new IOException("ModuleReader is closed");
490 

397             return READER;
398         }
399     }
400 
401     /**
402      * A ModuleReader for reading resources from a module linked into the
403      * run-time image.
404      */
405     private static class SystemModuleReader implements ModuleReader {
406         private final String module;
407         private volatile boolean closed;
408 
409         SystemModuleReader(String module) {
410             this.module = module;
411         }
412 
413         /**
414          * Returns {@code true} if the given resource exists, {@code false}
415          * if not found.
416          */
417         private boolean containsResource(String module, String name) throws IOException {
418             Objects.requireNonNull(name);
419             if (closed)
420                 throw new IOException("ModuleReader is closed");
421             ImageReader imageReader = SystemImage.reader();
422             return imageReader != null && imageReader.containsResource(module, name);






423         }
424 
425         @Override
426         public Optional<URI> find(String name) throws IOException {
427             Objects.requireNonNull(name);
428             if (containsResource(module, name)) {
429                 URI u = JNUA.create("jrt", "/" + module + "/" + name);

430                 return Optional.of(u);
431             } else {
432                 return Optional.empty();
433             }
434         }
435 
436         @Override
437         public Optional<InputStream> open(String name) throws IOException {
438             return read(name).map(this::toInputStream);
439         }
440 
441         private InputStream toInputStream(ByteBuffer bb) { // ## -> ByteBuffer?
442             try {
443                 int rem = bb.remaining();
444                 byte[] bytes = new byte[rem];
445                 bb.get(bytes);
446                 return new ByteArrayInputStream(bytes);
447             } finally {
448                 release(bb);
449             }
450         }
451 
452         /**
453          * Returns the node for the given resource if found. If the name references
454          * a non-resource node, then {@code null} is returned.
455          */
456         private ImageReader.Node findResource(ImageReader reader, String name) throws IOException {
457             Objects.requireNonNull(name);
458             if (closed) {
459                 throw new IOException("ModuleReader is closed");
460             }
461             return reader.findResourceNode(module, name);


462         }
463 
464         @Override
465         public Optional<ByteBuffer> read(String name) throws IOException {
466             ImageReader reader = SystemImage.reader();
467             return Optional.ofNullable(findResource(reader, name))
468                     .map(reader::getResourceBuffer);
469         }
470 
471         @Override
472         public void release(ByteBuffer bb) {
473             Objects.requireNonNull(bb);
474             ImageReader.releaseByteBuffer(bb);
475         }
476 
477         @Override
478         public Stream<String> list() throws IOException {
479             if (closed)
480                 throw new IOException("ModuleReader is closed");
481 
< prev index next >