@@ -30,20 +30,15 @@ import java.util.jar.Manifest
3030import javax.inject.Inject
3131import org.gradle.api.DefaultTask
3232import org.gradle.api.file.ConfigurableFileCollection
33+ import org.gradle.api.file.DirectoryProperty
3334import org.gradle.api.file.FileCollection
3435import org.gradle.api.plugins.JavaPluginExtension
3536import org.gradle.api.provider.Property
36- import org.gradle.api.tasks.Classpath
37- import org.gradle.api.tasks.InputFiles
38- import org.gradle.api.tasks.Internal
39- import org.gradle.api.tasks.JavaExec
40- import org.gradle.api.tasks.Nested
41- import org.gradle.api.tasks.Optional
42- import org.gradle.api.tasks.OutputDirectory
43- import org.gradle.api.tasks.TaskAction
37+ import org.gradle.api.tasks.*
4438import org.gradle.jvm.toolchain.JavaLauncher
4539import org.gradle.jvm.toolchain.JavaToolchainService
4640import org.gradle.process.JavaForkOptions
41+ import org.gradle.work.Incremental
4742import org.gradle.workers.ProcessWorkerSpec
4843import org.gradle.workers.WorkerExecutor
4944
@@ -52,6 +47,8 @@ abstract class PlugGenerateTask : DefaultTask() {
5247
5348 @get:Inject abstract val workerExecutor: WorkerExecutor
5449
50+ @get:InputDirectory abstract val discoveredPlugsDir: DirectoryProperty
51+
5552 @get:InputFiles @get:Classpath abstract val jarsToLinkAgainst: ConfigurableFileCollection
5653
5754 @get:Internal var resourcesFolder: File ? = null
@@ -60,7 +57,7 @@ abstract class PlugGenerateTask : DefaultTask() {
6057 val atplugInfFolder: File
6158 get() = File (resourcesFolder, PlugPlugin .ATPLUG_INF )
6259
63- @InputFiles var classesFolders: FileCollection ? = null
60+ @get:Incremental @get: InputFiles abstract val classesFolders: ConfigurableFileCollection
6461
6562 init {
6663 this .outputs.upToDateWhen {
@@ -74,20 +71,36 @@ abstract class PlugGenerateTask : DefaultTask() {
7471 launcher.set(service.launcherFor(spec))
7572 }
7673
77- fun setClassesFolders (files : Iterable <File >) {
78- // if we don't copy, Gradle finds an implicit dependency which
79- // forces us to depend on `classes` even though we don't
80- val copy: MutableList <File > = ArrayList ()
81- for (file in files) {
82- copy.add(file)
83- }
84- classesFolders = project.files(copy)
85- }
86-
8774 @TaskAction
8875 fun build () {
76+ // 1) Collect the discovered classes
77+ val discoveredFiles =
78+ discoveredPlugsDir.get().asFile.listFiles().orEmpty().filter {
79+ it.isFile && it.name.endsWith(" .txt" )
80+ }
81+
82+ // Turn them into a list of (plugClass, socketClass)
83+ val discoveredPlugs =
84+ discoveredFiles
85+ .map { file ->
86+ val line = file.readText(StandardCharsets .UTF_8 ).trim()
87+ val split = line.split(" |" )
88+ check(split.size == 2 ) { " Malformed discovered line in ${file.name} : '$line '" }
89+ val (plugClassName, socketClassName) = split
90+ plugClassName to socketClassName
91+ }
92+ .toMap()
93+
94+ // 2) Use reflection logic, now that we have jarsToLinkAgainst, to produce final metadata
95+ // This is where you'd adapt the old PlugGenerator invocation, but no scanning is needed
96+ if (discoveredPlugs.isEmpty()) {
97+ // no discovered plugs
98+ FileMisc .cleanDir(atplugInfFolder)
99+ return
100+ }
101+
89102 // generate the metadata
90- val result = generate()
103+ val result = generate(discoveredPlugs )
91104
92105 // clean out the ATPLUG-INF folder, and put the map's content into the folder
93106 FileMisc .cleanDir(atplugInfFolder)
@@ -138,9 +151,10 @@ abstract class PlugGenerateTask : DefaultTask() {
138151 }
139152 }
140153
141- private fun generate (): SortedMap <String , String > {
154+ private fun generate (discoveredPlugs : Map < String , String > ): SortedMap <String , String > {
142155 val input =
143- PlugGeneratorJavaExecable (ArrayList (classesFolders!! .files), jarsToLinkAgainst.files)
156+ PlugGeneratorJavaExecable (
157+ discoveredPlugs, ArrayList (classesFolders.files), jarsToLinkAgainst.files)
144158 return if (launcher.isPresent) {
145159 val workQueue =
146160 workerExecutor.processIsolation { workerSpec: ProcessWorkerSpec ->
0 commit comments