diff options
Diffstat (limited to 'framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/exception/DefaultExceptionHandler.java')
-rw-r--r-- | framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/exception/DefaultExceptionHandler.java | 336 |
1 files changed, 336 insertions, 0 deletions
diff --git a/framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/exception/DefaultExceptionHandler.java b/framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/exception/DefaultExceptionHandler.java new file mode 100644 index 00000000..6df72c81 --- /dev/null +++ b/framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/exception/DefaultExceptionHandler.java @@ -0,0 +1,336 @@ +package org.apache.maven.exception; + +/* + * 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.io.IOException; +import java.net.ConnectException; +import java.net.UnknownHostException; +import java.util.ArrayList; +import java.util.List; + +import org.apache.maven.lifecycle.LifecycleExecutionException; +import org.apache.maven.model.building.ModelProblem; +import org.apache.maven.model.building.ModelProblemUtils; +import org.apache.maven.plugin.AbstractMojoExecutionException; +import org.apache.maven.plugin.MojoExecutionException; +import org.apache.maven.plugin.MojoFailureException; +import org.apache.maven.plugin.PluginContainerException; +import org.apache.maven.plugin.PluginExecutionException; +import org.apache.maven.project.ProjectBuildingException; +import org.apache.maven.project.ProjectBuildingResult; +import org.codehaus.plexus.component.annotations.Component; +import org.codehaus.plexus.util.StringUtils; + +/* + +- test projects for each of these +- how to categorize the problems so that the id of the problem can be match to a page with descriptive help and the test + project +- nice little sample projects that could be run in the core as well as integration tests + +All Possible Errors +- invalid lifecycle phase (maybe same as bad CLI param, though you were talking about embedder too) +- <module> specified is not found +- malformed settings +- malformed POM +- local repository not writable +- remote repositories not available +- artifact metadata missing +- extension metadata missing +- extension artifact missing +- artifact metadata retrieval problem +- version range violation +- circular dependency +- artifact missing +- artifact retrieval exception +- md5 checksum doesn't match for local artifact, need to redownload this +- POM doesn't exist for a goal that requires one +- parent POM missing (in both the repository + relative path) +- component not found + +Plugins: +- plugin metadata missing +- plugin metadata retrieval problem +- plugin artifact missing +- plugin artifact retrieval problem +- plugin dependency metadata missing +- plugin dependency metadata retrieval problem +- plugin configuration problem +- plugin execution failure due to something that is know to possibly go wrong (like compilation failure) +- plugin execution error due to something that is not expected to go wrong (the compiler executable missing) +- asking to use a plugin for which you do not have a version defined - tools to easily select versions +- goal not found in a plugin (probably could list the ones that are) + + */ + +// PluginNotFoundException, PluginResolutionException, PluginDescriptorParsingException, +// CycleDetectedInPluginGraphException; + +@Component( role = ExceptionHandler.class ) +public class DefaultExceptionHandler + implements ExceptionHandler +{ + + public ExceptionSummary handleException( Throwable exception ) + { + return handle( "", exception ); + } + + private ExceptionSummary handle( String message, Throwable exception ) + { + String reference = getReference( exception ); + + List<ExceptionSummary> children = null; + + if ( exception instanceof ProjectBuildingException ) + { + List<ProjectBuildingResult> results = ( (ProjectBuildingException) exception ).getResults(); + + children = new ArrayList<ExceptionSummary>(); + + for ( ProjectBuildingResult result : results ) + { + ExceptionSummary child = handle( result ); + if ( child != null ) + { + children.add( child ); + } + } + + message = "The build could not read " + children.size() + " project" + ( children.size() == 1 ? "" : "s" ); + } + else + { + message = getMessage( message, exception ); + } + + return new ExceptionSummary( exception, message, reference, children ); + } + + private ExceptionSummary handle( ProjectBuildingResult result ) + { + List<ExceptionSummary> children = new ArrayList<ExceptionSummary>(); + + for ( ModelProblem problem : result.getProblems() ) + { + ExceptionSummary child = handle( problem, result.getProjectId() ); + if ( child != null ) + { + children.add( child ); + } + } + + if ( children.isEmpty() ) + { + return null; + } + + String message = + "\nThe project " + result.getProjectId() + " (" + result.getPomFile() + ") has " + + children.size() + " error" + ( children.size() == 1 ? "" : "s" ); + + return new ExceptionSummary( null, message, null, children ); + } + + private ExceptionSummary handle( ModelProblem problem, String projectId ) + { + if ( ModelProblem.Severity.ERROR.compareTo( problem.getSeverity() ) >= 0 ) + { + String message = problem.getMessage(); + + String location = ModelProblemUtils.formatLocation( problem, projectId ); + + if ( StringUtils.isNotEmpty( location ) ) + { + message += " @ " + location; + } + + return handle( message, problem.getException() ); + } + else + { + return null; + } + } + + private String getReference( Throwable exception ) + { + String reference = ""; + + if ( exception != null ) + { + if ( exception instanceof MojoExecutionException ) + { + reference = MojoExecutionException.class.getSimpleName(); + + Throwable cause = exception.getCause(); + if ( cause instanceof IOException ) + { + cause = cause.getCause(); + if ( cause instanceof ConnectException ) + { + reference = ConnectException.class.getSimpleName(); + } + } + } + else if ( exception instanceof MojoFailureException ) + { + reference = MojoFailureException.class.getSimpleName(); + } + else if ( exception instanceof LinkageError ) + { + reference = LinkageError.class.getSimpleName(); + } + else if ( exception instanceof PluginExecutionException ) + { + Throwable cause = exception.getCause(); + + if ( cause instanceof PluginContainerException ) + { + Throwable cause2 = cause.getCause(); + + if ( cause2 instanceof NoClassDefFoundError + && cause2.getMessage().contains( "org/sonatype/aether/" ) ) + { + reference = "AetherClassNotFound"; + } + } + + if ( StringUtils.isEmpty( reference ) ) + { + reference = getReference( cause ); + } + + if ( StringUtils.isEmpty( reference ) ) + { + reference = exception.getClass().getSimpleName(); + } + } + else if ( exception instanceof LifecycleExecutionException ) + { + reference = getReference( exception.getCause() ); + } + else if ( isNoteworthyException( exception ) ) + { + reference = exception.getClass().getSimpleName(); + } + } + + if ( StringUtils.isNotEmpty( reference ) && !reference.startsWith( "http:" ) ) + { + reference = "http://cwiki.apache.org/confluence/display/MAVEN/" + reference; + } + + return reference; + } + + private boolean isNoteworthyException( Throwable exception ) + { + if ( exception == null ) + { + return false; + } + else if ( exception instanceof Error ) + { + return true; + } + else if ( exception instanceof RuntimeException ) + { + return false; + } + else if ( exception.getClass().getName().startsWith( "java" ) ) + { + return false; + } + return true; + } + + private String getMessage( String message, Throwable exception ) + { + String fullMessage = ( message != null ) ? message : ""; + + for ( Throwable t = exception; t != null; t = t.getCause() ) + { + String exceptionMessage = t.getMessage(); + + if ( t instanceof AbstractMojoExecutionException ) + { + String longMessage = ( (AbstractMojoExecutionException) t ).getLongMessage(); + if ( StringUtils.isNotEmpty( longMessage ) ) + { + if ( StringUtils.isEmpty( exceptionMessage ) || longMessage.contains( exceptionMessage ) ) + { + exceptionMessage = longMessage; + } + else if ( !exceptionMessage.contains( longMessage ) ) + { + exceptionMessage = join( exceptionMessage, '\n' + longMessage ); + } + } + } + + if ( StringUtils.isEmpty( exceptionMessage ) ) + { + exceptionMessage = t.getClass().getSimpleName(); + } + + if ( t instanceof UnknownHostException && !fullMessage.contains( "host" ) ) + { + fullMessage = join( fullMessage, "Unknown host " + exceptionMessage ); + } + else if ( !fullMessage.contains( exceptionMessage ) ) + { + fullMessage = join( fullMessage, exceptionMessage ); + } + } + + return fullMessage.trim(); + } + + private String join( String message1, String message2 ) + { + String message = ""; + + if ( StringUtils.isNotEmpty( message1 ) ) + { + message = message1.trim(); + } + + if ( StringUtils.isNotEmpty( message2 ) ) + { + if ( StringUtils.isNotEmpty( message ) ) + { + if ( message.endsWith( "." ) || message.endsWith( "!" ) || message.endsWith( ":" ) ) + { + message += " "; + } + else + { + message += ": "; + } + } + + message += message2; + } + + return message; + } + +} |