@@ -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