Skip to content

Commit 9a374c1

Browse files
authored
Merge pull request #24 from nebula-plugins/plugin-enhancements
Improve usage of Provider API and add configuration cache tests
2 parents d8c0399 + 533679a commit 9a374c1

File tree

3 files changed

+404
-49
lines changed

3 files changed

+404
-49
lines changed

src/main/kotlin/com/netflix/gradle/jakartaee/JakartaEeMigrationExtension.kt

Lines changed: 53 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,9 @@ import org.gradle.api.artifacts.type.ArtifactTypeDefinition
2525
import org.gradle.api.attributes.Attribute
2626
import org.gradle.api.plugins.JavaPlugin
2727
import org.gradle.api.plugins.JavaPluginExtension
28+
import org.gradle.api.provider.ListProperty
29+
import org.gradle.api.provider.Property
2830
import org.gradle.api.tasks.SourceSet
29-
import java.util.concurrent.atomic.AtomicBoolean
3031

3132
public open class JakartaEeMigrationExtension(
3233
private val project: Project,
@@ -84,21 +85,22 @@ public open class JakartaEeMigrationExtension(
8485
)
8586
}
8687

87-
private val configuredCapabilities = AtomicBoolean()
88-
private val registeredTransform = AtomicBoolean()
89-
private val excludeSpecificationsTransform = AtomicBoolean()
90-
private val transformInMemory = AtomicBoolean()
91-
private val preventTransformOfProductionConfigurations = AtomicBoolean()
92-
private val included = mutableListOf<ArtifactCoordinate>()
93-
private val excluded = mutableListOf<ArtifactCoordinate>()
88+
private val configuredCapabilities: Property<Boolean> = project.objects.property(Boolean::class.java).convention(false)
89+
private val registeredTransform: Property<Boolean> = project.objects.property(Boolean::class.java).convention(false)
90+
private val excludeSpecificationsTransform: Property<Boolean> = project.objects.property(Boolean::class.java).convention(false)
91+
private val transformInMemory: Property<Boolean> = project.objects.property(Boolean::class.java).convention(false)
92+
private val preventTransformOfProductionConfigurations: Property<Boolean> = project.objects.property(Boolean::class.java).convention(false)
93+
private val included: ListProperty<ArtifactCoordinate> = project.objects.listProperty(ArtifactCoordinate::class.java).empty()
94+
private val excluded: ListProperty<ArtifactCoordinate> = project.objects.listProperty(ArtifactCoordinate::class.java).convention(
95+
ARTIFACTS_WITH_INTENTIONAL_JAVAX.map {
96+
val split = it.split(":")
97+
ArtifactCoordinate(split[0], split[1])
98+
}
99+
)
94100

95101
private val configurations = project.configurations
96102
private val dependencies = project.dependencies
97103

98-
init {
99-
ARTIFACTS_WITH_INTENTIONAL_JAVAX.forEach(::excludeTransform)
100-
}
101-
102104
/**
103105
* Enable automatic migration.
104106
*/
@@ -109,18 +111,22 @@ public open class JakartaEeMigrationExtension(
109111
private fun applyToConfigurations(action: (Configuration) -> Unit) {
110112
val javaExtension = project.extensions.findByType(JavaPluginExtension::class.java)
111113
check(javaExtension != null) { "The Java plugin extension is not present on this project" }
112-
javaExtension.sourceSets.configureEach { sourceSet ->
113-
val configurationNames = CLASSPATH_NAME_ACCESSORS.map { it(sourceSet) }
114-
project.configurations.configureEach { configuration ->
115-
if (configurationNames.contains(configuration.name)) {
116-
action(configuration)
117-
}
118-
}
114+
115+
// Build the set of applicable configuration names lazily
116+
val applicableConfigurationNames = project.provider {
117+
val sourceSetConfigs = javaExtension.sourceSets.flatMap { sourceSet ->
118+
CLASSPATH_NAME_ACCESSORS.map { accessor -> accessor(sourceSet) }
119+
}.toSet()
120+
121+
sourceSetConfigs + SPRING_BOOT_CONFIGURATION_NAMES
119122
}
120-
project.configurations.configureEach {configuration ->
121-
if (SPRING_BOOT_CONFIGURATION_NAMES.contains(configuration.name)) {
122-
action(configuration)
123-
} else if (INCLUDED_SUFFIXES.any { configuration.name.endsWith(it) }) {
123+
124+
project.configurations.configureEach { configuration ->
125+
// Check if this configuration should have the action applied
126+
val shouldApply = applicableConfigurationNames.get().contains(configuration.name) ||
127+
INCLUDED_SUFFIXES.any { configuration.name.endsWith(it) }
128+
129+
if (shouldApply) {
124130
action(configuration)
125131
}
126132
}
@@ -132,7 +138,9 @@ public open class JakartaEeMigrationExtension(
132138
* @param configurationName the name of the configuration to be migrated
133139
*/
134140
public fun migrate(configurationName: String) {
135-
migrate(configurations.getByName(configurationName))
141+
configurations.named(configurationName).configure { configuration ->
142+
migrate(configuration)
143+
}
136144
}
137145

138146
/**
@@ -157,7 +165,8 @@ public open class JakartaEeMigrationExtension(
157165
* Configure capabilities for the project.
158166
*/
159167
public fun configureCapabilities() {
160-
if (configuredCapabilities.compareAndSet(false, true)) {
168+
if (!configuredCapabilities.get()) {
169+
configuredCapabilities.set(true)
161170
IMPLEMENTATIONS.forEach { specification ->
162171
specification.configureCapabilities(dependencies)
163172
}
@@ -170,7 +179,9 @@ public open class JakartaEeMigrationExtension(
170179
* @param configurationName the configuration to configure
171180
*/
172181
public fun resolveCapabilityConflicts(configurationName: String) {
173-
resolveCapabilityConflicts(configurations.getByName(configurationName))
182+
configurations.named(configurationName).configure { configuration ->
183+
resolveCapabilityConflicts(configuration)
184+
}
174185
}
175186

176187
/**
@@ -198,7 +209,9 @@ public open class JakartaEeMigrationExtension(
198209
* @param configurationName the configuration to configure
199210
*/
200211
public fun substitute(configurationName: String) {
201-
substitute(configurations.getByName(configurationName))
212+
configurations.named(configurationName).configure { configuration ->
213+
substitute(configuration)
214+
}
202215
}
203216

204217
/**
@@ -225,7 +238,9 @@ public open class JakartaEeMigrationExtension(
225238
* @param configurationName the name of the configuration to transform
226239
*/
227240
public fun transform(configurationName: String) {
228-
transform(configurations.getByName(configurationName))
241+
configurations.named(configurationName).configure { configuration ->
242+
transform(configuration)
243+
}
229244
}
230245

231246
/**
@@ -234,7 +249,8 @@ public open class JakartaEeMigrationExtension(
234249
* @param configuration the configuration to transform
235250
*/
236251
public fun transform(configuration: Configuration) {
237-
if (registeredTransform.compareAndSet(false, true)) {
252+
if (!registeredTransform.get()) {
253+
registeredTransform.set(true)
238254
registerTransform()
239255
}
240256
if (preventTransformOfProductionConfigurations.get() && PRODUCTION_CONFIGURATION_NAMES.contains(configuration.name)) {
@@ -251,7 +267,7 @@ public open class JakartaEeMigrationExtension(
251267
public fun excludeTransform(notation: String) {
252268
val split = notation.split(":")
253269
check(split.size == 2) { "Invalid notation, should be in the form group:module" }
254-
excluded += ArtifactCoordinate(split[0], split[1])
270+
excluded.add(ArtifactCoordinate(split[0], split[1]))
255271
}
256272

257273
/**
@@ -262,18 +278,19 @@ public open class JakartaEeMigrationExtension(
262278
public fun includeTransform(notation: String) {
263279
val split = notation.split(":")
264280
check(split.size == 2) { "Invalid notation, should be in the form group:module" }
265-
included += ArtifactCoordinate(split[0], split[1])
281+
included.add(ArtifactCoordinate(split[0], split[1]))
266282
}
267283

268284
/**
269285
* Exclude all specification artifacts from transformation.
270286
*/
271287
public fun excludeSpecificationsTransform() {
272-
if (excludeSpecificationsTransform.compareAndSet(false, true)) {
288+
if (!excludeSpecificationsTransform.get()) {
289+
excludeSpecificationsTransform.set(true)
273290
val specificationArtifacts = IMPLEMENTATIONS
274291
.flatMap { specification -> specification.coordinates }
275292
.distinct()
276-
excluded += specificationArtifacts
293+
excluded.addAll(specificationArtifacts)
277294
}
278295
}
279296

@@ -301,9 +318,9 @@ public open class JakartaEeMigrationExtension(
301318
.attribute(ARTIFACT_TYPE_ATTRIBUTE, artifactType)
302319
to.attribute(JAKARTAEE_ATTRIBUTE, true)
303320
.attribute(ARTIFACT_TYPE_ATTRIBUTE, artifactType)
304-
parameters.setIncludedArtifacts(included)
305-
parameters.setExcludedArtifacts(excluded)
306-
parameters.setTransformInMemory(transformInMemory)
321+
parameters.includedArtifacts.set(included)
322+
parameters.excludedArtifacts.set(excluded)
323+
parameters.transformInMemory.set(transformInMemory)
307324
}
308325
}
309326
}

src/main/kotlin/com/netflix/gradle/jakartaee/JakartaEeMigrationTransform.kt

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ import org.gradle.api.artifacts.transform.TransformAction
2626
import org.gradle.api.artifacts.transform.TransformOutputs
2727
import org.gradle.api.artifacts.transform.TransformParameters
2828
import org.gradle.api.file.FileSystemLocation
29+
import org.gradle.api.provider.ListProperty
30+
import org.gradle.api.provider.Property
2931
import org.gradle.api.provider.Provider
3032
import org.gradle.api.tasks.Input
3133
import org.gradle.api.tasks.PathSensitive
@@ -34,7 +36,6 @@ import org.slf4j.LoggerFactory
3436
import java.io.FileNotFoundException
3537
import java.io.UncheckedIOException
3638
import java.nio.file.Files
37-
import java.util.concurrent.atomic.AtomicBoolean
3839
import java.util.logging.Handler
3940
import java.util.logging.Level
4041
import java.util.logging.LogRecord
@@ -48,17 +49,14 @@ internal abstract class JakartaEeMigrationTransform : TransformAction<JakartaEeM
4849
* aren't dependency resolution specific, so we can't get access to the details of artifact, so we have to
4950
* rely on the filename for excludes.
5051
*/
51-
@Input
52-
fun getExcludedArtifacts(): List<ArtifactCoordinate>
53-
fun setExcludedArtifacts(excludedArtifact: List<ArtifactCoordinate>)
52+
@get:Input
53+
val excludedArtifacts: ListProperty<ArtifactCoordinate>
5454

55-
@Input
56-
fun getIncludedArtifacts(): List<ArtifactCoordinate>
57-
fun setIncludedArtifacts(includedArtifact: List<ArtifactCoordinate>)
55+
@get:Input
56+
val includedArtifacts: ListProperty<ArtifactCoordinate>
5857

59-
@Input
60-
fun getTransformInMemory(): AtomicBoolean
61-
fun setTransformInMemory(transformInMemory: AtomicBoolean)
58+
@get:Input
59+
val transformInMemory: Property<Boolean>
6260
}
6361

6462
companion object {
@@ -80,15 +78,15 @@ internal abstract class JakartaEeMigrationTransform : TransformAction<JakartaEeM
8078
* will fail to resolve. Allowing it to resolve with compatibility rules then causes the transform not to run.
8179
*/
8280
private val excludedPaths by lazy {
83-
parameters.getExcludedArtifacts().toPaths()
81+
parameters.excludedArtifacts.get().toPaths()
8482
}
8583

8684
private val includedPaths by lazy {
87-
parameters.getIncludedArtifacts().toPaths()
85+
parameters.includedArtifacts.get().toPaths()
8886
}
8987

9088
private val transformInMemory by lazy {
91-
parameters.getTransformInMemory().get()
89+
parameters.transformInMemory.get()
9290
}
9391

9492
private fun List<ArtifactCoordinate>.toPaths() = flatMap {

0 commit comments

Comments
 (0)