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