Skip to content

Commit 374ba2c

Browse files
committed
Support multiple library directories in LibrariesTask
Refactored LibrariesTask to accept multiple input directories via ConfigurableFileCollection instead of a single DirectoryProperty.
1 parent e097d68 commit 374ba2c

File tree

2 files changed

+43
-48
lines changed

2 files changed

+43
-48
lines changed
Lines changed: 40 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
package org.processing.java.gradle
22

33
import org.gradle.api.DefaultTask
4-
import org.gradle.api.file.DirectoryProperty
4+
import org.gradle.api.file.ConfigurableFileCollection
55
import org.gradle.api.file.RegularFileProperty
6-
import org.gradle.api.tasks.InputDirectory
7-
import org.gradle.api.tasks.Optional
6+
import org.gradle.api.tasks.InputFiles
87
import org.gradle.api.tasks.OutputFile
98
import org.gradle.api.tasks.TaskAction
109
import java.io.File
@@ -17,19 +16,17 @@ This task stores the resulting information in a file that can be used later to r
1716
*/
1817
abstract class LibrariesTask : DefaultTask() {
1918

20-
// TODO: Allow multiple directories
21-
@InputDirectory
22-
@Optional
23-
val librariesDirectory: DirectoryProperty = project.objects.directoryProperty()
19+
@InputFiles
20+
val libraryDirectories: ConfigurableFileCollection = project.files()
2421

2522
@OutputFile
2623
val librariesMetaData: RegularFileProperty = project.objects.fileProperty()
2724

2825
init{
29-
librariesMetaData.convention(project.layout.buildDirectory.file("processing/libraries"))
26+
librariesMetaData.convention { project.gradle.gradleUserHomeDir.resolve("common/processing/libraries") }
3027
}
3128

32-
data class Jar(
29+
data class Jar(
3330
val path: File,
3431
val classes: List<String>
3532
) : java.io.Serializable
@@ -40,45 +37,45 @@ abstract class LibrariesTask : DefaultTask() {
4037

4138
@TaskAction
4239
fun execute() {
43-
if (!librariesDirectory.isPresent) {
44-
logger.error("Libraries directory is not set. Libraries will not be imported.")
45-
val meta = ObjectOutputStream(librariesMetaData.get().asFile.outputStream())
46-
meta.writeObject(arrayListOf<Library>())
47-
meta.close()
48-
return
49-
}
50-
val libraries = librariesDirectory.get().asFile
51-
.listFiles { file -> file.isDirectory }
52-
?.map { folder ->
53-
// Find all the jars in the sketchbook
54-
val jars = folder.resolve("library")
55-
.listFiles{ file -> file.extension == "jar" }
56-
?.map{ file ->
40+
val output = libraryDirectories.flatMap { librariesDirectory ->
41+
if (!librariesDirectory.exists()) {
42+
logger.error("Libraries directory (${librariesDirectory.path}) does not exist. Libraries will not be imported.")
43+
return@flatMap emptyList()
44+
}
45+
val libraries = librariesDirectory
46+
.listFiles { file -> file.isDirectory }
47+
?.map { folder ->
48+
// Find all the jars in the sketchbook
49+
val jars = folder.resolve("library")
50+
.listFiles{ file -> file.extension == "jar" }
51+
?.map{ file ->
5752

58-
// Inside each jar, look for the defined classes
59-
val jar = JarFile(file)
60-
val classes = jar.entries().asSequence()
61-
.filter { entry -> entry.name.endsWith(".class") }
62-
.map { entry -> entry.name }
63-
.map { it.substringBeforeLast('/').replace('/', '.') }
64-
.distinct()
65-
.toList()
53+
// Inside each jar, look for the defined classes
54+
val jar = JarFile(file)
55+
val classes = jar.entries().asSequence()
56+
.filter { entry -> entry.name.endsWith(".class") }
57+
.map { entry -> entry.name }
58+
.map { it.substringBeforeLast('/').replace('/', '.') }
59+
.distinct()
60+
.toList()
6661

67-
// Return a reference to the jar and its classes
68-
return@map Jar(
69-
path = file,
70-
classes = classes
71-
)
72-
}?: emptyList()
62+
// Return a reference to the jar and its classes
63+
return@map Jar(
64+
path = file,
65+
classes = classes
66+
)
67+
}?: emptyList()
7368

74-
// Save the parsed jars and which folder
75-
return@map Library(
76-
jars = jars
77-
)
78-
}?: emptyList()
69+
// Save the parsed jars and which folder
70+
return@map Library(
71+
jars = jars
72+
)
73+
}?: emptyList()
7974

75+
return@flatMap libraries
76+
}
8077
val meta = ObjectOutputStream(librariesMetaData.get().asFile.outputStream())
81-
meta.writeObject(libraries)
78+
meta.writeObject(output)
8279
meta.close()
8380
}
8481
}

java/gradle/src/main/kotlin/ProcessingPlugin.kt

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import org.jetbrains.compose.ComposeExtension
1313
import org.jetbrains.compose.desktop.DesktopExtension
1414
import java.io.File
1515
import java.net.Socket
16-
import java.util.Properties
1716
import javax.inject.Inject
1817

1918
class ProcessingPlugin @Inject constructor(private val objectFactory: ObjectFactory) : Plugin<Project> {
@@ -181,8 +180,7 @@ class ProcessingPlugin @Inject constructor(private val objectFactory: ObjectFact
181180
val librariesTaskName = sourceSet.getTaskName("scanLibraries", "PDE")
182181
val librariesScan = project.tasks.register(librariesTaskName, LibrariesTask::class.java) { task ->
183182
task.description = "Scans the libraries in the sketchbook"
184-
task.librariesDirectory.set(sketchbook?.let { File(it, "libraries") })
185-
// TODO: Save the libraries metadata to settings folder to share between sketches
183+
task.libraryDirectories.from(sketchbook?.let { File(it, "libraries") })
186184
}
187185

188186
// Create a task to process the .pde files before compiling the java sources
@@ -198,9 +196,9 @@ class ProcessingPlugin @Inject constructor(private val objectFactory: ObjectFact
198196

199197
val depsTaskName = sourceSet.getTaskName("addLegacyDependencies", "PDE")
200198
project.tasks.register(depsTaskName, DependenciesTask::class.java){ task ->
201-
task.librariesMetaData
199+
// Link the output of the libraries task to the dependencies task
200+
task.librariesMetaData.set(librariesScan.get().librariesMetaData)
202201
task.dependsOn(pdeTask, librariesScan)
203-
// TODO: Save the libraries metadata to settings folder to share between sketches
204202
}
205203

206204
// Make sure that the PDE tasks runs before the java compilation task

0 commit comments

Comments
 (0)