/* * Copyright to the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.rioproject.resolver.aether.util; import org.eclipse.aether.transfer.AbstractTransferListener; import org.eclipse.aether.transfer.TransferEvent; import org.eclipse.aether.transfer.TransferResource; import java.io.PrintStream; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.util.Locale; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /** * A simplistic transfer listener that logs uploads/downloads to the console. */ public class ConsoleTransferListener extends AbstractTransferListener { private PrintStream out; private Map<TransferResource, Long> downloads = new ConcurrentHashMap<TransferResource, Long>(); private int lastLength; public ConsoleTransferListener() { this(null); } public ConsoleTransferListener(PrintStream out) { this.out = (out != null) ? out : System.out; } @Override public void transferProgressed(TransferEvent event) { TransferResource resource = event.getResource(); downloads.put(resource, event.getTransferredBytes()); StringBuilder buffer = new StringBuilder(64); for (Map.Entry<TransferResource, Long> entry : downloads.entrySet()) { long total = entry.getKey().getContentLength(); long complete = entry.getValue(); buffer.append(getStatus(complete, total)).append(" "); } int pad = lastLength - buffer.length(); lastLength = buffer.length(); pad(buffer, pad); buffer.append('\r'); out.print(buffer); } private String getStatus(long complete, long total) { if (total >= 1024) { return toKB(complete) + "/" + toKB(total) + " KB "; } else if (total >= 0) { return complete + "/" + total + " B "; } else if (complete >= 1024) { return toKB(complete) + " KB "; } else { return complete + " B "; } } private void pad(StringBuilder buffer, final int spaces) { int spaceCountDown = spaces; String block = " "; while (spaceCountDown > 0) { int n = Math.min(spaces, block.length()); buffer.append(block, 0, n); spaceCountDown -= n; } } @Override public void transferSucceeded(TransferEvent event) { transferCompleted(event); 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"; } out.println(type + ": " + resource.getRepositoryUrl() + resource.getResourceName() + " (" + len + throughput + ")"); } } @Override public void transferFailed(TransferEvent event) { transferCompleted(event); //out.println("[WARNING] "+event.getException().getLocalizedMessage()); } private void transferCompleted(TransferEvent event) { downloads.remove(event.getResource()); if (event.getDataLength() > 0) { StringBuilder buffer = new StringBuilder(64); pad(buffer, lastLength); buffer.append('\r'); out.print(buffer); } } public void transferCorrupted(TransferEvent event) { TransferResource resource = event.getResource(); out.println("[WARNING] " + event.getException().getMessage() + " for " + resource.getRepositoryUrl() + resource.getResourceName()); } protected long toKB(long bytes) { return (bytes + 1023) / 1024; } }