You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by be...@apache.org on 2009/08/03 18:20:06 UTC

svn commit: r800451 - in /maven/components/trunk: maven-compat/src/main/java/org/apache/maven/project/validation/ maven-model-builder/src/main/java/org/apache/maven/model/building/ maven-model-builder/src/main/java/org/apache/maven/model/validation/ ma...

Author: bentmann
Date: Mon Aug  3 16:20:06 2009
New Revision: 800451

URL: http://svn.apache.org/viewvc?rev=800451&view=rev
Log:
o Refactored model validator to use problem collector

Modified:
    maven/components/trunk/maven-compat/src/main/java/org/apache/maven/project/validation/DefaultModelValidator.java
    maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java
    maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelProblemCollector.java
    maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/validation/DefaultModelValidator.java
    maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/validation/ModelValidator.java
    maven/components/trunk/maven-model-builder/src/test/java/org/apache/maven/model/validation/DefaultModelValidatorTest.java

Modified: maven/components/trunk/maven-compat/src/main/java/org/apache/maven/project/validation/DefaultModelValidator.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-compat/src/main/java/org/apache/maven/project/validation/DefaultModelValidator.java?rev=800451&r1=800450&r2=800451&view=diff
==============================================================================
--- maven/components/trunk/maven-compat/src/main/java/org/apache/maven/project/validation/DefaultModelValidator.java (original)
+++ maven/components/trunk/maven-compat/src/main/java/org/apache/maven/project/validation/DefaultModelValidator.java Mon Aug  3 16:20:06 2009
@@ -22,6 +22,7 @@
 import org.apache.maven.model.Model;
 import org.apache.maven.model.building.DefaultModelBuildingRequest;
 import org.apache.maven.model.building.ModelBuildingRequest;
+import org.apache.maven.model.building.ModelProblemCollector;
 import org.codehaus.plexus.component.annotations.Component;
 import org.codehaus.plexus.component.annotations.Requirement;
 
@@ -34,7 +35,7 @@
 public class DefaultModelValidator
     implements ModelValidator
 {
-    
+
     @Requirement
     private org.apache.maven.model.validation.ModelValidator modelValidator;
 
@@ -45,12 +46,44 @@
         ModelBuildingRequest request =
             new DefaultModelBuildingRequest().setValidationLevel( ModelBuildingRequest.VALIDATION_LEVEL_MAVEN_2_0 );
 
-        for ( String message : modelValidator.validateEffectiveModel( model, request ).getErrors() )
+        SimpleModelProblemCollector problems = new SimpleModelProblemCollector( result );
+
+        modelValidator.validateEffectiveModel( model, request, problems );
+
+        return result;
+    }
+
+    private static class SimpleModelProblemCollector
+        implements ModelProblemCollector
+    {
+
+        ModelValidationResult result;
+
+        public SimpleModelProblemCollector( ModelValidationResult result )
+        {
+            this.result = result;
+        }
+
+        public void addError( String message )
         {
             result.addMessage( message );
         }
 
-        return result;
+        public void addError( String message, Exception cause )
+        {
+            result.addMessage( message );
+        }
+
+        public void addWarning( String message )
+        {
+            // not supported
+        }
+
+        public void addWarning( String message, Exception cause )
+        {
+            // not supported
+        }
+
     }
 
 }

Modified: maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java?rev=800451&r1=800450&r2=800451&view=diff
==============================================================================
--- maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java (original)
+++ maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java Mon Aug  3 16:20:06 2009
@@ -53,7 +53,6 @@
 import org.apache.maven.model.resolution.ModelResolver;
 import org.apache.maven.model.resolution.UnresolvableModelException;
 import org.apache.maven.model.superpom.SuperPomProvider;
-import org.apache.maven.model.validation.ModelValidationResult;
 import org.apache.maven.model.validation.ModelValidator;
 import org.codehaus.plexus.component.annotations.Component;
 import org.codehaus.plexus.component.annotations.Requirement;
@@ -121,7 +120,7 @@
         List<Profile> activeExternalProfiles =
             profileSelector.getActiveProfiles( request.getProfiles(), profileActivationContext, problems );
 
-        Model inputModel = readModel( request.getModelSource(), request.getPomFile(), request, problems.getProblems() );
+        Model inputModel = readModel( request.getModelSource(), request.getPomFile(), request, problems );
 
         ModelData resultData = new ModelData( inputModel );
 
@@ -159,7 +158,7 @@
 
             configureResolver( request.getModelResolver(), tmpModel, problems );
 
-            currentData = readParent( tmpModel, request, problems.getProblems() );
+            currentData = readParent( tmpModel, request, problems );
         }
 
         ModelData superData = new ModelData( getSuperModel() );
@@ -235,8 +234,7 @@
             pluginConfigurationExpander.expandPluginConfiguration( resultModel, request );
         }
 
-        ModelValidationResult validationResult = modelValidator.validateEffectiveModel( resultModel, request );
-        addProblems( resultModel, validationResult, problems.getProblems() );
+        modelValidator.validateEffectiveModel( resultModel, request, problems );
 
         if ( hasErrors( problems.getProblems() ) )
         {
@@ -247,7 +245,7 @@
     }
 
     private Model readModel( ModelSource modelSource, File pomFile, ModelBuildingRequest request,
-                             List<ModelProblem> problems )
+                             DefaultModelProblemCollector problems )
         throws ModelBuildingException
     {
         Model model;
@@ -277,19 +275,18 @@
         {
             problems.add( new ModelProblem( "Non-parseable POM " + modelSource.getLocation() + ": " + e.getMessage(),
                                             ModelProblem.Severity.FATAL, modelSource.getLocation(), e ) );
-            throw new ModelBuildingException( problems );
+            throw new ModelBuildingException( problems.getProblems() );
         }
         catch ( IOException e )
         {
             problems.add( new ModelProblem( "Non-readable POM " + modelSource.getLocation() + ": " + e.getMessage(),
                                             ModelProblem.Severity.FATAL, modelSource.getLocation(), e ) );
-            throw new ModelBuildingException( problems );
+            throw new ModelBuildingException( problems.getProblems() );
         }
 
         model.setPomFile( pomFile );
 
-        ModelValidationResult validationResult = modelValidator.validateRawModel( model, request );
-        addProblems( model, validationResult, problems );
+        modelValidator.validateRawModel( model, request, problems );
 
         return model;
     }
@@ -310,26 +307,6 @@
         return false;
     }
 
-    private void addProblems( Model model, ModelValidationResult result, List<ModelProblem> problems )
-    {
-        if ( !result.getWarnings().isEmpty() || !result.getErrors().isEmpty() )
-        {
-            String source = ModelProblemUtils.toSourceHint( model );
-
-            for ( String message : result.getWarnings() )
-            {
-                problems.add( new ModelProblem( "Invalid POM " + source + ": " + message,
-                                                ModelProblem.Severity.WARNING, source ) );
-            }
-
-            for ( String message : result.getErrors() )
-            {
-                problems.add( new ModelProblem( "Invalid POM " + source + ": " + message, ModelProblem.Severity.ERROR,
-                                                source ) );
-            }
-        }
-    }
-
     private ProfileActivationContext getProfileActivationContext( ModelBuildingRequest request )
     {
         ProfileActivationContext context = new DefaultProfileActivationContext();
@@ -394,7 +371,7 @@
         }
     }
 
-    private ModelData readParent( Model childModel, ModelBuildingRequest request, List<ModelProblem> problems )
+    private ModelData readParent( Model childModel, ModelBuildingRequest request, DefaultModelProblemCollector problems )
         throws ModelBuildingException
     {
         ModelData parentData;
@@ -449,7 +426,8 @@
         return parentData;
     }
 
-    private ModelData readParentLocally( Model childModel, ModelBuildingRequest request, List<ModelProblem> problems )
+    private ModelData readParentLocally( Model childModel, ModelBuildingRequest request,
+                                         DefaultModelProblemCollector problems )
         throws ModelBuildingException
     {
         File pomFile = getParentPomFile( childModel );
@@ -514,7 +492,8 @@
         return pomFile;
     }
 
-    private ModelData readParentExternally( Model childModel, ModelBuildingRequest request, List<ModelProblem> problems )
+    private ModelData readParentExternally( Model childModel, ModelBuildingRequest request,
+                                            DefaultModelProblemCollector problems )
         throws ModelBuildingException
     {
         Parent parent = childModel.getParent();
@@ -543,7 +522,7 @@
                 + ModelProblemUtils.toId( groupId, artifactId, version ) + " for POM "
                 + ModelProblemUtils.toSourceHint( childModel ) + ": " + e.getMessage(), ModelProblem.Severity.FATAL,
                                             ModelProblemUtils.toSourceHint( childModel ), e ) );
-            throw new ModelBuildingException( problems );
+            throw new ModelBuildingException( problems.getProblems() );
         }
 
         Model parentModel = readModel( modelSource, null, request, problems );

Modified: maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelProblemCollector.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelProblemCollector.java?rev=800451&r1=800450&r2=800451&view=diff
==============================================================================
--- maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelProblemCollector.java (original)
+++ maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelProblemCollector.java Mon Aug  3 16:20:06 2009
@@ -74,6 +74,11 @@
         return sourceHint;
     }
 
+    public void add( ModelProblem problem )
+    {
+        problems.add( problem );
+    }
+
     public void addError( String message )
     {
         problems.add( new ModelProblem( message, ModelProblem.Severity.ERROR, getSourceHint() ) );

Modified: maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/validation/DefaultModelValidator.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/validation/DefaultModelValidator.java?rev=800451&r1=800450&r2=800451&view=diff
==============================================================================
--- maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/validation/DefaultModelValidator.java (original)
+++ maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/validation/DefaultModelValidator.java Mon Aug  3 16:20:06 2009
@@ -36,6 +36,7 @@
 import org.apache.maven.model.Repository;
 import org.apache.maven.model.Resource;
 import org.apache.maven.model.building.ModelBuildingRequest;
+import org.apache.maven.model.building.ModelProblemCollector;
 import org.codehaus.plexus.component.annotations.Component;
 import org.codehaus.plexus.util.StringUtils;
 
@@ -50,78 +51,72 @@
 
     private static final String ID_REGEX = "[A-Za-z0-9_\\-.]+";
 
-    public ModelValidationResult validateRawModel( Model model, ModelBuildingRequest request )
+    public void validateRawModel( Model model, ModelBuildingRequest request, ModelProblemCollector problems )
     {
-        ModelValidationResult result = new ModelValidationResult();
-
         Parent parent = model.getParent();
         if ( parent != null )
         {
-            validateStringNotEmpty( "parent.groupId", result, false, parent.getGroupId() );
+            validateStringNotEmpty( "parent.groupId", problems, false, parent.getGroupId() );
 
-            validateStringNotEmpty( "parent.artifactId", result, false, parent.getArtifactId() );
+            validateStringNotEmpty( "parent.artifactId", problems, false, parent.getArtifactId() );
 
-            validateStringNotEmpty( "parent.version", result, false, parent.getVersion() );
+            validateStringNotEmpty( "parent.version", problems, false, parent.getVersion() );
 
             if ( parent.getGroupId().equals( model.getGroupId() )
                 && parent.getArtifactId().equals( model.getArtifactId() ) )
             {
-                addViolation( result, false, "The parent element cannot have the same ID as the project." );
+                addViolation( problems, false, "The parent element cannot have the same ID as the project." );
             }
         }
 
         if ( request.getValidationLevel() >= ModelBuildingRequest.VALIDATION_LEVEL_MAVEN_2_0 )
         {
-            validateDependencies( result, model.getDependencies(), "dependencies.dependency", request );
+            validateDependencies( problems, model.getDependencies(), "dependencies.dependency", request );
 
             if ( model.getDependencyManagement() != null )
             {
-                validateDependencies( result, model.getDependencyManagement().getDependencies(),
+                validateDependencies( problems, model.getDependencyManagement().getDependencies(),
                                       "dependencyManagement.dependencies.dependency", request );
             }
 
-            validateRepositories( result, model.getRepositories(), "repositories.repository", request );
+            validateRepositories( problems, model.getRepositories(), "repositories.repository", request );
 
-            validateRepositories( result, model.getPluginRepositories(), "pluginRepositories.pluginRepository", request );
+            validateRepositories( problems, model.getPluginRepositories(), "pluginRepositories.pluginRepository", request );
 
             for ( Profile profile : model.getProfiles() )
             {
-                validateDependencies( result, profile.getDependencies(), "profiles.profile[" + profile.getId()
+                validateDependencies( problems, profile.getDependencies(), "profiles.profile[" + profile.getId()
                     + "].dependencies.dependency", request );
 
                 if ( profile.getDependencyManagement() != null )
                 {
-                    validateDependencies( result, profile.getDependencyManagement().getDependencies(),
+                    validateDependencies( problems, profile.getDependencyManagement().getDependencies(),
                                           "profiles.profile[" + profile.getId()
                                               + "].dependencyManagement.dependencies.dependency", request );
                 }
 
-                validateRepositories( result, profile.getRepositories(), "profiles.profile[" + profile.getId()
+                validateRepositories( problems, profile.getRepositories(), "profiles.profile[" + profile.getId()
                     + "].repositories.repository", request );
 
-                validateRepositories( result, profile.getPluginRepositories(), "profiles.profile[" + profile.getId()
+                validateRepositories( problems, profile.getPluginRepositories(), "profiles.profile[" + profile.getId()
                     + "].pluginRepositories.pluginRepository", request );
             }
         }
-
-        return result;
     }
 
-    public ModelValidationResult validateEffectiveModel( Model model, ModelBuildingRequest request )
+    public void validateEffectiveModel( Model model, ModelBuildingRequest request, ModelProblemCollector problems )
     {
-        ModelValidationResult result = new ModelValidationResult();
+        validateStringNotEmpty( "modelVersion", problems, false, model.getModelVersion() );
 
-        validateStringNotEmpty( "modelVersion", result, false, model.getModelVersion() );
+        validateId( "groupId", problems, model.getGroupId() );
 
-        validateId( "groupId", result, model.getGroupId() );
+        validateId( "artifactId", problems, model.getArtifactId() );
 
-        validateId( "artifactId", result, model.getArtifactId() );
-
-        validateStringNotEmpty( "packaging", result, false, model.getPackaging() );
+        validateStringNotEmpty( "packaging", problems, false, model.getPackaging() );
 
         if ( !model.getModules().isEmpty() && !"pom".equals( model.getPackaging() ) )
         {
-            addViolation( result, false, "Packaging '" + model.getPackaging() + "' is invalid. Aggregator projects " +
+            addViolation( problems, false, "Packaging '" + model.getPackaging() + "' is invalid. Aggregator projects " +
                 "require 'pom' as packaging." );
         }
 
@@ -131,21 +126,21 @@
             if ( parent.getGroupId().equals( model.getGroupId() ) &&
                 parent.getArtifactId().equals( model.getArtifactId() ) )
             {
-                addViolation( result, false, "The parent element cannot have the same ID as the project." );
+                addViolation( problems, false, "The parent element cannot have the same ID as the project." );
             }
         }
 
-        validateStringNotEmpty( "version", result, false, model.getVersion() );
+        validateStringNotEmpty( "version", problems, false, model.getVersion() );
 
         for ( Dependency d : model.getDependencies() )
         {
-            validateId( "dependencies.dependency.artifactId", result, d.getArtifactId() );
+            validateId( "dependencies.dependency.artifactId", problems, d.getArtifactId() );
 
-            validateId( "dependencies.dependency.groupId", result, d.getGroupId() );
+            validateId( "dependencies.dependency.groupId", problems, d.getGroupId() );
 
-            validateStringNotEmpty( "dependencies.dependency.type", result, false, d.getType(), d.getManagementKey() );
+            validateStringNotEmpty( "dependencies.dependency.type", problems, false, d.getType(), d.getManagementKey() );
 
-            validateStringNotEmpty( "dependencies.dependency.version", result, false, d.getVersion(),
+            validateStringNotEmpty( "dependencies.dependency.version", problems, false, d.getVersion(),
                                     d.getManagementKey() );
 
             if ( "system".equals( d.getScope() ) )
@@ -154,20 +149,20 @@
 
                 if ( StringUtils.isEmpty( systemPath ) )
                 {
-                    addViolation( result, false, "For dependency " + d + ": system-scoped dependency must specify systemPath." );
+                    addViolation( problems, false, "For dependency " + d + ": system-scoped dependency must specify systemPath." );
                 }
                 else
                 {
                     if ( !new File( systemPath ).isAbsolute() )
                     {
-                        addViolation( result, false, "For dependency " + d + ": system-scoped dependency must " +
+                        addViolation( problems, false, "For dependency " + d + ": system-scoped dependency must " +
                             "specify an absolute path systemPath." );
                     }
                 }
             }
             else if ( StringUtils.isNotEmpty( d.getSystemPath() ) )
             {
-                addViolation( result, false,
+                addViolation( problems, false,
                     "For dependency " + d + ": only dependency with system scope can specify systemPath." );
             }
         }
@@ -177,10 +172,10 @@
         {
             for ( Dependency d : mgmt.getDependencies() )
             {
-                validateSubElementStringNotEmpty( d, "dependencyManagement.dependencies.dependency.artifactId", result,
+                validateSubElementStringNotEmpty( d, "dependencyManagement.dependencies.dependency.artifactId", problems,
                                                   d.getArtifactId() );
 
-                validateSubElementStringNotEmpty( d, "dependencyManagement.dependencies.dependency.groupId", result,
+                validateSubElementStringNotEmpty( d, "dependencyManagement.dependencies.dependency.groupId", problems,
                                                   d.getGroupId() );
 
                 if ( "system".equals( d.getScope() ) )
@@ -189,21 +184,21 @@
 
                     if ( StringUtils.isEmpty( systemPath ) )
                     {
-                        addViolation( result, false,
+                        addViolation( problems, false,
                             "For managed dependency " + d + ": system-scoped dependency must specify systemPath." );
                     }
                     else
                     {
                         if ( !new File( systemPath ).isAbsolute() )
                         {
-                            addViolation( result, false, "For managed dependency " + d + ": system-scoped dependency must " +
+                            addViolation( problems, false, "For managed dependency " + d + ": system-scoped dependency must " +
                                 "specify an absolute path systemPath." );
                         }
                     }
                 }
                 else if ( StringUtils.isNotEmpty( d.getSystemPath() ) )
                 {
-                    addViolation( result, false,
+                    addViolation( problems, false,
                         "For managed dependency " + d + ": only dependency with system scope can specify systemPath." );
                 }
             }
@@ -219,17 +214,17 @@
             {
                 for ( Plugin p : build.getPlugins() )
                 {
-                    validateStringNotEmpty( "build.plugins.plugin.artifactId", result, false, p.getArtifactId() );
+                    validateStringNotEmpty( "build.plugins.plugin.artifactId", problems, false, p.getArtifactId() );
 
-                    validateStringNotEmpty( "build.plugins.plugin.groupId", result, false, p.getGroupId() );
+                    validateStringNotEmpty( "build.plugins.plugin.groupId", problems, false, p.getGroupId() );
 
-                    validateStringNotEmpty( "build.plugins.plugin.version", result, warnOnMissingPluginVersion,
+                    validateStringNotEmpty( "build.plugins.plugin.version", problems, warnOnMissingPluginVersion,
                                             p.getVersion(), p.getKey() );
                 }
 
-                validateResources( result, build.getResources(), "build.resources.resource" );
+                validateResources( problems, build.getResources(), "build.resources.resource" );
 
-                validateResources( result, build.getTestResources(), "build.testResources.testResource" );
+                validateResources( problems, build.getTestResources(), "build.testResources.testResource" );
             }
 
             Reporting reporting = model.getReporting();
@@ -237,24 +232,22 @@
             {
                 for ( ReportPlugin p : reporting.getPlugins() )
                 {
-                    validateStringNotEmpty( "reporting.plugins.plugin.artifactId", result, false, p.getArtifactId() );
+                    validateStringNotEmpty( "reporting.plugins.plugin.artifactId", problems, false, p.getArtifactId() );
 
-                    validateStringNotEmpty( "reporting.plugins.plugin.groupId", result, false, p.getGroupId() );
+                    validateStringNotEmpty( "reporting.plugins.plugin.groupId", problems, false, p.getGroupId() );
 
-                    validateStringNotEmpty( "reporting.plugins.plugin.version", result, warnOnMissingPluginVersion,
+                    validateStringNotEmpty( "reporting.plugins.plugin.version", problems, warnOnMissingPluginVersion,
                                             p.getVersion(), p.getKey() );
                 }
             }
 
-            forcePluginExecutionIdCollision( model, result );
+            forcePluginExecutionIdCollision( model, problems );
         }
-
-        return result;
     }
 
-    private boolean validateId( String fieldName, ModelValidationResult result, String id )
+    private boolean validateId( String fieldName, ModelProblemCollector problems, String id )
     {
-        if ( !validateStringNotEmpty( fieldName, result, false, id ) )
+        if ( !validateStringNotEmpty( fieldName, problems, false, id ) )
         {
             return false;
         }
@@ -263,13 +256,13 @@
             boolean match = id.matches( ID_REGEX );
             if ( !match )
             {
-                addViolation( result, false, "'" + fieldName + "' with value '" + id + "' does not match a valid id pattern." );
+                addViolation( problems, false, "'" + fieldName + "' with value '" + id + "' does not match a valid id pattern." );
             }
             return match;
         }
     }
 
-    private void validateDependencies( ModelValidationResult result, List<Dependency> dependencies, String prefix,
+    private void validateDependencies( ModelProblemCollector problems, List<Dependency> dependencies, String prefix,
                                        ModelBuildingRequest request )
     {
         Map<String, Dependency> index = new HashMap<String, Dependency>();
@@ -281,7 +274,7 @@
             if ( "pom".equals( dependency.getType() ) && "import".equals( dependency.getScope() )
                 && StringUtils.isNotEmpty( dependency.getClassifier() ) )
             {
-                addViolation( result, false, "'" + prefix + ".classifier' must be empty for imported POM: " + key );
+                addViolation( problems, false, "'" + prefix + ".classifier' must be empty for imported POM: " + key );
             }
 
             Dependency existing = index.get( key );
@@ -290,7 +283,7 @@
             {
                 boolean warning = request.getValidationLevel() < ModelBuildingRequest.VALIDATION_LEVEL_MAVEN_3_0;
 
-                addViolation( result, warning, "'" + prefix + ".(groupId:artifactId:type:classifier)' must be unique: "
+                addViolation( problems, warning, "'" + prefix + ".(groupId:artifactId:type:classifier)' must be unique: "
                     + key + " -> " + existing.getVersion() + " vs " + dependency.getVersion() );
             }
             else
@@ -300,16 +293,16 @@
         }
     }
 
-    private void validateRepositories( ModelValidationResult result, List<Repository> repositories, String prefix,
+    private void validateRepositories( ModelProblemCollector problems, List<Repository> repositories, String prefix,
                                        ModelBuildingRequest request )
     {
         Map<String, Repository> index = new HashMap<String, Repository>();
 
         for ( Repository repository : repositories )
         {
-            validateStringNotEmpty( prefix + ".id", result, false, repository.getId() );
+            validateStringNotEmpty( prefix + ".id", problems, false, repository.getId() );
 
-            validateStringNotEmpty( prefix + ".url", result, false, repository.getUrl() );
+            validateStringNotEmpty( prefix + ".url", problems, false, repository.getUrl() );
 
             String key = repository.getId();
 
@@ -319,7 +312,7 @@
             {
                 boolean warning = request.getValidationLevel() < ModelBuildingRequest.VALIDATION_LEVEL_MAVEN_3_0;
 
-                addViolation( result, warning, "'" + prefix + ".id' must be unique: " + repository.getId() + " -> "
+                addViolation( problems, warning, "'" + prefix + ".id' must be unique: " + repository.getId() + " -> "
                     + existing.getUrl() + " vs " + repository.getUrl() );
             }
             else
@@ -329,15 +322,15 @@
         }
     }
 
-    private void validateResources( ModelValidationResult result, List<Resource> resources, String prefix )
+    private void validateResources( ModelProblemCollector problems, List<Resource> resources, String prefix )
     {
         for ( Resource resource : resources )
         {
-            validateStringNotEmpty( prefix + ".directory", result, false, resource.getDirectory() );
+            validateStringNotEmpty( prefix + ".directory", problems, false, resource.getDirectory() );
         }
     }
 
-    private void forcePluginExecutionIdCollision( Model model, ModelValidationResult result )
+    private void forcePluginExecutionIdCollision( Model model, ModelProblemCollector problems )
     {
         Build build = model.getBuild();
 
@@ -356,7 +349,7 @@
                     }
                     catch ( IllegalStateException collisionException )
                     {
-                        addViolation( result, false, collisionException.getMessage() );
+                        addViolation( problems, false, collisionException.getMessage() );
                     }
                 }
             }
@@ -367,9 +360,9 @@
     // Field validation
     // ----------------------------------------------------------------------
 
-    private boolean validateStringNotEmpty( String fieldName, ModelValidationResult result, boolean warning, String string )
+    private boolean validateStringNotEmpty( String fieldName, ModelProblemCollector problems, boolean warning, String string )
     {
-        return validateStringNotEmpty( fieldName, result, warning, string, null );
+        return validateStringNotEmpty( fieldName, problems, warning, string, null );
     }
 
     /**
@@ -380,10 +373,10 @@
      * <li><code>string.length > 0</code>
      * </ul>
      */
-    private boolean validateStringNotEmpty( String fieldName, ModelValidationResult result, boolean warning,
+    private boolean validateStringNotEmpty( String fieldName, ModelProblemCollector problems, boolean warning,
                                             String string, String sourceHint )
     {
-        if ( !validateNotNull( fieldName, result, warning, string, sourceHint ) )
+        if ( !validateNotNull( fieldName, problems, warning, string, sourceHint ) )
         {
             return false;
         }
@@ -395,11 +388,11 @@
 
         if ( sourceHint != null )
         {
-            addViolation( result, false, "'" + fieldName + "' is missing for " + sourceHint );
+            addViolation( problems, false, "'" + fieldName + "' is missing for " + sourceHint );
         }
         else
         {
-            addViolation( result, false, "'" + fieldName + "' is missing." );
+            addViolation( problems, false, "'" + fieldName + "' is missing." );
         }
 
         return false;
@@ -414,9 +407,9 @@
      * </ul>
      */
     private boolean validateSubElementStringNotEmpty( Object subElementInstance, String fieldName,
-                                                      ModelValidationResult result, String string )
+                                                      ModelProblemCollector problems, String string )
     {
-        if ( !validateSubElementNotNull( subElementInstance, fieldName, result, string ) )
+        if ( !validateSubElementNotNull( subElementInstance, fieldName, problems, string ) )
         {
             return false;
         }
@@ -426,7 +419,7 @@
             return true;
         }
 
-        addViolation( result, false, "In " + subElementInstance + ":\n\n       -> '" + fieldName + "' is missing." );
+        addViolation( problems, false, "In " + subElementInstance + ":\n\n       -> '" + fieldName + "' is missing." );
 
         return false;
     }
@@ -438,7 +431,7 @@
      * <li><code>string != null</code>
      * </ul>
      */
-    private boolean validateNotNull( String fieldName, ModelValidationResult result, boolean warning, Object object, String sourceHint )
+    private boolean validateNotNull( String fieldName, ModelProblemCollector problems, boolean warning, Object object, String sourceHint )
     {
         if ( object != null )
         {
@@ -447,11 +440,11 @@
 
         if ( sourceHint != null )
         {
-            addViolation( result, warning, "'" + fieldName + "' is missing for " + sourceHint );
+            addViolation( problems, warning, "'" + fieldName + "' is missing for " + sourceHint );
         }
         else
         {
-            addViolation( result, warning, "'" + fieldName + "' is missing." );
+            addViolation( problems, warning, "'" + fieldName + "' is missing." );
         }
 
         return false;
@@ -465,27 +458,27 @@
      * </ul>
      */
     private boolean validateSubElementNotNull( Object subElementInstance, String fieldName,
-                                               ModelValidationResult result, Object object )
+                                               ModelProblemCollector problems, Object object )
     {
         if ( object != null )
         {
             return true;
         }
 
-        addViolation( result, false, "In " + subElementInstance + ":\n\n       -> '" + fieldName + "' is missing." );
+        addViolation( problems, false, "In " + subElementInstance + ":\n\n       -> '" + fieldName + "' is missing." );
 
         return false;
     }
 
-    private void addViolation( ModelValidationResult result, boolean warning, String message )
+    private void addViolation( ModelProblemCollector problems, boolean warning, String message )
     {
         if ( warning )
         {
-            result.addWarning( message );
+            problems.addWarning( message );
         }
         else
         {
-            result.addError( message );
+            problems.addError( message );
         }
     }
 

Modified: maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/validation/ModelValidator.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/validation/ModelValidator.java?rev=800451&r1=800450&r2=800451&view=diff
==============================================================================
--- maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/validation/ModelValidator.java (original)
+++ maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/validation/ModelValidator.java Mon Aug  3 16:20:06 2009
@@ -21,6 +21,7 @@
 
 import org.apache.maven.model.Model;
 import org.apache.maven.model.building.ModelBuildingRequest;
+import org.apache.maven.model.building.ModelProblemCollector;
 
 /**
  * Checks the model for missing or invalid values.
@@ -37,9 +38,9 @@
      * 
      * @param model The model to validate, must not be {@code null}.
      * @param request The model building request that holds further settings, must not be {@code null}.
-     * @return The result of the validation, never {@code null}.
+     * @param problems The container used to collect problems that were encountered, must not be {@code null}.
      */
-    ModelValidationResult validateRawModel( Model model, ModelBuildingRequest request );
+    void validateRawModel( Model model, ModelBuildingRequest request, ModelProblemCollector problems );
 
     /**
      * Checks the specified (effective) model for missing or invalid values. The effective model is fully assembled and
@@ -47,8 +48,8 @@
      * 
      * @param model The model to validate, must not be {@code null}.
      * @param request The model building request that holds further settings, must not be {@code null}.
-     * @return The result of the validation, never {@code null}.
+     * @param problems The container used to collect problems that were encountered, must not be {@code null}.
      */
-    ModelValidationResult validateEffectiveModel( Model model, ModelBuildingRequest request );
+    void validateEffectiveModel( Model model, ModelBuildingRequest request, ModelProblemCollector problems );
 
 }

Modified: maven/components/trunk/maven-model-builder/src/test/java/org/apache/maven/model/validation/DefaultModelValidatorTest.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-model-builder/src/test/java/org/apache/maven/model/validation/DefaultModelValidatorTest.java?rev=800451&r1=800450&r2=800451&view=diff
==============================================================================
--- maven/components/trunk/maven-model-builder/src/test/java/org/apache/maven/model/validation/DefaultModelValidatorTest.java (original)
+++ maven/components/trunk/maven-model-builder/src/test/java/org/apache/maven/model/validation/DefaultModelValidatorTest.java Mon Aug  3 16:20:06 2009
@@ -20,11 +20,13 @@
  */
 
 import java.io.InputStream;
+import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.maven.model.Model;
 import org.apache.maven.model.building.DefaultModelBuildingRequest;
 import org.apache.maven.model.building.ModelBuildingRequest;
+import org.apache.maven.model.building.ModelProblemCollector;
 import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
 import org.codehaus.plexus.PlexusTestCase;
 
@@ -38,6 +40,46 @@
 
     private DefaultModelValidator validator;
 
+    private static class SimpleProblemCollector
+        implements ModelProblemCollector
+    {
+
+        private List<String> warnings = new ArrayList<String>();
+
+        private List<String> errors = new ArrayList<String>();
+
+        public void addError( String message )
+        {
+            errors.add( message );
+        }
+
+        public void addError( String message, Exception cause )
+        {
+            addError( message );
+        }
+
+        public void addWarning( String message )
+        {
+            warnings.add( message );
+        }
+
+        public void addWarning( String message, Exception cause )
+        {
+            addWarning( message );
+        }
+
+        public List<String> getWarnings()
+        {
+            return warnings;
+        }
+
+        public List<String> getErrors()
+        {
+            return errors;
+        }
+
+    }
+
     private Model read( String pom )
         throws Exception
     {
@@ -47,26 +89,34 @@
         return new MavenXpp3Reader().read( is );
     }
 
-    private ModelValidationResult validate( String pom )
+    private SimpleProblemCollector validate( String pom )
         throws Exception
     {
         return validateEffective( pom, ModelBuildingRequest.VALIDATION_LEVEL_STRICT );
     }
 
-    private ModelValidationResult validateEffective( String pom, int level )
+    private SimpleProblemCollector validateEffective( String pom, int level )
         throws Exception
     {
         ModelBuildingRequest request = new DefaultModelBuildingRequest().setValidationLevel( level );
 
-        return validator.validateEffectiveModel( read( pom ), request );
+        SimpleProblemCollector problems = new SimpleProblemCollector();
+
+        validator.validateEffectiveModel( read( pom ), request, problems );
+
+        return problems;
     }
 
-    private ModelValidationResult validateRaw( String pom, int level )
+    private SimpleProblemCollector validateRaw( String pom, int level )
         throws Exception
     {
         ModelBuildingRequest request = new DefaultModelBuildingRequest().setValidationLevel( level );
 
-        return validator.validateRawModel( read( pom ), request );
+        SimpleProblemCollector problems = new SimpleProblemCollector();
+
+        validator.validateRawModel( read( pom ), request, problems );
+
+        return problems;
     }
 
     @Override
@@ -87,7 +137,7 @@
         super.tearDown();
     }
 
-    private void assertViolations( ModelValidationResult result, int errors, int warnings )
+    private void assertViolations( SimpleProblemCollector result, int errors, int warnings )
     {
         assertEquals( errors, result.getErrors().size() );
         assertEquals( warnings, result.getWarnings().size() );
@@ -96,7 +146,7 @@
     public void testMissingModelVersion()
         throws Exception
     {
-        ModelValidationResult result = validate( "missing-modelVersion-pom.xml" );
+        SimpleProblemCollector result = validate( "missing-modelVersion-pom.xml" );
 
         assertViolations( result, 1, 0 );
 
@@ -106,7 +156,7 @@
     public void testMissingArtifactId()
         throws Exception
     {
-        ModelValidationResult result = validate( "missing-artifactId-pom.xml" );
+        SimpleProblemCollector result = validate( "missing-artifactId-pom.xml" );
 
         assertViolations( result, 1, 0 );
 
@@ -116,7 +166,7 @@
     public void testMissingGroupId()
         throws Exception
     {
-        ModelValidationResult result = validate( "missing-groupId-pom.xml" );
+        SimpleProblemCollector result = validate( "missing-groupId-pom.xml" );
 
         assertViolations( result, 1, 0 );
 
@@ -126,7 +176,7 @@
     public void testInvalidIds()
         throws Exception
     {
-        ModelValidationResult result = validate( "invalid-ids-pom.xml" );
+        SimpleProblemCollector result = validate( "invalid-ids-pom.xml" );
 
         assertViolations( result, 2, 0 );
 
@@ -138,7 +188,7 @@
     public void testMissingType()
         throws Exception
     {
-        ModelValidationResult result = validate( "missing-type-pom.xml" );
+        SimpleProblemCollector result = validate( "missing-type-pom.xml" );
 
         assertViolations( result, 1, 0 );
 
@@ -148,7 +198,7 @@
     public void testMissingVersion()
         throws Exception
     {
-        ModelValidationResult result = validate( "missing-version-pom.xml" );
+        SimpleProblemCollector result = validate( "missing-version-pom.xml" );
 
         assertViolations( result, 1, 0 );
 
@@ -158,7 +208,7 @@
     public void testInvalidAggregatorPackaging()
         throws Exception
     {
-        ModelValidationResult result = validate( "invalid-aggregator-packaging-pom.xml" );
+        SimpleProblemCollector result = validate( "invalid-aggregator-packaging-pom.xml" );
 
         assertViolations( result, 1, 0 );
 
@@ -168,7 +218,7 @@
     public void testMissingDependencyArtifactId()
         throws Exception
     {
-        ModelValidationResult result = validate( "missing-dependency-artifactId-pom.xml" );
+        SimpleProblemCollector result = validate( "missing-dependency-artifactId-pom.xml" );
 
         assertViolations( result, 1, 0 );
 
@@ -178,7 +228,7 @@
     public void testMissingDependencyGroupId()
         throws Exception
     {
-        ModelValidationResult result = validate( "missing-dependency-groupId-pom.xml" );
+        SimpleProblemCollector result = validate( "missing-dependency-groupId-pom.xml" );
 
         assertViolations( result, 1, 0 );
 
@@ -188,7 +238,7 @@
     public void testMissingDependencyVersion()
         throws Exception
     {
-        ModelValidationResult result = validate( "missing-dependency-version-pom.xml" );
+        SimpleProblemCollector result = validate( "missing-dependency-version-pom.xml" );
 
         assertViolations( result, 1, 0 );
 
@@ -198,7 +248,7 @@
     public void testMissingDependencyManagementArtifactId()
         throws Exception
     {
-        ModelValidationResult result = validate( "missing-dependency-mgmt-artifactId-pom.xml" );
+        SimpleProblemCollector result = validate( "missing-dependency-mgmt-artifactId-pom.xml" );
 
         assertViolations( result, 1, 0 );
 
@@ -209,7 +259,7 @@
     public void testMissingDependencyManagementGroupId()
         throws Exception
     {
-        ModelValidationResult result = validate( "missing-dependency-mgmt-groupId-pom.xml" );
+        SimpleProblemCollector result = validate( "missing-dependency-mgmt-groupId-pom.xml" );
 
         assertViolations( result, 1, 0 );
 
@@ -220,7 +270,7 @@
     public void testMissingAll()
         throws Exception
     {
-        ModelValidationResult result = validate( "missing-1-pom.xml" );
+        SimpleProblemCollector result = validate( "missing-1-pom.xml" );
 
         assertViolations( result, 4, 0 );
 
@@ -236,7 +286,7 @@
     public void testMissingPluginArtifactId()
         throws Exception
     {
-        ModelValidationResult result = validate( "missing-plugin-artifactId-pom.xml" );
+        SimpleProblemCollector result = validate( "missing-plugin-artifactId-pom.xml" );
 
         assertViolations( result, 1, 0 );
 
@@ -246,7 +296,7 @@
     public void testMissingPluginVersion()
         throws Exception
     {
-        ModelValidationResult result =
+        SimpleProblemCollector result =
             validateEffective( "missing-plugin-version-pom.xml", ModelBuildingRequest.VALIDATION_LEVEL_MAVEN_3_1 );
 
         assertViolations( result, 1, 0 );
@@ -262,7 +312,7 @@
     public void testMissingRepositoryId()
         throws Exception
     {
-        ModelValidationResult result =
+        SimpleProblemCollector result =
             validateRaw( "missing-repository-id-pom.xml", ModelBuildingRequest.VALIDATION_LEVEL_STRICT );
 
         assertViolations( result, 4, 0 );
@@ -279,7 +329,7 @@
     public void testMissingResourceDirectory()
         throws Exception
     {
-        ModelValidationResult result = validate( "missing-resource-directory-pom.xml" );
+        SimpleProblemCollector result = validate( "missing-resource-directory-pom.xml" );
 
         assertViolations( result, 2, 0 );