1 package org.apache.maven.repository.internal.util;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.io.PrintStream;
23 import java.text.DecimalFormat;
24 import java.text.DecimalFormatSymbols;
25 import java.util.Locale;
26 import java.util.Map;
27 import java.util.concurrent.ConcurrentHashMap;
28
29 import org.eclipse.aether.transfer.AbstractTransferListener;
30 import org.eclipse.aether.transfer.TransferEvent;
31 import org.eclipse.aether.transfer.TransferResource;
32
33 public class ConsoleTransferListener
34 extends AbstractTransferListener
35 {
36
37 private PrintStream out;
38
39 private Map<TransferResource, Long> downloads = new ConcurrentHashMap<>();
40
41 private int lastLength;
42
43 public ConsoleTransferListener()
44 {
45 this( null );
46 }
47
48 public ConsoleTransferListener( PrintStream out )
49 {
50 this.out = ( out != null ) ? out : System.out;
51 }
52
53 @Override
54 public void transferInitiated( TransferEvent event )
55 {
56 String message = event.getRequestType() == TransferEvent.RequestType.PUT ? "Uploading" : "Downloading";
57
58 println( "transferInitiated", message + ": " + event.getResource().getRepositoryUrl() + event.getResource().getResourceName() );
59 }
60
61 @Override
62 public void transferProgressed( TransferEvent event )
63 {
64 TransferResource resource = event.getResource();
65 downloads.put( resource, event.getTransferredBytes() );
66
67 StringBuilder buffer = new StringBuilder( 64 );
68
69 for ( Map.Entry<TransferResource, Long> entry : downloads.entrySet() )
70 {
71 long total = entry.getKey().getContentLength();
72 long complete = entry.getValue();
73
74 buffer.append( getStatus( complete, total ) ).append( " " );
75 }
76
77 int pad = lastLength - buffer.length();
78 lastLength = buffer.length();
79 pad( buffer, pad );
80 buffer.append( '\r' );
81
82 print( "transferProgressed", buffer.toString() );
83 }
84
85 private String getStatus( long complete, long total )
86 {
87 if ( total >= 1024 )
88 {
89 return toKB( complete ) + "/" + toKB( total ) + " KB ";
90 }
91 else if ( total >= 0 )
92 {
93 return complete + "/" + total + " B ";
94 }
95 else if ( complete >= 1024 )
96 {
97 return toKB( complete ) + " KB ";
98 }
99 else
100 {
101 return complete + " B ";
102 }
103 }
104
105 private void pad( StringBuilder buffer, int spaces )
106 {
107 String block = " ";
108 while ( spaces > 0 )
109 {
110 int n = Math.min( spaces, block.length() );
111 buffer.append( block, 0, n );
112 spaces -= n;
113 }
114 }
115
116 @Override
117 public void transferSucceeded( TransferEvent event )
118 {
119 transferCompleted( event );
120
121 TransferResource resource = event.getResource();
122 long contentLength = event.getTransferredBytes();
123 if ( contentLength >= 0 )
124 {
125 String type = ( event.getRequestType() == TransferEvent.RequestType.PUT ? "Uploaded" : "Downloaded" );
126 String len = contentLength >= 1024 ? toKB( contentLength ) + " KB" : contentLength + " B";
127
128 String throughput = "";
129 long duration = System.currentTimeMillis() - resource.getTransferStartTime();
130 if ( duration > 0 )
131 {
132 DecimalFormat format = new DecimalFormat( "0.0", new DecimalFormatSymbols( Locale.ENGLISH ) );
133 double kbPerSec = ( contentLength / 1024.0 ) / ( duration / 1000.0 );
134 throughput = " at " + format.format( kbPerSec ) + " KB/sec";
135 }
136
137 println( "transferSucceeded", type + ": " + resource.getRepositoryUrl() + resource.getResourceName() + " ("
138 + len + throughput + ")" );
139 }
140 }
141
142 @Override
143 public void transferFailed( TransferEvent event )
144 {
145 transferCompleted( event );
146
147 println( "transferFailed", event.getException().getClass() + ": " + event.getException().getMessage() );
148 }
149
150 private void transferCompleted( TransferEvent event )
151 {
152 downloads.remove( event.getResource() );
153
154 StringBuilder buffer = new StringBuilder( 64 );
155 pad( buffer, lastLength );
156 buffer.append( '\r' );
157 out.println( buffer );
158 }
159
160 @Override
161 public void transferCorrupted( TransferEvent event )
162 {
163 println( "transferCorrupted", event.getException().getClass() + ": " + event.getException().getMessage() );
164 }
165
166 protected long toKB( long bytes )
167 {
168 return ( bytes + 1023 ) / 1024;
169 }
170
171 private void println( String event, String message )
172 {
173 print( event, message );
174 out.println();
175 }
176
177 private void print( String event, String message )
178 {
179 out.print( "Aether Transfer - " + event );
180 if ( message != null )
181 {
182 out.print( ": " );
183 out.print( message );
184 }
185 }
186 }