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
|