< 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,10 +78,11 @@
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,11 +835,19 @@
return toPackageName(entry.getName());
}
private static String toPackageName(String path) {
assert path.endsWith(".class");
- int index = path.lastIndexOf('/');
+ 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,11 +882,11 @@
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))
+ if (entry.basename.endsWith(".class"))
packages.add(toPackageName(entry.basename));
if (isUpdate)
entryMap.put(entryName, entry);
}
} else if (f.isDirectory()) {
@@ -1066,11 +1075,11 @@
entryMap.remove(name);
entries.remove(ent);
}
jarEntries.add(name);
- if (name.endsWith(".class") && !(name.startsWith(VERSIONS_DIR)))
+ if (name.endsWith(".class"))
packages.add(toPackageName(name));
}
}
// add the remaining new files
@@ -1760,10 +1769,17 @@
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,28 +1989,35 @@
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());
+ 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(), conceals));
+ 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 >