use of io.quarkus.bootstrap.model.CapabilityErrors in project quarkus by quarkusio.
the class DevMojoIT method testCapabilitiesMissing.
@Test
public void testCapabilitiesMissing() throws MavenInvocationException, IOException {
testDir = getTargetDir("projects/capabilities-missing");
final File runnerPom = new File(testDir, "runner/pom.xml");
if (!runnerPom.exists()) {
fail("Failed to locate runner/pom.xml in " + testDir);
}
run(true);
final CapabilityErrors error = new CapabilityErrors();
error.addMissing("sunshine", "org.acme:acme-quarkus-ext:1.0-SNAPSHOT");
String response = DevModeTestUtils.getHttpResponse("/hello", true);
assertThat(response).contains(error.report());
final StringWriter buf = new StringWriter();
try (BufferedWriter writer = new BufferedWriter(buf)) {
writer.write(" <dependency>");
writer.newLine();
writer.write(" <groupId>org.acme</groupId>");
writer.newLine();
writer.write(" <artifactId>alt-quarkus-ext</artifactId>");
writer.newLine();
writer.write(" </dependency>");
writer.newLine();
}
final String acmeDep = buf.toString();
filter(runnerPom, Collections.singletonMap("<!-- missing -->", acmeDep));
assertThat(DevModeTestUtils.getHttpResponse("/hello", false)).isEqualTo("hello");
}
use of io.quarkus.bootstrap.model.CapabilityErrors in project quarkus by quarkusio.
the class CapabilityAggregationStep method aggregateCapabilities.
/**
* Aggregates all the capability build items. Not all the capabilities are configured in the extension descriptors.
* Many are still produced by build steps directly.
*
* @param capabilities capability build items
* @return aggregated capabilities
*/
@BuildStep
Capabilities aggregateCapabilities(List<CapabilityBuildItem> capabilities, CapabilitiesConfiguredInDescriptorsBuildItem configuredCaps, CurateOutcomeBuildItem curateOutcomeBuildItem) {
final Map<String, Object> providedCapabilities = new HashMap<>();
CapabilityErrors capabilityErrors = null;
Map<String, List<String>> capsProvidedByBuildSteps = Collections.emptyMap();
for (CapabilityBuildItem capabilityItem : capabilities) {
final String provider = capabilityItem.getProvider();
final String capability = capabilityItem.getName();
final Object previous = providedCapabilities.put(capability, provider);
if (previous != null) {
if (previous instanceof String) {
capabilityErrors = createIfNull(capabilityErrors);
capabilityErrors.addConflict(capability, previous.toString());
providedCapabilities.put(capability, capabilityErrors);
} else {
capabilityErrors = (CapabilityErrors) previous;
}
capabilityErrors.addConflict(capability, provider);
providedCapabilities.put(capability, capabilityErrors);
}
if (!configuredCaps.names.contains(capability)) {
if (capsProvidedByBuildSteps.isEmpty()) {
capsProvidedByBuildSteps = new HashMap<>();
}
capsProvidedByBuildSteps.computeIfAbsent(provider, k -> new ArrayList<>(1)).add(capability);
}
}
for (ExtensionCapabilities extCap : curateOutcomeBuildItem.getApplicationModel().getExtensionCapabilities()) {
if (extCap.getRequiresCapabilities().isEmpty()) {
continue;
}
for (String required : extCap.getRequiresCapabilities()) {
if (!providedCapabilities.containsKey(required)) {
capabilityErrors = createIfNull(capabilityErrors);
capabilityErrors.addMissing(required, extCap.getExtension());
}
}
}
// capabilities are supposed to be configured in the extension descriptors and not produced directly by build steps
if (!capsProvidedByBuildSteps.isEmpty()) {
final StringWriter buf = new StringWriter();
try (BufferedWriter writer = new BufferedWriter(buf)) {
writer.append("The following capabilities were found to be missing from the processed extension descriptors:");
for (Map.Entry<String, List<String>> provider : capsProvidedByBuildSteps.entrySet()) {
for (String capability : provider.getValue()) {
writer.newLine();
writer.append(" - " + capability + " provided by ").append(provider.getKey());
}
}
writer.newLine();
writer.append("Please report this issue to the extension maintainers to get it fixed in the future releases.");
} catch (IOException e) {
}
Logger.getLogger(CapabilityAggregationStep.class).warn(buf.toString());
}
if (capabilityErrors != null && !capabilityErrors.isEmpty()) {
throw new IllegalStateException(capabilityErrors.report());
}
return new Capabilities(providedCapabilities.keySet());
}
use of io.quarkus.bootstrap.model.CapabilityErrors in project quarkus by quarkusio.
the class DevMojoIT method testCapabilitiesConflict.
@Test
public void testCapabilitiesConflict() throws MavenInvocationException, IOException {
testDir = getTargetDir("projects/capabilities-conflict");
final File runnerPom = new File(testDir, "runner/pom.xml");
if (!runnerPom.exists()) {
fail("Failed to locate runner/pom.xml in " + testDir);
}
run(true);
final CapabilityErrors error = new CapabilityErrors();
error.addConflict("sunshine", "org.acme:alt-quarkus-ext:1.0-SNAPSHOT");
error.addConflict("sunshine", "org.acme:acme-quarkus-ext:1.0-SNAPSHOT");
String response = DevModeTestUtils.getHttpResponse("/hello", true);
assertThat(response).contains(error.report());
final StringWriter buf = new StringWriter();
try (BufferedWriter writer = new BufferedWriter(buf)) {
writer.write(" <dependency>");
writer.newLine();
writer.write(" <groupId>org.acme</groupId>");
writer.newLine();
writer.write(" <artifactId>acme-quarkus-ext</artifactId>");
writer.newLine();
writer.write(" </dependency>");
writer.newLine();
}
final String acmeDep = buf.toString();
filter(runnerPom, Collections.singletonMap(acmeDep, ""));
assertThat(DevModeTestUtils.getHttpResponse("/hello", false)).isEqualTo("hello");
buf.getBuffer().setLength(0);
try (BufferedWriter writer = new BufferedWriter(buf)) {
writer.write(" <dependency>");
writer.newLine();
writer.write(" <groupId>org.acme</groupId>");
writer.newLine();
writer.write(" <artifactId>alt-quarkus-ext</artifactId>");
writer.newLine();
writer.write(" </dependency>");
writer.newLine();
}
final String altDep = buf.toString();
filter(runnerPom, Collections.singletonMap(acmeDep, altDep));
assertThat(DevModeTestUtils.getHttpResponse("/hello", false)).isEqualTo("hello");
}
Aggregations