/*******************************************************************************
* Copyright (c) 2008-2010 Sonatype, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Sonatype, Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.m2e.core.internal.embedder;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.osgi.util.NLS;
import org.apache.maven.wagon.WagonConstants;
import org.eclipse.m2e.core.internal.Messages;
/**
* AbstractTransferListenerAdapter
*
* @author igor
*/
abstract class AbstractTransferListenerAdapter {
private static final Logger log = LoggerFactory.getLogger(AbstractTransferListenerAdapter.class);
protected final MavenImpl maven;
protected final IProgressMonitor monitor;
//The same TransferListener monitors parallel downloads
protected Map<String, Long> progressMap = new ConcurrentHashMap<String, Long>();
private static final String[] units = {Messages.AbstractTransferListenerAdapter_byte,
Messages.AbstractTransferListenerAdapter_kb, Messages.AbstractTransferListenerAdapter_mb};
protected AbstractTransferListenerAdapter(MavenImpl maven, IProgressMonitor monitor) {
this.maven = maven;
this.monitor = monitor == null ? new NullProgressMonitor() : monitor;
}
protected void formatBytes(long n, StringBuilder sb) {
int i = 0;
while(n >= 1024 && ++i < units.length)
n >>= 10;
sb.append(n);
sb.append(units[i]);
}
protected void transferInitiated(String artifactUrl) {
if(monitor.isCanceled()) {
throw new OperationCanceledException(Messages.AbstractTransferListenerAdapter_cancelled);
}
if(artifactUrl != null) {
monitor.subTask(artifactUrl);
}
}
protected void transferStarted(String artifactUrl) {
log.info(NLS.bind("Downloading {0}", artifactUrl));
// monitor.beginTask("0% "+e.getWagon().getRepository()+"/"+e.getResource().getName(), IProgressMonitor.UNKNOWN);
monitor.subTask(NLS.bind(Messages.AbstractTransferListenerAdapter_4, artifactUrl));
}
protected void transferProgress(String artifactUrl, long total, int length) throws OperationCanceledException {
if(monitor.isCanceled()) {
throw new OperationCanceledException(Messages.AbstractTransferListenerAdapter_cancelled);
}
Long downloadProgress = progressMap.get(artifactUrl);
long complete = downloadProgress == null ? 0L : downloadProgress.longValue();
complete += length;
progressMap.put(artifactUrl, complete);
StringBuilder sb = new StringBuilder();
formatBytes(complete, sb);
if(total != WagonConstants.UNKNOWN_LENGTH) {
sb.append('/');
formatBytes(total, sb);
if(total > 0) {
sb.append(" (");
sb.append(100l * complete / total);
sb.append("%)");
}
}
sb.append(' ');
monitor.subTask(sb.toString() + artifactUrl);
}
protected void transferCompleted(String artifactUrl) {
log.info(NLS.bind("Downloaded {0}", artifactUrl));
// monitor.subTask("100% "+e.getWagon().getRepository()+"/"+e.getResource().getName());
monitor.subTask(""); //$NON-NLS-1$
progressMap.remove(artifactUrl);
}
protected void transferError(String artifactUrl, Exception exception) {
log.error(NLS.bind("Unable to download {0} : {1}", artifactUrl, exception));
monitor.subTask(NLS.bind(Messages.AbstractTransferListenerAdapter_subtask, artifactUrl));
progressMap.remove(artifactUrl);
}
}