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 <[email protected]> Authored: Thu Feb 18 00:28:50 2016 +0100 Committer: Michael Osipov <[email protected]> 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 + ")" ); } }
