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