Skip to content

Commit

Permalink
Merge pull request quarkusio#24255 from glefloch/fix/gradle-require-c…
Browse files Browse the repository at this point in the history
…apabilities

Support required capability in gradle extension plugin
  • Loading branch information
glefloch authored Mar 11, 2022
2 parents 8511327 + e395134 commit 618e1bc
Show file tree
Hide file tree
Showing 5 changed files with 56 additions and 22 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -99,8 +99,12 @@ public void setDependencyConditions(List<String> dependencyCondition) {
this.dependencyCondition = dependencyCondition;
}

public List<Capability> getCapabilities() {
return capabilities.getCapabilities();
public List<Capability> getProvidedCapabilities() {
return capabilities.getProvidedCapabilities();
}

public List<Capability> getRequiredCapabilities() {
return capabilities.getRequiredCapabilities();
}

public void capabilities(Action<Capabilities> capabilitiesAction) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,26 @@

public class Capabilities {

private List<Capability> capabilities = new ArrayList<>(0);
private List<Capability> provided = new ArrayList<>(0);
private List<Capability> 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<Capability> getCapabilities() {
return capabilities;
public Capability requires(String name) {
Capability capability = new Capability(name);
required.add(capability);
return capability;
}

public List<Capability> getProvidedCapabilities() {
return provided;
}

public List<Capability> getRequiredCapabilities() {
return required;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -141,16 +142,26 @@ private void generateQuarkusExtensionProperties(Path metaInfDir) {
props.put(AppModel.LESSER_PRIORITY_ARTIFACTS, val);
}

List<Capability> 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<Capability> 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<Capability> 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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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");
}
}
21 changes: 13 additions & 8 deletions docs/src/main/asciidoc/capabilities.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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.
****

Expand Down Expand Up @@ -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"]
Expand All @@ -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.
Expand Down

0 comments on commit 618e1bc

Please sign in to comment.