498 for (String name : e.getValue()) { 499 if (ALL_UNNAMED.equals(name)) { 500 Modules.addReadsAllUnnamed(m); 501 } else { 502 om = bootLayer.findModule(name); 503 if (om.isPresent()) { 504 Modules.addReads(m, om.get()); 505 } else { 506 warnUnknownModule(ADD_READS, name); 507 } 508 } 509 } 510 } 511 } 512 513 /** 514 * Process the --add-exports and --add-opens options to export/open 515 * additional packages specified on the command-line. 516 */ 517 private static void addExtraExportsAndOpens(Layer bootLayer) { 518 IllegalAccessLogger.Builder builder = new IllegalAccessLogger.Builder(); 519 520 // --add-exports 521 String prefix = "jdk.module.addexports."; 522 Map<String, List<String>> extraExports = decode(prefix); 523 if (!extraExports.isEmpty()) { 524 addExtraExportsOrOpens(bootLayer, extraExports, false, builder); 525 } 526 527 // --add-opens 528 prefix = "jdk.module.addopens."; 529 Map<String, List<String>> extraOpens = decode(prefix); 530 if (!extraOpens.isEmpty()) { 531 addExtraExportsOrOpens(bootLayer, extraOpens, true, builder); 532 } 533 534 // --permit-illegal-access 535 if (getAndRemoveProperty("jdk.module.permitIllegalAccess") != null) { 536 warn("--permit-illegal-access will be removed in the next major release"); 537 bootLayer.modules().stream().forEach(m -> { 538 m.getDescriptor() 539 .packages() 540 .stream() 541 .filter(pn -> !m.isOpen(pn)) 542 .forEach(pn -> { 543 builder.logAccessToOpenPackage(m, pn, "--permit-illegal-access"); 544 Modules.addOpensToAllUnnamed(m, pn); 545 }); 546 }); 547 } 548 549 IllegalAccessLogger.setIllegalAccessLogger(builder.build()); 550 } 551 552 private static void addExtraExportsOrOpens(Layer bootLayer, 553 Map<String, List<String>> map, 554 boolean opens, 555 IllegalAccessLogger.Builder builder) 556 { 557 String option = opens ? ADD_OPENS : ADD_EXPORTS; 558 for (Map.Entry<String, List<String>> e : map.entrySet()) { 559 560 // the key is $MODULE/$PACKAGE 561 String key = e.getKey(); 562 String[] s = key.split("/"); 563 if (s.length != 2) 564 fail(unableToParse(option, "<module>/<package>", key)); 565 566 String mn = s[0]; 567 String pn = s[1]; 568 if (mn.isEmpty() || pn.isEmpty()) 569 fail(unableToParse(option, "<module>/<package>", key)); 570 571 // The exporting module is in the boot layer 572 Module m; 573 Optional<Module> om = bootLayer.findModule(mn); 574 if (!om.isPresent()) { 575 warnUnknownModule(option, mn); 583 continue; 584 } 585 586 // the value is the set of modules to export to (by name) 587 for (String name : e.getValue()) { 588 boolean allUnnamed = false; 589 Module other = null; 590 if (ALL_UNNAMED.equals(name)) { 591 allUnnamed = true; 592 } else { 593 om = bootLayer.findModule(name); 594 if (om.isPresent()) { 595 other = om.get(); 596 } else { 597 warnUnknownModule(option, name); 598 continue; 599 } 600 } 601 if (allUnnamed) { 602 if (opens) { 603 builder.logAccessToOpenPackage(m, pn, option); 604 Modules.addOpensToAllUnnamed(m, pn); 605 } else { 606 builder.logAccessToExportedPackage(m, pn, option); 607 Modules.addExportsToAllUnnamed(m, pn); 608 } 609 } else { 610 if (opens) { 611 Modules.addOpens(m, pn, other); 612 } else { 613 Modules.addExports(m, pn, other); 614 } 615 } 616 617 } 618 } 619 } 620 621 /** 622 * Decodes the values of --add-reads, -add-exports, --add-opens or 623 * --patch-modules options that are encoded in system properties. 624 * 625 * @param prefix the system property prefix 626 * @praam regex the regex for splitting the RHS of the option value | 498 for (String name : e.getValue()) { 499 if (ALL_UNNAMED.equals(name)) { 500 Modules.addReadsAllUnnamed(m); 501 } else { 502 om = bootLayer.findModule(name); 503 if (om.isPresent()) { 504 Modules.addReads(m, om.get()); 505 } else { 506 warnUnknownModule(ADD_READS, name); 507 } 508 } 509 } 510 } 511 } 512 513 /** 514 * Process the --add-exports and --add-opens options to export/open 515 * additional packages specified on the command-line. 516 */ 517 private static void addExtraExportsAndOpens(Layer bootLayer) { 518 // --add-exports 519 String prefix = "jdk.module.addexports."; 520 Map<String, List<String>> extraExports = decode(prefix); 521 if (!extraExports.isEmpty()) { 522 addExtraExportsOrOpens(bootLayer, extraExports, false); 523 } 524 525 // --add-opens 526 prefix = "jdk.module.addopens."; 527 Map<String, List<String>> extraOpens = decode(prefix); 528 if (!extraOpens.isEmpty()) { 529 addExtraExportsOrOpens(bootLayer, extraOpens, true); 530 } 531 532 // --permit-illegal-access 533 if (getAndRemoveProperty("jdk.module.permitIllegalAccess") != null) { 534 warn("--permit-illegal-access will be removed in the next major release"); 535 IllegalAccessLogger.Builder builder = new IllegalAccessLogger.Builder(); 536 Module unnamed = BootLoader.getUnnamedModule(); 537 bootLayer.modules().stream().forEach(m -> { 538 m.getDescriptor() 539 .packages() 540 .stream() 541 .filter(pn -> !m.isOpen(pn, unnamed)) // skip if opened by --add-opens 542 .forEach(pn -> { 543 builder.logAccessToOpenPackage(m, pn, "--permit-illegal-access"); 544 Modules.addOpensToAllUnnamed(m, pn); 545 }); 546 }); 547 IllegalAccessLogger.setIllegalAccessLogger(builder.build()); 548 } 549 } 550 551 private static void addExtraExportsOrOpens(Layer bootLayer, 552 Map<String, List<String>> map, 553 boolean opens) 554 { 555 String option = opens ? ADD_OPENS : ADD_EXPORTS; 556 for (Map.Entry<String, List<String>> e : map.entrySet()) { 557 558 // the key is $MODULE/$PACKAGE 559 String key = e.getKey(); 560 String[] s = key.split("/"); 561 if (s.length != 2) 562 fail(unableToParse(option, "<module>/<package>", key)); 563 564 String mn = s[0]; 565 String pn = s[1]; 566 if (mn.isEmpty() || pn.isEmpty()) 567 fail(unableToParse(option, "<module>/<package>", key)); 568 569 // The exporting module is in the boot layer 570 Module m; 571 Optional<Module> om = bootLayer.findModule(mn); 572 if (!om.isPresent()) { 573 warnUnknownModule(option, mn); 581 continue; 582 } 583 584 // the value is the set of modules to export to (by name) 585 for (String name : e.getValue()) { 586 boolean allUnnamed = false; 587 Module other = null; 588 if (ALL_UNNAMED.equals(name)) { 589 allUnnamed = true; 590 } else { 591 om = bootLayer.findModule(name); 592 if (om.isPresent()) { 593 other = om.get(); 594 } else { 595 warnUnknownModule(option, name); 596 continue; 597 } 598 } 599 if (allUnnamed) { 600 if (opens) { 601 Modules.addOpensToAllUnnamed(m, pn); 602 } else { 603 Modules.addExportsToAllUnnamed(m, pn); 604 } 605 } else { 606 if (opens) { 607 Modules.addOpens(m, pn, other); 608 } else { 609 Modules.addExports(m, pn, other); 610 } 611 } 612 613 } 614 } 615 } 616 617 /** 618 * Decodes the values of --add-reads, -add-exports, --add-opens or 619 * --patch-modules options that are encoded in system properties. 620 * 621 * @param prefix the system property prefix 622 * @praam regex the regex for splitting the RHS of the option value |