Skip to content

Commit bba5c30

Browse files
committed
Wire up the new mechanisms.
1 parent 8838901 commit bba5c30

File tree

3 files changed

+61
-38
lines changed

3 files changed

+61
-38
lines changed

atplug-plugin-gradle/src/main/java/com/diffplug/atplug/tooling/gradle/PlugGenerateTask.kt

Lines changed: 36 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -30,20 +30,15 @@ import java.util.jar.Manifest
3030
import javax.inject.Inject
3131
import org.gradle.api.DefaultTask
3232
import org.gradle.api.file.ConfigurableFileCollection
33+
import org.gradle.api.file.DirectoryProperty
3334
import org.gradle.api.file.FileCollection
3435
import org.gradle.api.plugins.JavaPluginExtension
3536
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.*
4438
import org.gradle.jvm.toolchain.JavaLauncher
4539
import org.gradle.jvm.toolchain.JavaToolchainService
4640
import org.gradle.process.JavaForkOptions
41+
import org.gradle.work.Incremental
4742
import org.gradle.workers.ProcessWorkerSpec
4843
import 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 ->

atplug-plugin-gradle/src/main/java/com/diffplug/atplug/tooling/gradle/PlugPlugin.kt

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -50,32 +50,37 @@ class PlugPlugin : Plugin<Project> {
5050
plugGen.dependencies.add(dep)
5151
}
5252

53-
// jar --dependsOn--> plugGenerate
54-
val generateTask =
55-
project.tasks.register<PlugGenerateTask>(GENERATE, PlugGenerateTask::class.java) {
56-
task: PlugGenerateTask ->
57-
task.setClassesFolders(main.output.classesDirs)
58-
task.jarsToLinkAgainst.setFrom(plugGenConfig)
59-
task.resourcesFolder = main.resources.sourceDirectories.singleFile
53+
val findPlugsTask =
54+
project.tasks.register("findPlugs", FindPlugsTask::class.java) {
55+
it.classesFolders.setFrom(main.output.classesDirs)
56+
it.discoveredPlugsDir.set(project.layout.buildDirectory.dir("foundPlugs"))
6057
// dep on java
6158
for (taskName in mutableListOf("compileJava", "compileKotlin")) {
6259
try {
63-
task.dependsOn(project.tasks.named(taskName))
60+
it.dependsOn(project.tasks.named(taskName))
6461
} catch (e: UnknownTaskException) {
65-
// not a problem
62+
// not a problem if we only have kotlin
6663
}
6764
}
6865
}
69-
project.tasks.named(JavaPlugin.JAR_TASK_NAME).configure { jarTaskUntyped: Task ->
70-
val jarTask = jarTaskUntyped as Jar
71-
val metadataTask = generateTask.get()
66+
67+
val generatePlugsTask =
68+
project.tasks.register("generatePlugs", PlugGenerateTask::class.java) {
69+
it.discoveredPlugsDir.set(findPlugsTask.flatMap { it.discoveredPlugsDir })
70+
it.classesFolders.setFrom(main.output.classesDirs)
71+
it.jarsToLinkAgainst.setFrom(plugGenConfig)
72+
it.resourcesFolder = main.resources.sourceDirectories.singleFile
73+
it.dependsOn(findPlugsTask)
74+
}
75+
project.tasks.named(JavaPlugin.JAR_TASK_NAME).configure {
76+
val jarTask = it as Jar
77+
val metadataTask = generatePlugsTask.get()
7278
jarTask.inputs.dir(metadataTask.atplugInfFolder)
7379
jarTask.doFirst(
74-
"Set " + SERVICE_COMPONENT + " header",
75-
SetServiceComponentHeader(metadataTask.atplugInfFolder))
80+
"Set $SERVICE_COMPONENT header", SetServiceComponentHeader(metadataTask.atplugInfFolder))
7681
}
7782
project.tasks.named(JavaPlugin.PROCESS_RESOURCES_TASK_NAME).configure { t: Task ->
78-
t.dependsOn(generateTask)
83+
t.dependsOn(generatePlugsTask)
7984
}
8085
}
8186

@@ -93,7 +98,6 @@ class PlugPlugin : Plugin<Project> {
9398
}
9499

95100
companion object {
96-
const val GENERATE = "plugGenerate"
97101
const val SERVICE_COMPONENT = "AtPlug-Component"
98102
const val DOT_JSON = ".json"
99103
const val ATPLUG_INF = "ATPLUG-INF/"

atplug-plugin-gradle/src/test/java/com/diffplug/atplug/tooling/PlugGeneratorTest.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@ class PlugGeneratorTest : ResourceHarness() {
3333
fun generateMetadata() {
3434
val maps =
3535
PlugGenerator.generate(
36+
mapOf(
37+
"com.diffplug.atplug.Apple" to "com.diffplug.atplug.Fruit",
38+
"com.diffplug.atplug.Orange" to "com.diffplug.atplug.Fruit",
39+
"com.diffplug.atplug.Shape\$Circle" to "com.diffplug.atplug.Shape",
40+
"com.diffplug.atplug.Shape\$Square" to "com.diffplug.atplug.Shape"),
3641
listOf("java", "kotlin").map { File("../atplug-runtime/build/classes/$it/test") },
3742
deps())
3843
Assertions.assertEquals(

0 commit comments

Comments
 (0)