diff options
Diffstat (limited to 'framework/src/maven/apache-maven-3.3.3/maven-embedder/src/main/java/org/apache/maven/cli/event/ExecutionEventLogger.java')
-rw-r--r-- | framework/src/maven/apache-maven-3.3.3/maven-embedder/src/main/java/org/apache/maven/cli/event/ExecutionEventLogger.java | 381 |
1 files changed, 381 insertions, 0 deletions
diff --git a/framework/src/maven/apache-maven-3.3.3/maven-embedder/src/main/java/org/apache/maven/cli/event/ExecutionEventLogger.java b/framework/src/maven/apache-maven-3.3.3/maven-embedder/src/main/java/org/apache/maven/cli/event/ExecutionEventLogger.java new file mode 100644 index 00000000..ad3ad3a4 --- /dev/null +++ b/framework/src/maven/apache-maven-3.3.3/maven-embedder/src/main/java/org/apache/maven/cli/event/ExecutionEventLogger.java @@ -0,0 +1,381 @@ +package org.apache.maven.cli.event; + +/* + * 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 static org.apache.maven.cli.CLIReportingUtils.formatDuration; +import static org.apache.maven.cli.CLIReportingUtils.formatTimestamp; + +import org.apache.maven.execution.AbstractExecutionListener; +import org.apache.maven.execution.BuildFailure; +import org.apache.maven.execution.BuildSuccess; +import org.apache.maven.execution.BuildSummary; +import org.apache.maven.execution.ExecutionEvent; +import org.apache.maven.execution.MavenExecutionResult; +import org.apache.maven.execution.MavenSession; +import org.apache.maven.plugin.MojoExecution; +import org.apache.maven.plugin.descriptor.MojoDescriptor; +import org.apache.maven.project.MavenProject; +import org.codehaus.plexus.util.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Logs execution events to logger, eventually user-supplied. + * + * @author Benjamin Bentmann + */ +public class ExecutionEventLogger + extends AbstractExecutionListener +{ + private final Logger logger; + + private static final int LINE_LENGTH = 72; + private static final int MAX_PADDED_BUILD_TIME_DURATION_LENGTH = 9; + private static final int MAX_PROJECT_NAME_LENGTH = 52; + + public ExecutionEventLogger() + { + logger = LoggerFactory.getLogger( ExecutionEventLogger.class ); + } + + // TODO should we deprecate? + public ExecutionEventLogger( Logger logger ) + { + if ( logger == null ) + { + throw new IllegalArgumentException( "logger missing" ); + } + + this.logger = logger; + } + + private static String chars( char c, int count ) + { + StringBuilder buffer = new StringBuilder( count ); + + for ( int i = count; i > 0; i-- ) + { + buffer.append( c ); + } + + return buffer.toString(); + } + + @Override + public void projectDiscoveryStarted( ExecutionEvent event ) + { + if ( logger.isInfoEnabled() ) + { + logger.info( "Scanning for projects..." ); + } + } + + @Override + public void sessionStarted( ExecutionEvent event ) + { + if ( logger.isInfoEnabled() && event.getSession().getProjects().size() > 1 ) + { + logger.info( chars( '-', LINE_LENGTH ) ); + + logger.info( "Reactor Build Order:" ); + + logger.info( "" ); + + for ( MavenProject project : event.getSession().getProjects() ) + { + logger.info( project.getName() ); + } + } + } + + @Override + public void sessionEnded( ExecutionEvent event ) + { + if ( logger.isInfoEnabled() ) + { + if ( event.getSession().getProjects().size() > 1 ) + { + logReactorSummary( event.getSession() ); + } + + logResult( event.getSession() ); + + logStats( event.getSession() ); + + logger.info( chars( '-', LINE_LENGTH ) ); + } + } + + private void logReactorSummary( MavenSession session ) + { + logger.info( chars( '-', LINE_LENGTH ) ); + + logger.info( "Reactor Summary:" ); + + logger.info( "" ); + + MavenExecutionResult result = session.getResult(); + + for ( MavenProject project : session.getProjects() ) + { + StringBuilder buffer = new StringBuilder( 128 ); + + buffer.append( project.getName() ); + buffer.append( ' ' ); + + if ( buffer.length() <= MAX_PROJECT_NAME_LENGTH ) + { + while ( buffer.length() < MAX_PROJECT_NAME_LENGTH ) + { + buffer.append( '.' ); + } + buffer.append( ' ' ); + } + + BuildSummary buildSummary = result.getBuildSummary( project ); + + if ( buildSummary == null ) + { + buffer.append( "SKIPPED" ); + } + else if ( buildSummary instanceof BuildSuccess ) + { + buffer.append( "SUCCESS [" ); + String buildTimeDuration = formatDuration( buildSummary.getTime() ); + int padSize = MAX_PADDED_BUILD_TIME_DURATION_LENGTH - buildTimeDuration.length(); + if ( padSize > 0 ) + { + buffer.append( chars( ' ', padSize ) ); + } + buffer.append( buildTimeDuration ); + buffer.append( "]" ); + } + else if ( buildSummary instanceof BuildFailure ) + { + buffer.append( "FAILURE [" ); + String buildTimeDuration = formatDuration( buildSummary.getTime() ); + int padSize = MAX_PADDED_BUILD_TIME_DURATION_LENGTH - buildTimeDuration.length(); + if ( padSize > 0 ) + { + buffer.append( chars( ' ', padSize ) ); + } + buffer.append( buildTimeDuration ); + buffer.append( "]" ); + } + + logger.info( buffer.toString() ); + } + } + + private void logResult( MavenSession session ) + { + logger.info( chars( '-', LINE_LENGTH ) ); + + if ( session.getResult().hasExceptions() ) + { + logger.info( "BUILD FAILURE" ); + } + else + { + logger.info( "BUILD SUCCESS" ); + } + } + + private void logStats( MavenSession session ) + { + logger.info( chars( '-', LINE_LENGTH ) ); + + long finish = System.currentTimeMillis(); + + long time = finish - session.getRequest().getStartTime().getTime(); + + String wallClock = session.getRequest().getDegreeOfConcurrency() > 1 ? " (Wall Clock)" : ""; + + logger.info( "Total time: " + formatDuration( time ) + wallClock ); + + logger.info( "Finished at: " + formatTimestamp( finish ) ); + + System.gc(); + + Runtime r = Runtime.getRuntime(); + + long mb = 1024 * 1024; + + logger.info( "Final Memory: " + ( r.totalMemory() - r.freeMemory() ) / mb + "M/" + r.totalMemory() / mb + "M" ); + } + + @Override + public void projectSkipped( ExecutionEvent event ) + { + if ( logger.isInfoEnabled() ) + { + logger.info( chars( ' ', LINE_LENGTH ) ); + logger.info( chars( '-', LINE_LENGTH ) ); + + logger.info( "Skipping " + event.getProject().getName() ); + logger.info( "This project has been banned from the build due to previous failures." ); + + logger.info( chars( '-', LINE_LENGTH ) ); + } + } + + @Override + public void projectStarted( ExecutionEvent event ) + { + if ( logger.isInfoEnabled() ) + { + logger.info( chars( ' ', LINE_LENGTH ) ); + logger.info( chars( '-', LINE_LENGTH ) ); + + logger.info( "Building " + event.getProject().getName() + " " + event.getProject().getVersion() ); + + logger.info( chars( '-', LINE_LENGTH ) ); + } + } + + @Override + public void mojoSkipped( ExecutionEvent event ) + { + if ( logger.isWarnEnabled() ) + { + logger.warn( "Goal " + event.getMojoExecution().getGoal() + + " requires online mode for execution but Maven is currently offline, skipping" ); + } + } + + /** + * <pre>--- mojo-artifactId:version:goal (mojo-executionId) @ project-artifactId ---</pre> + */ + @Override + public void mojoStarted( ExecutionEvent event ) + { + if ( logger.isInfoEnabled() ) + { + StringBuilder buffer = new StringBuilder( 128 ); + + buffer.append( "--- " ); + append( buffer, event.getMojoExecution() ); + append( buffer, event.getProject() ); + buffer.append( " ---" ); + + logger.info( "" ); + logger.info( buffer.toString() ); + } + } + + /** + * <pre>>>> mojo-artifactId:version:goal (mojo-executionId) > :forked-goal @ project-artifactId >>></pre> + * <pre>>>> mojo-artifactId:version:goal (mojo-executionId) > [lifecycle]phase @ project-artifactId >>></pre> + */ + @Override + public void forkStarted( ExecutionEvent event ) + { + if ( logger.isInfoEnabled() ) + { + StringBuilder buffer = new StringBuilder( 128 ); + + buffer.append( ">>> " ); + append( buffer, event.getMojoExecution() ); + buffer.append( " > " ); + appendForkInfo( buffer, event.getMojoExecution().getMojoDescriptor() ); + append( buffer, event.getProject() ); + buffer.append( " >>>" ); + + logger.info( "" ); + logger.info( buffer.toString() ); + } + } + + // CHECKSTYLE_OFF: LineLength + /** + * <pre><<< mojo-artifactId:version:goal (mojo-executionId) < :forked-goal @ project-artifactId <<<</pre> + * <pre><<< mojo-artifactId:version:goal (mojo-executionId) < [lifecycle]phase @ project-artifactId <<<</pre> + */ + // CHECKSTYLE_ON: LineLength + @Override + public void forkSucceeded( ExecutionEvent event ) + { + if ( logger.isInfoEnabled() ) + { + StringBuilder buffer = new StringBuilder( 128 ); + + buffer.append( "<<< " ); + append( buffer, event.getMojoExecution() ); + buffer.append( " < " ); + appendForkInfo( buffer, event.getMojoExecution().getMojoDescriptor() ); + append( buffer, event.getProject() ); + buffer.append( " <<<" ); + + logger.info( "" ); + logger.info( buffer.toString() ); + } + } + + private void append( StringBuilder buffer, MojoExecution me ) + { + buffer.append( me.getArtifactId() ).append( ':' ).append( me.getVersion() ); + buffer.append( ':' ).append( me.getGoal() ); + if ( me.getExecutionId() != null ) + { + buffer.append( " (" ).append( me.getExecutionId() ).append( ')' ); + } + } + + private void appendForkInfo( StringBuilder buffer, MojoDescriptor md ) + { + if ( StringUtils.isNotEmpty( md.getExecutePhase() ) ) + { + // forked phase + if ( StringUtils.isNotEmpty( md.getExecuteLifecycle() ) ) + { + buffer.append( '[' ); + buffer.append( md.getExecuteLifecycle() ); + buffer.append( ']' ); + } + buffer.append( md.getExecutePhase() ); + } + else + { + // forked goal + buffer.append( ':' ); + buffer.append( md.getExecuteGoal() ); + } + } + + private void append( StringBuilder buffer, MavenProject project ) + { + buffer.append( " @ " ).append( project.getArtifactId() ); + } + + @Override + public void forkedProjectStarted( ExecutionEvent event ) + { + if ( logger.isInfoEnabled() && event.getMojoExecution().getForkedExecutions().size() > 1 ) + { + logger.info( chars( ' ', LINE_LENGTH ) ); + logger.info( chars( '>', LINE_LENGTH ) ); + + logger.info( "Forking " + event.getProject().getName() + " " + event.getProject().getVersion() ); + + logger.info( chars( '>', LINE_LENGTH ) ); + } + } + +} |