Skip to content

Commit 65c7d72

Browse files
committed
generate file with class to module info
1 parent 06522bd commit 65c7d72

File tree

2 files changed

+62
-72
lines changed

2 files changed

+62
-72
lines changed

build-tools/src/main/java/org/elasticsearch/gradle/plugin/GenerateTestBuildInfoTask.java

Lines changed: 49 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -12,22 +12,24 @@
1212
import org.gradle.api.DefaultTask;
1313
import org.gradle.api.file.DirectoryProperty;
1414
import org.gradle.api.file.FileCollection;
15-
import org.gradle.api.file.RegularFileProperty;
1615
import org.gradle.api.provider.Property;
1716
import org.gradle.api.tasks.Input;
18-
import org.gradle.api.tasks.InputFile;
1917
import org.gradle.api.tasks.InputFiles;
20-
import org.gradle.api.tasks.Optional;
2118
import org.gradle.api.tasks.OutputDirectory;
2219
import org.gradle.api.tasks.TaskAction;
2320

2421
import java.io.File;
2522
import java.io.IOException;
23+
import java.io.UncheckedIOException;
2624
import java.nio.charset.StandardCharsets;
2725
import java.nio.file.Files;
2826
import java.nio.file.Path;
29-
30-
// TODO: 3 sets - testBuildInfo, internalClusterTest, external (as dependency of another)
27+
import java.util.ArrayList;
28+
import java.util.Arrays;
29+
import java.util.HashMap;
30+
import java.util.List;
31+
import java.util.Map;
32+
import java.util.jar.JarFile;
3133

3234
public abstract class GenerateTestBuildInfoTask extends DefaultTask {
3335

@@ -41,14 +43,6 @@ public GenerateTestBuildInfoTask() {
4143
@Input
4244
public abstract Property<String> getComponentName();
4345

44-
@InputFile
45-
@Optional
46-
public abstract RegularFileProperty getDescriptorFile();
47-
48-
@InputFile
49-
@Optional
50-
public abstract RegularFileProperty getPolicyFile();
51-
5246
@InputFiles
5347
public abstract Property<FileCollection> getCodeLocations();
5448

@@ -57,6 +51,41 @@ public GenerateTestBuildInfoTask() {
5751

5852
@TaskAction
5953
public void generatePropertiesFile() throws IOException {
54+
Map<String, String> classesToModules = new HashMap<>();
55+
for (File file : getCodeLocations().get().getFiles()) {
56+
if (file.exists()) {
57+
if (file.getName().endsWith(".jar")) {
58+
try (JarFile jarFile = new JarFile(file)) {
59+
jarFile.stream()
60+
.filter(
61+
je -> je.getName().startsWith("META-INF") == false
62+
&& je.getName().equals("module-info.class") == false
63+
&& je.getName().endsWith(".class")
64+
)
65+
.findFirst()
66+
.ifPresent(entry -> classesToModules.put(entry.getName(), "module-goes-here"));
67+
} catch (IOException ioe) {
68+
throw new UncheckedIOException(ioe);
69+
}
70+
} else if (file.isDirectory()) {
71+
List<File> files = new ArrayList<>(List.of(file));
72+
while (files.isEmpty() == false) {
73+
File find = files.removeFirst();
74+
if (find.exists()) {
75+
if (find.isDirectory() && find.getName().equals("META_INF") == false) {
76+
files.addAll(Arrays.asList(find.listFiles()));
77+
} else if (find.getName().equals("module-info.class") == false && find.getName().contains("$") == false) {
78+
classesToModules.put(find.getName(), "module-goes-here");
79+
break;
80+
}
81+
}
82+
}
83+
} else {
84+
throw new IllegalArgumentException("Unrecognized classpath file: " + file);
85+
}
86+
}
87+
}
88+
6089
Path outputDirectory = getOutputDirectory().get().getAsFile().toPath();
6190
Files.createDirectories(outputDirectory);
6291
Path outputFile = outputDirectory.resolve(PROPERTIES_FILENAME);
@@ -68,24 +97,15 @@ public void generatePropertiesFile() throws IOException {
6897
writer.write(getComponentName().get());
6998
writer.write("\",\n");
7099

71-
if (getDescriptorFile().isPresent()) {
72-
writer.write(" \"descriptor\": \"");
73-
writer.write(getDescriptorFile().getAsFile().get().getAbsolutePath());
74-
writer.write("\",\n");
75-
}
76-
77-
if (getPolicyFile().isPresent()) {
78-
writer.write(" \"policy\": \"");
79-
writer.write(getPolicyFile().getAsFile().get().getAbsolutePath());
80-
writer.write("\",\n");
81-
}
82-
83100
writer.write(" \"locations\": [\n");
84101
StringBuilder sb = new StringBuilder();
85-
for (File jar : getCodeLocations().get()) {
86-
sb.append(" \"");
87-
sb.append(jar.getAbsolutePath());
88-
sb.append("\",\n");
102+
for (Map.Entry<String, String> entry : classesToModules.entrySet()) {
103+
sb.append(" {\n");
104+
sb.append(" \"class\": \"");
105+
sb.append(entry.getKey());
106+
sb.append("\",\n \"module\": \"");
107+
sb.append(entry.getValue());
108+
sb.append("\"\n },\n");
89109
}
90110
writer.write(sb.substring(0, sb.length() - 2));
91111
writer.write("\n ]\n}\n");

build-tools/src/main/java/org/elasticsearch/gradle/plugin/PluginBuildPlugin.java

Lines changed: 13 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -19,20 +19,10 @@
1919
import org.gradle.api.provider.ProviderFactory;
2020
import org.gradle.api.tasks.SourceSet;
2121
import org.gradle.api.tasks.SourceSetContainer;
22-
import org.gradle.jvm.tasks.Jar;
2322
import org.gradle.language.jvm.tasks.ProcessResources;
2423

2524
import javax.inject.Inject;
2625

27-
import java.io.File;
28-
import java.io.IOException;
29-
import java.io.UncheckedIOException;
30-
import java.util.Optional;
31-
import java.util.jar.JarEntry;
32-
import java.util.jar.JarFile;
33-
34-
import static java.util.stream.Collectors.toList;
35-
3626
/**
3727
* Encapsulates build configuration for an Elasticsearch plugin.
3828
*/
@@ -72,55 +62,35 @@ public void apply(final Project project) {
7262
// TODO: we no longer care about policy-yaml file remove as inputs
7363
var testBuildInfoTask = project.getTasks().register("generateTestBuildInfo", GenerateTestBuildInfoTask.class, task -> {
7464
var pluginProperties = project.getTasks().withType(GeneratePluginPropertiesTask.class).named("pluginProperties");
75-
task.getDescriptorFile().set(pluginProperties.flatMap(GeneratePluginPropertiesTask::getOutputFile));
65+
// task.getDescriptorFile().set(pluginProperties.flatMap(GeneratePluginPropertiesTask::getOutputFile));
7666
var propertiesExtension = project.getExtensions().getByType(PluginPropertiesExtension.class);
7767
task.getComponentName().set(providerFactory.provider(propertiesExtension::getName));
7868
var policy = project.getLayout().getProjectDirectory().file("src/main/plugin-metadata/entitlement-policy.yaml");
7969
if (policy.getAsFile().exists()) {
80-
task.getPolicyFile().set(policy);
70+
// task.getPolicyFile().set(policy);
8171
}
8272
// TODO: get first class of each location in deterministic order
8373
// TODO: filter META_INF and module-info.class out of these
84-
for (File file : project.getConfigurations()
85-
.getByName("runtimeClasspath")
86-
.minus(project.getConfigurations().getByName(CompileOnlyResolvePlugin.RESOLVEABLE_COMPILE_ONLY_CONFIGURATION_NAME))
87-
.plus(sourceSets.getByName(SourceSet.MAIN_SOURCE_SET_NAME).getOutput().getClassesDirs()).getFiles()) {
88-
project.getLogger().lifecycle("HELLO: " + file.getAbsolutePath() + " - " + file.isDirectory());
89-
if (file.getName().endsWith(".jar")) {
90-
try (JarFile jarFile = new JarFile(file)) {
91-
Optional<JarEntry> jarEntry = jarFile.stream()
92-
.filter(je -> je.getName().startsWith("META-INF") || je.getName().endsWith("module-info.class") || je.getName().endsWith(".class") == false).findFirst();
93-
if (jarEntry.isPresent()) {
94-
project.getLogger().lifecycle("ENTRY: " + jarEntry.get().getName());
95-
}
96-
//project.getLogger().lifecycle("LIST: " + jarFile.stream().toList());
97-
} catch (IOException ioe) {
98-
throw new UncheckedIOException(ioe);
99-
}
100-
}
101-
}
10274

103-
task.getCodeLocations().set(project.getConfigurations()
104-
.getByName("runtimeClasspath")
105-
.minus(project.getConfigurations().getByName(CompileOnlyResolvePlugin.RESOLVEABLE_COMPILE_ONLY_CONFIGURATION_NAME))
106-
.plus(sourceSets.getByName(SourceSet.MAIN_SOURCE_SET_NAME).getOutput().getClassesDirs())
107-
);
75+
task.getCodeLocations()
76+
.set(
77+
project.getConfigurations()
78+
.getByName("runtimeClasspath")
79+
.minus(project.getConfigurations().getByName(CompileOnlyResolvePlugin.RESOLVEABLE_COMPILE_ONLY_CONFIGURATION_NAME))
80+
.plus(sourceSets.getByName(SourceSet.MAIN_SOURCE_SET_NAME).getOutput().getClassesDirs())
81+
);
10882

109-
Provider<Directory> directory = project.getLayout()
110-
.getBuildDirectory()
111-
.dir("generated-build-info/test");
83+
Provider<Directory> directory = project.getLayout().getBuildDirectory().dir("generated-build-info/test");
11284
task.getOutputDirectory().set(directory);
11385
});
11486

115-
sourceSets.named(SourceSet.TEST_SOURCE_SET_NAME).configure(sourceSet -> {
116-
sourceSet.getResources().srcDir(testBuildInfoTask);
117-
});
87+
sourceSets.named(SourceSet.TEST_SOURCE_SET_NAME).configure(sourceSet -> { sourceSet.getResources().srcDir(testBuildInfoTask); });
11888

11989
project.getTasks().withType(ProcessResources.class).named("processResources").configure(task -> {
120-
// TODO: this is a copy task
90+
// TODO: this is a copy task
12191
// TODO: do this for descriptor and policy-yaml file
12292
// TODO: use child copy spec
123-
//task.into()
93+
// task.into()
12494
});
12595
}
12696

0 commit comments

Comments
 (0)