From aee67888fdb90845c8d1a015fe720d8acd0d864a Mon Sep 17 00:00:00 2001 From: Slawomir Jaranowski Date: Tue, 13 May 2025 21:23:43 +0200 Subject: [PATCH 1/7] [MNG-5913] Allow defining aliases for existing server configurations in settings.xml Add the next tag ids to the server in settings.xml Additional server will be created in memory by SettingsBuilder, so the generated configuration should be transparent to other as Settings#getServers() will return complete list. --- .../src/main/mdo/settings.mdo | 13 ++ compat/maven-settings-builder/pom.xml | 5 + .../building/DefaultSettingsBuilder.java | 23 ++++ .../DefaultSettingsBuilderFactoryTest.java | 118 ++++++++++++++++-- .../settings/factory/settings-servers-1.xml | 37 ++++++ .../settings/factory/settings-servers-2.xml | 49 ++++++++ .../settings/factory/settings-servers-3.xml | 40 ++++++ compat/maven-settings/pom.xml | 1 + .../maven/impl/DefaultSettingsBuilder.java | 25 +++- .../DefaultSettingsBuilderFactoryTest.java | 114 +++++++++++++++-- .../resources/settings/settings-servers-1.xml | 37 ++++++ .../resources/settings/settings-servers-2.xml | 49 ++++++++ .../resources/settings/settings-servers-3.xml | 40 ++++++ .../{ => settings}/settings-simple.xml | 0 impl/maven-support/pom.xml | 1 + 15 files changed, 535 insertions(+), 17 deletions(-) create mode 100644 compat/maven-settings-builder/src/test/resources/settings/factory/settings-servers-1.xml create mode 100644 compat/maven-settings-builder/src/test/resources/settings/factory/settings-servers-2.xml create mode 100644 compat/maven-settings-builder/src/test/resources/settings/factory/settings-servers-3.xml create mode 100644 impl/maven-impl/src/test/resources/settings/settings-servers-1.xml create mode 100644 impl/maven-impl/src/test/resources/settings/settings-servers-2.xml create mode 100644 impl/maven-impl/src/test/resources/settings/settings-servers-3.xml rename impl/maven-impl/src/test/resources/{ => settings}/settings-simple.xml (100%) diff --git a/api/maven-api-settings/src/main/mdo/settings.mdo b/api/maven-api-settings/src/main/mdo/settings.mdo index fe69efeeff16..05183ae9501b 100644 --- a/api/maven-api-settings/src/main/mdo/settings.mdo +++ b/api/maven-api-settings/src/main/mdo/settings.mdo @@ -181,6 +181,7 @@ repositories + 1.3.0+ The lists of the remote repositories. @@ -192,6 +193,7 @@ pluginRepositories + 1.3.0+ The lists of the remote repositories for discovering plugins. @@ -529,6 +531,17 @@ Extra configuration for the transport layer. + + ids + 1.3.0+ + + List of additional ids for server. + + + String + * + + diff --git a/compat/maven-settings-builder/pom.xml b/compat/maven-settings-builder/pom.xml index 24e62ee65639..9b94d3a498f3 100644 --- a/compat/maven-settings-builder/pom.xml +++ b/compat/maven-settings-builder/pom.xml @@ -78,6 +78,11 @@ under the License. junit-jupiter-api test + + org.assertj + assertj-core + test + diff --git a/compat/maven-settings-builder/src/main/java/org/apache/maven/settings/building/DefaultSettingsBuilder.java b/compat/maven-settings-builder/src/main/java/org/apache/maven/settings/building/DefaultSettingsBuilder.java index 140393bf0659..dd4ad96215b0 100644 --- a/compat/maven-settings-builder/src/main/java/org/apache/maven/settings/building/DefaultSettingsBuilder.java +++ b/compat/maven-settings-builder/src/main/java/org/apache/maven/settings/building/DefaultSettingsBuilder.java @@ -26,12 +26,14 @@ import java.io.IOException; import java.io.StringReader; import java.io.StringWriter; +import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; import org.apache.maven.building.FileSource; import org.apache.maven.building.Source; +import org.apache.maven.settings.Server; import org.apache.maven.settings.Settings; import org.apache.maven.settings.TrackableBase; import org.apache.maven.settings.io.SettingsParseException; @@ -181,6 +183,7 @@ private Settings readSettings( return new Settings(); } + settings.setServers(serversByIds(settings.getServers())); settingsValidator.validate(settings, problems); return settings; @@ -251,4 +254,24 @@ public Object execute(String expression, Object value) { return result; } + + private List serversByIds(List servers) { + + if (servers.stream().allMatch(server -> server.getIds().isEmpty())) { + return servers; + } + + ArrayList result = new ArrayList<>(servers); + + servers.stream().filter(server -> !server.getIds().isEmpty()).forEach(server -> server.getIds() + .forEach(id -> result.add(newServer(server, id)))); + return result; + } + + private Server newServer(Server server, String id) { + return new Server(org.apache.maven.api.settings.Server.newBuilder(server.getDelegate(), false) + .id(id) + .ids(Collections.emptyList()) + .build()); + } } diff --git a/compat/maven-settings-builder/src/test/java/org/apache/maven/settings/building/DefaultSettingsBuilderFactoryTest.java b/compat/maven-settings-builder/src/test/java/org/apache/maven/settings/building/DefaultSettingsBuilderFactoryTest.java index 2959e4f68243..15219a2ca5fd 100644 --- a/compat/maven-settings-builder/src/test/java/org/apache/maven/settings/building/DefaultSettingsBuilderFactoryTest.java +++ b/compat/maven-settings-builder/src/test/java/org/apache/maven/settings/building/DefaultSettingsBuilderFactoryTest.java @@ -19,10 +19,15 @@ package org.apache.maven.settings.building; import java.io.File; +import java.util.List; +import java.util.Properties; +import org.apache.maven.api.settings.Server; +import org.apache.maven.settings.Settings; +import org.assertj.core.api.recursive.comparison.RecursiveComparisonConfiguration; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.assertj.core.api.Assertions.assertThat; /** */ @@ -32,17 +37,114 @@ private File getSettings(String name) { return new File("src/test/resources/settings/factory/" + name + ".xml").getAbsoluteFile(); } - @Test - void testCompleteWiring() throws Exception { + private org.apache.maven.settings.Server asServer(Server delegate) { + return new org.apache.maven.settings.Server(delegate); + } + + SettingsBuildingResult execute(String settingsName) throws Exception { + Properties properties = new Properties(); + properties.setProperty("user.home", "/home/user"); + SettingsBuilder builder = new DefaultSettingsBuilderFactory().newInstance(); - assertNotNull(builder); + assertThat(builder).isNotNull(); DefaultSettingsBuildingRequest request = new DefaultSettingsBuildingRequest(); - request.setSystemProperties(System.getProperties()); - request.setUserSettingsFile(getSettings("simple")); + request.setSystemProperties(properties); + request.setUserSettingsFile(getSettings(settingsName)); SettingsBuildingResult result = builder.build(request); - assertNotNull(result); - assertNotNull(result.getEffectiveSettings()); + return assertThat(result).isNotNull().actual(); + } + + @Test + void testCompleteWiring() throws Exception { + Settings settings = assertThat(execute("simple")) + .extracting(SettingsBuildingResult::getEffectiveSettings) + .actual(); + + assertThat(settings.getLocalRepository()) + .satisfiesAnyOf( + repo -> assertThat(repo).isEqualTo("/home/user/.m2/repository"), + repo -> assertThat(repo).endsWith("\\home\\user\\.m2\\repository")); + } + + @Test + void testSettingsWithServers() throws Exception { + Settings settings = assertThat(execute("settings-servers-1")) + .extracting(SettingsBuildingResult::getEffectiveSettings) + .actual(); + + assertThat(settings.getDelegate().getServers()) + .hasSize(2) + .usingRecursiveFieldByFieldElementComparator(RecursiveComparisonConfiguration.builder() + .withIgnoredFields("locations") + .build()) + .containsExactlyInAnyOrder( + Server.newBuilder() + .id("server-1") + .username("username1") + .password("password1") + .build(), + Server.newBuilder() + .id("server-2") + .username("username2") + .password("password2") + .build()); + } + + @Test + void testSettingsWithServersAndAliases() throws Exception { + Settings settings = assertThat(execute("settings-servers-2")) + .extracting(SettingsBuildingResult::getEffectiveSettings) + .actual(); + + assertThat(settings.getDelegate().getServers()) + .hasSize(6) + .usingRecursiveFieldByFieldElementComparator(RecursiveComparisonConfiguration.builder() + .withIgnoredFields("locations") + .build()) + .containsExactlyInAnyOrder( + Server.newBuilder() + .id("server-1") + .username("username1") + .password("password1") + .ids(List.of("server-11", "server-12")) + .build(), + Server.newBuilder() + .id("server-11") + .username("username1") + .password("password1") + .build(), + Server.newBuilder() + .id("server-12") + .username("username1") + .password("password1") + .build(), + Server.newBuilder() + .id("server-2") + .username("username2") + .password("password2") + .ids(List.of("server-21")) + .build(), + Server.newBuilder() + .id("server-21") + .username("username2") + .password("password2") + .build(), + Server.newBuilder() + .id("server-3") + .username("username3") + .password("password3") + .build()); + } + + @Test + void testSettingsWithDuplicateServersIds() throws Exception { + SettingsBuildingResult result = execute("settings-servers-3"); + + assertThat(result.getProblems()) + .hasSize(1) + .extracting(SettingsProblem::getMessage) + .containsExactly("'servers.server.id' must be unique but found duplicate server with id server-2"); } } diff --git a/compat/maven-settings-builder/src/test/resources/settings/factory/settings-servers-1.xml b/compat/maven-settings-builder/src/test/resources/settings/factory/settings-servers-1.xml new file mode 100644 index 000000000000..7076749943b2 --- /dev/null +++ b/compat/maven-settings-builder/src/test/resources/settings/factory/settings-servers-1.xml @@ -0,0 +1,37 @@ + + + + + + ${user.home}/.m2/repository + + + server-1 + username1 + password1 + + + server-2 + username2 + password2 + + + + diff --git a/compat/maven-settings-builder/src/test/resources/settings/factory/settings-servers-2.xml b/compat/maven-settings-builder/src/test/resources/settings/factory/settings-servers-2.xml new file mode 100644 index 000000000000..1504f536ab11 --- /dev/null +++ b/compat/maven-settings-builder/src/test/resources/settings/factory/settings-servers-2.xml @@ -0,0 +1,49 @@ + + + + + + ${user.home}/.m2/repository + + + server-1 + + server-11 + server-12 + + username1 + password1 + + + server-2 + + server-21 + + username2 + password2 + + + server-3 + username3 + password3 + + + + diff --git a/compat/maven-settings-builder/src/test/resources/settings/factory/settings-servers-3.xml b/compat/maven-settings-builder/src/test/resources/settings/factory/settings-servers-3.xml new file mode 100644 index 000000000000..3fe2937c1fb5 --- /dev/null +++ b/compat/maven-settings-builder/src/test/resources/settings/factory/settings-servers-3.xml @@ -0,0 +1,40 @@ + + + + + + ${user.home}/.m2/repository + + + server-1 + + server-2 + + username1 + password1 + + + server-2 + username2 + password2 + + + + diff --git a/compat/maven-settings/pom.xml b/compat/maven-settings/pom.xml index 6aaa0e4e4246..66ecd27c77bb 100644 --- a/compat/maven-settings/pom.xml +++ b/compat/maven-settings/pom.xml @@ -75,6 +75,7 @@ under the License. src/main/mdo/settings.mdo + forcedIOModelVersion=1.2.0 packageModelV3=org.apache.maven.settings packageModelV4=org.apache.maven.api.settings diff --git a/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultSettingsBuilder.java b/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultSettingsBuilder.java index be7dd9e86312..7119b78f0ceb 100644 --- a/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultSettingsBuilder.java +++ b/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultSettingsBuilder.java @@ -26,6 +26,8 @@ import java.io.InputStream; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; @@ -62,7 +64,6 @@ /** * Builds the effective settings from a user settings file and/or a global settings file. - * */ @Named public class DefaultSettingsBuilder implements SettingsBuilder { @@ -203,6 +204,12 @@ private Settings readSettings( settings = interpolate(settings, request, problems); settings = decrypt(settingsSource, settings, request, problems); + if (!isProjectSettings) { + settings = Settings.newBuilder(settings, false) + .servers(serversByIds(settings.getServers())) + .build(); + } + settingsValidator.validate(settings, isProjectSettings, problems); if (isProjectSettings) { @@ -228,6 +235,22 @@ private Settings readSettings( return settings; } + private List serversByIds(List servers) { + + if (servers.stream().allMatch(server -> server.getIds().isEmpty())) { + return servers; + } + + ArrayList result = new ArrayList<>(servers); + + servers.stream().filter(server -> !server.getIds().isEmpty()).forEach(server -> server.getIds() + .forEach(id -> result.add(Server.newBuilder(server) + .id(id) + .ids(Collections.emptyList()) + .build()))); + return result; + } + private Settings interpolate( Settings settings, SettingsBuilderRequest request, ProblemCollector problems) { UnaryOperator src; diff --git a/impl/maven-impl/src/test/java/org/apache/maven/impl/DefaultSettingsBuilderFactoryTest.java b/impl/maven-impl/src/test/java/org/apache/maven/impl/DefaultSettingsBuilderFactoryTest.java index 5419b27d6287..accabb8d8e54 100644 --- a/impl/maven-impl/src/test/java/org/apache/maven/impl/DefaultSettingsBuilderFactoryTest.java +++ b/impl/maven-impl/src/test/java/org/apache/maven/impl/DefaultSettingsBuilderFactoryTest.java @@ -20,15 +20,20 @@ import java.nio.file.Path; import java.nio.file.Paths; +import java.util.List; import java.util.Map; import org.apache.maven.api.Session; +import org.apache.maven.api.services.BuilderProblem; import org.apache.maven.api.services.SettingsBuilder; import org.apache.maven.api.services.SettingsBuilderRequest; import org.apache.maven.api.services.SettingsBuilderResult; import org.apache.maven.api.services.Sources; import org.apache.maven.api.services.xml.SettingsXmlFactory; +import org.apache.maven.api.settings.Server; +import org.apache.maven.api.settings.Settings; import org.apache.maven.impl.model.DefaultInterpolator; +import org.assertj.core.api.recursive.comparison.RecursiveComparisonConfiguration; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -36,9 +41,10 @@ import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; -import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.assertj.core.api.Assertions.assertThat; /** + * */ @ExtendWith(MockitoExtension.class) class DefaultSettingsBuilderFactoryTest { @@ -53,23 +59,115 @@ void setup() { .thenReturn(new DefaultSettingsXmlFactory()); } - @Test - void testCompleteWiring() { + SettingsBuilderResult execute(String settingsName) { SettingsBuilder builder = new DefaultSettingsBuilder(new DefaultSettingsXmlFactory(), new DefaultInterpolator(), Map.of()); - assertNotNull(builder); + assertThat(builder).isNotNull(); SettingsBuilderRequest request = SettingsBuilderRequest.builder() .session(session) - .userSettingsSource(Sources.buildSource(getSettings("settings-simple"))) + .userSettingsSource(Sources.buildSource(getSettings(settingsName))) .build(); SettingsBuilderResult result = builder.build(request); - assertNotNull(result); - assertNotNull(result.getEffectiveSettings()); + return assertThat(result).isNotNull().actual(); + } + + @Test + void testCompleteWiring() { + Settings settings = assertThat(execute("settings-simple")) + .extracting(SettingsBuilderResult::getEffectiveSettings) + .actual(); + + assertThat(settings.getLocalRepository()) + .satisfiesAnyOf( + repo -> assertThat(repo).isEqualTo("${user.home}/.m2/repository"), + repo -> assertThat(repo).endsWith("\\${user.home}\\.m2\\repository")); + } + + @Test + void testSettingsWithServers() { + Settings settings = assertThat(execute("settings-servers-1")) + .extracting(SettingsBuilderResult::getEffectiveSettings) + .actual(); + + assertThat(settings.getServers()) + .hasSize(2) + .usingRecursiveFieldByFieldElementComparator(RecursiveComparisonConfiguration.builder() + .withIgnoredFields("locations") + .build()) + .containsExactlyInAnyOrder( + Server.newBuilder() + .id("server-1") + .username("username1") + .password("password1") + .build(), + Server.newBuilder() + .id("server-2") + .username("username2") + .password("password2") + .build()); + } + + @Test + void testSettingsWithServersAndAliases() { + Settings settings = assertThat(execute("settings-servers-2")) + .extracting(SettingsBuilderResult::getEffectiveSettings) + .actual(); + + assertThat(settings.getLocalRepository()).isEqualTo("${user.home}/.m2/repository"); + + assertThat(settings.getServers()) + .hasSize(6) + .usingRecursiveFieldByFieldElementComparator(RecursiveComparisonConfiguration.builder() + .withIgnoredFields("locations") + .build()) + .containsExactlyInAnyOrder( + Server.newBuilder() + .id("server-1") + .username("username1") + .password("password1") + .ids(List.of("server-11", "server-12")) + .build(), + Server.newBuilder() + .id("server-11") + .username("username1") + .password("password1") + .build(), + Server.newBuilder() + .id("server-12") + .username("username1") + .password("password1") + .build(), + Server.newBuilder() + .id("server-2") + .username("username2") + .password("password2") + .ids(List.of("server-21")) + .build(), + Server.newBuilder() + .id("server-21") + .username("username2") + .password("password2") + .build(), + Server.newBuilder() + .id("server-3") + .username("username3") + .password("password3") + .build()); + } + + @Test + void testSettingsWithDuplicateServersIds() throws Exception { + SettingsBuilderResult result = execute("settings-servers-3"); + + assertThat(result.getProblems().problems()) + .hasSize(1) + .extracting(BuilderProblem::getMessage) + .containsExactly("'servers.server.id' must be unique but found duplicate server with id server-2"); } private Path getSettings(String name) { - return Paths.get("src/test/resources/" + name + ".xml").toAbsolutePath(); + return Paths.get("src/test/resources/settings/" + name + ".xml").toAbsolutePath(); } } diff --git a/impl/maven-impl/src/test/resources/settings/settings-servers-1.xml b/impl/maven-impl/src/test/resources/settings/settings-servers-1.xml new file mode 100644 index 000000000000..7076749943b2 --- /dev/null +++ b/impl/maven-impl/src/test/resources/settings/settings-servers-1.xml @@ -0,0 +1,37 @@ + + + + + + ${user.home}/.m2/repository + + + server-1 + username1 + password1 + + + server-2 + username2 + password2 + + + + diff --git a/impl/maven-impl/src/test/resources/settings/settings-servers-2.xml b/impl/maven-impl/src/test/resources/settings/settings-servers-2.xml new file mode 100644 index 000000000000..1504f536ab11 --- /dev/null +++ b/impl/maven-impl/src/test/resources/settings/settings-servers-2.xml @@ -0,0 +1,49 @@ + + + + + + ${user.home}/.m2/repository + + + server-1 + + server-11 + server-12 + + username1 + password1 + + + server-2 + + server-21 + + username2 + password2 + + + server-3 + username3 + password3 + + + + diff --git a/impl/maven-impl/src/test/resources/settings/settings-servers-3.xml b/impl/maven-impl/src/test/resources/settings/settings-servers-3.xml new file mode 100644 index 000000000000..3fe2937c1fb5 --- /dev/null +++ b/impl/maven-impl/src/test/resources/settings/settings-servers-3.xml @@ -0,0 +1,40 @@ + + + + + + ${user.home}/.m2/repository + + + server-1 + + server-2 + + username1 + password1 + + + server-2 + username2 + password2 + + + + diff --git a/impl/maven-impl/src/test/resources/settings-simple.xml b/impl/maven-impl/src/test/resources/settings/settings-simple.xml similarity index 100% rename from impl/maven-impl/src/test/resources/settings-simple.xml rename to impl/maven-impl/src/test/resources/settings/settings-simple.xml diff --git a/impl/maven-support/pom.xml b/impl/maven-support/pom.xml index 65f1eb0a7c5a..5608e5d4cd3e 100644 --- a/impl/maven-support/pom.xml +++ b/impl/maven-support/pom.xml @@ -136,6 +136,7 @@ under the License. + forcedIOModelVersion=1.2.0 packageModelV3=org.apache.maven.settings packageModelV4=org.apache.maven.api.settings From b248d2d8023b426cb0f6cde53bf0a8e2281ec149 Mon Sep 17 00:00:00 2001 From: Slawomir Jaranowski Date: Thu, 15 May 2025 00:15:34 +0200 Subject: [PATCH 2/7] Apply review suggestion - 1 --- .../building/DefaultSettingsBuilder.java | 18 ++++++++++----- .../DefaultSettingsBuilderFactoryTest.java | 4 ---- .../maven/impl/DefaultSettingsBuilder.java | 23 +++++++++++-------- 3 files changed, 26 insertions(+), 19 deletions(-) diff --git a/compat/maven-settings-builder/src/main/java/org/apache/maven/settings/building/DefaultSettingsBuilder.java b/compat/maven-settings-builder/src/main/java/org/apache/maven/settings/building/DefaultSettingsBuilder.java index dd4ad96215b0..4ac6fde1a7f6 100644 --- a/compat/maven-settings-builder/src/main/java/org/apache/maven/settings/building/DefaultSettingsBuilder.java +++ b/compat/maven-settings-builder/src/main/java/org/apache/maven/settings/building/DefaultSettingsBuilder.java @@ -26,10 +26,11 @@ import java.io.IOException; import java.io.StringReader; import java.io.StringWriter; -import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; import org.apache.maven.building.FileSource; import org.apache.maven.building.Source; @@ -261,11 +262,16 @@ private List serversByIds(List servers) { return servers; } - ArrayList result = new ArrayList<>(servers); - - servers.stream().filter(server -> !server.getIds().isEmpty()).forEach(server -> server.getIds() - .forEach(id -> result.add(newServer(server, id)))); - return result; + return servers.stream() + .flatMap(server -> { + List ids = server.getIds(); + if (ids.isEmpty()) { + return Stream.of(server); + } else { + return Stream.concat(Stream.of(server), ids.stream().map(id -> newServer(server, id))); + } + }) + .collect(Collectors.toList()); } private Server newServer(Server server, String id) { diff --git a/compat/maven-settings-builder/src/test/java/org/apache/maven/settings/building/DefaultSettingsBuilderFactoryTest.java b/compat/maven-settings-builder/src/test/java/org/apache/maven/settings/building/DefaultSettingsBuilderFactoryTest.java index 15219a2ca5fd..181c8576ca01 100644 --- a/compat/maven-settings-builder/src/test/java/org/apache/maven/settings/building/DefaultSettingsBuilderFactoryTest.java +++ b/compat/maven-settings-builder/src/test/java/org/apache/maven/settings/building/DefaultSettingsBuilderFactoryTest.java @@ -37,10 +37,6 @@ private File getSettings(String name) { return new File("src/test/resources/settings/factory/" + name + ".xml").getAbsoluteFile(); } - private org.apache.maven.settings.Server asServer(Server delegate) { - return new org.apache.maven.settings.Server(delegate); - } - SettingsBuildingResult execute(String settingsName) throws Exception { Properties properties = new Properties(); properties.setProperty("user.home", "/home/user"); diff --git a/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultSettingsBuilder.java b/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultSettingsBuilder.java index 7119b78f0ceb..f1c401ea5697 100644 --- a/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultSettingsBuilder.java +++ b/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultSettingsBuilder.java @@ -26,13 +26,14 @@ import java.io.InputStream; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Supplier; import java.util.function.UnaryOperator; +import java.util.stream.Collectors; +import java.util.stream.Stream; import org.apache.maven.api.Constants; import org.apache.maven.api.ProtoSession; @@ -241,14 +242,18 @@ private List serversByIds(List servers) { return servers; } - ArrayList result = new ArrayList<>(servers); - - servers.stream().filter(server -> !server.getIds().isEmpty()).forEach(server -> server.getIds() - .forEach(id -> result.add(Server.newBuilder(server) - .id(id) - .ids(Collections.emptyList()) - .build()))); - return result; + return servers.stream() + .flatMap(server -> { + List ids = server.getIds(); + if (ids.isEmpty()) { + return Stream.of(server); + } + return Stream.concat(Stream.of(server), ids.stream().map(id -> Server.newBuilder(server, true) + .id(id) + .ids(Collections.emptyList()) + .build())); + }) + .collect(Collectors.toList()); } private Settings interpolate( From e96fbd198b8c3b12440ad68a93418f1796198d9e Mon Sep 17 00:00:00 2001 From: Slawomir Jaranowski Date: Thu, 15 May 2025 20:22:50 +0200 Subject: [PATCH 3/7] Apply review suggestion - 2 --- .../building/DefaultSettingsBuilder.java | 24 ++++----------- .../maven/impl/DefaultSettingsBuilder.java | 30 +++++-------------- 2 files changed, 14 insertions(+), 40 deletions(-) diff --git a/compat/maven-settings-builder/src/main/java/org/apache/maven/settings/building/DefaultSettingsBuilder.java b/compat/maven-settings-builder/src/main/java/org/apache/maven/settings/building/DefaultSettingsBuilder.java index 4ac6fde1a7f6..90bcfdc38926 100644 --- a/compat/maven-settings-builder/src/main/java/org/apache/maven/settings/building/DefaultSettingsBuilder.java +++ b/compat/maven-settings-builder/src/main/java/org/apache/maven/settings/building/DefaultSettingsBuilder.java @@ -29,7 +29,6 @@ import java.util.Collections; import java.util.List; import java.util.Map; -import java.util.stream.Collectors; import java.util.stream.Stream; import org.apache.maven.building.FileSource; @@ -257,27 +256,16 @@ public Object execute(String expression, Object value) { } private List serversByIds(List servers) { - - if (servers.stream().allMatch(server -> server.getIds().isEmpty())) { - return servers; - } - return servers.stream() - .flatMap(server -> { - List ids = server.getIds(); - if (ids.isEmpty()) { - return Stream.of(server); - } else { - return Stream.concat(Stream.of(server), ids.stream().map(id -> newServer(server, id))); - } - }) - .collect(Collectors.toList()); + .flatMap(server -> Stream.concat( + Stream.of(server), server.getIds().stream().map(id -> serverAlias(server, id)))) + .toList(); } - private Server newServer(Server server, String id) { - return new Server(org.apache.maven.api.settings.Server.newBuilder(server.getDelegate(), false) + private Server serverAlias(Server server, String id) { + return new Server(org.apache.maven.api.settings.Server.newBuilder(server.getDelegate(), true) .id(id) - .ids(Collections.emptyList()) + .ids(List.of()) .build()); } } diff --git a/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultSettingsBuilder.java b/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultSettingsBuilder.java index f1c401ea5697..2be376599b5c 100644 --- a/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultSettingsBuilder.java +++ b/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultSettingsBuilder.java @@ -26,13 +26,11 @@ import java.io.InputStream; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.Collections; import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Supplier; import java.util.function.UnaryOperator; -import java.util.stream.Collectors; import java.util.stream.Stream; import org.apache.maven.api.Constants; @@ -206,9 +204,7 @@ private Settings readSettings( settings = decrypt(settingsSource, settings, request, problems); if (!isProjectSettings) { - settings = Settings.newBuilder(settings, false) - .servers(serversByIds(settings.getServers())) - .build(); + settings = settings.withServers(serversByIds(settings.getServers())); } settingsValidator.validate(settings, isProjectSettings, problems); @@ -237,23 +233,14 @@ private Settings readSettings( } private List serversByIds(List servers) { - - if (servers.stream().allMatch(server -> server.getIds().isEmpty())) { - return servers; - } - return servers.stream() - .flatMap(server -> { - List ids = server.getIds(); - if (ids.isEmpty()) { - return Stream.of(server); - } - return Stream.concat(Stream.of(server), ids.stream().map(id -> Server.newBuilder(server, true) - .id(id) - .ids(Collections.emptyList()) - .build())); - }) - .collect(Collectors.toList()); + .flatMap(server -> Stream.concat( + Stream.of(server), server.getIds().stream().map(id -> serverAlias(server, id)))) + .toList(); + } + + private Server serverAlias(Server server, String id) { + return Server.newBuilder(server, true).id(id).ids(List.of()).build(); } private Settings interpolate( @@ -376,7 +363,6 @@ public org.apache.maven.api.model.Profile convert(Profile profile) { /** * Collects the output of the settings builder. - * */ static class DefaultSettingsBuilderResult implements SettingsBuilderResult { From 81933fe8ddd6a0aaaa8fab1d073b4b07beec698a Mon Sep 17 00:00:00 2001 From: Slawomir Jaranowski Date: Mon, 19 May 2025 20:54:39 +0200 Subject: [PATCH 4/7] cleanup of introduced comments --- api/maven-api-settings/src/main/mdo/settings.mdo | 2 -- compat/maven-settings/pom.xml | 3 +-- impl/maven-support/pom.xml | 3 +-- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/api/maven-api-settings/src/main/mdo/settings.mdo b/api/maven-api-settings/src/main/mdo/settings.mdo index 05183ae9501b..f7eb554d5c62 100644 --- a/api/maven-api-settings/src/main/mdo/settings.mdo +++ b/api/maven-api-settings/src/main/mdo/settings.mdo @@ -181,7 +181,6 @@ repositories - 1.3.0+ The lists of the remote repositories. @@ -193,7 +192,6 @@ pluginRepositories - 1.3.0+ The lists of the remote repositories for discovering plugins. diff --git a/compat/maven-settings/pom.xml b/compat/maven-settings/pom.xml index 66ecd27c77bb..78119cf62b32 100644 --- a/compat/maven-settings/pom.xml +++ b/compat/maven-settings/pom.xml @@ -75,8 +75,7 @@ under the License. src/main/mdo/settings.mdo - - forcedIOModelVersion=1.2.0 + forcedIOModelVersion=1.3.0 packageModelV3=org.apache.maven.settings packageModelV4=org.apache.maven.api.settings packageToolV4=org.apache.maven.settings.v4 diff --git a/impl/maven-support/pom.xml b/impl/maven-support/pom.xml index 5608e5d4cd3e..b1c334995ed8 100644 --- a/impl/maven-support/pom.xml +++ b/impl/maven-support/pom.xml @@ -136,8 +136,7 @@ under the License. - - forcedIOModelVersion=1.2.0 + forcedIOModelVersion=1.3.0 packageModelV3=org.apache.maven.settings packageModelV4=org.apache.maven.api.settings packageToolV4=org.apache.maven.settings.v4 From d634949e5f3d9944c95cce462da6d644d41ca594 Mon Sep 17 00:00:00 2001 From: Slawomir Jaranowski Date: Sat, 11 Apr 2026 20:17:10 +0200 Subject: [PATCH 5/7] Refresh changes - rename ids to aliases --- api/maven-api-settings/pom.xml | 4 + .../src/main/mdo/settings.mdo | 6 +- compat/maven-settings-builder/pom.xml | 5 - .../building/DefaultSettingsBuilder.java | 4 +- .../DefaultSettingsBuilderFactoryTest.java | 148 ++++++++--------- .../settings/factory/settings-servers-2.xml | 14 +- .../settings/factory/settings-servers-3.xml | 6 +- .../maven/impl/DefaultSettingsBuilder.java | 4 +- .../DefaultSettingsBuilderFactoryTest.java | 153 +++++++++--------- .../resources/settings/settings-servers-2.xml | 14 +- .../resources/settings/settings-servers-3.xml | 6 +- impl/maven-support/pom.xml | 4 + 12 files changed, 178 insertions(+), 190 deletions(-) diff --git a/api/maven-api-settings/pom.xml b/api/maven-api-settings/pom.xml index a73c2ce1de0d..11b87448607f 100644 --- a/api/maven-api-settings/pom.xml +++ b/api/maven-api-settings/pom.xml @@ -53,7 +53,11 @@ under the License. org.codehaus.modello modello-maven-plugin + 2.6.1-SNAPSHOT + + alias + 2.0.0 ${project.basedir}/../../src/mdo diff --git a/api/maven-api-settings/src/main/mdo/settings.mdo b/api/maven-api-settings/src/main/mdo/settings.mdo index f7eb554d5c62..471c065dcbc7 100644 --- a/api/maven-api-settings/src/main/mdo/settings.mdo +++ b/api/maven-api-settings/src/main/mdo/settings.mdo @@ -530,11 +530,11 @@ - ids + aliases 1.3.0+ - List of additional ids for server. - + List of additional server aliases. For each alias, an additional server will be generated by copying the entire configuration, but using a different ID. + This is useful when the same credentials should be used for multiple servers. String * diff --git a/compat/maven-settings-builder/pom.xml b/compat/maven-settings-builder/pom.xml index 9b94d3a498f3..24e62ee65639 100644 --- a/compat/maven-settings-builder/pom.xml +++ b/compat/maven-settings-builder/pom.xml @@ -78,11 +78,6 @@ under the License. junit-jupiter-api test - - org.assertj - assertj-core - test - diff --git a/compat/maven-settings-builder/src/main/java/org/apache/maven/settings/building/DefaultSettingsBuilder.java b/compat/maven-settings-builder/src/main/java/org/apache/maven/settings/building/DefaultSettingsBuilder.java index 90bcfdc38926..3e11798f06ae 100644 --- a/compat/maven-settings-builder/src/main/java/org/apache/maven/settings/building/DefaultSettingsBuilder.java +++ b/compat/maven-settings-builder/src/main/java/org/apache/maven/settings/building/DefaultSettingsBuilder.java @@ -258,14 +258,14 @@ public Object execute(String expression, Object value) { private List serversByIds(List servers) { return servers.stream() .flatMap(server -> Stream.concat( - Stream.of(server), server.getIds().stream().map(id -> serverAlias(server, id)))) + Stream.of(server), server.getAliases().stream().map(id -> serverAlias(server, id)))) .toList(); } private Server serverAlias(Server server, String id) { return new Server(org.apache.maven.api.settings.Server.newBuilder(server.getDelegate(), true) .id(id) - .ids(List.of()) + .aliases(List.of()) .build()); } } diff --git a/compat/maven-settings-builder/src/test/java/org/apache/maven/settings/building/DefaultSettingsBuilderFactoryTest.java b/compat/maven-settings-builder/src/test/java/org/apache/maven/settings/building/DefaultSettingsBuilderFactoryTest.java index 181c8576ca01..cd5fc00516ef 100644 --- a/compat/maven-settings-builder/src/test/java/org/apache/maven/settings/building/DefaultSettingsBuilderFactoryTest.java +++ b/compat/maven-settings-builder/src/test/java/org/apache/maven/settings/building/DefaultSettingsBuilderFactoryTest.java @@ -24,10 +24,11 @@ import org.apache.maven.api.settings.Server; import org.apache.maven.settings.Settings; -import org.assertj.core.api.recursive.comparison.RecursiveComparisonConfiguration; import org.junit.jupiter.api.Test; -import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; /** */ @@ -42,105 +43,96 @@ SettingsBuildingResult execute(String settingsName) throws Exception { properties.setProperty("user.home", "/home/user"); SettingsBuilder builder = new DefaultSettingsBuilderFactory().newInstance(); - assertThat(builder).isNotNull(); + assertNotNull(builder); DefaultSettingsBuildingRequest request = new DefaultSettingsBuildingRequest(); request.setSystemProperties(properties); request.setUserSettingsFile(getSettings(settingsName)); SettingsBuildingResult result = builder.build(request); - return assertThat(result).isNotNull().actual(); + assertNotNull(result); + return result; } @Test void testCompleteWiring() throws Exception { - Settings settings = assertThat(execute("simple")) - .extracting(SettingsBuildingResult::getEffectiveSettings) - .actual(); - - assertThat(settings.getLocalRepository()) - .satisfiesAnyOf( - repo -> assertThat(repo).isEqualTo("/home/user/.m2/repository"), - repo -> assertThat(repo).endsWith("\\home\\user\\.m2\\repository")); + Settings settings = execute("simple").getEffectiveSettings(); + + String localRepository = settings.getLocalRepository(); + assertTrue(localRepository.equals("/home/user/.m2/repository") + || localRepository.endsWith("\\home\\user\\.m2\\repository")); } @Test void testSettingsWithServers() throws Exception { - Settings settings = assertThat(execute("settings-servers-1")) - .extracting(SettingsBuildingResult::getEffectiveSettings) - .actual(); - - assertThat(settings.getDelegate().getServers()) - .hasSize(2) - .usingRecursiveFieldByFieldElementComparator(RecursiveComparisonConfiguration.builder() - .withIgnoredFields("locations") - .build()) - .containsExactlyInAnyOrder( - Server.newBuilder() - .id("server-1") - .username("username1") - .password("password1") - .build(), - Server.newBuilder() - .id("server-2") - .username("username2") - .password("password2") - .build()); + Settings settings = execute("settings-servers-1").getEffectiveSettings(); + + List servers = settings.getDelegate().getServers(); + assertEquals(2, servers.size()); + + Server server1 = getServerById(servers, "server-1"); + assertEquals("username1", server1.getUsername()); + assertEquals("password1", server1.getPassword()); + + Server server2 = getServerById(servers, "server-2"); + assertEquals("username2", server2.getUsername()); + assertEquals("password2", server2.getPassword()); } @Test void testSettingsWithServersAndAliases() throws Exception { - Settings settings = assertThat(execute("settings-servers-2")) - .extracting(SettingsBuildingResult::getEffectiveSettings) - .actual(); - - assertThat(settings.getDelegate().getServers()) - .hasSize(6) - .usingRecursiveFieldByFieldElementComparator(RecursiveComparisonConfiguration.builder() - .withIgnoredFields("locations") - .build()) - .containsExactlyInAnyOrder( - Server.newBuilder() - .id("server-1") - .username("username1") - .password("password1") - .ids(List.of("server-11", "server-12")) - .build(), - Server.newBuilder() - .id("server-11") - .username("username1") - .password("password1") - .build(), - Server.newBuilder() - .id("server-12") - .username("username1") - .password("password1") - .build(), - Server.newBuilder() - .id("server-2") - .username("username2") - .password("password2") - .ids(List.of("server-21")) - .build(), - Server.newBuilder() - .id("server-21") - .username("username2") - .password("password2") - .build(), - Server.newBuilder() - .id("server-3") - .username("username3") - .password("password3") - .build()); + Settings settings = execute("settings-servers-2").getEffectiveSettings(); + + List servers = settings.getDelegate().getServers(); + assertEquals(6, servers.size()); + + Server server1 = getServerById(servers, "server-1"); + assertEquals("username1", server1.getUsername()); + assertEquals("password1", server1.getPassword()); + assertEquals(List.of("server-11", "server-12"), server1.getAliases()); + + Server server11 = getServerById(servers, "server-11"); + assertEquals("username1", server11.getUsername()); + assertEquals("password1", server11.getPassword()); + assertTrue(server11.getAliases().isEmpty()); + + Server server12 = getServerById(servers, "server-12"); + assertEquals("username1", server12.getUsername()); + assertEquals("password1", server12.getPassword()); + assertTrue(server11.getAliases().isEmpty()); + + Server server2 = getServerById(servers, "server-2"); + assertEquals("username2", server2.getUsername()); + assertEquals("password2", server2.getPassword()); + assertEquals(List.of("server-21"), server2.getAliases()); + + Server server21 = getServerById(servers, "server-21"); + assertEquals("username2", server21.getUsername()); + assertEquals("password2", server21.getPassword()); + assertTrue(server21.getAliases().isEmpty()); + + Server server3 = getServerById(servers, "server-3"); + assertEquals("username3", server3.getUsername()); + assertEquals("password3", server3.getPassword()); + assertTrue(server3.getAliases().isEmpty()); + } + + private Server getServerById(List servers, String id) { + return servers.stream() + .filter(s -> s.getId().equals(id)) + .findFirst() + .orElseThrow( + () -> new IllegalStateException("Server with id " + id + " not found on list: " + servers)); } @Test void testSettingsWithDuplicateServersIds() throws Exception { SettingsBuildingResult result = execute("settings-servers-3"); - assertThat(result.getProblems()) - .hasSize(1) - .extracting(SettingsProblem::getMessage) - .containsExactly("'servers.server.id' must be unique but found duplicate server with id server-2"); + List problems = result.getProblems(); + assertEquals(1, problems.size()); + assertEquals( + "'servers.server.id' must be unique but found duplicate server with id server-2", + problems.get(0).getMessage()); } } diff --git a/compat/maven-settings-builder/src/test/resources/settings/factory/settings-servers-2.xml b/compat/maven-settings-builder/src/test/resources/settings/factory/settings-servers-2.xml index 1504f536ab11..a8464a49a302 100644 --- a/compat/maven-settings-builder/src/test/resources/settings/factory/settings-servers-2.xml +++ b/compat/maven-settings-builder/src/test/resources/settings/factory/settings-servers-2.xml @@ -24,18 +24,18 @@ under the License. server-1 - - server-11 - server-12 - + + server-11 + server-12 + username1 password1 server-2 - - server-21 - + + server-21 + username2 password2 diff --git a/compat/maven-settings-builder/src/test/resources/settings/factory/settings-servers-3.xml b/compat/maven-settings-builder/src/test/resources/settings/factory/settings-servers-3.xml index 3fe2937c1fb5..e0a13454e2e8 100644 --- a/compat/maven-settings-builder/src/test/resources/settings/factory/settings-servers-3.xml +++ b/compat/maven-settings-builder/src/test/resources/settings/factory/settings-servers-3.xml @@ -24,9 +24,9 @@ under the License. server-1 - - server-2 - + + server-2 + username1 password1 diff --git a/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultSettingsBuilder.java b/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultSettingsBuilder.java index 2be376599b5c..ff4707b0bebe 100644 --- a/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultSettingsBuilder.java +++ b/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultSettingsBuilder.java @@ -235,12 +235,12 @@ private Settings readSettings( private List serversByIds(List servers) { return servers.stream() .flatMap(server -> Stream.concat( - Stream.of(server), server.getIds().stream().map(id -> serverAlias(server, id)))) + Stream.of(server), server.getAliases().stream().map(id -> serverAlias(server, id)))) .toList(); } private Server serverAlias(Server server, String id) { - return Server.newBuilder(server, true).id(id).ids(List.of()).build(); + return Server.newBuilder(server, true).id(id).aliases(List.of()).build(); } private Settings interpolate( diff --git a/impl/maven-impl/src/test/java/org/apache/maven/impl/DefaultSettingsBuilderFactoryTest.java b/impl/maven-impl/src/test/java/org/apache/maven/impl/DefaultSettingsBuilderFactoryTest.java index accabb8d8e54..a143d41ff9da 100644 --- a/impl/maven-impl/src/test/java/org/apache/maven/impl/DefaultSettingsBuilderFactoryTest.java +++ b/impl/maven-impl/src/test/java/org/apache/maven/impl/DefaultSettingsBuilderFactoryTest.java @@ -25,6 +25,7 @@ import org.apache.maven.api.Session; import org.apache.maven.api.services.BuilderProblem; +import org.apache.maven.api.services.ProblemCollector; import org.apache.maven.api.services.SettingsBuilder; import org.apache.maven.api.services.SettingsBuilderRequest; import org.apache.maven.api.services.SettingsBuilderResult; @@ -33,7 +34,6 @@ import org.apache.maven.api.settings.Server; import org.apache.maven.api.settings.Settings; import org.apache.maven.impl.model.DefaultInterpolator; -import org.assertj.core.api.recursive.comparison.RecursiveComparisonConfiguration; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -41,7 +41,9 @@ import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; -import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * @@ -62,7 +64,7 @@ void setup() { SettingsBuilderResult execute(String settingsName) { SettingsBuilder builder = new DefaultSettingsBuilder(new DefaultSettingsXmlFactory(), new DefaultInterpolator(), Map.of()); - assertThat(builder).isNotNull(); + assertNotNull(builder); SettingsBuilderRequest request = SettingsBuilderRequest.builder() .session(session) @@ -70,101 +72,92 @@ SettingsBuilderResult execute(String settingsName) { .build(); SettingsBuilderResult result = builder.build(request); - return assertThat(result).isNotNull().actual(); + assertNotNull(result); + return result; } @Test void testCompleteWiring() { - Settings settings = assertThat(execute("settings-simple")) - .extracting(SettingsBuilderResult::getEffectiveSettings) - .actual(); - - assertThat(settings.getLocalRepository()) - .satisfiesAnyOf( - repo -> assertThat(repo).isEqualTo("${user.home}/.m2/repository"), - repo -> assertThat(repo).endsWith("\\${user.home}\\.m2\\repository")); + Settings settings = execute("settings-simple").getEffectiveSettings(); + + String localRepository = settings.getLocalRepository(); + assertTrue(localRepository.equals("${user.home}/.m2/repository") + || localRepository.endsWith("\\${user.home}\\.m2\\repository")); } @Test void testSettingsWithServers() { - Settings settings = assertThat(execute("settings-servers-1")) - .extracting(SettingsBuilderResult::getEffectiveSettings) - .actual(); - - assertThat(settings.getServers()) - .hasSize(2) - .usingRecursiveFieldByFieldElementComparator(RecursiveComparisonConfiguration.builder() - .withIgnoredFields("locations") - .build()) - .containsExactlyInAnyOrder( - Server.newBuilder() - .id("server-1") - .username("username1") - .password("password1") - .build(), - Server.newBuilder() - .id("server-2") - .username("username2") - .password("password2") - .build()); + Settings settings = execute("settings-servers-1").getEffectiveSettings(); + + List servers = settings.getServers(); + assertEquals(2, servers.size()); + + Server server1 = getServerById(servers, "server-1"); + assertEquals("username1", server1.getUsername()); + assertEquals("password1", server1.getPassword()); + + Server server2 = getServerById(servers, "server-2"); + assertEquals("username2", server2.getUsername()); + assertEquals("password2", server2.getPassword()); } @Test void testSettingsWithServersAndAliases() { - Settings settings = assertThat(execute("settings-servers-2")) - .extracting(SettingsBuilderResult::getEffectiveSettings) - .actual(); - - assertThat(settings.getLocalRepository()).isEqualTo("${user.home}/.m2/repository"); - - assertThat(settings.getServers()) - .hasSize(6) - .usingRecursiveFieldByFieldElementComparator(RecursiveComparisonConfiguration.builder() - .withIgnoredFields("locations") - .build()) - .containsExactlyInAnyOrder( - Server.newBuilder() - .id("server-1") - .username("username1") - .password("password1") - .ids(List.of("server-11", "server-12")) - .build(), - Server.newBuilder() - .id("server-11") - .username("username1") - .password("password1") - .build(), - Server.newBuilder() - .id("server-12") - .username("username1") - .password("password1") - .build(), - Server.newBuilder() - .id("server-2") - .username("username2") - .password("password2") - .ids(List.of("server-21")) - .build(), - Server.newBuilder() - .id("server-21") - .username("username2") - .password("password2") - .build(), - Server.newBuilder() - .id("server-3") - .username("username3") - .password("password3") - .build()); + Settings settings = execute("settings-servers-2").getEffectiveSettings(); + + assertEquals("${user.home}/.m2/repository", settings.getLocalRepository()); + + List servers = settings.getServers(); + assertEquals(6, servers.size()); + + Server server1 = getServerById(servers, "server-1"); + assertEquals("username1", server1.getUsername()); + assertEquals("password1", server1.getPassword()); + assertEquals(List.of("server-11", "server-12"), server1.getAliases()); + + Server server11 = getServerById(servers, "server-11"); + assertEquals("username1", server11.getUsername()); + assertEquals("password1", server11.getPassword()); + assertTrue(server11.getAliases().isEmpty()); + + Server server12 = getServerById(servers, "server-12"); + assertEquals("username1", server12.getUsername()); + assertEquals("password1", server12.getPassword()); + assertTrue(server11.getAliases().isEmpty()); + + Server server2 = getServerById(servers, "server-2"); + assertEquals("username2", server2.getUsername()); + assertEquals("password2", server2.getPassword()); + assertEquals(List.of("server-21"), server2.getAliases()); + + Server server21 = getServerById(servers, "server-21"); + assertEquals("username2", server21.getUsername()); + assertEquals("password2", server21.getPassword()); + assertTrue(server21.getAliases().isEmpty()); + + Server server3 = getServerById(servers, "server-3"); + assertEquals("username3", server3.getUsername()); + assertEquals("password3", server3.getPassword()); + assertTrue(server3.getAliases().isEmpty()); + } + + private Server getServerById(List servers, String id) { + return servers.stream() + .filter(s -> s.getId().equals(id)) + .findFirst() + .orElseThrow( + () -> new IllegalStateException("Server with id " + id + " not found on list: " + servers)); } @Test void testSettingsWithDuplicateServersIds() throws Exception { SettingsBuilderResult result = execute("settings-servers-3"); - assertThat(result.getProblems().problems()) - .hasSize(1) - .extracting(BuilderProblem::getMessage) - .containsExactly("'servers.server.id' must be unique but found duplicate server with id server-2"); + ProblemCollector problems = result.getProblems(); + assertEquals(1, problems.problems().count()); + assertEquals( + "'servers.server.id' must be unique but found duplicate server with id server-2", + problems.problems().findFirst().orElseThrow().getMessage()); } private Path getSettings(String name) { diff --git a/impl/maven-impl/src/test/resources/settings/settings-servers-2.xml b/impl/maven-impl/src/test/resources/settings/settings-servers-2.xml index 1504f536ab11..a8464a49a302 100644 --- a/impl/maven-impl/src/test/resources/settings/settings-servers-2.xml +++ b/impl/maven-impl/src/test/resources/settings/settings-servers-2.xml @@ -24,18 +24,18 @@ under the License. server-1 - - server-11 - server-12 - + + server-11 + server-12 + username1 password1 server-2 - - server-21 - + + server-21 + username2 password2 diff --git a/impl/maven-impl/src/test/resources/settings/settings-servers-3.xml b/impl/maven-impl/src/test/resources/settings/settings-servers-3.xml index 3fe2937c1fb5..e0a13454e2e8 100644 --- a/impl/maven-impl/src/test/resources/settings/settings-servers-3.xml +++ b/impl/maven-impl/src/test/resources/settings/settings-servers-3.xml @@ -24,9 +24,9 @@ under the License. server-1 - - server-2 - + + server-2 + username1 password1 diff --git a/impl/maven-support/pom.xml b/impl/maven-support/pom.xml index b1c334995ed8..f3f6761e1085 100644 --- a/impl/maven-support/pom.xml +++ b/impl/maven-support/pom.xml @@ -68,6 +68,7 @@ under the License. org.codehaus.modello modello-maven-plugin + 2.6.1-SNAPSHOT velocity-lifecycle @@ -123,6 +124,9 @@ under the License. generate-sources + + alias + 2.0.0 ${project.basedir}/../../api/maven-api-settings ${project.basedir}/../../src/mdo From feb03925ab17712188cbddb1736fe18627716c2d Mon Sep 17 00:00:00 2001 From: Slawomir Jaranowski Date: Tue, 14 Apr 2026 09:02:43 +0200 Subject: [PATCH 6/7] Use modello 2.7.0 --- api/maven-api-settings/pom.xml | 1 - impl/maven-support/pom.xml | 1 - pom.xml | 5 +++++ 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/api/maven-api-settings/pom.xml b/api/maven-api-settings/pom.xml index 11b87448607f..8262c2efde5a 100644 --- a/api/maven-api-settings/pom.xml +++ b/api/maven-api-settings/pom.xml @@ -53,7 +53,6 @@ under the License. org.codehaus.modello modello-maven-plugin - 2.6.1-SNAPSHOT alias diff --git a/impl/maven-support/pom.xml b/impl/maven-support/pom.xml index f3f6761e1085..7171363b74fc 100644 --- a/impl/maven-support/pom.xml +++ b/impl/maven-support/pom.xml @@ -68,7 +68,6 @@ under the License. org.codehaus.modello modello-maven-plugin - 2.6.1-SNAPSHOT velocity-lifecycle diff --git a/pom.xml b/pom.xml index 08260706e3ed..b109514105be 100644 --- a/pom.xml +++ b/pom.xml @@ -745,6 +745,11 @@ under the License. build-helper-maven-plugin 3.6.1 + + org.codehaus.modello + modello-maven-plugin + 2.7.0 + org.apache.maven.plugins maven-deploy-plugin From 6abdb324958150e43e4d08196628f0ec6a0a7eb7 Mon Sep 17 00:00:00 2001 From: Slawomir Jaranowski Date: Tue, 14 Apr 2026 22:15:40 +0200 Subject: [PATCH 7/7] Fix trailing whitespace --- api/maven-api-settings/src/main/mdo/settings.mdo | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/api/maven-api-settings/src/main/mdo/settings.mdo b/api/maven-api-settings/src/main/mdo/settings.mdo index 471c065dcbc7..34b83cf86869 100644 --- a/api/maven-api-settings/src/main/mdo/settings.mdo +++ b/api/maven-api-settings/src/main/mdo/settings.mdo @@ -532,9 +532,8 @@ aliases 1.3.0+ - - List of additional server aliases. For each alias, an additional server will be generated by copying the entire configuration, but using a different ID. - This is useful when the same credentials should be used for multiple servers. + List of additional server aliases. For each alias, an additional server will be generated by copying the entire configuration, but using a different ID. + This is useful when the same credentials should be used for multiple servers. String *