< prev index next >

src/jdk.jartool/share/classes/sun/tools/jar/Main.java

Print this page
rev 16153 : 8164805: Fail to create a MR modular JAR with a versioned entry of a concealed package
Reviewed-by: chegar, mchung

*** 78,87 **** --- 78,88 ---- String program; PrintWriter out, err; String fname, mname, ename; String zname = ""; String rootjar = null; + Set<String> concealedPackages = new HashSet<>(); private static final int BASE_VERSION = 0; class Entry { final String basename;
*** 834,844 **** return toPackageName(entry.getName()); } private static String toPackageName(String path) { assert path.endsWith(".class"); ! int index = path.lastIndexOf('/'); if (index != -1) { return path.substring(0, index).replace('/', '.'); } else { return ""; } --- 835,853 ---- return toPackageName(entry.getName()); } private static String toPackageName(String path) { assert path.endsWith(".class"); ! int index; ! if (path.startsWith(VERSIONS_DIR)) { ! index = path.indexOf('/', VERSIONS_DIR.length()); ! if (index <= 0) { ! return ""; ! } ! path = path.substring(index + 1); ! } ! index = path.lastIndexOf('/'); if (index != -1) { return path.substring(0, index).replace('/', '.'); } else { return ""; }
*** 873,883 **** moduleInfoPaths.put(entryName, f.toPath()); if (isUpdate) entryMap.put(entryName, entry); } else if (entries.add(entry)) { jarEntries.add(entryName); ! if (entry.basename.endsWith(".class") && !entryName.startsWith(VERSIONS_DIR)) packages.add(toPackageName(entry.basename)); if (isUpdate) entryMap.put(entryName, entry); } } else if (f.isDirectory()) { --- 882,892 ---- moduleInfoPaths.put(entryName, f.toPath()); if (isUpdate) entryMap.put(entryName, entry); } else if (entries.add(entry)) { jarEntries.add(entryName); ! if (entry.basename.endsWith(".class")) packages.add(toPackageName(entry.basename)); if (isUpdate) entryMap.put(entryName, entry); } } else if (f.isDirectory()) {
*** 1066,1076 **** entryMap.remove(name); entries.remove(ent); } jarEntries.add(name); ! if (name.endsWith(".class") && !(name.startsWith(VERSIONS_DIR))) packages.add(toPackageName(name)); } } // add the remaining new files --- 1075,1085 ---- entryMap.remove(name); entries.remove(ent); } jarEntries.add(name); ! if (name.endsWith(".class")) packages.add(toPackageName(name)); } } // add the remaining new files
*** 1760,1769 **** --- 1769,1785 ---- void error(String s) { err.println(s); } /** + * Print a warning message + */ + void warn(String s) { + err.println(s); + } + + /** * Main routine to start program. */ public static void main(String args[]) { Main jartool = new Main(System.out, System.err, "jar"); System.exit(jartool.run(args) ? 0 : 1);
*** 1973,2000 **** assert !moduleInfos.isEmpty() && moduleInfos.get(MODULE_INFO) != null; ByteBuffer bb = ByteBuffer.wrap(moduleInfos.get(MODULE_INFO)); ModuleDescriptor rd = ModuleDescriptor.read(bb); ! Set<String> exports = rd.exports() ! .stream() ! .map(Exports::source) ! .collect(toSet()); ! ! Set<String> conceals = packages.stream() ! .filter(p -> !exports.contains(p)) ! .collect(toSet()); for (Map.Entry<String,byte[]> e: moduleInfos.entrySet()) { ModuleDescriptor vd = ModuleDescriptor.read(ByteBuffer.wrap(e.getValue())); if (!(isValidVersionedDescriptor(vd, rd))) return false; ! e.setValue(extendedInfoBytes(rd, vd, e.getValue(), conceals)); } return true; } private static boolean isPlatformModule(String name) { return name.startsWith("java.") || name.startsWith("jdk."); } /** --- 1989,2023 ---- assert !moduleInfos.isEmpty() && moduleInfos.get(MODULE_INFO) != null; ByteBuffer bb = ByteBuffer.wrap(moduleInfos.get(MODULE_INFO)); ModuleDescriptor rd = ModuleDescriptor.read(bb); ! concealedPackages = findConcealedPackages(rd); for (Map.Entry<String,byte[]> e: moduleInfos.entrySet()) { ModuleDescriptor vd = ModuleDescriptor.read(ByteBuffer.wrap(e.getValue())); if (!(isValidVersionedDescriptor(vd, rd))) return false; ! e.setValue(extendedInfoBytes(rd, vd, e.getValue(), concealedPackages)); } return true; } + private Set<String> findConcealedPackages(ModuleDescriptor md){ + Objects.requireNonNull(md); + + Set<String> exports = md.exports() + .stream() + .map(Exports::source) + .collect(toSet()); + + return packages.stream() + .filter(p -> !p.equals("")) + .filter(p -> !exports.contains(p)) + .collect(toSet()); + } + private static boolean isPlatformModule(String name) { return name.startsWith("java.") || name.startsWith("jdk."); } /**
< prev index next >