< prev index next >

src/java.base/share/classes/jdk/internal/module/SystemModuleFinder.java

Print this page




 133     // the set of modules in the run-time image
 134     private final Set<ModuleReference> modules;
 135 
 136     // maps module name to module reference
 137     private final Map<String, ModuleReference> nameToModule;
 138 
 139     // module name to hashes
 140     private final Map<String, byte[]> hashes;
 141 
 142     private SystemModuleFinder() {
 143         String[] names = moduleNames();
 144         int n = names.length;
 145         moduleCount.add(n);
 146 
 147         // fastpath is enabled by default.
 148         // It can be disabled for troubleshooting purpose.
 149         boolean disabled =
 150             System.getProperty("jdk.system.module.finder.disabledFastPath") != null;
 151 
 152         ModuleDescriptor[] descriptors;

 153         ModuleHashes[] recordedHashes;
 154         ModuleResolution[] moduleResolutions;
 155 
 156         // fast loading of ModuleDescriptor of system modules
 157         if (isFastPathSupported() && !disabled) {
 158             descriptors = SystemModules.descriptors();

 159             recordedHashes = SystemModules.hashes();
 160             moduleResolutions = SystemModules.moduleResolutions();
 161         } else {
 162             // if fast loading of ModuleDescriptors is disabled
 163             // fallback to read module-info.class
 164             descriptors = new ModuleDescriptor[n];

 165             recordedHashes = new ModuleHashes[n];
 166             moduleResolutions = new ModuleResolution[n];
 167             ImageReader imageReader = SystemImage.reader();
 168             for (int i = 0; i < names.length; i++) {
 169                 String mn = names[i];
 170                 ImageLocation loc = imageReader.findLocation(mn, "module-info.class");
 171                 ModuleInfo.Attributes attrs =
 172                     ModuleInfo.read(imageReader.getResourceBuffer(loc), null);
 173                 descriptors[i] = attrs.descriptor();

 174                 recordedHashes[i] = attrs.recordedHashes();
 175                 moduleResolutions[i] = attrs.moduleResolution();
 176             }
 177         }
 178 
 179         Map<String, byte[]> hashes = null;
 180         boolean secondSeen = false;
 181         // record the hashes to build HashSupplier
 182         for (ModuleHashes mh : recordedHashes) {
 183             if (mh != null) {
 184                 // if only one module contain ModuleHashes, use it
 185                 if (hashes == null) {
 186                     hashes = mh.hashes();
 187                 } else {
 188                     if (!secondSeen) {
 189                         hashes = new HashMap<>(hashes);
 190                         secondSeen = true;
 191                     }
 192                     hashes.putAll(mh.hashes());
 193                 }
 194             }
 195         }
 196         this.hashes = (hashes == null) ? Map.of() : hashes;
 197 
 198         ModuleReference[] mods = new ModuleReference[n];
 199 
 200         @SuppressWarnings(value = {"rawtypes", "unchecked"})
 201         Entry<String, ModuleReference>[] map
 202             = (Entry<String, ModuleReference>[])new Entry[n];
 203 
 204         for (int i = 0; i < n; i++) {
 205             ModuleDescriptor md = descriptors[i];
 206 
 207             // create the ModuleReference
 208             ModuleReference mref = toModuleReference(md,

 209                                                      recordedHashes[i],
 210                                                      hashSupplier(names[i]),
 211                                                      moduleResolutions[i]);
 212             mods[i] = mref;
 213             map[i] = Map.entry(names[i], mref);
 214 
 215             // counters
 216             packageCount.add(md.packages().size());
 217             exportsCount.add(md.exports().size());
 218         }
 219 
 220         modules = Set.of(mods);
 221         nameToModule = Map.ofEntries(map);
 222     }
 223 
 224     @Override
 225     public Optional<ModuleReference> find(String name) {
 226         Objects.requireNonNull(name);
 227         return Optional.ofNullable(nameToModule.get(name));
 228     }
 229 
 230     @Override
 231     public Set<ModuleReference> findAll() {
 232         return modules;
 233     }
 234 
 235     private ModuleReference toModuleReference(ModuleDescriptor md,

 236                                               ModuleHashes recordedHashes,
 237                                               HashSupplier hasher,
 238                                               ModuleResolution mres) {
 239         String mn = md.name();
 240         URI uri = JNUA.create("jrt", "/".concat(mn));
 241 
 242         Supplier<ModuleReader> readerSupplier = new Supplier<>() {
 243             @Override
 244             public ModuleReader get() {
 245                 return new ImageModuleReader(mn, uri);
 246             }
 247         };
 248 
 249         ModuleReference mref =
 250             new ModuleReferenceImpl(md, uri, readerSupplier, null,
 251                                     recordedHashes, hasher, mres);





 252 
 253         // may need a reference to a patched module if --patch-module specified
 254         mref = ModuleBootstrap.patcher().patchIfNeeded(mref);
 255 
 256         return mref;
 257     }
 258 
 259     private HashSupplier hashSupplier(String name) {
 260         if (!hashes.containsKey(name))
 261             return null;
 262 
 263         return new HashSupplier() {
 264             @Override
 265             public byte[] generate(String algorithm) {
 266                 return hashes.get(name);
 267             }
 268         };
 269     }
 270 
 271     /**




 133     // the set of modules in the run-time image
 134     private final Set<ModuleReference> modules;
 135 
 136     // maps module name to module reference
 137     private final Map<String, ModuleReference> nameToModule;
 138 
 139     // module name to hashes
 140     private final Map<String, byte[]> hashes;
 141 
 142     private SystemModuleFinder() {
 143         String[] names = moduleNames();
 144         int n = names.length;
 145         moduleCount.add(n);
 146 
 147         // fastpath is enabled by default.
 148         // It can be disabled for troubleshooting purpose.
 149         boolean disabled =
 150             System.getProperty("jdk.system.module.finder.disabledFastPath") != null;
 151 
 152         ModuleDescriptor[] descriptors;
 153         ModuleTarget[] targets;
 154         ModuleHashes[] recordedHashes;
 155         ModuleResolution[] moduleResolutions;
 156 
 157         // fast loading of ModuleDescriptor of system modules
 158         if (isFastPathSupported() && !disabled) {
 159             descriptors = SystemModules.descriptors();
 160             targets = SystemModules.targets();
 161             recordedHashes = SystemModules.hashes();
 162             moduleResolutions = SystemModules.moduleResolutions();
 163         } else {
 164             // if fast loading of ModuleDescriptors is disabled
 165             // fallback to read module-info.class
 166             descriptors = new ModuleDescriptor[n];
 167             targets = new ModuleTarget[n];
 168             recordedHashes = new ModuleHashes[n];
 169             moduleResolutions = new ModuleResolution[n];
 170             ImageReader imageReader = SystemImage.reader();
 171             for (int i = 0; i < names.length; i++) {
 172                 String mn = names[i];
 173                 ImageLocation loc = imageReader.findLocation(mn, "module-info.class");
 174                 ModuleInfo.Attributes attrs =
 175                     ModuleInfo.read(imageReader.getResourceBuffer(loc), null);
 176                 descriptors[i] = attrs.descriptor();
 177                 targets[i] = attrs.target();
 178                 recordedHashes[i] = attrs.recordedHashes();
 179                 moduleResolutions[i] = attrs.moduleResolution();
 180             }
 181         }
 182 
 183         Map<String, byte[]> hashes = null;
 184         boolean secondSeen = false;
 185         // record the hashes to build HashSupplier
 186         for (ModuleHashes mh : recordedHashes) {
 187             if (mh != null) {
 188                 // if only one module contain ModuleHashes, use it
 189                 if (hashes == null) {
 190                     hashes = mh.hashes();
 191                 } else {
 192                     if (!secondSeen) {
 193                         hashes = new HashMap<>(hashes);
 194                         secondSeen = true;
 195                     }
 196                     hashes.putAll(mh.hashes());
 197                 }
 198             }
 199         }
 200         this.hashes = (hashes == null) ? Map.of() : hashes;
 201 
 202         ModuleReference[] mods = new ModuleReference[n];
 203 
 204         @SuppressWarnings(value = {"rawtypes", "unchecked"})
 205         Entry<String, ModuleReference>[] map
 206             = (Entry<String, ModuleReference>[])new Entry[n];
 207 
 208         for (int i = 0; i < n; i++) {
 209             ModuleDescriptor md = descriptors[i];
 210 
 211             // create the ModuleReference
 212             ModuleReference mref = toModuleReference(md,
 213                                                      targets[i],
 214                                                      recordedHashes[i],
 215                                                      hashSupplier(names[i]),
 216                                                      moduleResolutions[i]);
 217             mods[i] = mref;
 218             map[i] = Map.entry(names[i], mref);
 219 
 220             // counters
 221             packageCount.add(md.packages().size());
 222             exportsCount.add(md.exports().size());
 223         }
 224 
 225         modules = Set.of(mods);
 226         nameToModule = Map.ofEntries(map);
 227     }
 228 
 229     @Override
 230     public Optional<ModuleReference> find(String name) {
 231         Objects.requireNonNull(name);
 232         return Optional.ofNullable(nameToModule.get(name));
 233     }
 234 
 235     @Override
 236     public Set<ModuleReference> findAll() {
 237         return modules;
 238     }
 239 
 240     private ModuleReference toModuleReference(ModuleDescriptor md,
 241                                               ModuleTarget target,
 242                                               ModuleHashes recordedHashes,
 243                                               HashSupplier hasher,
 244                                               ModuleResolution mres) {
 245         String mn = md.name();
 246         URI uri = JNUA.create("jrt", "/".concat(mn));
 247 
 248         Supplier<ModuleReader> readerSupplier = new Supplier<>() {
 249             @Override
 250             public ModuleReader get() {
 251                 return new ImageModuleReader(mn, uri);
 252             }
 253         };
 254 
 255         ModuleReference mref = new ModuleReferenceImpl(md,
 256                                                        uri,
 257                                                        readerSupplier,
 258                                                        null,
 259                                                        target,
 260                                                        recordedHashes,
 261                                                        hasher,
 262                                                        mres);
 263 
 264         // may need a reference to a patched module if --patch-module specified
 265         mref = ModuleBootstrap.patcher().patchIfNeeded(mref);
 266 
 267         return mref;
 268     }
 269 
 270     private HashSupplier hashSupplier(String name) {
 271         if (!hashes.containsKey(name))
 272             return null;
 273 
 274         return new HashSupplier() {
 275             @Override
 276             public byte[] generate(String algorithm) {
 277                 return hashes.get(name);
 278             }
 279         };
 280     }
 281 
 282     /**


< prev index next >