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