From 4d5728e1215243c97f95579f026fc8381796fdb8 Mon Sep 17 00:00:00 2001 From: Slawomir Jaranowski Date: Tue, 13 May 2025 21:23:43 +0200 Subject: [PATCH 1/4] [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 dac986044776..928f424ba118 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 051b8f44722d..fd9d1cd980a3 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 253989512052..57afba8c327f 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 53731c6009cc..13af2c7e93d0 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 22f7fe8fc10b..096f25bfc31a 100644 --- a/impl/maven-support/pom.xml +++ b/impl/maven-support/pom.xml @@ -118,6 +118,7 @@ + forcedIOModelVersion=1.2.0 packageModelV3=org.apache.maven.settings packageModelV4=org.apache.maven.api.settings From 59a34d8b6f3dcb52e0a67ce97f27bfca3d31dd02 Mon Sep 17 00:00:00 2001 From: Slawomir Jaranowski Date: Thu, 15 May 2025 00:15:34 +0200 Subject: [PATCH 2/4] 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 fd9d1cd980a3..07970e5b72bb 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 13af2c7e93d0..2f32cbce7e18 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 14438b59b0ad2ee8bad6ef63d6d5a15f4e8f24a8 Mon Sep 17 00:00:00 2001 From: Slawomir Jaranowski Date: Thu, 15 May 2025 20:22:50 +0200 Subject: [PATCH 3/4] 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 07970e5b72bb..5b9dc8008783 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 2f32cbce7e18..3834f723e951 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( @@ -360,7 +347,6 @@ public org.apache.maven.api.model.Profile convert(Profile profile) { /** * Collects the output of the settings builder. - * */ static class DefaultSettingsBuilderResult implements SettingsBuilderResult { From c726fc1359ed765c8e6e619aa62764d8654597e5 Mon Sep 17 00:00:00 2001 From: Slawomir Jaranowski Date: Mon, 19 May 2025 20:54:39 +0200 Subject: [PATCH 4/4] 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 57afba8c327f..7a861e35b669 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 096f25bfc31a..89d81ecea8f7 100644 --- a/impl/maven-support/pom.xml +++ b/impl/maven-support/pom.xml @@ -118,8 +118,7 @@ - - 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