< prev index next >
jdk/src/java.base/share/classes/jdk/internal/module/ModulePatcher.java
Print this page
*** 56,95 ****
import jdk.internal.misc.SharedSecrets;
import sun.net.www.ParseUtil;
/**
! * Provides support for patching modules in the boot layer with -Xpatch.
*/
public final class ModulePatcher {
private static final JavaLangModuleAccess JLMA
= SharedSecrets.getJavaLangModuleAccess();
! // the prefix of the system properties that encode the value of -Xpatch
! private static final String PATCH_PROPERTY_PREFIX = "jdk.launcher.patch.";
// module name -> sequence of patches (directories or JAR files)
private static final Map<String, List<Path>> PATCH_MAP = decodeProperties();
private ModulePatcher() { }
-
/**
! * Decodes the values of -Xpatch options, returning a Map of module name to
! * list of file paths.
*
* @throws IllegalArgumentException if the the module name is missing or
! * -Xpatch is used more than once to patch the same module
*/
private static Map<String, List<Path>> decodeProperties() {
int index = 0;
! String value = System.getProperty(PATCH_PROPERTY_PREFIX + index);
if (value == null)
! return Collections.emptyMap(); // -Xpatch not specified
Map<String, List<Path>> map = new HashMap<>();
while (value != null) {
// <module>=<file>(:<file>)*
--- 56,94 ----
import jdk.internal.misc.SharedSecrets;
import sun.net.www.ParseUtil;
/**
! * Provides support for patching modules in the boot layer with --patch-module.
*/
public final class ModulePatcher {
private static final JavaLangModuleAccess JLMA
= SharedSecrets.getJavaLangModuleAccess();
! // the prefix of the system properties that encode the value of --patch-module
! private static final String PATCH_PROPERTY_PREFIX = "jdk.module.patch.";
// module name -> sequence of patches (directories or JAR files)
private static final Map<String, List<Path>> PATCH_MAP = decodeProperties();
private ModulePatcher() { }
/**
! * Decodes the values of --patch-module options, returning a Map of module
! * name to list of file paths.
*
* @throws IllegalArgumentException if the the module name is missing or
! * --patch-module is used more than once to patch the same module
*/
private static Map<String, List<Path>> decodeProperties() {
int index = 0;
! String value = getAndRemoveProperty(PATCH_PROPERTY_PREFIX + index);
if (value == null)
! return Collections.emptyMap(); // --patch-module not specified
Map<String, List<Path>> map = new HashMap<>();
while (value != null) {
// <module>=<file>(:<file>)*
*** 113,130 ****
list.add(Paths.get(path));
}
}
index++;
! value = System.getProperty(PATCH_PROPERTY_PREFIX + index);
}
return map;
}
/**
* Returns a module reference that interposes on the given module if
* needed. If there are no patches for the given module then the module
* reference is simply returned. Otherwise the patches for the module
* are scanned (to find any new concealed packages) and a new module
* reference is returned.
--- 112,137 ----
list.add(Paths.get(path));
}
}
index++;
! value = getAndRemoveProperty(PATCH_PROPERTY_PREFIX + index);
}
return map;
}
/**
+ * Returns {@code true} is --patch-module is specified to patch modules
+ * in the boot layer.
+ */
+ static boolean isBootLayerPatched() {
+ return !PATCH_MAP.isEmpty();
+ }
+
+ /**
* Returns a module reference that interposes on the given module if
* needed. If there are no patches for the given module then the module
* reference is simply returned. Otherwise the patches for the module
* are scanned (to find any new concealed packages) and a new module
* reference is returned.
*** 535,544 ****
--- 542,558 ----
return parent.toString().replace(File.separatorChar, '.');
}
}
/**
+ * Gets and remove the named system property
+ */
+ private static String getAndRemoveProperty(String key) {
+ return (String)System.getProperties().remove(key);
+ }
+
+ /**
* Derives a package name from the name of an entry in a JAR file.
*/
private static String toPackageName(Path file, JarEntry entry) {
String name = entry.getName();
int index = name.lastIndexOf("/");
< prev index next >