1+ import org.gradle.api.GradleException
2+ import org.gradle.api.Plugin
3+ import org.gradle.api.Project
4+ import org.gradle.api.plugins.JavaPlugin
5+ import org.gradle.api.plugins.JavaPluginExtension
6+ import org.gradle.api.tasks.bundling.Jar
7+ import org.gradle.api.tasks.bundling.Zip
8+ import org.gradle.api.tasks.javadoc.Javadoc
9+ import org.gradle.jvm.toolchain.JavaLanguageVersion
10+ import java.util.prefs.Preferences
11+
12+ class ProcessingLibraryPlugin : Plugin <Project > {
13+
14+ override fun apply (target : Project ) {
15+ val extension = target.extensions.create(" processing" , ProcessingLibraryExtension ::class .java)
16+ target.plugins.apply (JavaPlugin ::class .java)
17+
18+ target.repositories.mavenCentral()
19+ target.repositories.maven { it.setUrl(" https://jogamp.org/deployment/maven/" ) }
20+
21+ // Grab processing core if available, otherwise use the published version
22+ val hasCore = try {
23+ val core = target.project(" :core" )
24+ target.dependencies.add(" compileOnly" , core)
25+ true
26+ } catch (_: Exception ) {
27+ false
28+ }
29+
30+ target.afterEvaluate {
31+ if (! hasCore) {
32+ if (extension.version == null ) {
33+ throw GradleException (" Processing library version must be specified, please set processing.version in your build.gradle.kts" )
34+ }
35+ val processingVersion = extension.version
36+ target.dependencies.add(" compileOnly" , " org.processing:core:$processingVersion " )
37+ }
38+ }
39+ target.extensions.configure(JavaPluginExtension ::class .java) { extension ->
40+ extension.toolchain.languageVersion.set(JavaLanguageVersion .of(17 ))
41+ }
42+
43+ target.plugins.withType(JavaPlugin ::class .java) {
44+ val jarTask = target.tasks.named(" jar" , Jar ::class .java)
45+ val javaDocTask = target.tasks.named(" javadoc" , Javadoc ::class .java)
46+
47+ val bundleTask = target.tasks.register(" bundleLibrary" , BundleLibraryFilesTask ::class .java) { task ->
48+ task.configuration = extension.library
49+ task.group = " processing"
50+ task.description = " Creates the Processing library folder with jar, library.properties, and examples."
51+ task.dependsOn(jarTask, javaDocTask)
52+ }
53+
54+ val zipTask = target.tasks.register(" zipLibrary" , Zip ::class .java) { task ->
55+ task.apply {
56+ val libraryName = extension.library.name ? : target.name
57+ val sourceDir = bundleTask.get().outputDir.get().asFile
58+
59+ group = " processing"
60+ description = " Creates a zip & pdex archive of the Processing library folder."
61+ dependsOn(bundleTask)
62+ include(" ${libraryName} /**" )
63+
64+ archiveFileName.set(" $libraryName .zip" )
65+ from(sourceDir)
66+ destinationDirectory.set(sourceDir)
67+ doLast {
68+ val zip = task.outputs.files.files.first()
69+ zip.copyTo(sourceDir.resolve(" $libraryName .pdex" ), overwrite = true )
70+ }
71+ }
72+ }
73+
74+ target.tasks.register(" installLibrary" ) { task ->
75+ task.apply {
76+ group = " processing"
77+ dependsOn(zipTask)
78+ doLast {
79+ val preferences = Preferences .userRoot().node(" org/processing/app" )
80+
81+ val semverRe = Regex (""" ^(\d+)(?:\.(\d+))?(?:\.(\d+))?(?:-([0-9A-Za-z.-]+))?""" )
82+ fun semverKey (v : String ): Triple <Long , Boolean , String > {
83+ val m = semverRe.find(v)
84+ val maj = m?.groupValues?.getOrNull(1 )?.toLongOrNull() ? : 0L
85+ val min = m?.groupValues?.getOrNull(2 )?.toLongOrNull() ? : 0L
86+ val pat = m?.groupValues?.getOrNull(3 )?.toLongOrNull() ? : 0L
87+ val pre = m?.groupValues?.getOrNull(4 )
88+ val packed = (maj shl 40 ) or (min shl 20 ) or pat
89+ return Triple (packed, pre == null , pre ? : " " )
90+ }
91+
92+ val installLocations = preferences.get(" installLocations" , " " )
93+ .split(" ," )
94+ .filter { it.isNotEmpty() }
95+ .mapNotNull {
96+ val parts = it.split(" ^" )
97+ if (parts.size < 2 ) null else parts[1 ] to parts[0 ] // version to path
98+ }
99+ .sortedWith(Comparator { a, b ->
100+ val ka = semverKey(a.first)
101+ val kb = semverKey(b.first)
102+ when {
103+ ka.first != kb.first -> kb.first.compareTo(ka.first)
104+ ka.second != kb.second -> kb.second.compareTo(ka.second)
105+ else -> kb.third.compareTo(ka.third)
106+ }
107+ })
108+
109+ val installPath = installLocations.firstOrNull()?.second
110+ ? : throw GradleException (" Could not find Processing install location in preferences." )
111+
112+ val libraryName = extension.library.name ? : target.name
113+ val sourceDir = bundleTask.get().outputDir.get().asFile.resolve(" $libraryName .pdex" )
114+
115+ ProcessBuilder ()
116+ .command(installPath, sourceDir.absolutePath)
117+ .inheritIO()
118+ .start()
119+ }
120+ }
121+ }
122+
123+ }
124+ }
125+ }
0 commit comments