26 package java.lang.module; |
26 package java.lang.module; |
27 |
27 |
28 import java.io.PrintStream; |
28 import java.io.PrintStream; |
29 import java.lang.module.ModuleDescriptor.Provides; |
29 import java.lang.module.ModuleDescriptor.Provides; |
30 import java.lang.module.ModuleDescriptor.Requires.Modifier; |
30 import java.lang.module.ModuleDescriptor.Requires.Modifier; |
31 import java.net.URI; |
|
32 import java.util.ArrayDeque; |
31 import java.util.ArrayDeque; |
33 import java.util.ArrayList; |
32 import java.util.ArrayList; |
34 import java.util.Arrays; |
33 import java.util.Arrays; |
35 import java.util.Collection; |
34 import java.util.Collection; |
36 import java.util.Deque; |
35 import java.util.Deque; |
43 import java.util.Set; |
42 import java.util.Set; |
44 import java.util.stream.Collectors; |
43 import java.util.stream.Collectors; |
45 |
44 |
46 import jdk.internal.module.ModuleHashes; |
45 import jdk.internal.module.ModuleHashes; |
47 import jdk.internal.module.ModuleReferenceImpl; |
46 import jdk.internal.module.ModuleReferenceImpl; |
|
47 import jdk.internal.module.ModuleResolution; |
48 import jdk.internal.module.ModuleTarget; |
48 import jdk.internal.module.ModuleTarget; |
49 |
49 |
50 /** |
50 /** |
51 * The resolver used by {@link Configuration#resolve} and {@link |
51 * The resolver used by {@link Configuration#resolve} and {@link |
52 * Configuration#resolveAndBind}. |
52 * Configuration#resolveAndBind}. |
213 /** |
213 /** |
214 * Augments the set of resolved modules with modules induced by the |
214 * Augments the set of resolved modules with modules induced by the |
215 * service-use relation. |
215 * service-use relation. |
216 */ |
216 */ |
217 Resolver bind() { |
217 Resolver bind() { |
218 |
218 return bind(/*bindIncubatorModules*/true); |
|
219 } |
|
220 |
|
221 /** |
|
222 * Augments the set of resolved modules with modules induced by the |
|
223 * service-use relation. |
|
224 * |
|
225 * @param bindIncubatorModules true if incubator modules are candidates to |
|
226 * add to the module graph |
|
227 */ |
|
228 Resolver bind(boolean bindIncubatorModules) { |
219 // Scan the finders for all available service provider modules. As |
229 // Scan the finders for all available service provider modules. As |
220 // java.base uses services then the module finders will be scanned |
230 // java.base uses services then the module finders will be scanned |
221 // anyway. |
231 // anyway. |
222 Map<String, Set<ModuleReference>> availableProviders = new HashMap<>(); |
232 Map<String, Set<ModuleReference>> availableProviders = new HashMap<>(); |
223 for (ModuleReference mref : findAll()) { |
233 for (ModuleReference mref : findAll()) { |
224 ModuleDescriptor descriptor = mref.descriptor(); |
234 ModuleDescriptor descriptor = mref.descriptor(); |
225 if (!descriptor.provides().isEmpty()) { |
235 |
226 |
236 boolean candidate; |
|
237 if (!bindIncubatorModules && (mref instanceof ModuleReferenceImpl)) { |
|
238 ModuleResolution mres = ((ModuleReferenceImpl) mref).moduleResolution(); |
|
239 candidate = (mres == null) || (mres.hasIncubatingWarning() == false); |
|
240 } else { |
|
241 candidate = true; |
|
242 } |
|
243 if (candidate && !descriptor.provides().isEmpty()) { |
227 for (Provides provides : descriptor.provides()) { |
244 for (Provides provides : descriptor.provides()) { |
228 String sn = provides.service(); |
245 String sn = provides.service(); |
229 |
246 |
230 // computeIfAbsent |
247 // computeIfAbsent |
231 Set<ModuleReference> providers = availableProviders.get(sn); |
248 Set<ModuleReference> providers = availableProviders.get(sn); |