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