@@ -30,20 +30,15 @@ import java.util.jar.Manifest
30
30
import javax.inject.Inject
31
31
import org.gradle.api.DefaultTask
32
32
import org.gradle.api.file.ConfigurableFileCollection
33
+ import org.gradle.api.file.DirectoryProperty
33
34
import org.gradle.api.file.FileCollection
34
35
import org.gradle.api.plugins.JavaPluginExtension
35
36
import 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.*
44
38
import org.gradle.jvm.toolchain.JavaLauncher
45
39
import org.gradle.jvm.toolchain.JavaToolchainService
46
40
import org.gradle.process.JavaForkOptions
41
+ import org.gradle.work.Incremental
47
42
import org.gradle.workers.ProcessWorkerSpec
48
43
import org.gradle.workers.WorkerExecutor
49
44
@@ -52,6 +47,8 @@ abstract class PlugGenerateTask : DefaultTask() {
52
47
53
48
@get:Inject abstract val workerExecutor: WorkerExecutor
54
49
50
+ @get:InputDirectory abstract val discoveredPlugsDir: DirectoryProperty
51
+
55
52
@get:InputFiles @get:Classpath abstract val jarsToLinkAgainst: ConfigurableFileCollection
56
53
57
54
@get:Internal var resourcesFolder: File ? = null
@@ -60,7 +57,7 @@ abstract class PlugGenerateTask : DefaultTask() {
60
57
val atplugInfFolder: File
61
58
get() = File (resourcesFolder, PlugPlugin .ATPLUG_INF )
62
59
63
- @InputFiles var classesFolders: FileCollection ? = null
60
+ @get:Incremental @get: InputFiles abstract val classesFolders: ConfigurableFileCollection
64
61
65
62
init {
66
63
this .outputs.upToDateWhen {
@@ -74,20 +71,36 @@ abstract class PlugGenerateTask : DefaultTask() {
74
71
launcher.set(service.launcherFor(spec))
75
72
}
76
73
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
-
87
74
@TaskAction
88
75
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
+
89
102
// generate the metadata
90
- val result = generate()
103
+ val result = generate(discoveredPlugs )
91
104
92
105
// clean out the ATPLUG-INF folder, and put the map's content into the folder
93
106
FileMisc .cleanDir(atplugInfFolder)
@@ -138,9 +151,10 @@ abstract class PlugGenerateTask : DefaultTask() {
138
151
}
139
152
}
140
153
141
- private fun generate (): SortedMap <String , String > {
154
+ private fun generate (discoveredPlugs : Map < String , String > ): SortedMap <String , String > {
142
155
val input =
143
- PlugGeneratorJavaExecable (ArrayList (classesFolders!! .files), jarsToLinkAgainst.files)
156
+ PlugGeneratorJavaExecable (
157
+ discoveredPlugs, ArrayList (classesFolders.files), jarsToLinkAgainst.files)
144
158
return if (launcher.isPresent) {
145
159
val workQueue =
146
160
workerExecutor.processIsolation { workerSpec: ProcessWorkerSpec ->
0 commit comments