Skip to content

Commit befbcdf

Browse files
committed
Project configuration update instruction API
1 parent f39695e commit befbcdf

File tree

51 files changed

+5736
-7
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+5736
-7
lines changed

devtools/maven/src/main/java/io/quarkus/maven/CreateProjectMojo.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -346,8 +346,7 @@ public void execute() throws MojoExecutionException {
346346
}
347347

348348
static ExtensionCatalog resolveExtensionsCatalog(AbstractMojo mojo, String groupId, String artifactId, String version,
349-
ExtensionCatalogResolver catalogResolver, MavenArtifactResolver artifactResolver, MessageWriter log)
350-
throws MojoExecutionException {
349+
ExtensionCatalogResolver catalogResolver, MavenArtifactResolver artifactResolver, MessageWriter log) {
351350

352351
if (catalogResolver.hasRegistries()) {
353352
try {

devtools/maven/src/main/java/io/quarkus/maven/UpdateMojo.java

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.quarkus.maven;
22

3+
import java.util.Collection;
34
import java.util.List;
45

56
import org.apache.maven.plugin.MojoExecutionException;
@@ -11,6 +12,8 @@
1112
import io.quarkus.devtools.commands.data.QuarkusCommandOutcome;
1213
import io.quarkus.devtools.project.QuarkusProject;
1314
import io.quarkus.devtools.project.QuarkusProjectHelper;
15+
import io.quarkus.devtools.project.configuration.ConfiguredApplication;
16+
import io.quarkus.devtools.project.configuration.maven.MavenConfiguredApplicationResolver;
1417
import io.quarkus.devtools.project.update.rewrite.QuarkusUpdateExitErrorException;
1518
import io.quarkus.maven.dependency.ArtifactCoords;
1619
import io.quarkus.platform.tools.ToolsConstants;
@@ -85,6 +88,12 @@ public class UpdateMojo extends QuarkusProjectStateMojoBase {
8588
@Parameter(property = "stream", required = false)
8689
private String stream;
8790

91+
/**
92+
* Option to use the previous ApplicationModel-based approach to collect application data
93+
*/
94+
@Parameter(property = "useAppModel", defaultValue = "true")
95+
private boolean useAppModel;
96+
8897
@Override
8998
protected void validateParameters() throws MojoExecutionException {
9099
getLog().warn("quarkus:update goal is experimental, its options and output might change in future versions");
@@ -123,7 +132,11 @@ protected void processProjectState(QuarkusProject quarkusProject) throws MojoExe
123132
final UpdateProject invoker = new UpdateProject(quarkusProject);
124133
invoker.targetCatalog(targetCatalog);
125134
invoker.targetPlatformVersion(platformVersion);
126-
invoker.appModel(resolveApplicationModel());
135+
if (useAppModel) {
136+
invoker.appModel(resolveApplicationModel());
137+
} else {
138+
invoker.configuredApplications(getConfiguredApplications(quarkusProject));
139+
}
127140
if (rewritePluginVersion != null) {
128141
invoker.rewritePluginVersion(rewritePluginVersion);
129142
}
@@ -157,6 +170,16 @@ protected void processProjectState(QuarkusProject quarkusProject) throws MojoExe
157170
}
158171
}
159172

173+
private Collection<ConfiguredApplication> getConfiguredApplications(QuarkusProject quarkusProject)
174+
throws MojoExecutionException {
175+
try {
176+
return MavenConfiguredApplicationResolver.load(project.getBasedir().toPath(), artifactResolver().getMavenContext(),
177+
quarkusProject.log());
178+
} catch (Exception e) {
179+
throw new MojoExecutionException("Failed to read project configuration", e);
180+
}
181+
}
182+
160183
private static ArtifactCoords getPrimaryBom(ExtensionCatalog c) {
161184
return c.getDerivedFrom().isEmpty() ? c.getBom() : c.getDerivedFrom().get(0).getBom();
162185
}

devtools/pom.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,6 @@
2828
<module>cli-common</module>
2929
<module>cli</module>
3030
<module>config-doc-maven-plugin</module>
31+
<module>update-poc</module>
3132
</modules>
3233
</project>

devtools/update-poc/pom.xml

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xmlns="http://maven.apache.org/POM/4.0.0"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<parent>
6+
<artifactId>quarkus-build-parent</artifactId>
7+
<groupId>io.quarkus</groupId>
8+
<version>999-SNAPSHOT</version>
9+
<relativePath>../../build-parent/pom.xml</relativePath>
10+
</parent>
11+
<modelVersion>4.0.0</modelVersion>
12+
13+
<properties>
14+
<quarkus.package.jar.type>uber-jar</quarkus.package.jar.type>
15+
<quarkus.package.jar.add-runner-suffix>false</quarkus.package.jar.add-runner-suffix>
16+
<skipOriginalJarRename>true</skipOriginalJarRename>
17+
</properties>
18+
19+
<artifactId>quarkus-update-poc</artifactId>
20+
<name>Quarkus - Command Line Interface - Update PoC</name>
21+
<description>Quarkus command line utility</description>
22+
<dependencies>
23+
<dependency>
24+
<groupId>io.quarkus</groupId>
25+
<artifactId>quarkus-picocli</artifactId>
26+
<exclusions>
27+
<exclusion>
28+
<groupId>io.smallrye.reactive</groupId>
29+
<artifactId>mutiny</artifactId>
30+
</exclusion>
31+
<exclusion>
32+
<groupId>io.github.crac</groupId>
33+
<artifactId>org-crac</artifactId>
34+
</exclusion>
35+
<exclusion>
36+
<groupId>org.eclipse.microprofile.context-propagation</groupId>
37+
<artifactId>microprofile-context-propagation-api</artifactId>
38+
</exclusion>
39+
</exclusions>
40+
</dependency>
41+
<dependency>
42+
<groupId>io.quarkus</groupId>
43+
<artifactId>quarkus-devtools-common</artifactId>
44+
</dependency>
45+
<dependency>
46+
<groupId>org.junit.jupiter</groupId>
47+
<artifactId>junit-jupiter</artifactId>
48+
<scope>test</scope>
49+
</dependency>
50+
<dependency>
51+
<groupId>org.assertj</groupId>
52+
<artifactId>assertj-core</artifactId>
53+
<scope>test</scope>
54+
</dependency>
55+
<!-- This dependency is here to make sure the build order is correct-->
56+
<dependency>
57+
<groupId>io.quarkus</groupId>
58+
<artifactId>quarkus-picocli-deployment</artifactId>
59+
<type>pom</type>
60+
<scope>test</scope>
61+
<version>${project.version}</version>
62+
<exclusions>
63+
<exclusion>
64+
<groupId>*</groupId>
65+
<artifactId>*</artifactId>
66+
</exclusion>
67+
</exclusions>
68+
</dependency>
69+
</dependencies>
70+
71+
<build>
72+
<plugins>
73+
<plugin>
74+
<groupId>io.quarkus</groupId>
75+
<artifactId>quarkus-maven-plugin</artifactId>
76+
<executions>
77+
<execution>
78+
<goals>
79+
<goal>build</goal>
80+
</goals>
81+
<configuration>
82+
<skipOriginalJarRename>true</skipOriginalJarRename>
83+
<environmentVariables>
84+
<MAVEN_REPO_LOCAL>${settings.localRepository}</MAVEN_REPO_LOCAL>
85+
<GRADLE_OPTS>${env.MAVEN_OPTS}</GRADLE_OPTS>
86+
</environmentVariables>
87+
</configuration>
88+
</execution>
89+
</executions>
90+
</plugin>
91+
</plugins>
92+
</build>
93+
94+
<profiles>
95+
<profile>
96+
<id>native</id>
97+
<activation>
98+
<property>
99+
<name>native</name>
100+
</property>
101+
</activation>
102+
<build>
103+
<plugins>
104+
<plugin>
105+
<groupId>org.apache.maven.plugins</groupId>
106+
<artifactId>maven-failsafe-plugin</artifactId>
107+
<executions>
108+
<execution>
109+
<goals>
110+
<goal>integration-test</goal>
111+
<goal>verify</goal>
112+
</goals>
113+
<configuration>
114+
<systemPropertyVariables>
115+
<native.image.path>
116+
${project.build.directory}/${project.build.finalName}-runner
117+
</native.image.path>
118+
</systemPropertyVariables>
119+
</configuration>
120+
</execution>
121+
</executions>
122+
</plugin>
123+
</plugins>
124+
</build>
125+
<properties>
126+
<quarkus.native.enabled>true</quarkus.native.enabled>
127+
</properties>
128+
</profile>
129+
</profiles>
130+
</project>
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package io.quarkus.poc.update;
2+
3+
import io.quarkus.picocli.runtime.annotations.TopCommand;
4+
import picocli.CommandLine;
5+
6+
@TopCommand
7+
@CommandLine.Command(mixinStandardHelpOptions = true, subcommands = { InfoCommand.class, UpdateCommand.class })
8+
public class EntryCommand {
9+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package io.quarkus.poc.update;
2+
3+
import static io.quarkus.poc.update.Utils.initMavenContext;
4+
import static io.quarkus.poc.update.Utils.readAppConfig;
5+
6+
import java.nio.file.Path;
7+
import java.util.Collection;
8+
9+
import io.quarkus.devtools.messagewriter.MessageWriter;
10+
import io.quarkus.devtools.project.configuration.ConfiguredApplication;
11+
import picocli.CommandLine;
12+
13+
@CommandLine.Command(name = "info")
14+
public class InfoCommand implements Runnable {
15+
16+
@CommandLine.Parameters(arity = "0..1", description = "Project or module directory")
17+
Path projectDir;
18+
19+
@Override
20+
public void run() {
21+
var log = MessageWriter.info();
22+
final Path projectDir = Utils.getProjectDir(this.projectDir);
23+
logConfiguredApps(readAppConfig(projectDir, initMavenContext(projectDir), log), log);
24+
}
25+
26+
private static void logConfiguredApps(Collection<ConfiguredApplication> apps, MessageWriter log) {
27+
int i = 1;
28+
for (var app : apps) {
29+
log.info(i++ + ") Quarkus application " + app.getId());
30+
log.info(" Enforced platform BOMs:");
31+
for (var platformBom : app.getPlatformBoms()) {
32+
log.info(" - " + platformBom + ", " + platformBom.getArtifact().getConfigurationFile());
33+
}
34+
log.info(" Top extensions dependencies:");
35+
for (var topExtDep : app.getTopExtensionDependencies()) {
36+
log.info(" - " + topExtDep.toCompactString() + ", " + topExtDep.getConfigurationFile());
37+
}
38+
log.info(" Quarkus Maven plugin");
39+
log.info(" - " + app.getQuarkusPlugin().toCompactString());
40+
}
41+
}
42+
}
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
package io.quarkus.poc.update;
2+
3+
import static io.quarkus.poc.update.Utils.initMavenContext;
4+
import static io.quarkus.poc.update.Utils.readAppConfig;
5+
6+
import java.nio.file.Path;
7+
import java.util.Collection;
8+
import java.util.HashMap;
9+
import java.util.List;
10+
import java.util.Map;
11+
12+
import io.quarkus.bootstrap.resolver.maven.BootstrapMavenContext;
13+
import io.quarkus.bootstrap.resolver.maven.MavenArtifactResolver;
14+
import io.quarkus.devtools.commands.handlers.RegistryProjectInfo;
15+
import io.quarkus.devtools.messagewriter.MessageWriter;
16+
import io.quarkus.devtools.project.configuration.ConfiguredApplication;
17+
import io.quarkus.devtools.project.configuration.ConfiguredArtifact;
18+
import io.quarkus.devtools.project.configuration.update.UpdateInstructions;
19+
import io.quarkus.maven.dependency.ArtifactKey;
20+
import io.quarkus.registry.ExtensionCatalogResolver;
21+
import io.quarkus.registry.RegistryResolutionException;
22+
import io.quarkus.registry.catalog.ExtensionCatalog;
23+
import picocli.CommandLine;
24+
25+
@CommandLine.Command(name = "update")
26+
public class UpdateCommand implements Runnable {
27+
28+
@CommandLine.Parameters(arity = "0..1", description = "Project or module directory")
29+
Path projectDir;
30+
31+
@Override
32+
public void run() {
33+
var log = MessageWriter.info();
34+
final Path projectDir = Utils.getProjectDir(this.projectDir);
35+
var mavenCtx = initMavenContext(projectDir);
36+
logUpdateInstructions(readAppConfig(projectDir, mavenCtx, log), mavenCtx, log);
37+
}
38+
39+
private static void logUpdateInstructions(Collection<ConfiguredApplication> apps, BootstrapMavenContext mavenCtx,
40+
MessageWriter log) {
41+
var extensionCatalog = getCatalogFromRegistry(apps, mavenCtx, log);
42+
var instructions = new UpdateInstructions();
43+
for (var app : apps) {
44+
addInstructions(instructions, app, extensionCatalog, log);
45+
}
46+
var instructionList = instructions.asList();
47+
if (instructionList.isEmpty()) {
48+
log.info("No updates recommended");
49+
} else {
50+
log.info("Recommended updates:");
51+
for (var updateStep : instructionList) {
52+
log.info(updateStep.toString());
53+
}
54+
}
55+
}
56+
57+
private static void addInstructions(UpdateInstructions updateSteps, ConfiguredApplication app,
58+
ExtensionCatalog extensionCatalog,
59+
MessageWriter log) {
60+
log.info("Quarkus application " + app.getId());
61+
var extDeps = getTopExtensionMap(app);
62+
final RegistryProjectInfo registryInfo;
63+
try {
64+
registryInfo = RegistryProjectInfo.fromCatalog(extensionCatalog, extDeps.values());
65+
} catch (Exception e) {
66+
throw new RuntimeException(e);
67+
}
68+
UpdateInstructions.add(updateSteps, app, registryInfo, log);
69+
}
70+
71+
private static Map<ArtifactKey, ConfiguredArtifact> getTopExtensionMap(ConfiguredApplication quarkusApp) {
72+
final List<ConfiguredArtifact> exts = quarkusApp.getTopExtensionDependencies();
73+
final Map<ArtifactKey, ConfiguredArtifact> topExtensions = new HashMap<>(exts.size());
74+
for (var e : exts) {
75+
topExtensions.put(e.getKey(), e);
76+
}
77+
return topExtensions;
78+
}
79+
80+
private static ExtensionCatalog getCatalogFromRegistry(Collection<ConfiguredApplication> apps,
81+
BootstrapMavenContext mavenCtx, MessageWriter log) {
82+
final ExtensionCatalogResolver registryClient;
83+
try {
84+
registryClient = registryClient(mavenCtx, log);
85+
} catch (Exception e) {
86+
throw new RuntimeException("Failed to initialize the registry client", e);
87+
}
88+
//var extensionCatalog = registryClient.resolveExtensionCatalog(toArtifactCoordsList(quarkusApp.getPlatformBoms()));
89+
final ExtensionCatalog extensionCatalog;
90+
try {
91+
extensionCatalog = registryClient.resolveExtensionCatalog();
92+
} catch (RegistryResolutionException e) {
93+
throw new RuntimeException("Failed to resolve extension catalog", e);
94+
}
95+
return extensionCatalog;
96+
}
97+
98+
private static ExtensionCatalogResolver registryClient(BootstrapMavenContext mvnCtx, MessageWriter log) throws Exception {
99+
return ExtensionCatalogResolver.builder()
100+
.artifactResolver(new MavenArtifactResolver(mvnCtx))
101+
.messageWriter(log)
102+
.build();
103+
}
104+
}

0 commit comments

Comments
 (0)