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 16:58:05 UTC

svn commit: r800413 - in /maven/components/trunk: maven-core/src/main/java/org/apache/maven/model/plugin/ maven-model-builder/src/main/java/org/apache/maven/model/building/ maven-model-builder/src/main/java/org/apache/maven/model/plugin/

Author: bentmann
Date: Mon Aug  3 14:58:05 2009
New Revision: 800413

URL: http://svn.apache.org/viewvc?rev=800413&view=rev
Log:
o Reworked handling of model problems to allow for easier reusage across all the other model diddling components

Added:
    maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelProblemCollector.java   (with props)
    maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelProblemCollector.java   (with props)
Removed:
    maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuildingProblems.java
    maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelBuildingProblems.java
Modified:
    maven/components/trunk/maven-core/src/main/java/org/apache/maven/model/plugin/DefaultLifecycleBindingsInjector.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/ModelProblemUtils.java
    maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/plugin/LifecycleBindingsInjector.java

Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/model/plugin/DefaultLifecycleBindingsInjector.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/model/plugin/DefaultLifecycleBindingsInjector.java?rev=800413&r1=800412&r2=800413&view=diff
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/model/plugin/DefaultLifecycleBindingsInjector.java (original)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/model/plugin/DefaultLifecycleBindingsInjector.java Mon Aug  3 14:58:05 2009
@@ -32,9 +32,7 @@
 import org.apache.maven.model.Model;
 import org.apache.maven.model.Plugin;
 import org.apache.maven.model.PluginContainer;
-import org.apache.maven.model.building.ModelBuildingProblems;
-import org.apache.maven.model.building.ModelProblem;
-import org.apache.maven.model.building.ModelProblemUtils;
+import org.apache.maven.model.building.ModelProblemCollector;
 import org.apache.maven.model.merge.MavenModelMerger;
 import org.codehaus.plexus.component.annotations.Component;
 import org.codehaus.plexus.component.annotations.Requirement;
@@ -54,7 +52,7 @@
     @Requirement
     private LifecycleExecutor lifecycle;
 
-    public void injectLifecycleBindings( Model model, ModelBuildingProblems problems )
+    public void injectLifecycleBindings( Model model, ModelProblemCollector problems )
     {
         String packaging = model.getPackaging();
 
@@ -62,9 +60,7 @@
 
         if ( defaultPlugins == null )
         {
-            String source = ModelProblemUtils.toSourceHint( model );
-            problems.add( new ModelProblem( "Invalid POM " + source + ": Unknown packaging: " + packaging,
-                                            ModelProblem.Severity.ERROR, source ) );
+            problems.addError( "Unknown packaging: " + packaging );
         }
         else if ( !defaultPlugins.isEmpty() )
         {

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=800413&r1=800412&r2=800413&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 14:58:05 2009
@@ -115,10 +115,11 @@
     {
         DefaultModelBuildingResult result = new DefaultModelBuildingResult();
 
-        DefaultModelBuildingProblems problems = new DefaultModelBuildingProblems( null );
+        DefaultModelProblemCollector problems = new DefaultModelProblemCollector( null );
 
         ProfileActivationContext profileActivationContext = getProfileActivationContext( request );
 
+        problems.setSourceHint( "(external profiles)" );
         List<Profile> activeExternalProfiles = getActiveExternalProfiles( request, profileActivationContext, problems );
 
         Model inputModel = readModel( request.getModelSource(), request.getPomFile(), request, problems.getProblems() );
@@ -136,6 +137,8 @@
             Model rawModel = ModelUtils.cloneModel( tmpModel );
             currentData.setRawModel( rawModel );
 
+            problems.setSourceHint( tmpModel );
+
             modelNormalizer.mergeDuplicates( tmpModel, request );
 
             List<Profile> activePomProfiles = getActivePomProfiles( rawModel, profileActivationContext, problems );
@@ -168,6 +171,8 @@
 
         Model resultModel = resultData.getModel();
 
+        problems.setSourceHint( resultModel );
+
         resultModel = interpolateModel( resultModel, request, problems );
         resultData.setModel( resultModel );
 
@@ -203,7 +208,8 @@
     {
         Model resultModel = result.getEffectiveModel();
 
-        DefaultModelBuildingProblems problems = new DefaultModelBuildingProblems( result.getProblems() );
+        DefaultModelProblemCollector problems = new DefaultModelProblemCollector( result.getProblems() );
+        problems.setSourceHint( resultModel );
 
         modelPathTranslator.alignToBaseDirectory( resultModel, resultModel.getProjectDirectory(), request );
 
@@ -338,43 +344,42 @@
     }
 
     private List<Profile> getActiveExternalProfiles( ModelBuildingRequest request, ProfileActivationContext context,
-                                                     ModelBuildingProblems problems )
+                                                     ModelProblemCollector problems )
     {
         ProfileSelectionResult result = profileSelector.getActiveProfiles( request.getProfiles(), context );
 
         for ( ProfileActivationException e : result.getActivationExceptions() )
         {
-            problems.add( new ModelProblem( "Invalid activation condition for external profile "
-                + e.getProfile().getId() + ": " + e.getMessage(), ModelProblem.Severity.ERROR, "(external profiles)", e ) );
+            problems.addError( "Invalid activation condition for external profile " + e.getProfile().getId() + ": "
+                + e.getMessage(), e );
         }
 
         return result.getActiveProfiles();
     }
 
     private List<Profile> getActivePomProfiles( Model model, ProfileActivationContext context,
-                                                ModelBuildingProblems problems )
+                                                ModelProblemCollector problems )
     {
         ProfileSelectionResult result = profileSelector.getActiveProfiles( model.getProfiles(), context );
 
         for ( ProfileActivationException e : result.getActivationExceptions() )
         {
-            problems.add( new ModelProblem(
-                                            "Invalid activation condition for project profile "
-                                                + e.getProfile().getId() + " in POM "
-                                                + ModelProblemUtils.toSourceHint( model ) + ": " + e.getMessage(),
-                                            ModelProblem.Severity.ERROR, ModelProblemUtils.toSourceHint( model ), e ) );
+            problems.addError( "Invalid activation condition for project profile " + e.getProfile().getId() + ": "
+                + e.getMessage(), e );
         }
 
         return result.getActiveProfiles();
     }
 
-    private void configureResolver( ModelResolver modelResolver, Model model, ModelBuildingProblems problems )
+    private void configureResolver( ModelResolver modelResolver, Model model, DefaultModelProblemCollector problems )
     {
         if ( modelResolver == null )
         {
             return;
         }
 
+        problems.setSourceHint( model );
+
         List<Repository> repositories = model.getRepositories();
         Collections.reverse( repositories );
 
@@ -386,9 +391,7 @@
             }
             catch ( InvalidRepositoryException e )
             {
-                problems.add( new ModelProblem( "Invalid repository " + repository.getId() + " in POM "
-                    + ModelProblemUtils.toSourceHint( model ) + ": " + e.getMessage(), ModelProblem.Severity.ERROR,
-                                                ModelProblemUtils.toSourceHint( model ), e ) );
+                problems.addError( "Invalid repository " + repository.getId() + ": " + e.getMessage(), e );
             }
         }
     }
@@ -403,7 +406,7 @@
         }
     }
 
-    private Model interpolateModel( Model model, ModelBuildingRequest request, ModelBuildingProblems problems )
+    private Model interpolateModel( Model model, ModelBuildingRequest request, ModelProblemCollector problems )
     {
         try
         {
@@ -413,8 +416,7 @@
         }
         catch ( ModelInterpolationException e )
         {
-            problems.add( new ModelProblem( "Invalid expression in POM " + ModelProblemUtils.toSourceHint( model )
-                + ": " + e.getMessage(), ModelProblem.Severity.ERROR, ModelProblemUtils.toSourceHint( model ), e ) );
+            problems.addError( "Invalid expression: " + e.getMessage(), e );
 
             return model;
         }
@@ -585,7 +587,8 @@
         return ModelUtils.cloneModel( superPomProvider.getSuperModel( "4.0.0" ) );
     }
 
-    private void importDependencyManagement( Model model, ModelBuildingRequest request, ModelBuildingProblems problems )
+    private void importDependencyManagement( Model model, ModelBuildingRequest request,
+                                             DefaultModelProblemCollector problems )
     {
         DependencyManagement depMngt = model.getDependencyManagement();
 
@@ -634,10 +637,8 @@
                 }
                 catch ( UnresolvableModelException e )
                 {
-                    problems.add( new ModelProblem( "Non-resolvable import POM "
-                        + ModelProblemUtils.toId( groupId, artifactId, version ) + " for POM "
-                        + ModelProblemUtils.toSourceHint( model ) + ": " + e.getMessage(), ModelProblem.Severity.ERROR,
-                                                    ModelProblemUtils.toSourceHint( model ), e ) );
+                    problems.addError( "Non-resolvable import POM "
+                        + ModelProblemUtils.toId( groupId, artifactId, version ) + ": " + e.getMessage(), e );
                     continue;
                 }
 
@@ -657,11 +658,11 @@
                 }
                 catch ( ModelBuildingException e )
                 {
-                    problems.addAll( e.getProblems() );
+                    problems.getProblems().addAll( e.getProblems() );
                     continue;
                 }
 
-                problems.addAll( importResult.getProblems() );
+                problems.getProblems().addAll( importResult.getProblems() );
 
                 Model importModel = importResult.getEffectiveModel();
 
@@ -709,7 +710,7 @@
         return null;
     }
 
-    private void fireBuildExtensionsAssembled( Model model, ModelBuildingRequest request, ModelBuildingProblems problems )
+    private void fireBuildExtensionsAssembled( Model model, ModelBuildingRequest request, ModelProblemCollector problems )
         throws ModelBuildingException
     {
         if ( request.getModelBuildingListeners().isEmpty() )
@@ -727,8 +728,7 @@
             }
             catch ( Exception e )
             {
-                problems.add( new ModelProblem( "Invalid build extensions: " + e.getMessage(),
-                                                ModelProblem.Severity.ERROR, ModelProblemUtils.toSourceHint( model ), e ) );
+                problems.addError( "Invalid build extensions: " + e.getMessage(), e );
             }
         }
     }

Added: 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=800413&view=auto
==============================================================================
--- maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelProblemCollector.java (added)
+++ maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelProblemCollector.java Mon Aug  3 14:58:05 2009
@@ -0,0 +1,97 @@
+package org.apache.maven.model.building;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.maven.model.Model;
+
+/**
+ * Collects problems that are encountered during model building. The primary purpose of this component is to account for
+ * the fact that the problem reporter has/should not have information about the calling context and hence cannot provide
+ * an expressive source hint for the model problem. Instead, the source hint is configured by the model builder before
+ * it delegates to other components that potentially encounter problems. Then, the problem reporter can focus on
+ * providing a simple error message, leaving the donkey work of creating a nice model problem to this component.
+ * 
+ * @author Benjamin Bentmann
+ */
+class DefaultModelProblemCollector
+    implements ModelProblemCollector
+{
+
+    private List<ModelProblem> problems;
+
+    private String sourceHint;
+
+    private Model sourceModel;
+
+    public DefaultModelProblemCollector( List<ModelProblem> problems )
+    {
+        this.problems = ( problems != null ) ? problems : new ArrayList<ModelProblem>();
+    }
+
+    public List<ModelProblem> getProblems()
+    {
+        return problems;
+    }
+
+    public void setSourceHint( String sourceHint )
+    {
+        this.sourceHint = sourceHint;
+        this.sourceModel = null;
+    }
+
+    public void setSourceHint( Model sourceModel )
+    {
+        this.sourceModel = sourceModel;
+        this.sourceHint = null;
+    }
+
+    private String getSourceHint()
+    {
+        if ( sourceHint == null && sourceModel != null )
+        {
+            sourceHint = ModelProblemUtils.toSourceHint( sourceModel );
+        }
+        return sourceHint;
+    }
+
+    public void addError( String message )
+    {
+        problems.add( new ModelProblem( message, ModelProblem.Severity.ERROR, getSourceHint() ) );
+    }
+
+    public void addError( String message, Exception cause )
+    {
+        problems.add( new ModelProblem( message, ModelProblem.Severity.ERROR, getSourceHint(), cause ) );
+    }
+
+    public void addWarning( String message )
+    {
+        problems.add( new ModelProblem( message, ModelProblem.Severity.WARNING, getSourceHint() ) );
+    }
+
+    public void addWarning( String message, Exception cause )
+    {
+        problems.add( new ModelProblem( message, ModelProblem.Severity.WARNING, getSourceHint(), cause ) );
+    }
+
+}

Propchange: maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelProblemCollector.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelProblemCollector.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelProblemCollector.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelProblemCollector.java?rev=800413&view=auto
==============================================================================
--- maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelProblemCollector.java (added)
+++ maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelProblemCollector.java Mon Aug  3 14:58:05 2009
@@ -0,0 +1,60 @@
+package org.apache.maven.model.building;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/**
+ * Collects problems that are encountered during model building.
+ * 
+ * @author Benjamin Bentmann
+ */
+public interface ModelProblemCollector
+{
+
+    /**
+     * Adds the specified error.
+     * 
+     * @param message The detail message of the error, may be {@code null}.
+     */
+    void addError( String message );
+
+    /**
+     * Adds the specified error.
+     * 
+     * @param message The detail message of the error, may be {@code null}.
+     * @param cause The cause of the error, may be {@code null}.
+     */
+    void addError( String message, Exception cause );
+
+    /**
+     * Adds the specified warning.
+     * 
+     * @param message The detail message of the warning, may be {@code null}.
+     */
+    void addWarning( String message );
+
+    /**
+     * Adds the specified warning.
+     * 
+     * @param message The detail message of the warning, may be {@code null}.
+     * @param cause The cause of the warning, may be {@code null}.
+     */
+    void addWarning( String message, Exception cause );
+
+}

Propchange: maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelProblemCollector.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelProblemCollector.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Modified: maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelProblemUtils.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelProblemUtils.java?rev=800413&r1=800412&r2=800413&view=diff
==============================================================================
--- maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelProblemUtils.java (original)
+++ maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelProblemUtils.java Mon Aug  3 14:58:05 2009
@@ -28,7 +28,7 @@
  * 
  * @author Benjamin Bentmann
  */
-public class ModelProblemUtils
+class ModelProblemUtils
 {
 
     /**

Modified: maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/plugin/LifecycleBindingsInjector.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/plugin/LifecycleBindingsInjector.java?rev=800413&r1=800412&r2=800413&view=diff
==============================================================================
--- maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/plugin/LifecycleBindingsInjector.java (original)
+++ maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/plugin/LifecycleBindingsInjector.java Mon Aug  3 14:58:05 2009
@@ -20,7 +20,7 @@
  */
 
 import org.apache.maven.model.Model;
-import org.apache.maven.model.building.ModelBuildingProblems;
+import org.apache.maven.model.building.ModelProblemCollector;
 
 /**
  * Handles injection of plugin executions induced by the lifecycle bindings for a packaging.
@@ -37,6 +37,6 @@
      *            <code>null</code>.
      * @param problems The container used to collect problems that were encountered, must not be {@code null}.
      */
-    void injectLifecycleBindings( Model model, ModelBuildingProblems problems );
+    void injectLifecycleBindings( Model model, ModelProblemCollector problems );
 
 }