< prev index next >
src/java.base/share/classes/jdk/internal/module/SystemModuleFinder.java
Print this page
*** 21,44 ****
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
! package java.lang.module;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UncheckedIOException;
import java.net.URI;
import java.net.URLConnection;
import java.nio.ByteBuffer;
import java.util.ArrayDeque;
import java.util.Collections;
import java.util.Deque;
import java.util.HashMap;
- import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Objects;
import java.util.Optional;
--- 21,47 ----
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
! package jdk.internal.module;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UncheckedIOException;
+ import java.lang.module.ModuleDescriptor;
+ import java.lang.module.ModuleFinder;
+ import java.lang.module.ModuleReader;
+ import java.lang.module.ModuleReference;
import java.net.URI;
import java.net.URLConnection;
import java.nio.ByteBuffer;
import java.util.ArrayDeque;
import java.util.Collections;
import java.util.Deque;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Objects;
import java.util.Optional;
*** 52,77 ****
import jdk.internal.jimage.ImageLocation;
import jdk.internal.jimage.ImageReader;
import jdk.internal.jimage.ImageReaderFactory;
import jdk.internal.misc.JavaNetUriAccess;
import jdk.internal.misc.SharedSecrets;
- import jdk.internal.module.ModuleBootstrap;
- import jdk.internal.module.ModuleHashes;
import jdk.internal.module.ModuleHashes.HashSupplier;
- import jdk.internal.module.SystemModules;
- import jdk.internal.module.ModulePatcher;
import jdk.internal.perf.PerfCounter;
/**
* A {@code ModuleFinder} that finds modules that are linked into the
* run-time image.
*
* The modules linked into the run-time image are assumed to have the
* Packages attribute.
*/
! class SystemModuleFinder implements ModuleFinder {
private static final JavaNetUriAccess JNUA = SharedSecrets.getJavaNetUriAccess();
private static final PerfCounter initTime
= PerfCounter.newPerfCounter("jdk.module.finder.jimage.initTime");
--- 55,76 ----
import jdk.internal.jimage.ImageLocation;
import jdk.internal.jimage.ImageReader;
import jdk.internal.jimage.ImageReaderFactory;
import jdk.internal.misc.JavaNetUriAccess;
import jdk.internal.misc.SharedSecrets;
import jdk.internal.module.ModuleHashes.HashSupplier;
import jdk.internal.perf.PerfCounter;
/**
* A {@code ModuleFinder} that finds modules that are linked into the
* run-time image.
*
* The modules linked into the run-time image are assumed to have the
* Packages attribute.
*/
! public class SystemModuleFinder implements ModuleFinder {
private static final JavaNetUriAccess JNUA = SharedSecrets.getJavaNetUriAccess();
private static final PerfCounter initTime
= PerfCounter.newPerfCounter("jdk.module.finder.jimage.initTime");
*** 82,171 ****
private static final PerfCounter exportsCount
= PerfCounter.newPerfCounter("jdk.module.finder.jimage.exports");
// ImageReader used to access all modules in the image
private static final ImageReader imageReader;
! // the set of modules in the run-time image
! private static final Set<ModuleReference> modules;
! // maps module name to module reference
! private static final Map<String, ModuleReference> nameToModule;
/**
* For now, the module references are created eagerly on the assumption
* that service binding will require all modules to be located.
*/
static {
long t0 = System.nanoTime();
imageReader = ImageReaderFactory.getImageReader();
! String[] names = moduleNames();
! ModuleDescriptor[] descriptors = descriptors(names);
!
! int n = names.length;
! moduleCount.add(n);
!
! ModuleReference[] mods = new ModuleReference[n];
!
! @SuppressWarnings(value = {"rawtypes", "unchecked"})
! Entry<String, ModuleReference>[] map
! = (Entry<String, ModuleReference>[])new Entry[n];
!
! for (int i = 0; i < n; i++) {
! ModuleDescriptor md = descriptors[i];
!
! // create the ModuleReference
! ModuleReference mref = toModuleReference(md, hashSupplier(i, names[i]));
!
! mods[i] = mref;
! map[i] = Map.entry(names[i], mref);
!
! // counters
! packageCount.add(md.packages().size());
! exportsCount.add(md.exports().size());
! }
!
! modules = Set.of(mods);
! nameToModule = Map.ofEntries(map);
initTime.addElapsedTimeFrom(t0);
}
- /*
- * Returns an array of ModuleDescriptor of the given module names.
- *
- * This obtains ModuleDescriptors from SystemModules class that is generated
- * from the jlink system-modules plugin. ModuleDescriptors have already
- * been validated at link time.
- *
- * If java.base is patched, or fastpath is disabled for troubleshooting
- * purpose, it will fall back to find system modules via jrt file system.
- */
- private static ModuleDescriptor[] descriptors(String[] names) {
- // fastpath is enabled by default.
- // It can be disabled for troubleshooting purpose.
- boolean disabled =
- System.getProperty("jdk.system.module.finder.disabledFastPath") != null;
-
- // fast loading of ModuleDescriptor of system modules
- if (isFastPathSupported() && !disabled)
- return SystemModules.modules();
-
- // if fast loading of ModuleDescriptors is disabled
- // fallback to read module-info.class
- ModuleDescriptor[] descriptors = new ModuleDescriptor[names.length];
- for (int i = 0; i < names.length; i++) {
- String mn = names[i];
- ImageLocation loc = imageReader.findLocation(mn, "module-info.class");
- descriptors[i] = ModuleDescriptor.read(imageReader.getResourceBuffer(loc));
-
- // add the recorded hashes of tied modules
- Hashes.add(descriptors[i]);
- }
- return descriptors;
- }
-
private static boolean isFastPathSupported() {
return SystemModules.MODULE_NAMES.length > 0;
}
private static String[] moduleNames() {
--- 81,110 ----
private static final PerfCounter exportsCount
= PerfCounter.newPerfCounter("jdk.module.finder.jimage.exports");
// ImageReader used to access all modules in the image
private static final ImageReader imageReader;
! // singleton finder to find modules in the run-time images
! private static final SystemModuleFinder INSTANCE;
! public static SystemModuleFinder getInstance() {
! return INSTANCE;
! }
/**
* For now, the module references are created eagerly on the assumption
* that service binding will require all modules to be located.
*/
static {
long t0 = System.nanoTime();
imageReader = ImageReaderFactory.getImageReader();
! INSTANCE = new SystemModuleFinder();
initTime.addElapsedTimeFrom(t0);
}
private static boolean isFastPathSupported() {
return SystemModules.MODULE_NAMES.length > 0;
}
private static String[] moduleNames() {
*** 176,235 ****
// this happens when java.base is patched with java.base
// from an exploded image
return imageReader.getModuleNames();
}
- private static ModuleReference toModuleReference(ModuleDescriptor md,
- HashSupplier hash)
- {
- String mn = md.name();
- URI uri = JNUA.create("jrt", "/".concat(mn));
-
- Supplier<ModuleReader> readerSupplier = new Supplier<>() {
- @Override
- public ModuleReader get() {
- return new ImageModuleReader(mn, uri);
- }
- };
-
- ModuleReference mref =
- new ModuleReference(md, uri, readerSupplier, hash);
-
- // may need a reference to a patched module if --patch-module specified
- mref = ModuleBootstrap.patcher().patchIfNeeded(mref);
-
- return mref;
- }
-
- private static HashSupplier hashSupplier(int index, String name) {
- if (isFastPathSupported()) {
- return new HashSupplier() {
- @Override
- public byte[] generate(String algorithm) {
- return SystemModules.MODULES_TO_HASH[index];
- }
- };
- } else {
- return Hashes.hashFor(name);
- }
- }
! /*
! * This helper class is only used when SystemModules is patched.
! * It will get the recorded hashes from module-info.class.
*/
private static class Hashes {
static Map<String, byte[]> hashes = new HashMap<>();
! static void add(ModuleDescriptor descriptor) {
! Optional<ModuleHashes> ohashes = descriptor.hashes();
! if (ohashes.isPresent()) {
! hashes.putAll(ohashes.get().hashes());
}
}
! static HashSupplier hashFor(String name) {
if (!hashes.containsKey(name))
return null;
return new HashSupplier() {
@Override
--- 115,138 ----
// this happens when java.base is patched with java.base
// from an exploded image
return imageReader.getModuleNames();
}
! /**
! * Helper class to use the recorded hashes to create a HashSupplier
*/
private static class Hashes {
static Map<String, byte[]> hashes = new HashMap<>();
! static void add(ModuleHashes recordedHashes) {
! if (recordedHashes != null) {
! hashes.putAll(recordedHashes.hashes());
}
}
! static HashSupplier hashSupplierFor(String name) {
if (!hashes.containsKey(name))
return null;
return new HashSupplier() {
@Override
*** 238,248 ****
}
};
}
}
! SystemModuleFinder() { }
@Override
public Optional<ModuleReference> find(String name) {
Objects.requireNonNull(name);
return Optional.ofNullable(nameToModule.get(name));
--- 141,222 ----
}
};
}
}
! // the set of modules in the run-time image
! private final Set<ModuleReference> modules;
!
! // maps module name to module reference
! private final Map<String, ModuleReference> nameToModule;
!
! private SystemModuleFinder() {
! String[] names = moduleNames();
! int n = names.length;
! moduleCount.add(n);
!
! // fastpath is enabled by default.
! // It can be disabled for troubleshooting purpose.
! boolean disabled =
! System.getProperty("jdk.system.module.finder.disabledFastPath") != null;
!
! ModuleDescriptor[] descriptors;
! ModuleHashes[] recordedHashes;
! ModuleResolution[] moduleResolutions;
!
! // fast loading of ModuleDescriptor of system modules
! if (isFastPathSupported() && !disabled) {
! descriptors = SystemModules.descriptors();
! recordedHashes = SystemModules.hashes();
! moduleResolutions = SystemModules.moduleResolutions();
! } else {
! // if fast loading of ModuleDescriptors is disabled
! // fallback to read module-info.class
! descriptors = new ModuleDescriptor[n];
! recordedHashes = new ModuleHashes[n];
! moduleResolutions = new ModuleResolution[n];
! for (int i = 0; i < names.length; i++) {
! String mn = names[i];
! ImageLocation loc = imageReader.findLocation(mn, "module-info.class");
! ModuleInfo.Attributes attrs =
! ModuleInfo.read(imageReader.getResourceBuffer(loc), null);
! descriptors[i] = attrs.descriptor();
! recordedHashes[i] = attrs.recordedHashes();
! moduleResolutions[i] = attrs.moduleResolution();
! }
! }
!
! // record the hashes to build HashSupplier
! for (ModuleHashes mh : recordedHashes) {
! Hashes.add(mh);
! }
!
! ModuleReference[] mods = new ModuleReference[n];
!
! @SuppressWarnings(value = {"rawtypes", "unchecked"})
! Entry<String, ModuleReference>[] map
! = (Entry<String, ModuleReference>[])new Entry[n];
!
! for (int i = 0; i < n; i++) {
! ModuleDescriptor md = descriptors[i];
!
! // create the ModuleReference
! ModuleReference mref = toModuleReference(md,
! recordedHashes[i],
! Hashes.hashSupplierFor(names[i]),
! moduleResolutions[i]);
! mods[i] = mref;
! map[i] = Map.entry(names[i], mref);
!
! // counters
! packageCount.add(md.packages().size());
! exportsCount.add(md.exports().size());
! }
!
! modules = Set.of(mods);
! nameToModule = Map.ofEntries(map);
! }
@Override
public Optional<ModuleReference> find(String name) {
Objects.requireNonNull(name);
return Optional.ofNullable(nameToModule.get(name));
*** 251,260 ****
--- 225,258 ----
@Override
public Set<ModuleReference> findAll() {
return modules;
}
+ private ModuleReference toModuleReference(ModuleDescriptor md,
+ ModuleHashes recordedHashes,
+ HashSupplier hasher,
+ ModuleResolution mres) {
+ String mn = md.name();
+ URI uri = JNUA.create("jrt", "/".concat(mn));
+
+ Supplier<ModuleReader> readerSupplier = new Supplier<>() {
+ @Override
+ public ModuleReader get() {
+ return new ImageModuleReader(mn, uri);
+ }
+ };
+
+ ModuleReference mref =
+ new ModuleReferenceImpl(md, uri, readerSupplier, null,
+ recordedHashes, hasher, mres);
+
+ // may need a reference to a patched module if --patch-module specified
+ mref = ModuleBootstrap.patcher().patchIfNeeded(mref);
+
+ return mref;
+ }
+
/**
* A ModuleReader for reading resources from a module linked into the
* run-time image.
*/
< prev index next >