Author: bentmann Date: Fri Aug 19 08:10:58 2011 New Revision: 1159534 URL: http://svn.apache.org/viewvc?rev=1159534&view=rev Log: [MNG-5159] Extend validation of settings.xml to check for uniqueness of id elements
Modified: maven/maven-3/trunk/maven-settings-builder/src/main/java/org/apache/maven/settings/validation/DefaultSettingsValidator.java maven/maven-3/trunk/maven-settings-builder/src/test/java/org/apache/maven/settings/validation/DefaultSettingsValidatorTest.java Modified: maven/maven-3/trunk/maven-settings-builder/src/main/java/org/apache/maven/settings/validation/DefaultSettingsValidator.java URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-settings-builder/src/main/java/org/apache/maven/settings/validation/DefaultSettingsValidator.java?rev=1159534&r1=1159533&r2=1159534&view=diff ============================================================================== --- maven/maven-3/trunk/maven-settings-builder/src/main/java/org/apache/maven/settings/validation/DefaultSettingsValidator.java (original) +++ maven/maven-3/trunk/maven-settings-builder/src/main/java/org/apache/maven/settings/validation/DefaultSettingsValidator.java Fri Aug 19 08:10:58 2011 @@ -19,7 +19,9 @@ package org.apache.maven.settings.valida * under the License. */ +import java.util.HashSet; import java.util.List; +import java.util.Set; import org.apache.maven.settings.Mirror; import org.apache.maven.settings.Profile; @@ -77,11 +79,19 @@ public class DefaultSettingsValidator if ( servers != null ) { + Set<String> serverIds = new HashSet<String>(); + for ( int i = 0; i < servers.size(); i++ ) { Server server = servers.get( i ); validateStringNotEmpty( problems, "servers.server[" + i + "].id", server.getId(), null ); + + if ( !serverIds.add( server.getId() ) ) + { + addViolation( problems, Severity.WARNING, "servers.server.id", null, + "must be unique but found duplicate server with id " + server.getId() ); + } } } @@ -113,17 +123,29 @@ public class DefaultSettingsValidator if ( profiles != null ) { + Set<String> profileIds = new HashSet<String>(); + for ( Profile profile : profiles ) { - validateRepositories( problems, profile.getRepositories(), "repositories.repository" ); - validateRepositories( problems, profile.getPluginRepositories(), - "pluginRepositories.pluginRepository" ); + if ( !profileIds.add( profile.getId() ) ) + { + addViolation( problems, Severity.WARNING, "profiles.profile.id", null, + "must be unique but found duplicate profile with id " + profile.getId() ); + } + + String prefix = "profiles.profile[" + profile.getId() + "]."; + + validateRepositories( problems, profile.getRepositories(), prefix + "repositories.repository" ); + validateRepositories( problems, profile.getPluginRepositories(), prefix + + "pluginRepositories.pluginRepository" ); } } } private void validateRepositories( SettingsProblemCollector problems, List<Repository> repositories, String prefix ) { + Set<String> repoIds = new HashSet<String>(); + for ( Repository repository : repositories ) { validateStringNotEmpty( problems, prefix + ".id", repository.getId(), repository.getUrl() ); @@ -138,6 +160,12 @@ public class DefaultSettingsValidator + ", using it for other repositories will corrupt your repository metadata." ); } + if ( !repoIds.add( repository.getId() ) ) + { + addViolation( problems, Severity.WARNING, prefix + ".id", null, + "must be unique but found duplicate repository with id " + repository.getId() ); + } + validateStringNotEmpty( problems, prefix + ".url", repository.getUrl(), repository.getId() ); if ( "legacy".equals( repository.getLayout() ) ) Modified: maven/maven-3/trunk/maven-settings-builder/src/test/java/org/apache/maven/settings/validation/DefaultSettingsValidatorTest.java URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-settings-builder/src/test/java/org/apache/maven/settings/validation/DefaultSettingsValidatorTest.java?rev=1159534&r1=1159533&r2=1159534&view=diff ============================================================================== --- maven/maven-3/trunk/maven-settings-builder/src/test/java/org/apache/maven/settings/validation/DefaultSettingsValidatorTest.java (original) +++ maven/maven-3/trunk/maven-settings-builder/src/test/java/org/apache/maven/settings/validation/DefaultSettingsValidatorTest.java Fri Aug 19 08:10:58 2011 @@ -27,6 +27,7 @@ import junit.framework.TestCase; import org.apache.maven.settings.Mirror; import org.apache.maven.settings.Profile; import org.apache.maven.settings.Repository; +import org.apache.maven.settings.Server; import org.apache.maven.settings.Settings; import org.apache.maven.settings.building.SettingsProblemCollector; import org.apache.maven.settings.building.SettingsProblem.Severity; @@ -127,9 +128,71 @@ public class DefaultSettingsValidatorTes SimpleProblemCollector problems = new SimpleProblemCollector(); validator.validate( settings, problems ); assertEquals( 3, problems.messages.size() ); - assertContains( problems.messages.get( 0 ), "'repositories.repository.id' must not be 'local'" ); - assertContains( problems.messages.get( 1 ), "'repositories.repository.url' for local is missing" ); - assertContains( problems.messages.get( 2 ), "'repositories.repository.id' must not contain any of these characters" ); + assertContains( problems.messages.get( 0 ), + "'profiles.profile[default].repositories.repository.id' must not be 'local'" ); + assertContains( problems.messages.get( 1 ), + "'profiles.profile[default].repositories.repository.url' for local is missing" ); + assertContains( problems.messages.get( 2 ), + "'profiles.profile[default].repositories.repository.id' must not contain any of these characters" ); + } + + public void testValidateUniqueServerId() + throws Exception + { + Settings settings = new Settings(); + Server server1 = new Server(); + server1.setId( "test" ); + settings.addServer( server1 ); + Server server2 = new Server(); + server2.setId( "test" ); + settings.addServer( server2 ); + + SimpleProblemCollector problems = new SimpleProblemCollector(); + validator.validate( settings, problems ); + assertEquals( 1, problems.messages.size() ); + assertContains( problems.messages.get( 0 ), + "'servers.server.id' must be unique but found duplicate server with id test" ); + } + + public void testValidateUniqueProfileId() + throws Exception + { + Settings settings = new Settings(); + Profile profile1 = new Profile(); + profile1.setId( "test" ); + settings.addProfile( profile1 ); + Profile profile2 = new Profile(); + profile2.setId( "test" ); + settings.addProfile( profile2 ); + + SimpleProblemCollector problems = new SimpleProblemCollector(); + validator.validate( settings, problems ); + assertEquals( 1, problems.messages.size() ); + assertContains( problems.messages.get( 0 ), + "'profiles.profile.id' must be unique but found duplicate profile with id test" ); + } + + public void testValidateUniqueRepositoryId() + throws Exception + { + Settings settings = new Settings(); + Profile profile = new Profile(); + profile.setId( "pro" ); + settings.addProfile( profile ); + Repository repo1 = new Repository(); + repo1.setUrl( "http://apache.org/" ); + repo1.setId( "test" ); + profile.addRepository( repo1 ); + Repository repo2 = new Repository(); + repo2.setUrl( "http://apache.org/" ); + repo2.setId( "test" ); + profile.addRepository( repo2 ); + + SimpleProblemCollector problems = new SimpleProblemCollector(); + validator.validate( settings, problems ); + assertEquals( 1, problems.messages.size() ); + assertContains( problems.messages.get( 0 ), "'profiles.profile[pro].repositories.repository.id' must be unique" + + " but found duplicate repository with id test" ); } private static class SimpleProblemCollector