001package org.apache.maven.model.building;
002
003/*
004 * Licensed to the Apache Software Foundation (ASF) under one
005 * or more contributor license agreements.  See the NOTICE file
006 * distributed with this work for additional information
007 * regarding copyright ownership.  The ASF licenses this file
008 * to you under the Apache License, Version 2.0 (the
009 * "License"); you may not use this file except in compliance
010 * with the License.  You may obtain a copy of the License at
011 *
012 *   http://www.apache.org/licenses/LICENSE-2.0
013 *
014 * Unless required by applicable law or agreed to in writing,
015 * software distributed under the License is distributed on an
016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017 * KIND, either express or implied.  See the License for the
018 * specific language governing permissions and limitations
019 * under the License.
020 */
021
022import org.apache.maven.model.Model;
023
024/**
025 * Describes a problem that was encountered during model building. A problem can either be an exception that was thrown
026 * or a simple string message. In addition, a problem carries a hint about its source, e.g. the POM file that exhibits
027 * the problem.
028 * 
029 * @author Benjamin Bentmann
030 */
031public class DefaultModelProblem
032    implements ModelProblem
033{
034
035    private final String source;
036
037    private final int lineNumber;
038
039    private final int columnNumber;
040
041    private final String modelId;
042
043    private final String message;
044
045    private final Exception exception;
046
047    private final Severity severity;
048
049    private final Version version;
050
051
052    /**
053     * Creates a new problem with the specified message and exception.
054     * 
055     * @param message The message describing the problem, may be {@code null}.
056     * @param severity The severity level of the problem, may be {@code null} to default to
057     *            {@link ModelProblem.Severity#ERROR}.
058     * @param source The source of the problem, may be {@code null}.
059     * @param lineNumber The one-based index of the line containing the error or {@code -1} if unknown.
060     * @param columnNumber The one-based index of the column containing the error or {@code -1} if unknown.
061     * @param exception The exception that caused this problem, may be {@code null}.
062     */
063    //mkleint: does this need to be public?
064    public DefaultModelProblem( String message, Severity severity, Version version, Model source, int lineNumber, int columnNumber,
065                                Exception exception )
066    {
067        this( message, severity, version, ModelProblemUtils.toPath( source ), lineNumber, columnNumber,
068              ModelProblemUtils.toId( source ), exception );
069    }
070
071    /**
072     * Creates a new problem with the specified message and exception.
073     * 
074     * @param message The message describing the problem, may be {@code null}.
075     * @param severity The severity level of the problem, may be {@code null} to default to
076     *            {@link ModelProblem.Severity#ERROR}.
077     * @param version The version since the problem is relevant
078     * @param source A hint about the source of the problem like a file path, may be {@code null}.
079     * @param lineNumber The one-based index of the line containing the problem or {@code -1} if unknown.
080     * @param columnNumber The one-based index of the column containing the problem or {@code -1} if unknown.
081     * @param modelId The identifier of the model that exhibits the problem, may be {@code null}.
082     * @param exception The exception that caused this problem, may be {@code null}.
083     */
084    //mkleint: does this need to be public?
085    public DefaultModelProblem( String message, Severity severity, Version version, String source, int lineNumber, int columnNumber,
086                                String modelId, Exception exception )
087    {
088        this.message = message;
089        this.severity = ( severity != null ) ? severity : Severity.ERROR;
090        this.source = ( source != null ) ? source : "";
091        this.lineNumber = lineNumber;
092        this.columnNumber = columnNumber;
093        this.modelId = ( modelId != null ) ? modelId : "";
094        this.exception = exception;
095        this.version = version;
096    }
097
098    public String getSource()
099    {
100        return source;
101    }
102
103    public int getLineNumber()
104    {
105        return lineNumber;
106    }
107
108    public int getColumnNumber()
109    {
110        return columnNumber;
111    }
112
113    public String getModelId()
114    {
115        return modelId;
116    }
117
118    public Exception getException()
119    {
120        return exception;
121    }
122
123    public String getMessage()
124    {
125        String msg;
126
127        if ( message != null && message.length() > 0 )
128        {
129            msg = message;
130        }
131        else
132        {
133            msg = exception.getMessage();
134
135            if ( msg == null )
136            {
137                msg = "";
138            }
139        }
140
141        return msg;
142    }
143
144    public Severity getSeverity()
145    {
146        return severity;
147    }
148
149    public Version getVersion()
150    {
151        return version;
152    }
153    
154
155    @Override
156    public String toString()
157    {
158        StringBuilder buffer = new StringBuilder( 128 );
159
160        buffer.append( "[" ).append( getSeverity() ).append( "] " );
161        buffer.append( getMessage() );
162        buffer.append( " @ " ).append( ModelProblemUtils.formatLocation( this, null ) );
163
164        return buffer.toString();
165    }
166
167}