< prev index next >

test/jdk/modules/etc/JdkQualifiedExportTest.java

Print this page

        

*** 33,42 **** --- 33,43 ---- import jdk.internal.module.ModuleInfo; import java.io.IOException; import java.io.InputStream; import java.io.UncheckedIOException; + import java.lang.module.Configuration; import java.lang.module.ModuleDescriptor; import java.lang.module.ModuleDescriptor.Exports; import java.lang.module.ModuleDescriptor.Opens; import java.lang.module.ModuleFinder; import java.lang.module.ModuleReference;
*** 67,89 **** checkOpens(md); } static Set<String> KNOWN_EXCEPTIONS = Set.of("java.xml/com.sun.xml.internal.stream.writers", "jdk.jsobject/jdk.internal.netscape.javascript.spi"); - static Set<String> DEPLOY_MODULES = - Set.of("jdk.deploy", "jdk.plugin", "jdk.javaws"); static void checkExports(ModuleDescriptor md) { // build a map of upgradeable module to Exports that are qualified to it // skip the qualified exports Map<String, Set<Exports>> targetToExports = new HashMap<>(); md.exports().stream() .filter(Exports::isQualified) .forEach(e -> e.targets().stream() ! .filter(mn -> !HashedModules.contains(mn) && ! ModuleFinder.ofSystem().find(mn).isPresent()) .forEach(t -> targetToExports.computeIfAbsent(t, _k -> new HashSet<>()) .add(e))); if (targetToExports.size() > 0) { String mn = md.name(); --- 68,88 ---- checkOpens(md); } static Set<String> KNOWN_EXCEPTIONS = Set.of("java.xml/com.sun.xml.internal.stream.writers", + "jdk.internal.vm.ci/jdk.vm.ci.services", "jdk.jsobject/jdk.internal.netscape.javascript.spi"); static void checkExports(ModuleDescriptor md) { // build a map of upgradeable module to Exports that are qualified to it // skip the qualified exports Map<String, Set<Exports>> targetToExports = new HashMap<>(); md.exports().stream() .filter(Exports::isQualified) .forEach(e -> e.targets().stream() ! .filter(mn -> accept(md, mn)) .forEach(t -> targetToExports.computeIfAbsent(t, _k -> new HashSet<>()) .add(e))); if (targetToExports.size() > 0) { String mn = md.name();
*** 95,108 **** e.getValue().stream() .forEach(exp -> System.err.format(" exports %s to %s%n", exp.source(), e.getKey())); }); ! // workaround until all qualified exports to upgradeable modules ! // are eliminated if (targetToExports.entrySet().stream() - .filter(e -> !DEPLOY_MODULES.contains(e.getKey())) .flatMap(e -> e.getValue().stream()) .anyMatch(e -> !KNOWN_EXCEPTIONS.contains(mn + "/" + e.source()))) { throw new RuntimeException(mn + " can't export package to upgradeable modules"); } } --- 94,106 ---- e.getValue().stream() .forEach(exp -> System.err.format(" exports %s to %s%n", exp.source(), e.getKey())); }); ! // no qualified exports to upgradeable modules are expected ! // except the known exception cases if (targetToExports.entrySet().stream() .flatMap(e -> e.getValue().stream()) .anyMatch(e -> !KNOWN_EXCEPTIONS.contains(mn + "/" + e.source()))) { throw new RuntimeException(mn + " can't export package to upgradeable modules"); } }
*** 113,124 **** // skip the qualified exports Map<String, Set<Opens>> targetToOpens = new HashMap<>(); md.opens().stream() .filter(Opens::isQualified) .forEach(e -> e.targets().stream() ! .filter(mn -> !HashedModules.contains(mn) && ! ModuleFinder.ofSystem().find(mn).isPresent()) .forEach(t -> targetToOpens.computeIfAbsent(t, _k -> new HashSet<>()) .add(e))); if (targetToOpens.size() > 0) { String mn = md.name(); --- 111,121 ---- // skip the qualified exports Map<String, Set<Opens>> targetToOpens = new HashMap<>(); md.opens().stream() .filter(Opens::isQualified) .forEach(e -> e.targets().stream() ! .filter(mn -> accept(md, mn)) .forEach(t -> targetToOpens.computeIfAbsent(t, _k -> new HashSet<>()) .add(e))); if (targetToOpens.size() > 0) { String mn = md.name();
*** 134,143 **** --- 131,157 ---- throw new RuntimeException(mn + " can't open package to upgradeable modules"); } } + /** + * Returns true if target is an upgradeable module but not required + * by the source module directly and indirectly. + */ + private static boolean accept(ModuleDescriptor source, String target) { + if (HashedModules.contains(target)) + return false; + + if (!ModuleFinder.ofSystem().find(target).isPresent()) + return false; + + Configuration cf = Configuration.empty().resolve(ModuleFinder.of(), + ModuleFinder.ofSystem(), + Set.of(source.name())); + return cf.findModule(target).orElse(null) == null; + } + private static class HashedModules { static Set<String> HASHED_MODULES = hashedModules(); static Set<String> hashedModules() { Module javaBase = Object.class.getModule();
< prev index next >