From e39513439b15a9323dd01713f109990522945bd3 Mon Sep 17 00:00:00 2001 From: Guillaume Le Floch Date: Thu, 10 Mar 2022 15:52:19 +0100 Subject: [PATCH] Support required capability in gradle extension plugin --- .../gradle/QuarkusExtensionConfiguration.java | 8 +++++-- .../extension/gradle/dsl/Capabilities.java | 21 ++++++++++++++----- .../gradle/tasks/ExtensionDescriptorTask.java | 21 ++++++++++++++----- .../tasks/ExtensionDescriptorTaskTest.java | 7 +++++-- docs/src/main/asciidoc/capabilities.adoc | 21 ++++++++++++------- 5 files changed, 56 insertions(+), 22 deletions(-) diff --git a/devtools/gradle/gradle-extension-plugin/src/main/java/io/quarkus/extension/gradle/QuarkusExtensionConfiguration.java b/devtools/gradle/gradle-extension-plugin/src/main/java/io/quarkus/extension/gradle/QuarkusExtensionConfiguration.java index b21b72a3a9dfe..219c5afe1479e 100644 --- a/devtools/gradle/gradle-extension-plugin/src/main/java/io/quarkus/extension/gradle/QuarkusExtensionConfiguration.java +++ b/devtools/gradle/gradle-extension-plugin/src/main/java/io/quarkus/extension/gradle/QuarkusExtensionConfiguration.java @@ -99,8 +99,12 @@ public void setDependencyConditions(List dependencyCondition) { this.dependencyCondition = dependencyCondition; } - public List getCapabilities() { - return capabilities.getCapabilities(); + public List getProvidedCapabilities() { + return capabilities.getProvidedCapabilities(); + } + + public List getRequiredCapabilities() { + return capabilities.getRequiredCapabilities(); } public void capabilities(Action capabilitiesAction) { diff --git a/devtools/gradle/gradle-extension-plugin/src/main/java/io/quarkus/extension/gradle/dsl/Capabilities.java b/devtools/gradle/gradle-extension-plugin/src/main/java/io/quarkus/extension/gradle/dsl/Capabilities.java index 61a5238900d1a..aa962f12f112c 100644 --- a/devtools/gradle/gradle-extension-plugin/src/main/java/io/quarkus/extension/gradle/dsl/Capabilities.java +++ b/devtools/gradle/gradle-extension-plugin/src/main/java/io/quarkus/extension/gradle/dsl/Capabilities.java @@ -5,15 +5,26 @@ public class Capabilities { - private List capabilities = new ArrayList<>(0); + private List provided = new ArrayList<>(0); + private List required = new ArrayList<>(0); - public Capability capability(String name) { + public Capability provides(String name) { Capability capability = new Capability(name); - capabilities.add(capability); + provided.add(capability); return capability; } - public List getCapabilities() { - return capabilities; + public Capability requires(String name) { + Capability capability = new Capability(name); + required.add(capability); + return capability; + } + + public List getProvidedCapabilities() { + return provided; + } + + public List getRequiredCapabilities() { + return required; } } diff --git a/devtools/gradle/gradle-extension-plugin/src/main/java/io/quarkus/extension/gradle/tasks/ExtensionDescriptorTask.java b/devtools/gradle/gradle-extension-plugin/src/main/java/io/quarkus/extension/gradle/tasks/ExtensionDescriptorTask.java index d9869667298de..4532277251b2b 100644 --- a/devtools/gradle/gradle-extension-plugin/src/main/java/io/quarkus/extension/gradle/tasks/ExtensionDescriptorTask.java +++ b/devtools/gradle/gradle-extension-plugin/src/main/java/io/quarkus/extension/gradle/tasks/ExtensionDescriptorTask.java @@ -8,6 +8,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.HashSet; +import java.util.Iterator; import java.util.List; import java.util.Properties; import java.util.Set; @@ -141,16 +142,26 @@ private void generateQuarkusExtensionProperties(Path metaInfDir) { props.put(AppModel.LESSER_PRIORITY_ARTIFACTS, val); } - List capabilities = quarkusExtensionConfiguration.getCapabilities(); - if (!capabilities.isEmpty()) { + if (!quarkusExtensionConfiguration.getProvidedCapabilities().isEmpty()) { final StringBuilder buf = new StringBuilder(); - appendCapability(capabilities.get(0), buf); - for (int i = 1; i < capabilities.size(); ++i) { - appendCapability(capabilities.get(i), buf.append(',')); + final Iterator i = quarkusExtensionConfiguration.getProvidedCapabilities().iterator(); + appendCapability(i.next(), buf); + while (i.hasNext()) { + appendCapability(i.next(), buf.append(',')); } props.setProperty(BootstrapConstants.PROP_PROVIDES_CAPABILITIES, buf.toString()); } + if (!quarkusExtensionConfiguration.getRequiredCapabilities().isEmpty()) { + final StringBuilder buf = new StringBuilder(); + final Iterator i = quarkusExtensionConfiguration.getRequiredCapabilities().iterator(); + appendCapability(i.next(), buf); + while (i.hasNext()) { + appendCapability(i.next(), buf.append(',')); + } + props.setProperty(BootstrapConstants.PROP_REQUIRES_CAPABILITIES, buf.toString()); + } + try { Files.createDirectories(metaInfDir); try (BufferedWriter writer = Files diff --git a/devtools/gradle/gradle-extension-plugin/src/test/java/io/quarkus/extension/gradle/tasks/ExtensionDescriptorTaskTest.java b/devtools/gradle/gradle-extension-plugin/src/test/java/io/quarkus/extension/gradle/tasks/ExtensionDescriptorTaskTest.java index 6fba38ab86242..f28a85fa93504 100644 --- a/devtools/gradle/gradle-extension-plugin/src/test/java/io/quarkus/extension/gradle/tasks/ExtensionDescriptorTaskTest.java +++ b/devtools/gradle/gradle-extension-plugin/src/test/java/io/quarkus/extension/gradle/tasks/ExtensionDescriptorTaskTest.java @@ -142,9 +142,10 @@ public void shouldGenerateDescriptorBasedOnExistingFile() throws IOException { public void shouldGenerateDescriptorWithCapabilities() throws IOException { String buildFileContent = TestUtils.getDefaultGradleBuildFileContent(true, Collections.emptyList(), "capabilities { \n" + - " capability 'org.acme:ext-a:0.1.0' \n" + - " capability 'org.acme:ext-b:0.1.0' onlyIf(['org.acme:ext-b:0.1.0']) onlyIfNot(['org.acme:ext-c:0.1.0']) \n" + " provides 'org.acme:ext-a:0.1.0' \n" + + " provides 'org.acme:ext-b:0.1.0' onlyIf(['org.acme:ext-b:0.1.0']) onlyIfNot(['org.acme:ext-c:0.1.0']) \n" + + " requires 'sunshine' onlyIf(['org.acme:ext-b:0.1.0']) \n" + "}\n"); TestUtils.writeFile(buildFile, buildFileContent); @@ -156,5 +157,7 @@ public void shouldGenerateDescriptorWithCapabilities() throws IOException { Properties extensionProperty = TestUtils.readPropertyFile(extensionPropertiesFile.toPath()); assertThat(extensionProperty).containsEntry("provides-capabilities", "org.acme:ext-a:0.1.0,org.acme:ext-b:0.1.0?org.acme:ext-b:0.1.0?!org.acme:ext-c:0.1.0"); + assertThat(extensionProperty).containsEntry("requires-capabilities", + "sunshine?org.acme:ext-b:0.1.0"); } } diff --git a/docs/src/main/asciidoc/capabilities.adoc b/docs/src/main/asciidoc/capabilities.adoc index 2ef6c1adc69fe..b5747b10385f6 100644 --- a/docs/src/main/asciidoc/capabilities.adoc +++ b/docs/src/main/asciidoc/capabilities.adoc @@ -51,11 +51,13 @@ The `quarkus-bootstrap-maven-plugin:extension-descriptor` Maven goal and the `ex ---- quarkusExtension { capabilities { - capability 'io.quarkus.rest' - capability 'io.quarkus.resteasy' + provides 'io.quarkus.rest' <1> + requires 'io.quarkus.resteasy' <2> } } ---- +<1> the extension provides the `io.quarkus.hibernate.orm` capability (multiple `provides` elements are allowed) +<2> the extension requires the `io.quarkus.agroal` capability to be provided to function properly (multiple `requires` elements are allowed) NOTE: The Gradle extension plugin is still experimental and may change in the future. @@ -68,11 +70,14 @@ NOTE: The Gradle extension plugin is still experimental and may change in the fu ---- quarkusExtension { capabilities { - capability("io.quarkus.rest") - capability("io.quarkus.resteasy") + provides("io.quarkus.rest") <1> + requires("io.quarkus.resteasy") <2> } } ---- +<1> the extension provides the `io.quarkus.hibernate.orm` capability (multiple `provides` elements are allowed) +<2> the extension requires the `io.quarkus.agroal` capability to be provided to function properly (multiple `requires` elements are allowed) + NOTE: The Gradle extension plugin is still experimental and may change in the future. **** @@ -115,13 +120,13 @@ The corresponding `requiresIf` element is also supported. ---- quarkusExtension { capabilities { - capability 'io.quarkus.container.image.openshift' onlyIf ['io.quarkus.container.image.openshift.deployment.OpenshiftBuild'] <1> + provides 'io.quarkus.container.image.openshift' onlyIf ['io.quarkus.container.image.openshift.deployment.OpenshiftBuild'] <1> } } ---- <1> condition that must be resolved to `true` by a class implementing `java.util.function.BooleanSupplier` -NOTE: It is possible to specify `onlyIfNot` conditions as well. +NOTE: It is possible to specify `onlyIfNot` conditions as well. Conditions can also be set for required capabilities. **** [role="secondary asciidoc-tabs-sync-gradle-kotlin"] @@ -131,13 +136,13 @@ NOTE: It is possible to specify `onlyIfNot` conditions as well. ---- quarkusExtension { capabilities { - capability("io.quarkus.container.image.openshift").onlyIf(["io.quarkus.container.image.openshift.deployment.OpenshiftBuild"]) <1> + provides("io.quarkus.container.image.openshift").onlyIf(["io.quarkus.container.image.openshift.deployment.OpenshiftBuild"]) <1> } } ---- <1> condition that must be resolved to `true` by a class implementing `java.util.function.BooleanSupplier` -NOTE: It is possible to specify `onlyIfNot` conditions as well. +NOTE: It is possible to specify `onlyIfNot` conditions as well. . Conditions can also be set for required capabilities. **** In this case, `io.quarkus.container.image.openshift.deployment.OpenshiftBuild` should be included in one of the extension deployment dependencies and implement `java.util.function.BooleanSupplier`. At build time, the Quarkus bootstrap will create an instance of it and register `io.quarkus.container.image.openshift` capability only if its `getAsBoolean()` method returns true.