Author: bentmann
Date: Sun Sep 13 15:09:33 2009
New Revision: 814330

URL: http://svn.apache.org/viewvc?rev=814330&view=rev
Log:
o Revised ModelProblem to provide more detailed information about problem 
location

Modified:
    
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/DefaultMaven.java
    
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java
    
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/ProjectBuildingException.java
    
maven/maven-3/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java
    
maven/maven-3/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelProblem.java
    
maven/maven-3/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelProblemCollector.java
    
maven/maven-3/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelBuildingException.java
    
maven/maven-3/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelProblem.java
    
maven/maven-3/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelProblemCollector.java
    
maven/maven-3/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelProblemUtils.java

Modified: 
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/DefaultMaven.java
URL: 
http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/DefaultMaven.java?rev=814330&r1=814329&r2=814330&view=diff
==============================================================================
--- 
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/DefaultMaven.java 
(original)
+++ 
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/DefaultMaven.java 
Sun Sep 13 15:09:33 2009
@@ -326,7 +326,7 @@
 
                 for ( ModelProblem problem : result.getProblems() )
                 {
-                    logger.warn( problem.getMessage() + " @ " + 
problem.getSource() );
+                    logger.warn( problem.getMessage() + " @ " + 
problem.getLocation() );
                 }
 
                 logger.warn( "" );

Modified: 
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java
URL: 
http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java?rev=814330&r1=814329&r2=814330&view=diff
==============================================================================
--- 
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java
 (original)
+++ 
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java
 Sun Sep 13 15:09:33 2009
@@ -356,7 +356,7 @@
                         {
                             ModelProblem problem =
                                 new DefaultModelProblem( "Child module " + 
moduleFile + " of " + pomFile
-                                    + " does not exist", 
ModelProblem.Severity.ERROR, model );
+                                    + " does not exist", 
ModelProblem.Severity.ERROR, model, -1, -1, null );
                             result.getProblems().add( problem );
 
                             errors = true;

Modified: 
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/ProjectBuildingException.java
URL: 
http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/ProjectBuildingException.java?rev=814330&r1=814329&r2=814330&view=diff
==============================================================================
--- 
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/ProjectBuildingException.java
 (original)
+++ 
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/project/ProjectBuildingException.java
 Sun Sep 13 15:09:33 2009
@@ -320,7 +320,7 @@
                 writer.print( "] " );
                 writer.print( problem.getMessage() );
                 writer.print( " @ " );
-                writer.println( problem.getSource() );
+                writer.println( problem.getLocation() );
             }
         }
         writer.close();

Modified: 
maven/maven-3/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java
URL: 
http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java?rev=814330&r1=814329&r2=814330&view=diff
==============================================================================
--- 
maven/maven-3/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java
 (original)
+++ 
maven/maven-3/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java
 Sun Sep 13 15:09:33 2009
@@ -123,7 +123,7 @@
 
         ProfileActivationContext profileActivationContext = 
getProfileActivationContext( request );
 
-        problems.setSourceHint( "(external profiles)" );
+        problems.setSource( "(external profiles)" );
         List<Profile> activeExternalProfiles =
             profileSelector.getActiveProfiles( request.getProfiles(), 
profileActivationContext, problems );
 
@@ -145,7 +145,7 @@
             Model rawModel = tmpModel.clone();
             currentData.setRawModel( rawModel );
 
-            problems.setSourceHint( tmpModel );
+            problems.setSource( tmpModel );
 
             modelNormalizer.mergeDuplicates( tmpModel, request, problems );
 
@@ -185,7 +185,7 @@
 
         Model resultModel = resultData.getModel();
 
-        problems.setSourceHint( resultModel );
+        problems.setSource( resultModel );
         problems.setRootModel( resultModel );
 
         resultModel = interpolateModel( resultModel, request, problems );
@@ -231,7 +231,7 @@
         Model resultModel = result.getEffectiveModel();
 
         DefaultModelProblemCollector problems = new 
DefaultModelProblemCollector( result.getProblems() );
-        problems.setSourceHint( resultModel );
+        problems.setSource( resultModel );
         problems.setRootModel( resultModel );
 
         modelPathTranslator.alignToBaseDirectory( resultModel, 
resultModel.getProjectDirectory(), request );
@@ -284,6 +284,7 @@
             }
         }
 
+        problems.setSource( modelSource.getLocation() );
         try
         {
             boolean strict = request.getValidationLevel() >= 
ModelBuildingRequest.VALIDATION_LEVEL_MAVEN_2_0;
@@ -294,20 +295,19 @@
         }
         catch ( ModelParseException e )
         {
-            problems.add( new DefaultModelProblem( "Non-parseable POM " + 
modelSource.getLocation() + ": "
-                + e.getMessage(), ModelProblem.Severity.FATAL, 
modelSource.getLocation(), e ) );
+            problems.addFatalError( "Non-parseable POM " + 
modelSource.getLocation() + ": " + e.getMessage(),
+                                    e.getLineNumber(), e.getColumnNumber(), e 
);
             throw new ModelBuildingException( problems.getRootModelId(), 
problems.getProblems() );
         }
         catch ( IOException e )
         {
-            problems.add( new DefaultModelProblem( "Non-readable POM " + 
modelSource.getLocation() + ": "
-                + e.getMessage(), ModelProblem.Severity.FATAL, 
modelSource.getLocation(), e ) );
+            problems.addFatalError( "Non-parseable POM " + 
modelSource.getLocation() + ": " + e.getMessage(), -1, -1, e );
             throw new ModelBuildingException( problems.getRootModelId(), 
problems.getProblems() );
         }
 
         model.setPomFile( pomFile );
 
-        problems.setSourceHint( model );
+        problems.setSource( model );
         modelValidator.validateRawModel( model, request, problems );
 
         return model;
@@ -349,7 +349,7 @@
             return;
         }
 
-        problems.setSourceHint( model );
+        problems.setSource( model );
 
         List<Repository> repositories = model.getRepositories();
         Collections.reverse( repositories );
@@ -518,7 +518,7 @@
                                             DefaultModelProblemCollector 
problems )
         throws ModelBuildingException
     {
-        problems.setSourceHint( childModel );
+        problems.setSource( childModel );
 
         Parent parent = childModel.getParent();
 
@@ -543,7 +543,7 @@
         catch ( UnresolvableModelException e )
         {
             problems.addFatalError( "Non-resolvable parent POM "
-                + ModelProblemUtils.toId( groupId, artifactId, version ) + ": 
" + e.getMessage(), e );
+                + ModelProblemUtils.toId( groupId, artifactId, version ) + ": 
" + e.getMessage(), -1, -1, e );
             throw new ModelBuildingException( problems.getRootModelId(), 
problems.getProblems() );
         }
 

Modified: 
maven/maven-3/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelProblem.java
URL: 
http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelProblem.java?rev=814330&r1=814329&r2=814330&view=diff
==============================================================================
--- 
maven/maven-3/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelProblem.java
 (original)
+++ 
maven/maven-3/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelProblem.java
 Sun Sep 13 15:09:33 2009
@@ -34,6 +34,12 @@
 
     private final String source;
 
+    private final int lineNumber;
+
+    private final int columnNumber;
+
+    private final String modelId;
+
     private final String message;
 
     private final Exception exception;
@@ -41,40 +47,20 @@
     private final Severity severity;
 
     /**
-     * Creates a new problem with the specified message.
-     * 
-     * @param message The message describing the problem, may be {...@code 
null}.
-     * @param severity The severity level of the problem, may be {...@code 
null} to default to {...@link Severity#ERROR}.
-     * @param source The source of the problem, may be {...@code null}.
-     */
-    public DefaultModelProblem( String message, Severity severity, Model 
source )
-    {
-        this( message, severity, source, null );
-    }
-
-    /**
      * Creates a new problem with the specified message and exception.
      * 
      * @param message The message describing the problem, may be {...@code 
null}.
      * @param severity The severity level of the problem, may be {...@code 
null} to default to {...@link Severity#ERROR}.
      * @param source The source of the problem, may be {...@code null}.
+     * @param lineNumber The one-based index of the line containing the error 
or {...@code -1} if unknown.
+     * @param columnNumber The one-based index of the column containing the 
error or {...@code -1} if unknown.
      * @param exception The exception that caused this problem, may be 
{...@code null}.
      */
-    public DefaultModelProblem( String message, Severity severity, Model 
source, Exception exception )
+    public DefaultModelProblem( String message, Severity severity, Model 
source, int lineNumber, int columnNumber,
+                                Exception exception )
     {
-        this( message, severity, ModelProblemUtils.toSourceHint( source ), 
exception );
-    }
-
-    /**
-     * Creates a new problem with the specified message.
-     * 
-     * @param message The message describing the problem, may be {...@code 
null}.
-     * @param severity The severity level of the problem, may be {...@code 
null} to default to {...@link Severity#ERROR}.
-     * @param source A hint about the source of the problem, may be {...@code 
null}.
-     */
-    public DefaultModelProblem( String message, Severity severity, String 
source )
-    {
-        this( message, severity, source, null );
+        this( message, severity, ModelProblemUtils.toPath( source ), 
lineNumber, columnNumber,
+              ModelProblemUtils.toId( source ), exception );
     }
 
     /**
@@ -82,14 +68,21 @@
      * 
      * @param message The message describing the problem, may be {...@code 
null}.
      * @param severity The severity level of the problem, may be {...@code 
null} to default to {...@link Severity#ERROR}.
-     * @param source A hint about the source of the problem, may be {...@code 
null}.
+     * @param source A hint about the source of the problem like a file path, 
may be {...@code null}.
+     * @param lineNumber The one-based index of the line containing the 
problem or {...@code -1} if unknown.
+     * @param columnNumber The one-based index of the column containing the 
problem or {...@code -1} if unknown.
+     * @param modelId The identifier of the model that exhibits the problem, 
may be {...@code null}.
      * @param exception The exception that caused this problem, may be 
{...@code null}.
      */
-    public DefaultModelProblem( String message, Severity severity, String 
source, Exception exception )
+    public DefaultModelProblem( String message, Severity severity, String 
source, int lineNumber, int columnNumber,
+                                String modelId, Exception exception )
     {
         this.message = message;
         this.severity = ( severity != null ) ? severity : Severity.ERROR;
         this.source = ( source != null ) ? source : "";
+        this.lineNumber = lineNumber;
+        this.columnNumber = columnNumber;
+        this.modelId = ( modelId != null ) ? modelId : "";
         this.exception = exception;
     }
 
@@ -98,6 +91,57 @@
         return source;
     }
 
+    public int getLineNumber()
+    {
+        return lineNumber;
+    }
+
+    public int getColumnNumber()
+    {
+        return columnNumber;
+    }
+
+    public String getModelId()
+    {
+        return modelId;
+    }
+
+    public String getLocation()
+    {
+        StringBuilder buffer = new StringBuilder( 256 );
+
+        buffer.append( getModelId() );
+
+        if ( getSource().length() > 0 )
+        {
+            if ( buffer.length() > 0 )
+            {
+                buffer.append( ", " );
+            }
+            buffer.append( getSource() );
+        }
+
+        if ( getLineNumber() > 0 )
+        {
+            if ( buffer.length() > 0 )
+            {
+                buffer.append( ", " );
+            }
+            buffer.append( "line " ).append( getLineNumber() );
+        }
+
+        if ( getColumnNumber() > 0 )
+        {
+            if ( buffer.length() > 0 )
+            {
+                buffer.append( ", " );
+            }
+            buffer.append( "column " ).append( getColumnNumber() );
+        }
+
+        return buffer.toString();
+    }
+
     public Exception getException()
     {
         return exception;
@@ -135,7 +179,8 @@
         StringBuilder buffer = new StringBuilder( 128 );
 
         buffer.append( "[" ).append( getSeverity() ).append( "] " );
-        buffer.append( getSource() ).append( ": " ).append( getMessage() );
+        buffer.append( getMessage() );
+        buffer.append( " @ " ).append( getLocation() );
 
         return buffer.toString();
     }

Modified: 
maven/maven-3/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelProblemCollector.java
URL: 
http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelProblemCollector.java?rev=814330&r1=814329&r2=814330&view=diff
==============================================================================
--- 
maven/maven-3/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelProblemCollector.java
 (original)
+++ 
maven/maven-3/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelProblemCollector.java
 Sun Sep 13 15:09:33 2009
@@ -39,7 +39,7 @@
 
     private List<ModelProblem> problems;
 
-    private String sourceHint;
+    private String source;
 
     private Model sourceModel;
 
@@ -55,25 +55,30 @@
         return problems;
     }
 
-    public void setSourceHint( String sourceHint )
+    public void setSource( String source )
     {
-        this.sourceHint = sourceHint;
+        this.source = source;
         this.sourceModel = null;
     }
 
-    public void setSourceHint( Model sourceModel )
+    public void setSource( Model source )
     {
-        this.sourceModel = sourceModel;
-        this.sourceHint = null;
+        this.sourceModel = source;
+        this.source = null;
     }
 
-    private String getSourceHint()
+    private String getSource()
     {
-        if ( sourceHint == null && sourceModel != null )
+        if ( source == null && sourceModel != null )
         {
-            sourceHint = ModelProblemUtils.toSourceHint( sourceModel );
+            source = ModelProblemUtils.toPath( sourceModel );
         }
-        return sourceHint;
+        return source;
+    }
+
+    private String getModelId()
+    {
+        return ModelProblemUtils.toId( sourceModel );
     }
 
     public void setRootModel( Model rootModel )
@@ -101,34 +106,34 @@
         problems.addAll( problems );
     }
 
-    public void addFatalError( String message )
+    public void addFatalError( String message, int line, int column, Exception 
cause )
     {
-        problems.add( new DefaultModelProblem( message, 
ModelProblem.Severity.FATAL, getSourceHint() ) );
-    }
-
-    public void addFatalError( String message, Exception cause )
-    {
-        problems.add( new DefaultModelProblem( message, 
ModelProblem.Severity.FATAL, getSourceHint(), cause ) );
+        add( message, ModelProblem.Severity.FATAL, line, column, cause );
     }
 
     public void addError( String message )
     {
-        problems.add( new DefaultModelProblem( message, 
ModelProblem.Severity.ERROR, getSourceHint() ) );
+        addError( message, null );
     }
 
     public void addError( String message, Exception cause )
     {
-        problems.add( new DefaultModelProblem( message, 
ModelProblem.Severity.ERROR, getSourceHint(), cause ) );
+        add( message, ModelProblem.Severity.ERROR, -1, -1, cause );
     }
 
     public void addWarning( String message )
     {
-        problems.add( new DefaultModelProblem( message, 
ModelProblem.Severity.WARNING, getSourceHint() ) );
+        addWarning( message, null );
     }
 
     public void addWarning( String message, Exception cause )
     {
-        problems.add( new DefaultModelProblem( message, 
ModelProblem.Severity.WARNING, getSourceHint(), cause ) );
+        add( message, ModelProblem.Severity.WARNING, -1, -1, cause );
+    }
+
+    private void add( String message, ModelProblem.Severity severity, int 
line, int column, Exception cause )
+    {
+        problems.add( new DefaultModelProblem( message, severity, getSource(), 
line, column, getModelId(), cause ) );
     }
 
 }

Modified: 
maven/maven-3/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelBuildingException.java
URL: 
http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelBuildingException.java?rev=814330&r1=814329&r2=814330&view=diff
==============================================================================
--- 
maven/maven-3/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelBuildingException.java
 (original)
+++ 
maven/maven-3/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelBuildingException.java
 Sun Sep 13 15:09:33 2009
@@ -103,7 +103,7 @@
             writer.print( "] " );
             writer.print( problem.getMessage() );
             writer.print( " @ " );
-            writer.println( problem.getSource() );
+            writer.println( problem.getLocation() );
         }
 
         return buffer.toString();

Modified: 
maven/maven-3/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelProblem.java
URL: 
http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelProblem.java?rev=814330&r1=814329&r2=814330&view=diff
==============================================================================
--- 
maven/maven-3/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelProblem.java
 (original)
+++ 
maven/maven-3/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelProblem.java
 Sun Sep 13 15:09:33 2009
@@ -44,13 +44,50 @@
     /**
      * Gets the hint about the source of the problem. While the syntax of this 
hint is unspecified and depends on the
      * creator of the problem, the general expectation is that the hint 
provides sufficient information to the user to
-     * track the problem back to its origin.
+     * track the problem back to its origin. A concrete example for such a 
source hint can be the file path or URL from
+     * which a POM was read.
      * 
-     * @return The hint about the source of the problem, never {...@code null}.
+     * @return The hint about the source of the problem or an empty string if 
unknown, never {...@code null}.
      */
     String getSource();
 
     /**
+     * Gets the one-based index of the line containing the problem. The line 
number should refer to some text file that
+     * is given by {...@link #getSource()}.
+     * 
+     * @return The one-based index of the line containing the problem or a 
non-positive value if unknown.
+     */
+    int getLineNumber();
+
+    /**
+     * Gets the one-based index of the column containing the problem. The 
column number should refer to some text file
+     * that is given by {...@link #getSource()}.
+     * 
+     * @return The one-based index of the column containing the problem or 
non-positive value if unknown.
+     */
+    int getColumnNumber();
+
+    /**
+     * Gets the identifier of the model from which the problem originated. 
While the general form of this identifier is
+     * <code>groupId:artifactId:version</code> the returned identifier need 
not be complete. The identifier is derived
+     * from the information that is available at the point the problem occurs 
and as such merely serves as a best effort
+     * to provide information to the user to track the problem back to its 
origin.
+     * 
+     * @return The identifier of the model from which the problem originated 
or an empty string if unknown, never
+     *         {...@code null}.
+     */
+    String getModelId();
+
+    /**
+     * Gets the location of the problem. The location is a user-friendly 
combination of the values from
+     * {...@link #getModelId()}, {...@link #getSource()}, {...@link 
#getLineNumber()} and {...@link #getColumnNumber()}. The exact
+     * syntax of the returned value is undefined.
+     * 
+     * @return The location of the problem, never {...@code null}.
+     */
+    String getLocation();
+
+    /**
      * Gets the exception that caused this problem (if any).
      * 
      * @return The exception that caused this problem or {...@code null} if 
not applicable.

Modified: 
maven/maven-3/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelProblemCollector.java
URL: 
http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelProblemCollector.java?rev=814330&r1=814329&r2=814330&view=diff
==============================================================================
--- 
maven/maven-3/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelProblemCollector.java
 (original)
+++ 
maven/maven-3/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelProblemCollector.java
 Sun Sep 13 15:09:33 2009
@@ -20,7 +20,11 @@
  */
 
 /**
- * Collects problems that are encountered during model building.
+ * 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
  */

Modified: 
maven/maven-3/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelProblemUtils.java
URL: 
http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelProblemUtils.java?rev=814330&r1=814329&r2=814330&view=diff
==============================================================================
--- 
maven/maven-3/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelProblemUtils.java
 (original)
+++ 
maven/maven-3/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelProblemUtils.java
 Sun Sep 13 15:09:33 2009
@@ -57,6 +57,23 @@
         return buffer.toString();
     }
 
+    public static String toPath( Model model )
+    {
+        String path = "";
+
+        if ( model != null )
+        {
+            File pomFile = model.getPomFile();
+
+            if ( pomFile != null )
+            {
+                path = pomFile.getAbsolutePath();
+            }
+        }
+
+        return path;
+    }
+
     public static String toId( Model model )
     {
         if ( model == null )


Reply via email to