< 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 >