Skip to content

Commit 6eaad8c

Browse files
authored
Merge pull request quarkusio#50318 from aloubyansky/offering-catalog-bom-overlap
Avoid importing BOMs managing extensions managed by BOMs with higher preferences
2 parents fd7519d + e46b329 commit 6eaad8c

File tree

13 files changed

+531
-106
lines changed

13 files changed

+531
-106
lines changed

independent-projects/tools/devtools-common/src/main/java/io/quarkus/devtools/commands/handlers/CreateProjectCommandHandler.java

Lines changed: 307 additions & 73 deletions
Large diffs are not rendered by default.

independent-projects/tools/devtools-common/src/main/java/io/quarkus/devtools/commands/handlers/ListExtensionsCommandHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -319,7 +319,7 @@ List<String> getSupportScopes() {
319319
}
320320

321321
String getRegistryUserSelectedSupportKey() {
322-
var supportKey = e.getMetadata().get(Constants.REGISTRY_USER_SELECTED_SUPPORT_KEY);
322+
var supportKey = e.getMetadata().get(Constants.REGISTRY_CLIENT_USER_SELECTED_SUPPORT_KEY);
323323
if (supportKey == null) {
324324
return null;
325325
}

independent-projects/tools/devtools-common/src/main/java/io/quarkus/devtools/commands/handlers/QuarkusCommandHandlers.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import static io.quarkus.platform.catalog.processor.ExtensionProcessor.getExtendedKeywords;
77
import static io.quarkus.platform.catalog.processor.ExtensionProcessor.getShortName;
88
import static io.quarkus.platform.catalog.processor.ExtensionProcessor.isUnlisted;
9+
import static io.quarkus.platform.tools.ToolsUtils.countOf;
910

1011
import java.util.ArrayList;
1112
import java.util.Collection;
@@ -16,8 +17,6 @@
1617
import java.util.regex.Pattern;
1718
import java.util.stream.Collectors;
1819

19-
import org.apache.commons.lang3.StringUtils;
20-
2120
import io.quarkus.devtools.commands.data.QuarkusCommandInvocation;
2221
import io.quarkus.devtools.commands.data.SelectionResult;
2322
import io.quarkus.devtools.messagewriter.MessageWriter;
@@ -37,7 +36,7 @@ static List<Extension> computeExtensionsFromQuery(ExtensionCatalog catalog,
3736
final ArrayList<Extension> builder = new ArrayList<>();
3837
final Collection<Extension> extensionCatalog = catalog.getExtensions();
3938
for (String query : extensionsQuery) {
40-
final int countColons = StringUtils.countMatches(query, ":");
39+
final int countColons = countOf(query, ':');
4140
if (countColons > 1) {
4241
ArtifactCoords artifact = ArtifactCoords.fromString(query);
4342
final Extension ext = Extension.builder()

independent-projects/tools/devtools-common/src/main/java/io/quarkus/devtools/project/update/ProjectUpdateInfos.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import io.quarkus.devtools.project.update.ExtensionMapBuilder.ExtensionUpdateInfoBuilder;
1616
import io.quarkus.maven.dependency.ArtifactCoords;
1717
import io.quarkus.maven.dependency.ArtifactKey;
18+
import io.quarkus.registry.Constants;
1819
import io.quarkus.registry.catalog.Extension;
1920
import io.quarkus.registry.catalog.ExtensionCatalog;
2021
import io.quarkus.registry.catalog.ExtensionOrigin;
@@ -215,7 +216,7 @@ private static void addOrigins(final List<ExtensionOrigins> extOrigins, Extensio
215216
ExtensionOrigins.Builder eoBuilder = null;
216217
for (ExtensionOrigin o : e.getOrigins()) {
217218
if (o instanceof ExtensionCatalog c) {
218-
final OriginPreference op = (OriginPreference) c.getMetadata().get("origin-preference");
219+
final OriginPreference op = (OriginPreference) c.getMetadata().get(Constants.REGISTRY_CLIENT_ORIGIN_PREFERENCE);
219220
if (op == null) {
220221
continue;
221222
}

independent-projects/tools/devtools-common/src/main/java/io/quarkus/platform/tools/ToolsUtils.java

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import io.quarkus.devtools.messagewriter.MessageWriter;
2424
import io.quarkus.maven.dependency.ArtifactCoords;
2525
import io.quarkus.registry.CatalogMergeUtility;
26+
import io.quarkus.registry.Constants;
2627
import io.quarkus.registry.catalog.ExtensionCatalog;
2728
import io.quarkus.registry.catalog.selection.OriginPreference;
2829
import io.quarkus.registry.util.PlatformArtifacts;
@@ -88,6 +89,30 @@ public static String dotJoin(String... parts) {
8889
return buf.toString();
8990
}
9091

92+
/**
93+
* Returns the number of occurrences of a character in a string.
94+
* If the string argument is null, the method will return zero.
95+
*
96+
* @param str a string to search in
97+
* @param ch a character look for
98+
* @return number of occurrences of the character in string
99+
*/
100+
public static int countOf(String str, int ch) {
101+
if (str == null || str.isEmpty()) {
102+
return 0;
103+
}
104+
int i = str.indexOf(ch);
105+
if (i < 0) {
106+
return 0;
107+
}
108+
int count = 0;
109+
while (i >= 0) {
110+
++count;
111+
i = str.indexOf(ch, i + 1);
112+
}
113+
return count;
114+
}
115+
91116
public static ExtensionCatalog resolvePlatformDescriptorDirectly(String bomGroupId, String bomArtifactId, String bomVersion,
92117
MavenArtifactResolver artifactResolver, MessageWriter log) {
93118
return resolvePlatformDescriptorDirectly(bomGroupId, bomArtifactId, bomVersion, artifactResolver, log, 1);
@@ -172,7 +197,7 @@ private static ExtensionCatalog resolvePlatformDescriptorDirectly(String bomGrou
172197
final OriginPreference originPreference = new OriginPreference(registryPreference, 1, 1, ++memberIndex,
173198
1);
174199
Map<String, Object> metadata = new HashMap<>(memberCatalog.getMetadata());
175-
metadata.put("origin-preference", originPreference);
200+
metadata.put(Constants.REGISTRY_CLIENT_ORIGIN_PREFERENCE, originPreference);
176201
ExtensionCatalog.Mutable mutableMemberCatalog = memberCatalog.mutable();
177202
mutableMemberCatalog.setMetadata(metadata);
178203
catalogs.add(mutableMemberCatalog.build());
Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
package io.quarkus.devtools.project.create;
2+
3+
import java.nio.file.Path;
4+
import java.util.List;
5+
import java.util.Map;
6+
7+
import org.junit.jupiter.api.BeforeAll;
8+
import org.junit.jupiter.api.Test;
9+
10+
import io.quarkus.devtools.testing.registry.client.TestRegistryClientBuilder;
11+
import io.quarkus.maven.dependency.ArtifactCoords;
12+
13+
public class MixingOfferingAndNonOfferingExtensionsInTheSameBomTest extends MultiplePlatformBomsTestBase {
14+
15+
private static final String DOWNSTREAM_PLATFORM_KEY = "io.downstream.platform";
16+
private static final String UPSTREAM_PLATFORM_KEY = "io.upstream.platform";
17+
18+
@BeforeAll
19+
public static void setup() throws Exception {
20+
TestRegistryClientBuilder.newInstance()
21+
//.debug()
22+
.baseDir(configDir())
23+
// registry
24+
.newRegistry("downstream.registry.test")
25+
.recognizedQuarkusVersions("*downstream")
26+
.setOffering("offering-a")
27+
// platform key
28+
.newPlatform(DOWNSTREAM_PLATFORM_KEY)
29+
.newStream("1.1")
30+
// 1.1.1 release
31+
.newRelease("1.1.1.downstream")
32+
.quarkusVersion("1.1.1.downstream")
33+
.upstreamQuarkusVersion("1.1.1")
34+
// default bom including quarkus-core + essential metadata
35+
.addCoreMember()
36+
.addExtensionWithMetadata("io.quarkus", "quarkus-rest", "1.1.1.downstream",
37+
Map.of("offering-a-support", List.of("supported")))
38+
.addExtension("io.quarkus", "quarkus-magic", "1.1.1.downstream")
39+
.release()
40+
// foo platform member
41+
.newMember("acme-a-bom")
42+
.addExtensionWithMetadata("io.acme", "ext-a", "1.1.1.downstream",
43+
Map.of("offering-a-support", List.of("supported")))
44+
.addExtension("io.acme", "ext-b", "1.1.1.downstream")
45+
.release()
46+
.stream().platform().registry()
47+
.clientBuilder()
48+
.newRegistry("upstream.registry.test")
49+
// platform key
50+
.newPlatform(UPSTREAM_PLATFORM_KEY)
51+
// 1.1 STREAM
52+
.newStream("1.1")
53+
.newRelease("1.1.1")
54+
.quarkusVersion("1.1.1")
55+
// default bom including quarkus-core + essential metadata
56+
.addCoreMember()
57+
.addExtension("io.quarkus", "quarkus-rest", "1.1.1")
58+
.addExtension("io.quarkus", "quarkus-magic", "1.1.1")
59+
.release()
60+
.newMember("acme-a-bom")
61+
.addExtension("io.acme", "ext-a", "1.1.1")
62+
.addExtension("io.acme", "ext-b", "1.1.1")
63+
.release()
64+
.registry()
65+
.clientBuilder()
66+
.build();
67+
68+
enableRegistryClient();
69+
}
70+
71+
protected String getMainPlatformKey() {
72+
return DOWNSTREAM_PLATFORM_KEY;
73+
}
74+
75+
@Test
76+
public void downstreamCoreBomOnlyForSupportedExtension() throws Exception {
77+
final Path projectDir = newProjectDir("downstream-core-bom-only-for-supported-extension");
78+
createProject(projectDir, List.of("quarkus-rest"));
79+
80+
assertModel(projectDir,
81+
List.of(mainPlatformBom()),
82+
List.of(ArtifactCoords.jar("io.quarkus", "quarkus-rest", null)),
83+
"1.1.1.downstream");
84+
}
85+
86+
@Test
87+
public void downstreamBomUsedForNotSupportedExtensions() throws Exception {
88+
final Path projectDir = newProjectDir("downstream-bom-used-for-unsupported-extensions");
89+
createProject(projectDir, List.of("quarkus-rest", "quarkus-magic"));
90+
91+
assertModel(projectDir,
92+
List.of(mainPlatformBom()),
93+
List.of(ArtifactCoords.jar("io.quarkus", "quarkus-rest", null),
94+
ArtifactCoords.jar("io.quarkus", "quarkus-magic", null)),
95+
"1.1.1.downstream");
96+
}
97+
98+
@Test
99+
public void upstreamCoreBomOnly() throws Exception {
100+
final Path projectDir = newProjectDir("upstream-core-bom-only-project");
101+
createProject(projectDir, List.of("quarkus-magic"));
102+
103+
assertModel(projectDir,
104+
List.of(mainPlatformBom()),
105+
List.of(ArtifactCoords.jar("io.quarkus", "quarkus-magic", null)),
106+
Map.of("quarkus.platform.group-id", UPSTREAM_PLATFORM_KEY,
107+
"quarkus.platform.artifact-id", "quarkus-bom",
108+
"quarkus.platform.version", "1.1.1"));
109+
}
110+
111+
@Test
112+
public void downstreamBomsOnly() throws Exception {
113+
final Path projectDir = newProjectDir("downstream-bom-only-project");
114+
createProject(projectDir, List.of("ext-a", "ext-b"));
115+
116+
assertModel(projectDir,
117+
List.of(mainPlatformBom(),
118+
platformMemberBomCoords("acme-a-bom")),
119+
List.of(ArtifactCoords.jar("io.acme", "ext-a", null),
120+
ArtifactCoords.jar("io.acme", "ext-b", null)),
121+
"1.1.1.downstream");
122+
}
123+
124+
@Test
125+
public void upstreamBomsOnly() throws Exception {
126+
final Path projectDir = newProjectDir("upstream-bom-only-project");
127+
createProject(projectDir, List.of("ext-b"));
128+
129+
assertModel(projectDir,
130+
List.of(mainPlatformBom(),
131+
platformMemberBomCoords("acme-a-bom")),
132+
List.of(ArtifactCoords.jar("io.acme", "ext-b", null)),
133+
Map.of("quarkus.platform.group-id", UPSTREAM_PLATFORM_KEY,
134+
"quarkus.platform.artifact-id", "quarkus-bom",
135+
"quarkus.platform.version", "1.1.1"));
136+
}
137+
}

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -191,9 +191,7 @@ protected void assertModel(final Path projectDir, final List<ArtifactCoords> exp
191191
.map(d -> ArtifactCoords.of(d.getGroupId(), d.getArtifactId(), d.getClassifier(), d.getType(),
192192
d.getVersion()))
193193
.collect(Collectors.toList());
194-
// TODO the order should be predictable
195-
assertThat(actualBoms).containsAll(expectedBoms);
196-
assertThat(expectedBoms).containsAll(actualBoms);
194+
assertThat(actualBoms).containsExactlyElementsOf(expectedBoms);
197195
//assertThat(model.getDependencyManagement().getDependencies().size()).isEqualTo(expectedBoms.size());
198196

199197
// TODO the order should be predictable

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -175,8 +175,8 @@ public void testMix() throws Exception {
175175

176176
assertModel(projectDir,
177177
List.of(mainPlatformBom(),
178-
ArtifactCoords.pom("${quarkus.platform.group-id}", "quarkus-zoo-bom", "${quarkus.platform.version}"),
179-
ArtifactCoords.pom(MAIN_PLATFORM_KEY, "acme-magic-bom", "7.0.7")),
178+
ArtifactCoords.pom(MAIN_PLATFORM_KEY, "acme-magic-bom", "7.0.7"),
179+
ArtifactCoords.pom("${quarkus.platform.group-id}", "quarkus-zoo-bom", "${quarkus.platform.version}")),
180180
List.of(ArtifactCoords.jar("org.acme.platform", "acme-magic", null),
181181
ArtifactCoords.jar("org.quarkus.platform", "quarkus-giraffe", null)),
182182
"2.0.4");

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,9 @@ public void createOfferingA() throws Exception {
9393

9494
assertModel(projectDir,
9595
List.of(mainPlatformBom(),
96-
ArtifactCoords.pom(UPSTREAM_PLATFORM_KEY, "acme-a-bom", "1.1.1"),
9796
platformMemberBomCoords("acme-b-bom"),
9897
platformMemberBomCoords("acme-c-bom"),
98+
ArtifactCoords.pom(UPSTREAM_PLATFORM_KEY, "acme-a-bom", "1.1.1"),
9999
ArtifactCoords.pom(UPSTREAM_PLATFORM_KEY, "acme-d-bom", "1.1.1")),
100100
List.of(ArtifactCoords.jar("io.acme", "ext-a", null),
101101
ArtifactCoords.jar("io.acme", "ext-b", null),

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,9 @@ public void createOfferingA() throws Exception {
9393

9494
assertModel(projectDir,
9595
List.of(mainPlatformBom(),
96+
platformMemberBomCoords("acme-c-bom"),
9697
ArtifactCoords.pom(UPSTREAM_PLATFORM_KEY, "acme-a-bom", "1.1.1"),
9798
ArtifactCoords.pom(UPSTREAM_PLATFORM_KEY, "acme-b-bom", "1.1.1"),
98-
platformMemberBomCoords("acme-c-bom"),
9999
ArtifactCoords.pom(UPSTREAM_PLATFORM_KEY, "acme-d-bom", "1.1.1")),
100100
List.of(ArtifactCoords.jar("io.acme", "ext-a", null),
101101
ArtifactCoords.jar("io.acme", "ext-b", null),

0 commit comments

Comments
 (0)