/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 *
 * Copyright (c) 2010 Sonatype, Inc. All rights reserved.
 *
 * JBoss, Home of Professional Open Source
 * Copyright 2012, Red Hat Middleware LLC, and individual contributors
 * by the @authors tag. See the copyright.txt in the distribution for a
 * full listing of individual contributors.
 *
 * 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.jboss.shrinkwrap.resolver.impl.maven.logging;

import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.Locale;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.logging.Logger;

import org.eclipse.aether.transfer.AbstractTransferListener;
import org.eclipse.aether.transfer.TransferEvent;
import org.eclipse.aether.transfer.TransferResource;

A listener which reports Maven transfer events to a logger. The logger is shared with LogRepositoryListener.
Author:Karel Piwko
/** * A listener which reports Maven transfer events to a logger. * * The logger is shared with {@link LogRepositoryListener}. * * @author <a href="mailto:kpiwko@redhat.com">Karel Piwko</a> * */
public class LogTransferListener extends AbstractTransferListener { // set up new logger with output directed to standard out private static final Logger log = Logger.getLogger(LogTransferListener.class.getName()); // a map of transferred data sizes for the last notification private final Map<TransferResource, Long> downloads = new ConcurrentHashMap<TransferResource, Long>(); // a minimal amount of data transferred for an artifact required to inform // the user private static final long TRANSFER_THRESHOLD = 1024 * 50; /* * (non-Javadoc) * * @see org.sonatype.aether.util.listener.AbstractTransferListener#transferInitiated * (org.sonatype.aether.transfer.TransferEvent) */ @Override public void transferInitiated(TransferEvent event) { TransferResource resource = event.getResource(); StringBuilder sb = new StringBuilder() .append(event.getRequestType() == TransferEvent.RequestType.PUT ? "Uploading" : "Downloading").append(":") .append(resource.getRepositoryUrl()).append(resource.getResourceName()); downloads.put(resource, new Long(0)); log.fine(sb.toString()); } /* * (non-Javadoc) * * @see org.sonatype.aether.util.listener.AbstractTransferListener#transferProgressed * (org.sonatype.aether.transfer.TransferEvent) */ @Override public void transferProgressed(TransferEvent event) { TransferResource resource = event.getResource(); long lastTransferred = downloads.get(resource); long transferred = event.getTransferredBytes(); if (transferred - lastTransferred >= TRANSFER_THRESHOLD) { downloads.put(resource, Long.valueOf(transferred)); long total = resource.getContentLength(); log.finer(getStatus(transferred, total) + ", "); } } /* * (non-Javadoc) * * @see org.sonatype.aether.util.listener.AbstractTransferListener#transferSucceeded * (org.sonatype.aether.transfer.TransferEvent) */ @Override public void transferSucceeded(TransferEvent event) { TransferResource resource = event.getResource(); downloads.remove(resource); long contentLength = event.getTransferredBytes(); if (contentLength >= 0) { long duration = System.currentTimeMillis() - resource.getTransferStartTime(); double kbPerSec = (contentLength / 1024.0) / (duration / 1000.0); StringBuilder sb = new StringBuilder().append("Completed") .append(event.getRequestType() == TransferEvent.RequestType.PUT ? " upload of " : " download of ") .append(resource.getResourceName()) .append(event.getRequestType() == TransferEvent.RequestType.PUT ? " into " : " from ") .append(resource.getRepositoryUrl()).append(", transferred ") .append(contentLength >= 1024 ? toKB(contentLength) + " KB" : contentLength + " B").append(" at ") .append(new DecimalFormat("0.0", new DecimalFormatSymbols(Locale.ENGLISH)).format(kbPerSec)) .append("KB/sec"); log.fine(sb.toString()); } } /* * (non-Javadoc) * * @see org.sonatype.aether.util.listener.AbstractTransferListener#transferFailed * (org.sonatype.aether.transfer.TransferEvent) */ @Override public void transferFailed(TransferEvent event) { TransferResource resource = event.getResource(); downloads.remove(resource); StringBuilder sb = new StringBuilder().append("Failed") .append(event.getRequestType() == TransferEvent.RequestType.PUT ? " uploading " : " downloading ") .append(resource.getResourceName()) .append(event.getRequestType() == TransferEvent.RequestType.PUT ? " into " : " from ") .append(resource.getRepositoryUrl()).append(". "); if (event.getException() != null) { sb.append("Reason: \n").append(event.getException()); } log.warning(sb.toString()); } /* * (non-Javadoc) * * @see org.sonatype.aether.util.listener.AbstractTransferListener#transferCorrupted * (org.sonatype.aether.transfer.TransferEvent) */ @Override public void transferCorrupted(TransferEvent event) { TransferResource resource = event.getResource(); downloads.remove(resource); StringBuilder sb = new StringBuilder().append("Corrupted") .append(event.getRequestType() == TransferEvent.RequestType.PUT ? " upload of " : " download of ") .append(resource.getResourceName()) .append(event.getRequestType() == TransferEvent.RequestType.PUT ? " into " : " from ") .append(resource.getRepositoryUrl()).append(". "); if (event.getException() != null) { sb.append("Reason: \n").append(event.getException()); } log.warning(sb.toString()); } // converts into status message 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"; } } // converts bytes to kilobytes private long toKB(long bytes) { return (bytes + 1023) / 1024; } }