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