Skip to content

Commit 9a1d70e

Browse files
committed
Allow plugin to be applied in settings.gradle
Resolves #5
1 parent 3f8c933 commit 9a1d70e

File tree

2 files changed

+110
-11
lines changed

2 files changed

+110
-11
lines changed

plugin/src/main/java/de/jjohannes/gradle/javaecosystem/capabilities/JavaEcosystemCapabilitiesPlugin.java

+29-11
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
import org.gradle.api.artifacts.ComponentVariantIdentifier;
1313
import org.gradle.api.artifacts.component.ModuleComponentIdentifier;
1414
import org.gradle.api.artifacts.dsl.ComponentMetadataHandler;
15+
import org.gradle.api.initialization.Settings;
16+
import org.gradle.api.plugins.ExtensionAware;
1517
import org.gradle.util.GradleVersion;
1618

1719
import javax.annotation.Nullable;
@@ -24,30 +26,46 @@
2426

2527
@SuppressWarnings("unused")
2628
@NonNullApi
27-
public abstract class JavaEcosystemCapabilitiesPlugin implements Plugin<Project> {
29+
public abstract class JavaEcosystemCapabilitiesPlugin implements Plugin<ExtensionAware> {
2830

2931
private static final GradleVersion MINIMUM_SUPPORTED_VERSION = GradleVersion.version("6.0");
32+
private static final GradleVersion MINIMUM_SUPPORTED_VERSION_SETTINGS = GradleVersion.version("6.8");
3033

3134
/**
3235
* Map: Capability -> Default Module to resolve to (or 'null' if resolve to the highest version)
3336
*/
3437
private final Map<String, String> standardResolutionStrategy = new HashMap<>();
3538

3639
@Override
37-
public void apply(Project project) {
40+
public void apply(ExtensionAware projectOrSettings) {
3841
if (GradleVersion.current().compareTo(MINIMUM_SUPPORTED_VERSION) < 0) {
39-
throw new IllegalStateException("Plugin requires at least Gradle 6.0");
42+
throw new IllegalStateException("Plugin requires at least Gradle " + MINIMUM_SUPPORTED_VERSION.getVersion());
4043
}
4144

4245
Set<String> allCapabilities = new TreeSet<>();
43-
JavaEcosystemCapabilitiesExtension javaEcosystemCapabilities =
44-
project.getExtensions().create("javaEcosystemCapabilities", JavaEcosystemCapabilitiesExtension.class, allCapabilities);
45-
46-
registerCapabilityRules(project.getDependencies().getComponents(), allCapabilities);
47-
registerComponentRules(project.getDependencies().getComponents());
48-
49-
project.getConfigurations().all(configuration ->
50-
defineStrategies(javaEcosystemCapabilities, configuration.getResolutionStrategy().getCapabilitiesResolution()));
46+
47+
ComponentMetadataHandler components;
48+
if (projectOrSettings instanceof Project) {
49+
components = ((Project) projectOrSettings).getDependencies().getComponents();
50+
} else if (projectOrSettings instanceof Settings) {
51+
if (GradleVersion.current().compareTo(MINIMUM_SUPPORTED_VERSION_SETTINGS) < 0) {
52+
throw new IllegalStateException("Using this plugin in settings.gradle requires at least Gradle " + MINIMUM_SUPPORTED_VERSION_SETTINGS.getVersion());
53+
}
54+
//noinspection UnstableApiUsage
55+
components = ((Settings) projectOrSettings).getDependencyResolutionManagement().getComponents();
56+
} else {
57+
throw new IllegalStateException("Cannot apply plugin to: " + projectOrSettings.getClass().getName());
58+
}
59+
60+
registerCapabilityRules(components, allCapabilities);
61+
registerComponentRules(components);
62+
63+
if (projectOrSettings instanceof Project) {
64+
JavaEcosystemCapabilitiesExtension javaEcosystemCapabilities =
65+
projectOrSettings.getExtensions().create("javaEcosystemCapabilities", JavaEcosystemCapabilitiesExtension.class, allCapabilities);
66+
((Project) projectOrSettings).getConfigurations().all(configuration ->
67+
defineStrategies(javaEcosystemCapabilities, configuration.getResolutionStrategy().getCapabilitiesResolution()));
68+
}
5169
}
5270

5371
private void registerCapabilityRules(ComponentMetadataHandler components, Set<String> allCapabilities) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package de.jjohannes.gradle.javaecosystem.capabilities.test
2+
3+
import de.jjohannes.gradle.javaecosystem.capabilities.test.fixture.GradleBuild
4+
import spock.lang.Specification
5+
import spock.lang.Tag
6+
7+
class SettingsTest extends Specification {
8+
9+
@Delegate
10+
GradleBuild build = new GradleBuild()
11+
12+
@Tag("no-cross-version")
13+
def "plugin can be applied in settings file"() {
14+
given:
15+
settingsFile << """
16+
plugins {
17+
id("de.jjohannes.java-ecosystem-capabilities")
18+
}
19+
"""
20+
buildFile << """
21+
plugins {
22+
id("java-library")
23+
}
24+
25+
repositories.mavenCentral()
26+
27+
configurations.all {
28+
resolutionStrategy.capabilitiesResolution {
29+
withCapability("cglib:cglib") {
30+
select("cglib:cglib:0")
31+
}
32+
}
33+
resolutionStrategy.capabilitiesResolution {
34+
withCapability("javax.mail:mail") {
35+
select("com.sun.mail:jakarta.mail:0")
36+
}
37+
}
38+
resolutionStrategy.capabilitiesResolution {
39+
withCapability("javax.ws.rs:jsr311-api") {
40+
select("org.jboss.resteasy:jaxrs-api:0")
41+
}
42+
}
43+
resolutionStrategy.capabilitiesResolution {
44+
withCapability("javax.servlet:servlet-api") {
45+
select("jakarta.servlet:jakarta.servlet-api:0")
46+
}
47+
}
48+
}
49+
50+
dependencies {
51+
implementation("cglib:cglib-nodep:3.2.10")
52+
implementation("cglib:cglib:3.2.10")
53+
implementation("com.sun.mail:jakarta.mail:2.0.1")
54+
implementation("com.sun.mail:mailapi:2.0.1")
55+
implementation("jakarta.servlet:jakarta.servlet-api:5.0.0")
56+
implementation("org.apache.tomcat:tomcat-servlet-api:10.0.18")
57+
implementation("org.jboss.resteasy:jaxrs-api:3.0.0.Final")
58+
implementation("org.jboss.spec.javax.ws.rs:jboss-jaxrs-api_2.1_spec:2.0.2.Final")
59+
implementation("org.jboss.spec.javax.ws.rs:jboss-jaxrs-api_3.0_spec:1.0.1.Final")
60+
}
61+
"""
62+
63+
expect:
64+
dependencies().output.contains '''
65+
compileClasspath - Compile classpath for source set 'main'.
66+
+--- cglib:cglib-nodep:3.2.10 -> cglib:cglib:3.2.10
67+
| +--- org.ow2.asm:asm:7.0
68+
| \\--- org.apache.ant:ant:1.10.3
69+
| \\--- org.apache.ant:ant-launcher:1.10.3
70+
+--- cglib:cglib:3.2.10 (*)
71+
+--- com.sun.mail:jakarta.mail:2.0.1
72+
| \\--- com.sun.activation:jakarta.activation:2.0.1
73+
+--- com.sun.mail:mailapi:2.0.1 -> com.sun.mail:jakarta.mail:2.0.1 (*)
74+
+--- jakarta.servlet:jakarta.servlet-api:5.0.0
75+
+--- org.apache.tomcat:tomcat-servlet-api:10.0.18 -> jakarta.servlet:jakarta.servlet-api:5.0.0
76+
+--- org.jboss.resteasy:jaxrs-api:3.0.0.Final
77+
+--- org.jboss.spec.javax.ws.rs:jboss-jaxrs-api_2.1_spec:2.0.2.Final -> org.jboss.resteasy:jaxrs-api:3.0.0.Final
78+
\\--- org.jboss.spec.javax.ws.rs:jboss-jaxrs-api_3.0_spec:1.0.1.Final -> org.jboss.resteasy:jaxrs-api:3.0.0.Final
79+
'''.stripIndent()
80+
}
81+
}

0 commit comments

Comments
 (0)