2323import org .gradle .api .Task ;
2424import org .gradle .api .artifacts .Configuration ;
2525import org .gradle .api .artifacts .ConfigurationContainer ;
26- import org .gradle .api .artifacts .Dependency ;
27- import org .gradle .api .artifacts .ProjectDependency ;
2826import org .gradle .api .artifacts .VersionCatalogsExtension ;
27+ import org .gradle .api .plugins .ExtensionContainer ;
2928import org .gradle .api .plugins .JavaPlugin ;
30- import org .gradle .api .provider .Provider ;
3129import org .gradle .api .tasks .SourceSet ;
3230import org .gradle .api .tasks .SourceSetContainer ;
3331import org .gradle .api .tasks .TaskProvider ;
3432import org .gradle .util .GradleVersion ;
33+ import org .gradlex .javamodule .dependencies .dsl .AllDirectives ;
34+ import org .gradlex .javamodule .dependencies .dsl .GradleOnlyDirectives ;
3535import org .gradlex .javamodule .dependencies .internal .bridges .DependencyAnalysisBridge ;
3636import org .gradlex .javamodule .dependencies .internal .bridges .ExtraJavaModuleInfoBridge ;
3737import org .gradlex .javamodule .dependencies .internal .utils .ModuleInfo ;
4141import org .gradlex .javamodule .dependencies .tasks .ModulePathAnalysis ;
4242import org .gradlex .javamodule .dependencies .tasks .ModuleVersionRecommendation ;
4343
44- import javax .annotation .Nullable ;
4544import java .io .File ;
46- import java .util .Comparator ;
4745import java .util .HashSet ;
48- import java .util .Map ;
49- import java .util .Optional ;
50- import java .util .stream .Collectors ;
5146
5247import static org .gradle .api .plugins .HelpTasksPlugin .HELP_GROUP ;
5348import static org .gradle .language .base .plugins .LifecycleBasePlugin .VERIFICATION_GROUP ;
@@ -99,6 +94,8 @@ private void setupForJavaProject(Project project, JavaModuleDependenciesExtensio
9994 t .setDescription ("Check scope and order of directives in 'module-info.java' files" );
10095 });
10196
97+ setupDirectivesDSL (project , javaModuleDependencies );
98+
10299 setupOrderingCheckTasks (project , checkAllModuleInfo , javaModuleDependencies );
103100 setupModuleDependenciesTask (project );
104101 setupReportTasks (project , javaModuleDependencies );
@@ -114,6 +111,21 @@ private void setupExtraJavaModulePluginBridge(Project project, JavaModuleDepende
114111 e -> ExtraJavaModuleInfoBridge .autoRegisterPatchedModuleMappings (project , javaModuleDependencies ));
115112 }
116113
114+ private void setupDirectivesDSL (Project project , JavaModuleDependenciesExtension javaModuleDependencies ) {
115+ ExtensionContainer extensions = project .getExtensions ();
116+ SourceSetContainer sourceSets = extensions .getByType (SourceSetContainer .class );
117+ SourceSet mainSourceSet = sourceSets .getByName (SourceSet .MAIN_SOURCE_SET_NAME );
118+ sourceSets .all (sourceSet -> {
119+ File moduleInfoFile = new File (sourceSet .getJava ().getSrcDirs ().iterator ().next (), "module-info.java" );
120+ String extensionName = sourceSet .getName () + "ModuleInfo" ;
121+ if (moduleInfoFile .exists ()) {
122+ extensions .create (extensionName , GradleOnlyDirectives .class , sourceSet , mainSourceSet , javaModuleDependencies );
123+ } else {
124+ extensions .create (extensionName , AllDirectives .class , sourceSet , mainSourceSet , javaModuleDependencies );
125+ }
126+ });
127+ }
128+
117129 private void setupModuleDependenciesTask (Project project ) {
118130 SourceSetContainer sourceSets = project .getExtensions ().getByType (SourceSetContainer .class );
119131 TaskProvider <ModuleDependencyReport > moduleDependencies = project .getTasks ().register ("moduleDependencies" , ModuleDependencyReport .class , t -> {
@@ -235,69 +247,18 @@ private void readModuleInfo(ModuleInfo.Directive moduleDirective, SourceSet sour
235247 return ;
236248 }
237249 ModuleInfo moduleInfo = javaModuleDependenciesExtension .getModuleInfoCache ().get (sourceSet );
238- String ownModuleNamesPrefix = moduleInfo .moduleNamePrefix (project .getName (), sourceSet .getName ());
239250 for (String moduleName : moduleInfo .get (moduleDirective )) {
240- declareDependency (moduleName , ownModuleNamesPrefix , moduleInfo .getFilePath (), project , configuration , javaModuleDependenciesExtension );
251+ declareDependency (moduleName , moduleInfo .getFilePath (), project , sourceSet , configuration , javaModuleDependenciesExtension );
241252 }
242253 }
243254
244- private void declareDependency (String moduleName , @ Nullable String ownModuleNamesPrefix , File moduleInfoFile , Project project , Configuration configuration , JavaModuleDependenciesExtension javaModuleDependencies ) {
255+ private void declareDependency (String moduleName , File moduleInfoFile , Project project , SourceSet sourceSet , Configuration configuration , JavaModuleDependenciesExtension javaModuleDependencies ) {
245256 if (JDKInfo .MODULES .contains (moduleName )) {
246257 // The module is part of the JDK, no dependency required
247258 return ;
248259 }
249260
250- Map <String , String > allProjectNamesAndGroups = project .getRootProject ().getSubprojects ().stream ().collect (
251- Collectors .toMap (Project ::getName , p -> (String ) p .getGroup ()));
252-
253- Provider <Map <String , Object >> gav = javaModuleDependencies .gavNoError (moduleName );
254- String moduleNameSuffix = ownModuleNamesPrefix == null ? null :
255- moduleName .startsWith (ownModuleNamesPrefix + "." ) ? moduleName .substring (ownModuleNamesPrefix .length () + 1 ) :
256- ownModuleNamesPrefix .isEmpty () ? moduleName : null ;
257-
258- String parentPath = project .getParent () == null ? "" : project .getParent ().getPath ();
259- Optional <String > perfectMatch = allProjectNamesAndGroups .keySet ().stream ().filter (p -> p .replace ("-" , "." ).equals (moduleNameSuffix )).findFirst ();
260- Optional <String > existingProjectName = allProjectNamesAndGroups .keySet ().stream ().filter (p -> moduleNameSuffix != null && moduleNameSuffix .startsWith (p .replace ("-" , "." ) + "." ))
261- .max (Comparator .comparingInt (String ::length ));
262-
263- if (perfectMatch .isPresent ()) {
264- Dependency projectDependency = project .getDependencies ().add (
265- configuration .getName (), project .project (parentPath + ":" + perfectMatch .get ()));
266- assert projectDependency != null ;
267- projectDependency .because (moduleName );
268- } else if (existingProjectName .isPresent ()) {
269- // no exact match -> add capability to point at Module in other source set
270- String projectName = existingProjectName .get ();
271- ProjectDependency projectDependency = (ProjectDependency ) project .getDependencies ().add (
272- configuration .getName (), project .project (parentPath + ":" + projectName ));
273- assert projectDependency != null ;
274- String capabilityName = projectName + moduleNameSuffix .substring (projectName .length ()).replace ("." , "-" );
275- projectDependency .capabilities (c -> c .requireCapabilities (
276- allProjectNamesAndGroups .get (projectName ) + ":" + capabilityName ));
277- projectDependency .because (moduleName );
278- } else if (gav .isPresent ()) {
279- project .getDependencies ().addProvider (configuration .getName (), gav , d -> d .because (moduleName ));
280- if (!gav .get ().containsKey (GAV .VERSION )) {
281- warnVersionMissing (moduleName , gav .get (), moduleInfoFile , project , javaModuleDependencies );
282- }
283- } else {
284- project .getLogger ().lifecycle (
285- "[WARN] [Java Module Dependencies] javaModuleDependencies.moduleNameToGA.put(\" " + moduleName + "\" , \" group:artifact\" ) mapping is missing." );
286- }
287- }
288-
289- private void warnVersionMissing (String moduleName , Map <String , Object > ga , File moduleInfoFile , Project project , JavaModuleDependenciesExtension javaModuleDependencies ) {
290- if (javaModuleDependencies .getWarnForMissingVersions ().get ()) {
291- project .getLogger ().warn ("[WARN] [Java Module Dependencies] No version defined in catalog - " + ga .get (GAV .GROUP ) + ":" + ga .get (GAV .ARTIFACT ) + " - "
292- + moduleDebugInfo (moduleName .replace ('.' , '_' ), moduleInfoFile , project .getRootDir ()));
293- }
294- }
295-
296- private String moduleDebugInfo (String moduleName , File moduleInfoFile , File rootDir ) {
297- return moduleName
298- + " (required in "
299- + moduleInfoFile .getAbsolutePath ().substring (rootDir .getAbsolutePath ().length () + 1 )
300- + ")" ;
261+ project .getDependencies ().addProvider (configuration .getName (), javaModuleDependencies .create (moduleName , sourceSet ));
301262 }
302263
303264}
0 commit comments