diff --git a/maven-core/src/main/java/org/apache/maven/DefaultMaven.java b/maven-core/src/main/java/org/apache/maven/DefaultMaven.java
index 5ec691fa8c..0d7f50601d 100644
--- a/maven-core/src/main/java/org/apache/maven/DefaultMaven.java
+++ b/maven-core/src/main/java/org/apache/maven/DefaultMaven.java
@@ -59,12 +59,15 @@ import org.codehaus.plexus.util.dag.CycleDetectedException;
import java.io.File;
import java.io.IOException;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
+import java.util.TimeZone;
/**
* @author Jason van Zyl
@@ -326,7 +329,7 @@ public class DefaultMaven
if ( rm.hasBuildFailure( project ) )
{
- logReactorSummaryLine( project.getName(), "FAILED" );
+ logReactorSummaryLine( project.getName(), "FAILED", rm.getBuildFailure( project ).getTime() );
}
else if ( rm.isBlackListed( project ) )
{
@@ -334,7 +337,7 @@ public class DefaultMaven
}
else if ( rm.hasBuildSuccess( project ) )
{
- logReactorSummaryLine( project.getName(), "SUCCESS" );
+ logReactorSummaryLine( project.getName(), "SUCCESS", rm.getBuildSuccess( project ).getTime() );
}
else
{
@@ -347,25 +350,59 @@ public class DefaultMaven
}
private void logReactorSummaryLine( String name, String status )
+ {
+ logReactorSummaryLine( name, status, -1 );
+ }
+
+ private void logReactorSummaryLine( String name, String status, long time )
{
StringBuffer messageBuffer = new StringBuffer();
messageBuffer.append( name );
- int dotCount = 65;
+ int dotCount = 55;
dotCount -= name.length();
+ messageBuffer.append( " " );
+
for ( int i = 0; i < dotCount; i++ )
{
messageBuffer.append( '.' );
}
+ messageBuffer.append( " " );
+
messageBuffer.append( status );
+ if ( time >= 0 )
+ {
+ messageBuffer.append( " [" );
+
+ messageBuffer.append( getFormattedTime( time ) );
+
+ messageBuffer.append( "]" );
+ }
+
getLogger().info( messageBuffer.toString() );
}
+ private static String getFormattedTime( long time )
+ {
+ String pattern = "s.SSS's'";
+ if ( time / 60000L > 0 )
+ {
+ pattern = "m:s" + pattern;
+ if ( time / 3600000L > 0 )
+ {
+ pattern = "H:m" + pattern;
+ }
+ }
+ DateFormat fmt = new SimpleDateFormat( pattern );
+ fmt.setTimeZone( TimeZone.getTimeZone( "UTC" ) );
+ return fmt.format( new Date( time ) );
+ }
+
private MavenExecutionResponse dispatchErrorResponse( EventDispatcher dispatcher, String event,
String baseDirectory, Exception e )
{
diff --git a/maven-core/src/main/java/org/apache/maven/execution/BuildFailure.java b/maven-core/src/main/java/org/apache/maven/execution/BuildFailure.java
new file mode 100644
index 0000000000..9f464cd689
--- /dev/null
+++ b/maven-core/src/main/java/org/apache/maven/execution/BuildFailure.java
@@ -0,0 +1,54 @@
+package org.apache.maven.execution;
+
+/*
+ * Copyright 2001-2005 The Apache Software Foundation.
+ *
+ * Licensed 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.
+ */
+
+/**
+ * Describe a build failure in the reactor.
+ *
+ * @author Brett Porter
+ * @version $Id$
+ */
+public class BuildFailure
+{
+ private final Exception cause;
+
+ private final String task;
+
+ private final long time;
+
+ BuildFailure( Exception cause, String task, long time )
+ {
+ this.cause = cause;
+ this.task = task;
+ this.time = time;
+ }
+
+ String getTask()
+ {
+ return task;
+ }
+
+ Exception getCause()
+ {
+ return cause;
+ }
+
+ public long getTime()
+ {
+ return time;
+ }
+}
diff --git a/maven-core/src/main/java/org/apache/maven/execution/BuildSuccess.java b/maven-core/src/main/java/org/apache/maven/execution/BuildSuccess.java
new file mode 100644
index 0000000000..86ec0787ad
--- /dev/null
+++ b/maven-core/src/main/java/org/apache/maven/execution/BuildSuccess.java
@@ -0,0 +1,48 @@
+package org.apache.maven.execution;
+
+/*
+ * Copyright 2001-2005 The Apache Software Foundation.
+ *
+ * Licensed 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 org.apache.maven.project.MavenProject;
+
+/**
+ * Describe a build success in the reactor.
+ *
+ * @author Brett Porter
+ * @version $Id$
+ */
+public class BuildSuccess
+{
+ private final MavenProject project;
+
+ private final long time;
+
+ public BuildSuccess( MavenProject project, long time )
+ {
+ this.project = project;
+ this.time = time;
+ }
+
+ public MavenProject getProject()
+ {
+ return project;
+ }
+
+ public long getTime()
+ {
+ return time;
+ }
+}
diff --git a/maven-core/src/main/java/org/apache/maven/execution/ReactorManager.java b/maven-core/src/main/java/org/apache/maven/execution/ReactorManager.java
index 0bcac02d45..5da9407bf1 100644
--- a/maven-core/src/main/java/org/apache/maven/execution/ReactorManager.java
+++ b/maven-core/src/main/java/org/apache/maven/execution/ReactorManager.java
@@ -124,9 +124,9 @@ public class ReactorManager
return blackList.contains( ArtifactUtils.versionlessKey( project.getGroupId(), project.getArtifactId() ) );
}
- public void registerBuildFailure( MavenProject project, Exception error, String task )
+ public void registerBuildFailure( MavenProject project, Exception error, String task, long time )
{
- buildFailuresByProject.put( project.getId(), new BuildFailure( error, task ) );
+ buildFailuresByProject.put( project.getId(), new BuildFailure( error, task, time ) );
}
public boolean hasBuildFailures()
@@ -159,31 +159,19 @@ public class ReactorManager
return buildSuccessesByProject.containsKey( project.getId() );
}
- public void registerBuildSuccess( MavenProject project )
+ public void registerBuildSuccess( MavenProject project, long time )
{
- buildSuccessesByProject.put( project.getId(), project );
+ buildSuccessesByProject.put( project.getId(), new BuildSuccess( project, time ) );
}
- private static class BuildFailure
+ public BuildFailure getBuildFailure( MavenProject project )
{
- private Exception cause;
-
- private String task;
-
- BuildFailure( Exception cause, String task )
- {
- this.cause = cause;
- this.task = task;
- }
-
- String getTask()
- {
- return task;
- }
-
- Exception getCause()
- {
- return cause;
- }
+ return (BuildFailure) buildFailuresByProject.get( project.getId() );
}
+
+ public BuildSuccess getBuildSuccess( MavenProject project )
+ {
+ return (BuildSuccess) buildSuccessesByProject.get( project.getId() );
+ }
+
}
diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java b/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java
index 51f6b2453c..1367ca1e00 100644
--- a/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java
+++ b/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java
@@ -224,6 +224,8 @@ public class DefaultLifecycleExecutor
// Event monitoring.
String event = MavenEvents.PROJECT_EXECUTION;
+ long buildStartTime = System.currentTimeMillis();
+
dispatcher.dispatchStart( event, rootProject.getId() + " ( " + segment + " )" );
try
@@ -240,24 +242,24 @@ public class DefaultLifecycleExecutor
catch ( MojoExecutionException e )
{
// TODO: should this be removed?
- handleExecutionFailure( rm, rootProject, e, task );
+ handleExecutionFailure( rm, rootProject, e, task, buildStartTime );
}
catch ( ArtifactResolutionException e )
{
// TODO: should this be removed?
- handleExecutionFailure( rm, rootProject, e, task );
+ handleExecutionFailure( rm, rootProject, e, task, buildStartTime );
}
catch ( MojoFailureException e )
{
- handleExecutionFailure( rm, rootProject, e, task );
+ handleExecutionFailure( rm, rootProject, e, task, buildStartTime );
}
catch ( ArtifactNotFoundException e )
{
- handleExecutionFailure( rm, rootProject, e, task );
+ handleExecutionFailure( rm, rootProject, e, task, buildStartTime );
}
}
- rm.registerBuildSuccess( rootProject );
+ rm.registerBuildSuccess( rootProject, System.currentTimeMillis() - buildStartTime );
dispatcher.dispatchEnd( event, rootProject.getId() + " ( " + segment + " )" );
}
@@ -307,6 +309,8 @@ public class DefaultLifecycleExecutor
// Event monitoring.
String event = MavenEvents.PROJECT_EXECUTION;
+ long buildStartTime = System.currentTimeMillis();
+
dispatcher.dispatchStart( event, currentProject.getId() + " ( " + segment + " )" );
try
@@ -322,24 +326,24 @@ public class DefaultLifecycleExecutor
catch ( MojoExecutionException e )
{
// TODO: should this be removed?
- handleExecutionFailure( rm, currentProject, e, task );
+ handleExecutionFailure( rm, currentProject, e, task, buildStartTime );
}
catch ( ArtifactResolutionException e )
{
// TODO: should this be removed?
- handleExecutionFailure( rm, currentProject, e, task );
+ handleExecutionFailure( rm, currentProject, e, task, buildStartTime );
}
catch ( MojoFailureException e )
{
- handleExecutionFailure( rm, currentProject, e, task );
+ handleExecutionFailure( rm, currentProject, e, task, buildStartTime );
}
catch ( ArtifactNotFoundException e )
{
- handleExecutionFailure( rm, currentProject, e, task );
+ handleExecutionFailure( rm, currentProject, e, task, buildStartTime );
}
}
- rm.registerBuildSuccess( currentProject );
+ rm.registerBuildSuccess( currentProject, System.currentTimeMillis() - buildStartTime );
dispatcher.dispatchEnd( event, currentProject.getId() + " ( " + segment + " )" );
}
@@ -368,12 +372,13 @@ public class DefaultLifecycleExecutor
}
}
- private void handleExecutionFailure( ReactorManager rm, MavenProject project, Exception e, String task )
+ private void handleExecutionFailure( ReactorManager rm, MavenProject project, Exception e, String task,
+ long buildStartTime )
throws MojoExecutionException, MojoFailureException, ArtifactNotFoundException, ArtifactResolutionException
{
if ( ReactorManager.FAIL_FAST.equals( rm.getFailureBehavior() ) )
{
- rm.registerBuildFailure( project, e, task );
+ rm.registerBuildFailure( project, e, task, System.currentTimeMillis() - buildStartTime );
if ( e instanceof MojoExecutionException )
{
@@ -400,7 +405,7 @@ public class DefaultLifecycleExecutor
}
else if ( ReactorManager.FAIL_AT_END.equals( rm.getFailureBehavior() ) )
{
- rm.registerBuildFailure( project, e, task );
+ rm.registerBuildFailure( project, e, task, System.currentTimeMillis() - buildStartTime );
rm.blackList( project );
}