001    package 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    
022    import 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     */
031    public 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    }