Skip to content

Commit 9f0c299

Browse files
authored
Merge pull request #49713 from aloubyansky/ext-catalog-preferences
Make sure preferred platform BOMs passed to ExtensionCatalogResolver are actually prioritized
2 parents 3c41fb6 + 3ccbf95 commit 9f0c299

File tree

13 files changed

+491
-104
lines changed

13 files changed

+491
-104
lines changed

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
import io.quarkus.devtools.messagewriter.MessageWriter;
2727
import io.quarkus.devtools.project.BuildTool;
2828
import io.quarkus.devtools.project.CodestartResourceLoadersBuilder;
29-
import io.quarkus.devtools.project.JavaVersion;
3029
import io.quarkus.devtools.project.QuarkusProject;
3130
import io.quarkus.devtools.project.QuarkusProjectHelper;
3231
import io.quarkus.devtools.project.buildfile.MavenProjectBuildFile;
@@ -59,13 +58,13 @@ public abstract class QuarkusProjectMojoBase extends AbstractMojo {
5958
protected List<RemoteRepository> repos;
6059

6160
@Parameter(property = "bomGroupId", required = false)
62-
private String bomGroupId;
61+
String bomGroupId;
6362

6463
@Parameter(property = "bomArtifactId", required = false)
65-
private String bomArtifactId;
64+
String bomArtifactId;
6665

6766
@Parameter(property = "bomVersion", required = false)
68-
private String bomVersion;
67+
String bomVersion;
6968

7069
@Component
7170
QuarkusWorkspaceProvider workspaceProvider;
@@ -91,7 +90,7 @@ public void execute() throws MojoExecutionException {
9190
}
9291

9392
final QuarkusProject quarkusProject;
94-
if (BuildTool.MAVEN.equals(buildTool) && project.getFile() != null) {
93+
if (BuildTool.MAVEN.equals(buildTool) && project.getFile() != null && bomVersion == null) {
9594
try {
9695
quarkusProject = MavenProjectBuildFile.getProject(projectArtifact(), project.getOriginalModel(), baseDir(),
9796
project.getModel().getProperties(), artifactResolver(), getExtensionCatalogResolver(),
@@ -108,7 +107,8 @@ public void execute() throws MojoExecutionException {
108107
.catalog(extensionCatalog)
109108
.build();
110109
quarkusProject = QuarkusProject.of(baseDir(), extensionCatalog,
111-
codestartsResourceLoader, log, buildTool, JavaVersion.NA);
110+
codestartsResourceLoader, log, buildTool,
111+
MavenProjectBuildFile.resolveJavaVersion(project.getModel().getProperties()));
112112
}
113113

114114
doExecute(quarkusProject, getMessageWriter());

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

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,7 @@
22

33
import java.util.List;
44

5-
import org.apache.maven.execution.MavenSession;
6-
import org.apache.maven.plugin.BuildPluginManager;
75
import org.apache.maven.plugin.MojoExecutionException;
8-
import org.apache.maven.plugins.annotations.Component;
96
import org.apache.maven.plugins.annotations.Mojo;
107
import org.apache.maven.plugins.annotations.Parameter;
118

@@ -16,6 +13,7 @@
1613
import io.quarkus.devtools.project.QuarkusProjectHelper;
1714
import io.quarkus.devtools.project.update.rewrite.QuarkusUpdateExitErrorException;
1815
import io.quarkus.maven.dependency.ArtifactCoords;
16+
import io.quarkus.platform.tools.ToolsConstants;
1917
import io.quarkus.registry.RegistryResolutionException;
2018
import io.quarkus.registry.catalog.ExtensionCatalog;
2119
import io.quarkus.registry.catalog.PlatformStreamCoords;
@@ -87,12 +85,6 @@ public class UpdateMojo extends QuarkusProjectStateMojoBase {
8785
@Parameter(property = "stream", required = false)
8886
private String stream;
8987

90-
@Parameter(defaultValue = "${session}", readonly = true)
91-
private MavenSession mavenSession;
92-
93-
@Component
94-
private BuildPluginManager pluginManager;
95-
9688
@Override
9789
protected void validateParameters() throws MojoExecutionException {
9890
getLog().warn("quarkus:update goal is experimental, its options and output might change in future versions");
@@ -114,7 +106,14 @@ protected void processProjectState(QuarkusProject quarkusProject) throws MojoExe
114106
targetCatalog = getExtensionCatalogResolver().resolveExtensionCatalog(platformStream);
115107
platformVersion = getPrimaryBom(targetCatalog).getVersion();
116108
} else {
117-
targetCatalog = getExtensionCatalogResolver().resolveExtensionCatalog();
109+
if (bomVersion != null) {
110+
targetCatalog = getExtensionCatalogResolver().resolveExtensionCatalog(List.of(ArtifactCoords.pom(
111+
this.bomGroupId == null ? ToolsConstants.DEFAULT_PLATFORM_BOM_GROUP_ID : this.bomGroupId,
112+
this.bomArtifactId == null ? ToolsConstants.DEFAULT_PLATFORM_BOM_ARTIFACT_ID : this.bomArtifactId,
113+
bomVersion)));
114+
} else {
115+
targetCatalog = getExtensionCatalogResolver().resolveExtensionCatalog();
116+
}
118117
platformVersion = getPrimaryBom(targetCatalog).getVersion();
119118
}
120119
} catch (RegistryResolutionException e) {

independent-projects/tools/devtools-common/src/main/java/io/quarkus/devtools/project/buildfile/MavenProjectBuildFile.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ public static QuarkusProject getProject(Artifact projectPom, Model projectModel,
128128
codestartResourceLoaders, log, extensionManager, javaVersion);
129129
}
130130

131-
private static JavaVersion resolveJavaVersion(Properties projectProps) {
131+
public static JavaVersion resolveJavaVersion(Properties projectProps) {
132132
if (projectProps.containsKey("maven.compiler.release")) {
133133
return new JavaVersion(projectProps.getProperty("maven.compiler.release"));
134134
}

independent-projects/tools/devtools-testing/src/main/java/io/quarkus/devtools/testing/registry/client/TestRegistryClient.java

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,15 @@
33
import java.io.IOException;
44
import java.nio.file.Files;
55
import java.nio.file.Path;
6+
import java.util.List;
67
import java.util.Map;
78

9+
import org.eclipse.aether.DefaultRepositorySystemSession;
810
import org.eclipse.aether.artifact.DefaultArtifact;
11+
import org.eclipse.aether.repository.LocalRepository;
12+
import org.eclipse.aether.util.repository.ChainedLocalRepositoryManager;
913

14+
import io.quarkus.bootstrap.resolver.maven.BootstrapMavenContext;
1015
import io.quarkus.bootstrap.resolver.maven.BootstrapMavenException;
1116
import io.quarkus.bootstrap.resolver.maven.MavenArtifactResolver;
1217
import io.quarkus.devtools.messagewriter.MessageWriter;
@@ -29,7 +34,7 @@ public class TestRegistryClient implements RegistryClient {
2934
private final boolean enableMavenResolver;
3035

3136
public TestRegistryClient(RegistryClientEnvironment env, RegistryConfig clientConfig) {
32-
this.resolver = env.resolver();
37+
this.resolver = configureMavenResolver(env.resolver(), clientConfig);
3338
this.log = env.log();
3439
final Path configYaml = RegistriesConfigLocator.locateConfigYaml();
3540
if (configYaml == null) {
@@ -71,11 +76,35 @@ public TestRegistryClient(RegistryClientEnvironment env, RegistryConfig clientCo
7176
}
7277
}
7378
}
74-
final Object o = clientConfig.getExtra().get("enable-maven-resolver");
75-
enableMavenResolver = o == null ? false : Boolean.parseBoolean(o.toString());
79+
enableMavenResolver = Boolean.parseBoolean(String.valueOf(clientConfig.getExtra().get("enable-maven-resolver")));
7680
this.config = registryConfig;
7781
}
7882

83+
private static MavenArtifactResolver configureMavenResolver(MavenArtifactResolver originalResolver,
84+
RegistryConfig registryConfig) {
85+
Object testLocalMavenRepo = registryConfig.getExtra().get("test-local-maven-repo");
86+
if (testLocalMavenRepo == null) {
87+
return originalResolver;
88+
}
89+
try {
90+
var session = new DefaultRepositorySystemSession(originalResolver.getSession());
91+
session.setLocalRepositoryManager(new ChainedLocalRepositoryManager(
92+
originalResolver.getSystem().newLocalRepositoryManager(originalResolver.getSession(),
93+
new LocalRepository(testLocalMavenRepo.toString())),
94+
List.of(originalResolver.getSystem().newLocalRepositoryManager(originalResolver.getSession(),
95+
new LocalRepository(originalResolver.getMavenContext().getLocalRepo()))),
96+
false));
97+
return new MavenArtifactResolver(new BootstrapMavenContext(BootstrapMavenContext.config()
98+
.setWorkspaceDiscovery(false)
99+
.setRepositorySystemSession(session)
100+
.setRemoteRepositoryManager(originalResolver.getRemoteRepositoryManager())
101+
.setRemoteRepositories(originalResolver.getRepositories())
102+
.setRepositorySystem(originalResolver.getSystem())));
103+
} catch (BootstrapMavenException e) {
104+
throw new RuntimeException(e);
105+
}
106+
}
107+
79108
@Override
80109
public ExtensionCatalog.Mutable resolveNonPlatformExtensions(String quarkusVersion) throws RegistryResolutionException {
81110
if (config.getNonPlatformExtensions() == null || config.getNonPlatformExtensions().isDisabled()) {

independent-projects/tools/devtools-testing/src/main/java/io/quarkus/devtools/testing/registry/client/TestRegistryClientBuilder.java

Lines changed: 83 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,48 @@ public TestCodestartBuilder addExternalExtensionWithCodestart(String groupId, St
113113
return codestartBuilder;
114114
}
115115

116+
public TestRegistryClientBuilder installExternalPlatform(ExtensionCatalog platformCatalog) {
117+
// install the BOM artifact
118+
final ArtifactCoords bomCoords = platformCatalog.getBom();
119+
final Model bomModel = initModel(bomCoords);
120+
final List<Dependency> managedDeps = bomModel.getDependencyManagement().getDependencies();
121+
for (Extension ext : platformCatalog.getExtensions()) {
122+
final ArtifactCoords extCoords = ext.getArtifact();
123+
final Dependency runtime = new Dependency();
124+
runtime.setGroupId(extCoords.getGroupId());
125+
runtime.setArtifactId(extCoords.getArtifactId());
126+
runtime.setVersion(extCoords.getVersion());
127+
managedDeps.add(runtime);
128+
final Dependency deployment = new Dependency();
129+
deployment.setGroupId(extCoords.getGroupId());
130+
deployment.setArtifactId(extCoords.getArtifactId() + "-deployment");
131+
deployment.setVersion(extCoords.getVersion());
132+
managedDeps.add(deployment);
133+
}
134+
final Path bomFile = getTmpPath(bomCoords);
135+
try {
136+
ModelUtils.persistModel(bomFile, bomModel);
137+
} catch (IOException e) {
138+
throw new IllegalStateException("Failed to persist BOM at " + bomFile, e);
139+
}
140+
install(bomCoords, bomFile);
141+
142+
// install the JSON descriptor
143+
final ArtifactCoords jsonCoords = PlatformArtifacts.ensureCatalogArtifact(bomCoords);
144+
final Path jsonFile = getTmpPath(jsonCoords);
145+
try {
146+
platformCatalog.persist(jsonFile);
147+
} catch (IOException e) {
148+
throw new IllegalStateException("Failed to persist extension catalog " + jsonFile, e);
149+
}
150+
install(jsonCoords, jsonFile);
151+
152+
// install the extensions
153+
installExtensionArtifacts(platformCatalog.getExtensions());
154+
155+
return this;
156+
}
157+
116158
private void installExtensionArtifacts(Collection<Extension> extensions) {
117159
for (Extension e : extensions) {
118160
Path jarPath = getTmpPath(e.getArtifact());
@@ -234,7 +276,7 @@ public void build() {
234276
}
235277

236278
private void configureRegistry(TestRegistryBuilder registry) {
237-
registry.configure(getRegistryDir(baseDir, registry.config.getId()));
279+
registry.configure(getRegistryDir(baseDir, registry.config.getId()), getResolver());
238280
config.addRegistry(registry.config);
239281
}
240282

@@ -286,6 +328,17 @@ public TestRegistryBuilder external() {
286328
return this;
287329
}
288330

331+
/**
332+
* Enables Maven resolver for platform descriptors that couldn't be resolved by the configured platforms
333+
* for this registry.
334+
*
335+
* @return this instance
336+
*/
337+
public TestRegistryBuilder enableMavenResolver() {
338+
this.enableMavenResolver = true;
339+
return this;
340+
}
341+
289342
public TestRegistryBuilder disabled() {
290343
config.setEnabled(false);
291344
return this;
@@ -357,7 +410,7 @@ private void addMemberCatalog(TestPlatformCatalogMemberBuilder member) {
357410
memberCatalogs.add(member);
358411
}
359412

360-
private void configure(Path registryDir) {
413+
private void configure(Path registryDir, MavenArtifactResolver resolver) {
361414
if (Files.exists(registryDir)) {
362415
if (!Files.isDirectory(registryDir)) {
363416
throw new IllegalStateException(registryDir + " exists and is not a directory");
@@ -375,6 +428,11 @@ private void configure(Path registryDir) {
375428
TestRegistryClient.class.getProtectionDomain().getCodeSource().getLocation().toExternalForm());
376429
if (enableMavenResolver) {
377430
config.setExtra("enable-maven-resolver", true);
431+
try {
432+
config.setExtra("test-local-maven-repo", resolver.getMavenContext().getLocalRepo());
433+
} catch (BootstrapMavenException e) {
434+
throw new RuntimeException(e);
435+
}
378436
}
379437
}
380438

@@ -638,11 +696,7 @@ public TestPlatformCatalogMemberBuilder addCoreMember() {
638696
final TestPlatformCatalogMemberBuilder quarkusBom = newMember("quarkus-bom");
639697
quarkusBom.addExtension("io.quarkus", "quarkus-core", release.getQuarkusCoreVersion());
640698
Map<String, Object> metadata = quarkusBom.getProjectProperties();
641-
metadata.put("maven-plugin-groupId", quarkusBom.extensions.getBom().getGroupId());
642-
metadata.put("maven-plugin-artifactId", "quarkus-maven-plugin");
643-
metadata.put("maven-plugin-version", quarkusBom.extensions.getBom().getVersion());
644-
metadata.put("compiler-plugin-version", "3.8.1");
645-
metadata.put("surefire-plugin-version", "3.0.0");
699+
setMainPlatformProjectProperties(metadata, quarkusBom.extensions.getBom());
646700
return quarkusBom;
647701
}
648702

@@ -679,6 +733,26 @@ private void setReleaseInfo(ExtensionCatalog.Mutable catalog) {
679733
}
680734
}
681735

736+
/**
737+
* Initializes basic project metadata for dev tools
738+
*
739+
* @param catalog platform catalog
740+
*/
741+
public static void initMainPlatformMetadata(ExtensionCatalog catalog) {
742+
Map<String, Object> metadata = catalog.getMetadata();
743+
Map map = (Map) metadata.computeIfAbsent("project", k -> new HashMap<String, Object>());
744+
map = (Map) map.computeIfAbsent("properties", k -> new HashMap<String, Object>());
745+
setMainPlatformProjectProperties(map, catalog.getBom());
746+
}
747+
748+
public static void setMainPlatformProjectProperties(Map<String, Object> metadata, ArtifactCoords bomCoords) {
749+
metadata.put("maven-plugin-groupId", bomCoords.getGroupId());
750+
metadata.put("maven-plugin-artifactId", "quarkus-maven-plugin");
751+
metadata.put("maven-plugin-version", bomCoords.getVersion());
752+
metadata.put("compiler-plugin-version", "3.8.1");
753+
metadata.put("surefire-plugin-version", "3.0.0");
754+
}
755+
682756
public static class TestPlatformCatalogMemberBuilder {
683757

684758
private final TestPlatformCatalogReleaseBuilder release;
@@ -772,7 +846,7 @@ public TestPlatformCatalogMemberBuilder addExtensionWithMetadata(String groupId,
772846
final Extension.Mutable e = Extension.builder()
773847
.setArtifact(coords)
774848
.setName(artifactId)
775-
.setOrigins(Collections.singletonList(extensions));
849+
.setOrigins(List.of(extensions));
776850
if (metadata != null) {
777851
e.getMetadata().putAll(metadata);
778852
}
@@ -1011,7 +1085,7 @@ private static Model initModel(ArtifactCoords coords) {
10111085
pom.setGroupId(coords.getGroupId());
10121086
pom.setArtifactId(coords.getArtifactId());
10131087
pom.setVersion(coords.getVersion());
1014-
pom.setPackaging("pom");
1088+
pom.setPackaging(ArtifactCoords.TYPE_POM);
10151089
pom.setDependencyManagement(new DependencyManagement());
10161090

10171091
final Dependency d = new Dependency();

independent-projects/tools/devtools-testing/src/main/java/io/quarkus/devtools/testing/registry/client/TestRegistryClientFactory.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ public static TestRegistryClientFactory getInstance(RegistryClientEnvironment en
1515
if (instance != null) {
1616
return instance;
1717
}
18-
if (Thread.currentThread().getContextClassLoader() instanceof QuarkusClassLoader) {
19-
((QuarkusClassLoader) Thread.currentThread().getContextClassLoader()).addCloseTask(() -> instance = null);
18+
if (Thread.currentThread().getContextClassLoader() instanceof QuarkusClassLoader qcl) {
19+
qcl.addCloseTask(() -> instance = null);
2020
}
2121
return instance = new TestRegistryClientFactory(env);
2222
}

independent-projects/tools/devtools-testing/src/test/java/io/quarkus/devtools/project/create/ExtensionCatalogFromProvidedPlatformsTest.java

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,19 @@
55
import java.io.IOException;
66
import java.nio.file.Files;
77
import java.nio.file.Path;
8-
import java.util.Collections;
8+
import java.util.List;
99
import java.util.stream.Collectors;
1010

1111
import org.apache.maven.model.Dependency;
1212
import org.apache.maven.model.Model;
13-
import org.assertj.core.util.Arrays;
1413
import org.junit.jupiter.api.BeforeAll;
1514
import org.junit.jupiter.api.Test;
1615

1716
import io.quarkus.bootstrap.resolver.maven.workspace.ModelUtils;
1817
import io.quarkus.devtools.testing.registry.client.TestRegistryClientBuilder;
1918
import io.quarkus.maven.dependency.ArtifactCoords;
2019
import io.quarkus.registry.ExtensionCatalogResolver;
20+
import io.quarkus.registry.catalog.Extension;
2121
import io.quarkus.registry.catalog.ExtensionCatalog;
2222

2323
public class ExtensionCatalogFromProvidedPlatformsTest extends MultiplePlatformBomsTestBase {
@@ -60,7 +60,7 @@ public static void setup() throws Exception {
6060

6161
enableRegistryClient();
6262

63-
// install 1.0.0 version which is not recommended by the registry any more
63+
// install 1.0.0 version which is not recommended by the registry anymore
6464
installNotRecommendedVersion("1.0.1", "1.0.0", "acme-foo-bom");
6565
installNotRecommendedVersion("1.0.1", "1.0.0", "acme-baz-bom");
6666
installNotRecommendedVersion("1.0.1", "1.0.0", "quarkus-bom");
@@ -104,13 +104,12 @@ protected String getMainPlatformKey() {
104104
@Test
105105
public void test() throws Exception {
106106
final ExtensionCatalog catalog = ExtensionCatalogResolver.builder().build().resolveExtensionCatalog(
107-
Collections.singletonList(ArtifactCoords.fromString(MAIN_PLATFORM_KEY + ":acme-baz-bom::pom:1.0.0")));
108-
assertThat(Arrays.asList(new ArtifactCoords[] {
107+
List.of(ArtifactCoords.fromString(MAIN_PLATFORM_KEY + ":acme-baz-bom::pom:1.0.0")));
108+
assertThat(List.of(
109109
ArtifactCoords.fromString("io.quarkus:quarkus-core:1.1.2"),
110110
ArtifactCoords.fromString(MAIN_PLATFORM_KEY + ":acme-foo:1.0.0"),
111111
ArtifactCoords.fromString(MAIN_PLATFORM_KEY + ":acme-baz:1.0.0"),
112-
ArtifactCoords.fromString("org.acme:acme-quarkus-other:5.5.5")
113-
})).isEqualTo(
114-
catalog.getExtensions().stream().map(e -> e.getArtifact()).collect(Collectors.toList()));
112+
ArtifactCoords.fromString("org.acme:acme-quarkus-other:5.5.5"))).isEqualTo(
113+
catalog.getExtensions().stream().map(Extension::getArtifact).collect(Collectors.toList()));
115114
}
116115
}

0 commit comments

Comments
 (0)