You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by mi...@apache.org on 2016/02/18 00:32:43 UTC
maven git commit: [MNG-5977] Improve output readability of our
MavenTransferListener implementations
Repository: maven
Updated Branches:
refs/heads/master 8dea99f97 -> ea73fcdb6
[MNG-5977] Improve output readability of our MavenTransferListener implementations
* Applied a general decimal formatter which automatically scales file size between 1 and 1000 along with proper size and time units
* The progress meter in the shell will now properly tell that a progress is going on and visually seperate parallel downloads with " | "
* Optimized and reduced padding to the cases where it actually is necessary
* Padding has to applied to very event which can succeed a progress update
* Synchronize all calls to console to avoid race conditions where output is terminated by a carriage return only. If no sync is done, SLF4J or INIT/SUCCEEDED update can interleave and overwrite the progress while being shorter as the progress itself.
Race conditions cannot be avoided if -T is employed since one does not have access to the output stream of a SLF4J backend to synchronize on.
Project: http://git-wip-us.apache.org/repos/asf/maven/repo
Commit: http://git-wip-us.apache.org/repos/asf/maven/commit/ea73fcdb
Tree: http://git-wip-us.apache.org/repos/asf/maven/tree/ea73fcdb
Diff: http://git-wip-us.apache.org/repos/asf/maven/diff/ea73fcdb
Branch: refs/heads/master
Commit: ea73fcdb6c0d2bafad75085a38906fcccfa1c049
Parents: 8dea99f
Author: Michael Osipov <mi...@apache.org>
Authored: Thu Feb 18 00:28:50 2016 +0100
Committer: Michael Osipov <mi...@apache.org>
Committed: Thu Feb 18 00:31:00 2016 +0100
----------------------------------------------------------------------
.../transfer/AbstractMavenTransferListener.java | 92 +++++++++++++++-----
.../transfer/ConsoleMavenTransferListener.java | 84 +++++++++++-------
.../transfer/Slf4jMavenTransferListener.java | 37 ++++----
3 files changed, 138 insertions(+), 75 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/maven/blob/ea73fcdb/maven-embedder/src/main/java/org/apache/maven/cli/transfer/AbstractMavenTransferListener.java
----------------------------------------------------------------------
diff --git a/maven-embedder/src/main/java/org/apache/maven/cli/transfer/AbstractMavenTransferListener.java b/maven-embedder/src/main/java/org/apache/maven/cli/transfer/AbstractMavenTransferListener.java
index 58b1a5d..b8af752 100644
--- a/maven-embedder/src/main/java/org/apache/maven/cli/transfer/AbstractMavenTransferListener.java
+++ b/maven-embedder/src/main/java/org/apache/maven/cli/transfer/AbstractMavenTransferListener.java
@@ -22,6 +22,7 @@ package org.apache.maven.cli.transfer;
import java.io.PrintStream;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
+import java.text.FieldPosition;
import java.util.Locale;
import org.eclipse.aether.transfer.AbstractTransferListener;
@@ -33,6 +34,62 @@ public abstract class AbstractMavenTransferListener
extends AbstractTransferListener
{
+ // CHECKSTYLE_OFF: LineLength
+ /**
+ * Formats file length with the associated <a href="https://en.wikipedia.org/wiki/Metric_prefix">SI</a> prefix
+ * (GB, MB, kB) and using the pattern <code>###0.#</code> by default.
+ *
+ * @see <a href="https://en.wikipedia.org/wiki/Metric_prefix">https://en.wikipedia.org/wiki/Metric_prefix</a>
+ * @see <a href="https://en.wikipedia.org/wiki/Binary_prefix">https://en.wikipedia.org/wiki/Binary_prefix</a>
+ * @see <a
+ * href="https://en.wikipedia.org/wiki/Octet_%28computing%29">https://en.wikipedia.org/wiki/Octet_(computing)</a>
+ */
+ // CHECKSTYLE_ON: LineLength
+ static class FileDecimalFormat
+ extends DecimalFormat
+ {
+ private static final long serialVersionUID = -684999256062614038L;
+
+ /**
+ * Default constructor
+ *
+ * @param locale
+ */
+ public FileDecimalFormat( Locale locale )
+ {
+ super( "###0.#", new DecimalFormatSymbols( locale ) );
+ }
+
+ /** {@inheritDoc} */
+ public StringBuffer format( long fs, StringBuffer result, FieldPosition fieldPosition )
+ {
+ if ( fs > 1000L * 1000L * 1000L )
+ {
+ result = super.format( (float) fs / ( 1000L * 1000L * 1000L ), result, fieldPosition );
+ result.append( " GB" );
+ return result;
+ }
+
+ if ( fs > 1000L * 1000L )
+ {
+ result = super.format( (float) fs / ( 1000L * 1000L ), result, fieldPosition );
+ result.append( " MB" );
+ return result;
+ }
+
+ if ( fs > 1000L )
+ {
+ result = super.format( (float) fs / ( 1000L ), result, fieldPosition );
+ result.append( " kB" );
+ return result;
+ }
+
+ result = super.format( fs, result, fieldPosition );
+ result.append( " B" );
+ return result;
+ }
+ }
+
protected PrintStream out;
protected AbstractMavenTransferListener( PrintStream out )
@@ -43,9 +100,10 @@ public abstract class AbstractMavenTransferListener
@Override
public void transferInitiated( TransferEvent event )
{
- String message = event.getRequestType() == TransferEvent.RequestType.PUT ? "Uploading" : "Downloading";
+ String type = event.getRequestType() == TransferEvent.RequestType.PUT ? "Uploading" : "Downloading";
- out.println( message + ": " + event.getResource().getRepositoryUrl() + event.getResource().getResourceName() );
+ TransferResource resource = event.getResource();
+ out.println( type + ": " + resource.getRepositoryUrl() + resource.getResourceName() );
}
@Override
@@ -53,7 +111,6 @@ public abstract class AbstractMavenTransferListener
throws TransferCancelledException
{
TransferResource resource = event.getResource();
-
out.println( "[WARNING] " + event.getException().getMessage() + " for " + resource.getRepositoryUrl()
+ resource.getResourceName() );
}
@@ -63,28 +120,21 @@ public abstract class AbstractMavenTransferListener
{
TransferResource resource = event.getResource();
long contentLength = event.getTransferredBytes();
- if ( contentLength >= 0 )
- {
- String type = ( event.getRequestType() == TransferEvent.RequestType.PUT ? "Uploaded" : "Downloaded" );
- String len = contentLength >= 1024 ? toKB( contentLength ) + " KB" : contentLength + " B";
- String throughput = "";
- long duration = System.currentTimeMillis() - resource.getTransferStartTime();
- if ( duration > 0 )
- {
- DecimalFormat format = new DecimalFormat( "0.0", new DecimalFormatSymbols( Locale.ENGLISH ) );
- double kbPerSec = ( contentLength / 1024.0 ) / ( duration / 1000.0 );
- throughput = " at " + format.format( kbPerSec ) + " KB/sec";
- }
+ DecimalFormat format = new FileDecimalFormat( Locale.ENGLISH );
+ String type = ( event.getRequestType() == TransferEvent.RequestType.PUT ? "Uploaded" : "Downloaded" );
+ String len = format.format( contentLength );
- out.println( type + ": " + resource.getRepositoryUrl() + resource.getResourceName() + " (" + len
- + throughput + ")" );
+ String throughput = "";
+ long duration = System.currentTimeMillis() - resource.getTransferStartTime();
+ if ( duration > 0L )
+ {
+ double bytesPerSecond = contentLength / ( duration / 1000.0 );
+ throughput = " at " + format.format( (long) bytesPerSecond ) + "/s";
}
- }
- protected long toKB( long bytes )
- {
- return ( bytes + 1023 ) / 1024;
+ out.println( type + ": " + resource.getRepositoryUrl() + resource.getResourceName() + " (" + len
+ + throughput + ")" );
}
}
http://git-wip-us.apache.org/repos/asf/maven/blob/ea73fcdb/maven-embedder/src/main/java/org/apache/maven/cli/transfer/ConsoleMavenTransferListener.java
----------------------------------------------------------------------
diff --git a/maven-embedder/src/main/java/org/apache/maven/cli/transfer/ConsoleMavenTransferListener.java b/maven-embedder/src/main/java/org/apache/maven/cli/transfer/ConsoleMavenTransferListener.java
index 5f87836..704eaff 100644
--- a/maven-embedder/src/main/java/org/apache/maven/cli/transfer/ConsoleMavenTransferListener.java
+++ b/maven-embedder/src/main/java/org/apache/maven/cli/transfer/ConsoleMavenTransferListener.java
@@ -20,6 +20,9 @@ package org.apache.maven.cli.transfer;
*/
import java.io.PrintStream;
+import java.text.DecimalFormat;
+import java.util.Iterator;
+import java.util.Locale;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@@ -46,22 +49,42 @@ public class ConsoleMavenTransferListener
}
@Override
- public void transferProgressed( TransferEvent event )
+ public synchronized void transferInitiated( TransferEvent event )
+ {
+ overridePreviousTransfer( event );
+
+ super.transferInitiated( event );
+ }
+
+ @Override
+ public synchronized void transferCorrupted( TransferEvent event )
+ throws TransferCancelledException
+ {
+ overridePreviousTransfer( event );
+
+ super.transferCorrupted( event );
+ }
+
+ @Override
+ public synchronized void transferProgressed( TransferEvent event )
throws TransferCancelledException
{
TransferResource resource = event.getResource();
downloads.put( resource, event.getTransferredBytes() );
- StringBuilder buffer = new StringBuilder( 64 );
+ StringBuilder buffer = new StringBuilder( 128 );
+ buffer.append( "Progress: " );
- for ( Map.Entry<TransferResource, Long> entry : downloads.entrySet() )
+ Iterator<Map.Entry<TransferResource, Long>> iter = downloads.entrySet().iterator();
+ while ( iter.hasNext() )
{
+ Map.Entry<TransferResource, Long> entry = iter.next();
long total = entry.getKey().getContentLength();
Long complete = entry.getValue();
- // NOTE: This null check guards against http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6312056
- if ( complete != null )
+ buffer.append( getStatus( complete, total ) );
+ if ( iter.hasNext() )
{
- buffer.append( getStatus( complete, total ) ).append( " " );
+ buffer.append( " | " );
}
}
@@ -69,28 +92,20 @@ public class ConsoleMavenTransferListener
lastLength = buffer.length();
pad( buffer, pad );
buffer.append( '\r' );
-
out.print( buffer.toString() );
+ out.flush();
}
private String getStatus( long complete, long total )
{
- if ( total >= 1024 )
- {
- return toKB( complete ) + "/" + toKB( total ) + " KB ";
- }
- else if ( total >= 0 )
+ DecimalFormat format = new FileDecimalFormat( Locale.ENGLISH );
+ String status = format.format( complete );
+ if ( total > 0 && complete != total )
{
- return complete + "/" + total + " B ";
- }
- else if ( complete >= 1024 )
- {
- return toKB( complete ) + " KB ";
- }
- else
- {
- return complete + " B ";
+ status += "/" + format.format( total );
}
+
+ return status;
}
private void pad( StringBuilder buffer, int spaces )
@@ -105,29 +120,34 @@ public class ConsoleMavenTransferListener
}
@Override
- public void transferSucceeded( TransferEvent event )
+ public synchronized void transferSucceeded( TransferEvent event )
{
- transferCompleted( event );
+ downloads.remove( event.getResource() );
+ overridePreviousTransfer( event );
super.transferSucceeded( event );
}
@Override
- public void transferFailed( TransferEvent event )
+ public synchronized void transferFailed( TransferEvent event )
{
- transferCompleted( event );
+ downloads.remove( event.getResource() );
+ overridePreviousTransfer( event );
super.transferFailed( event );
}
- private void transferCompleted( TransferEvent event )
+ private void overridePreviousTransfer( TransferEvent event )
{
- downloads.remove( event.getResource() );
-
- StringBuilder buffer = new StringBuilder( 64 );
- pad( buffer, lastLength );
- buffer.append( '\r' );
- out.print( buffer.toString() );
+ if ( lastLength > 0 )
+ {
+ StringBuilder buffer = new StringBuilder( 128 );
+ pad( buffer, lastLength );
+ buffer.append( '\r' );
+ out.print( buffer.toString() );
+ out.flush();
+ lastLength = 0;
+ }
}
}
http://git-wip-us.apache.org/repos/asf/maven/blob/ea73fcdb/maven-embedder/src/main/java/org/apache/maven/cli/transfer/Slf4jMavenTransferListener.java
----------------------------------------------------------------------
diff --git a/maven-embedder/src/main/java/org/apache/maven/cli/transfer/Slf4jMavenTransferListener.java b/maven-embedder/src/main/java/org/apache/maven/cli/transfer/Slf4jMavenTransferListener.java
index bb72db3..6f50f5e 100644
--- a/maven-embedder/src/main/java/org/apache/maven/cli/transfer/Slf4jMavenTransferListener.java
+++ b/maven-embedder/src/main/java/org/apache/maven/cli/transfer/Slf4jMavenTransferListener.java
@@ -20,9 +20,9 @@ package org.apache.maven.cli.transfer;
*/
import java.text.DecimalFormat;
-import java.text.DecimalFormatSymbols;
import java.util.Locale;
+import org.apache.maven.cli.transfer.AbstractMavenTransferListener.FileDecimalFormat;
import org.eclipse.aether.transfer.AbstractTransferListener;
import org.eclipse.aether.transfer.TransferCancelledException;
import org.eclipse.aether.transfer.TransferEvent;
@@ -50,9 +50,10 @@ public class Slf4jMavenTransferListener
@Override
public void transferInitiated( TransferEvent event )
{
- String message = event.getRequestType() == TransferEvent.RequestType.PUT ? "Uploading" : "Downloading";
+ String type = event.getRequestType() == TransferEvent.RequestType.PUT ? "Uploading" : "Downloading";
- out.info( message + ": " + event.getResource().getRepositoryUrl() + event.getResource().getResourceName() );
+ TransferResource resource = event.getResource();
+ out.info( type + ": " + resource.getRepositoryUrl() + resource.getResourceName() );
}
@Override
@@ -60,7 +61,6 @@ public class Slf4jMavenTransferListener
throws TransferCancelledException
{
TransferResource resource = event.getResource();
-
out.warn( event.getException().getMessage() + " for " + resource.getRepositoryUrl()
+ resource.getResourceName() );
}
@@ -70,28 +70,21 @@ public class Slf4jMavenTransferListener
{
TransferResource resource = event.getResource();
long contentLength = event.getTransferredBytes();
- if ( contentLength >= 0 )
- {
- String type = ( event.getRequestType() == TransferEvent.RequestType.PUT ? "Uploaded" : "Downloaded" );
- String len = contentLength >= 1024 ? toKB( contentLength ) + " KB" : contentLength + " B";
- String throughput = "";
- long duration = System.currentTimeMillis() - resource.getTransferStartTime();
- if ( duration > 0 )
- {
- DecimalFormat format = new DecimalFormat( "0.0", new DecimalFormatSymbols( Locale.ENGLISH ) );
- double kbPerSec = ( contentLength / 1024.0 ) / ( duration / 1000.0 );
- throughput = " at " + format.format( kbPerSec ) + " KB/sec";
- }
+ DecimalFormat format = new FileDecimalFormat( Locale.ENGLISH );
+ String type = ( event.getRequestType() == TransferEvent.RequestType.PUT ? "Uploaded" : "Downloaded" );
+ String len = format.format( contentLength );
- out.info( type + ": " + resource.getRepositoryUrl() + resource.getResourceName() + " (" + len
- + throughput + ")" );
+ String throughput = "";
+ long duration = System.currentTimeMillis() - resource.getTransferStartTime();
+ if ( duration > 0L )
+ {
+ double bytesPerSecond = contentLength / ( duration / 1000.0 );
+ throughput = " at " + format.format( (long) bytesPerSecond ) + "/s";
}
- }
- protected long toKB( long bytes )
- {
- return ( bytes + 1023 ) / 1024;
+ out.info( type + ": " + resource.getRepositoryUrl() + resource.getResourceName() + " (" + len
+ + throughput + ")" );
}
}