Skip to content

Commit 024f58c

Browse files
committed
wip safe stuff
1 parent eda29d3 commit 024f58c

File tree

11 files changed

+234
-40
lines changed

11 files changed

+234
-40
lines changed

samples/configuration-cache/settings.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
pluginManagement {
22
includeBuild("build-logic")
3+
includeBuild("../..")
34
}
45
dependencyResolutionManagement {
6+
includeBuild("../..")
57
repositories.mavenCentral()
68
}
79

settings.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ dependencyResolutionManagement {
1010
repositories.gradlePluginPortal()
1111
}
1212

13+
//includeBuild("samples/configuration-cache")
14+
1315
rootProject.name = "java-module-dependencies"
1416

1517
develocity {

src/main/java/org/gradlex/javamodule/dependencies/JavaModuleDependenciesPlugin.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package org.gradlex.javamodule.dependencies;
1818

19+
import kotlin.Pair;
1920
import org.gradle.api.GradleException;
2021
import org.gradle.api.NonNullApi;
2122
import org.gradle.api.Plugin;
@@ -235,8 +236,7 @@ private void setupOrderingCheckTasks(Project project, TaskProvider<Task> checkAl
235236
t.setDescription("Check order of directives in 'module-info.java' in '" + sourceSet.getName() + "' source set");
236237

237238
ModuleInfo moduleInfo = javaModuleDependencies.getModuleInfoCache().get().get(sourceSet, project.getProviders());
238-
239-
t.getModuleInfoPath().convention(moduleInfo.getFilePath().getAbsolutePath());
239+
t.getModuleInfoPath().convention("module-info.java");
240240
t.getModuleNamePrefix().convention(moduleInfo.moduleNamePrefix(project.getName(), sourceSet.getName(), false));
241241
t.getModuleInfo().convention(moduleInfo);
242242

@@ -266,11 +266,11 @@ private void readModuleInfo(ModuleInfo.Directive moduleDirective, SourceSet sour
266266
}
267267
ModuleInfo moduleInfo = javaModuleDependenciesExtension.getModuleInfoCache().get().get(sourceSet, project.getProviders());
268268
for (String moduleName : moduleInfo.get(moduleDirective)) {
269-
declareDependency(moduleName, moduleInfo.getFilePath(), project, sourceSet, configuration, javaModuleDependenciesExtension);
269+
declareDependency(moduleName, project, sourceSet, configuration, javaModuleDependenciesExtension);
270270
}
271271
}
272272

273-
private void declareDependency(String moduleName, File moduleInfoFile, Project project, SourceSet sourceSet, Configuration configuration, JavaModuleDependenciesExtension javaModuleDependencies) {
273+
private void declareDependency(String moduleName, Project project, SourceSet sourceSet, Configuration configuration, JavaModuleDependenciesExtension javaModuleDependencies) {
274274
if (JDKInfo.MODULES.contains(moduleName)) {
275275
// The module is part of the JDK, no dependency required
276276
return;
@@ -286,7 +286,7 @@ private List<BuildFileDependenciesGenerate.DependencyDeclaration> collectDepende
286286
File sourceSetDir = sourceSet.getJava().getSrcDirs().iterator().next().getParentFile();
287287
File whiteboxModuleInfoFile = new File(sourceSetDir, "java9/module-info.java");
288288
if (whiteboxModuleInfoFile.exists()) {
289-
moduleInfo = new ModuleInfo(project.getProviders().fileContents(project.getLayout().getProjectDirectory().file(whiteboxModuleInfoFile.getAbsolutePath())).getAsText().get(), whiteboxModuleInfoFile);
289+
moduleInfo = new ModuleInfo(project.getProviders().fileContents(project.getLayout().getProjectDirectory().file(whiteboxModuleInfoFile.getAbsolutePath())).getAsText().get());
290290
}
291291
}
292292
return moduleInfo.get(directive).stream()

src/main/java/org/gradlex/javamodule/dependencies/JavaModuleVersionsPlugin.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ private void registerCatalogTask(Project project) {
132132
moduleInfoFile = new File(srcDirSet, "java9/module-info.java");
133133
}
134134
if (moduleInfoFile.exists()) {
135-
ModuleInfo moduleInfo = new ModuleInfo(project.getProviders().fileContents(project.getLayout().getProjectDirectory().file(moduleInfoFile.getAbsolutePath())).getAsText().get(), moduleInfoFile);
135+
ModuleInfo moduleInfo = new ModuleInfo(project.getProviders().fileContents(project.getLayout().getProjectDirectory().file(moduleInfoFile.getAbsolutePath())).getAsText().get());
136136
t.getEntries().addAll(collectCatalogEntriesFromModuleInfos(javaModuleDependencies, moduleInfo.get(REQUIRES_TRANSITIVE)));
137137
t.getEntries().addAll(collectCatalogEntriesFromModuleInfos(javaModuleDependencies, moduleInfo.get(REQUIRES)));
138138
t.getEntries().addAll(collectCatalogEntriesFromModuleInfos(javaModuleDependencies, moduleInfo.get(REQUIRES_STATIC_TRANSITIVE)));

src/main/java/org/gradlex/javamodule/dependencies/SharedMappings.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ static Map<String, String> loadModuleNameToGAProperties() {
2929
@Override
3030
public synchronized Object put(Object key, Object value) {
3131
if (get(key) != null) {
32-
throw new IllegalArgumentException(key + " already present.");
32+
// throw new IllegalArgumentException(key + " already present.");
3333
}
3434
return super.put(key, value);
3535
}

src/main/java/org/gradlex/javamodule/dependencies/internal/utils/ModuleInfo.java

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,8 @@
1717
package org.gradlex.javamodule.dependencies.internal.utils;
1818

1919
import javax.annotation.Nullable;
20-
import java.io.File;
2120
import java.io.Serializable;
22-
import java.util.ArrayList;
23-
import java.util.Arrays;
24-
import java.util.Collections;
25-
import java.util.List;
21+
import java.util.*;
2622

2723
import static org.gradlex.javamodule.dependencies.internal.utils.ModuleNamingUtil.sourceSetToModuleName;
2824

@@ -43,7 +39,7 @@ public String literal() {
4339

4440
public static final String RUNTIME_KEYWORD = "/*runtime*/";
4541

46-
public static final ModuleInfo EMPTY = new ModuleInfo("", new File(""));
42+
public static final ModuleInfo EMPTY = new ModuleInfo("");
4743

4844
private String moduleName = "";
4945
private final List<String> requires = new ArrayList<>();
@@ -52,10 +48,8 @@ public String literal() {
5248
private final List<String> requiresStaticTransitive = new ArrayList<>();
5349
private final List<String> requiresRuntime = new ArrayList<>();
5450

55-
private final File filePath;
5651

57-
public ModuleInfo(String moduleInfoFileContent, File filePath) {
58-
this.filePath = filePath;
52+
public ModuleInfo(String moduleInfoFileContent) {
5953
boolean insideComment = false;
6054
for(String line: moduleInfoFileContent.split("\n")) {
6155
insideComment = parse(line, insideComment);
@@ -108,9 +102,6 @@ public String moduleNamePrefix(String projectName, String sourceSetName, boolean
108102
return null;
109103
}
110104

111-
public File getFilePath() {
112-
return filePath;
113-
}
114105

115106
/**
116107
* @return true, if we are inside a multi-line comment after this line
@@ -150,4 +141,17 @@ private boolean parse(String moduleLine, boolean insideComment) {
150141
}
151142
return moduleLine.lastIndexOf("/*") > moduleLine.lastIndexOf("*/");
152143
}
144+
145+
@Override
146+
public boolean equals(Object o) {
147+
if (this == o) return true;
148+
if (o == null || getClass() != o.getClass()) return false;
149+
ModuleInfo that = (ModuleInfo) o;
150+
return Objects.equals(moduleName, that.moduleName) && Objects.equals(requires, that.requires) && Objects.equals(requiresTransitive, that.requiresTransitive) && Objects.equals(requiresStatic, that.requiresStatic) && Objects.equals(requiresStaticTransitive, that.requiresStaticTransitive) && Objects.equals(requiresRuntime, that.requiresRuntime);
151+
}
152+
153+
@Override
154+
public int hashCode() {
155+
return Objects.hash(moduleName, requires, requiresTransitive, requiresStatic, requiresStaticTransitive, requiresRuntime);
156+
}
153157
}

src/main/java/org/gradlex/javamodule/dependencies/internal/utils/ModuleInfoCache.java

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,20 +16,22 @@
1616

1717
package org.gradlex.javamodule.dependencies.internal.utils;
1818

19+
import org.gradle.api.Action;
20+
import org.gradle.api.file.ConfigurableFileCollection;
1921
import org.gradle.api.file.RegularFileProperty;
2022
import org.gradle.api.logging.Logger;
2123
import org.gradle.api.model.ObjectFactory;
2224
import org.gradle.api.provider.Provider;
2325
import org.gradle.api.provider.ProviderFactory;
26+
import org.gradle.api.provider.ValueSourceSpec;
2427
import org.gradle.api.tasks.SourceSet;
2528
import org.slf4j.LoggerFactory;
2629

2730
import javax.inject.Inject;
2831
import java.io.File;
2932
import java.nio.file.Path;
3033
import java.nio.file.Paths;
31-
import java.util.HashMap;
32-
import java.util.Map;
34+
import java.util.*;
3335

3436
import static org.gradlex.javamodule.dependencies.internal.utils.ModuleNamingUtil.sourceSetToCapabilitySuffix;
3537

@@ -102,15 +104,29 @@ public String getCapability(String moduleName) {
102104
}
103105

104106
private boolean maybePutModuleInfo(File folder, ProviderFactory providers) {
105-
RegularFileProperty moduleInfoFile = getObjects().fileProperty();
106-
moduleInfoFile.set(new File(folder, "module-info.java"));
107-
Provider<String> moduleInfoContent = providers.fileContents(moduleInfoFile).getAsText();
108-
if (moduleInfoContent.isPresent()) {
107+
Provider<ModuleInfo> moduleInfoProvider = provideModuleInfo(folder, providers);
108+
if (moduleInfoProvider.isPresent()) {
109109
if (!moduleInfo.containsKey(folder)) {
110-
moduleInfo.put(folder, new ModuleInfo(moduleInfoContent.get(), moduleInfoFile.get().getAsFile()));
110+
moduleInfo.put(folder, moduleInfoProvider.get() );
111111
}
112112
return true;
113113
}
114114
return false;
115115
}
116+
117+
private Provider<ModuleInfo> provideModuleInfo(File folder, ProviderFactory providers) {
118+
return providers.of(ValueSourceModuleInfo.class, new Action<ValueSourceSpec<ValueSourceModuleInfo.ModuleInfoSourceP>>() {
119+
@Override
120+
public void execute(ValueSourceSpec<ValueSourceModuleInfo.ModuleInfoSourceP> moduleInfoSourcePValueSourceSpec) {
121+
moduleInfoSourcePValueSourceSpec.parameters(new Action<ValueSourceModuleInfo.ModuleInfoSourceP>() {
122+
@Override
123+
public void execute(ValueSourceModuleInfo.ModuleInfoSourceP moduleInfoSourceP) {
124+
ConfigurableFileCollection from = getObjects().fileCollection().from(folder);
125+
moduleInfoSourceP.getLocations().set(from);
126+
}
127+
});
128+
129+
}
130+
});
131+
}
116132
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package org.gradlex.javamodule.dependencies.internal.utils;
2+
3+
import org.gradle.api.file.FileCollection;
4+
import org.gradle.api.file.RegularFileProperty;
5+
import org.gradle.api.model.ObjectFactory;
6+
import org.gradle.api.provider.*;
7+
import org.jetbrains.annotations.Nullable;
8+
9+
import javax.inject.Inject;
10+
import java.io.File;
11+
import java.io.IOException;
12+
import java.nio.charset.StandardCharsets;
13+
import java.nio.file.Files;
14+
import java.util.Scanner;
15+
16+
public abstract class ValueSourceModuleInfo implements ValueSource<ModuleInfo, ValueSourceModuleInfo.ModuleInfoSourceP> {
17+
18+
19+
interface ModuleInfoSourceP extends ValueSourceParameters {
20+
21+
Property<FileCollection> getLocations();
22+
}
23+
24+
25+
@Override
26+
public @Nullable ModuleInfo obtain() {
27+
ModuleInfoSourceP parameters = getParameters();
28+
for (File fileSystemLocation : parameters.getLocations().get()) {
29+
File file = new File(fileSystemLocation, "module-info.java");
30+
if (file.isFile()) {
31+
try {
32+
Scanner scan = new Scanner(file);
33+
try {
34+
scan.useDelimiter("\\Z");
35+
String content = scan.next();
36+
return new ModuleInfo(content);
37+
} finally {
38+
scan.close();
39+
}
40+
} catch (IOException e) {
41+
throw new RuntimeException(e);
42+
}
43+
}
44+
45+
46+
}
47+
return null;
48+
}
49+
}

src/main/java/org/gradlex/javamodule/dependencies/tasks/ModulePathAnalysis.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ public void report() throws IOException {
7575
if (file.exists()) {
7676
try(Stream<String> lines = Files.lines(file.toPath())) {
7777
String fileContent = lines.collect(Collectors.joining("\n"));
78-
ownModuleNamesPrefix = new ModuleInfo(fileContent, file).moduleNamePrefix(projectName, main.getName(), false);
78+
ownModuleNamesPrefix = new ModuleInfo(fileContent).moduleNamePrefix(projectName, main.getName(), false);
7979
}
8080
break;
8181
}

0 commit comments

Comments
 (0)