From 3e53a6e152f146474933ad4acfd3db1e4d887e48 Mon Sep 17 00:00:00 2001 From: Slawomir Jaranowski Date: Sun, 18 May 2025 17:56:21 +0200 Subject: [PATCH] [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. --- maven-settings-builder/pom.xml | 7 ++ .../building/DefaultSettingsBuilder.java | 25 ++++- .../DefaultSettingsBuilderFactoryTest.java | 93 +++++++++++++++++-- .../settings/factory/settings-servers-1.xml | 37 ++++++++ .../settings/factory/settings-servers-2.xml | 49 ++++++++++ .../settings/factory/settings-servers-3.xml | 40 ++++++++ maven-settings/pom.xml | 2 +- maven-settings/src/main/mdo/settings.mdo | 13 ++- 8 files changed, 252 insertions(+), 14 deletions(-) create mode 100644 maven-settings-builder/src/test/resources/settings/factory/settings-servers-1.xml create mode 100644 maven-settings-builder/src/test/resources/settings/factory/settings-servers-2.xml create mode 100644 maven-settings-builder/src/test/resources/settings/factory/settings-servers-3.xml diff --git a/maven-settings-builder/pom.xml b/maven-settings-builder/pom.xml index 9302e8d73e79..542e1c9c6f3c 100644 --- a/maven-settings-builder/pom.xml +++ b/maven-settings-builder/pom.xml @@ -63,6 +63,13 @@ under the License. org.codehaus.plexus plexus-sec-dispatcher + + + org.assertj + assertj-core + 3.27.3 + test + diff --git a/maven-settings-builder/src/main/java/org/apache/maven/settings/building/DefaultSettingsBuilder.java b/maven-settings-builder/src/main/java/org/apache/maven/settings/building/DefaultSettingsBuilder.java index 3addf78ea56a..9769ace3500e 100644 --- a/maven-settings-builder/src/main/java/org/apache/maven/settings/building/DefaultSettingsBuilder.java +++ b/maven-settings-builder/src/main/java/org/apache/maven/settings/building/DefaultSettingsBuilder.java @@ -29,9 +29,12 @@ 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; +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; @@ -91,10 +94,10 @@ public SettingsBuildingResult build(SettingsBuildingRequest request) throws Sett Source globalSettingsSource = getSettingsSource(request.getGlobalSettingsFile(), request.getGlobalSettingsSource()); - Settings globalSettings = readSettings(globalSettingsSource, request, problems); + Settings globalSettings = readSettings(globalSettingsSource, problems); Source userSettingsSource = getSettingsSource(request.getUserSettingsFile(), request.getUserSettingsSource()); - Settings userSettings = readSettings(userSettingsSource, request, problems); + Settings userSettings = readSettings(userSettingsSource, problems); settingsMerger.merge(userSettings, globalSettings, TrackableBase.GLOBAL_LEVEL); @@ -139,8 +142,7 @@ private Source getSettingsSource(File settingsFile, Source settingsSource) { return null; } - private Settings readSettings( - Source settingsSource, SettingsBuildingRequest request, DefaultSettingsProblemCollector problems) { + private Settings readSettings(Source settingsSource, DefaultSettingsProblemCollector problems) { if (settingsSource == null) { return new Settings(); } @@ -180,11 +182,26 @@ private Settings readSettings( return new Settings(); } + settings.setServers(serversByIds(settings.getServers())); settingsValidator.validate(settings, problems); return settings; } + private List serversByIds(List servers) { + return servers.stream() + .flatMap(server -> Stream.concat( + Stream.of(server), server.getIds().stream().map(id -> serverAlias(server, id)))) + .collect(Collectors.toList()); + } + + private Server serverAlias(Server server, String id) { + Server serverClone = server.clone(); + serverClone.setId(id); + serverClone.setIds(Collections.emptyList()); + return serverClone; + } + private Settings interpolate( Settings settings, SettingsBuildingRequest request, SettingsProblemCollector problems) { StringWriter writer = new StringWriter(1024 * 4); diff --git a/maven-settings-builder/src/test/java/org/apache/maven/settings/building/DefaultSettingsBuilderFactoryTest.java b/maven-settings-builder/src/test/java/org/apache/maven/settings/building/DefaultSettingsBuilderFactoryTest.java index 5dca987709d2..404c971b0398 100644 --- a/maven-settings-builder/src/test/java/org/apache/maven/settings/building/DefaultSettingsBuilderFactoryTest.java +++ b/maven-settings-builder/src/test/java/org/apache/maven/settings/building/DefaultSettingsBuilderFactoryTest.java @@ -19,28 +19,105 @@ package org.apache.maven.settings.building; import java.io.File; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Properties; -import junit.framework.TestCase; +import org.apache.maven.settings.Server; +import org.apache.maven.settings.Settings; +import org.junit.Test; + +import static org.assertj.core.api.Assertions.assertThat; /** * @author Benjamin Bentmann */ -public class DefaultSettingsBuilderFactoryTest extends TestCase { +public class DefaultSettingsBuilderFactoryTest { private File getSettings(String name) { return new File("src/test/resources/settings/factory/" + name + ".xml").getAbsoluteFile(); } - public void testCompleteWiring() throws Exception { + private 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 + public 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 + public void testSettingsWithServers() throws Exception { + Settings settings = assertThat(execute("settings-servers-1")) + .extracting(SettingsBuildingResult::getEffectiveSettings) + .actual(); + + assertThat(settings.getServers()) + .hasSize(2) + .usingRecursiveFieldByFieldElementComparator() + .containsExactlyInAnyOrder( + aServer("server-1", "username1", "password1"), aServer("server-2", "username2", "password2")); + } + + @Test + public void testSettingsWithServersAndAliases() throws Exception { + Settings settings = assertThat(execute("settings-servers-2")) + .extracting(SettingsBuildingResult::getEffectiveSettings) + .actual(); + + assertThat(settings.getServers()) + .hasSize(6) + .usingRecursiveFieldByFieldElementComparator() + .containsExactlyInAnyOrder( + aServer("server-1", "username1", "password1", Arrays.asList("server-11", "server-12")), + aServer("server-11", "username1", "password1"), + aServer("server-12", "username1", "password1"), + aServer("server-2", "username2", "password2", Collections.singletonList("server-21")), + aServer("server-21", "username2", "password2"), + aServer("server-3", "username3", "password3")); + } + + private Server aServer(String id, String username, String password) { + Server server = new Server(); + server.setId(id); + server.setUsername(username); + server.setPassword(password); + return server; + } + + private Server aServer(String id, String username, String password, List ids) { + Server server = aServer(id, username, password); + server.setIds(ids); + return server; + } + + @Test + public 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/maven-settings-builder/src/test/resources/settings/factory/settings-servers-1.xml b/maven-settings-builder/src/test/resources/settings/factory/settings-servers-1.xml new file mode 100644 index 000000000000..7076749943b2 --- /dev/null +++ b/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/maven-settings-builder/src/test/resources/settings/factory/settings-servers-2.xml b/maven-settings-builder/src/test/resources/settings/factory/settings-servers-2.xml new file mode 100644 index 000000000000..1504f536ab11 --- /dev/null +++ b/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/maven-settings-builder/src/test/resources/settings/factory/settings-servers-3.xml b/maven-settings-builder/src/test/resources/settings/factory/settings-servers-3.xml new file mode 100644 index 000000000000..3fe2937c1fb5 --- /dev/null +++ b/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/maven-settings/pom.xml b/maven-settings/pom.xml index 9f21810d2f75..e7035639da1d 100644 --- a/maven-settings/pom.xml +++ b/maven-settings/pom.xml @@ -44,7 +44,7 @@ under the License. org.codehaus.modello modello-maven-plugin - 1.2.0 + 1.3.0 src/main/mdo/settings.mdo diff --git a/maven-settings/src/main/mdo/settings.mdo b/maven-settings/src/main/mdo/settings.mdo index ebc6ce812749..6969066979d4 100644 --- a/maven-settings/src/main/mdo/settings.mdo +++ b/maven-settings/src/main/mdo/settings.mdo @@ -581,7 +581,18 @@ ]]> - + + ids + 1.3.0+ + + List of additional ids for server. + + + String + * + + + Mirror