/**
* Aptana Studio
* Copyright (c) 2005-2011 by Appcelerator, Inc. All Rights Reserved.
* Licensed under the terms of the GNU Public License (GPL) v3 (with exceptions).
* Please see the license.html included with this distribution for details.
* Any modifications to this file must keep this entire header intact.
*/
package com.aptana.ide.syncing.core.old.handlers;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.SubProgressMonitor;
import com.aptana.core.util.FileUtil;
import com.aptana.ide.core.io.IConnectionPoint;
import com.aptana.ide.syncing.core.old.VirtualFileSyncPair;
/**
* @author Max Stepanov (mstepanov@aptana.com)
*/
public class SyncEventHandlerAdapterWithProgressMonitor extends SyncEventHandlerAdapter
{
private static final int TRANSFER_SCALE = 1024;
private static final int PATH_DISPLAY_CHARACTERS = 40;
private IProgressMonitor monitor;
private Map<VirtualFileSyncPair, SubProgressMonitor> itemsProgress = new HashMap<VirtualFileSyncPair, SubProgressMonitor>();
private Map<VirtualFileSyncPair, Long> itemsTransfer = new HashMap<VirtualFileSyncPair, Long>();
/**
*
*/
public SyncEventHandlerAdapterWithProgressMonitor(IProgressMonitor monitor)
{
this.monitor = (monitor != null) ? monitor : new NullProgressMonitor();
}
/*
* (non-Javadoc)
* @see
* com.aptana.ide.core.io.sync.SyncEventHandlerAdapter#getFilesEvent(com.aptana.ide.core.io.IVirtualFileManager,
* java.lang.String)
*/
@Override
public boolean getFilesEvent(IConnectionPoint manager, String path)
{
monitor.subTask(FileUtil.compressPath(path, PATH_DISPLAY_CHARACTERS));
return !monitor.isCanceled() && super.getFilesEvent(manager, path);
}
/*
* (non-Javadoc)
* @see com.aptana.ide.core.io.sync.SyncEventHandlerAdapter#syncContinue()
*/
@Override
public boolean syncContinue(IProgressMonitor monitor)
{
return !monitor.isCanceled() && super.syncContinue(monitor);
}
/*
* (non-Javadoc)
* @see
* com.aptana.ide.core.io.sync.SyncEventHandlerAdapter#syncDone(com.aptana.ide.core.io.sync.VirtualFileSyncPair)
*/
@Override
public void syncDone(VirtualFileSyncPair item, IProgressMonitor monitor)
{
SubProgressMonitor itemProgressMonitor = itemsProgress.get(item);
if (itemProgressMonitor != null)
{
itemProgressMonitor.done();
itemsProgress.remove(item);
itemsTransfer.remove(item);
}
super.syncDone(item, monitor);
}
/*
* (non-Javadoc)
* @see
* com.aptana.ide.core.io.sync.SyncEventHandlerAdapter#syncErrorEvent(com.aptana.ide.core.io.sync.VirtualFileSyncPair
* , java.lang.Exception)
*/
@Override
public boolean syncErrorEvent(VirtualFileSyncPair item, Exception e, IProgressMonitor monitor)
{
SubProgressMonitor itemProgressMonitor = itemsProgress.get(item);
if (itemProgressMonitor != null)
{
itemProgressMonitor.done();
itemsProgress.remove(item);
itemsTransfer.remove(item);
}
return !monitor.isCanceled() && super.syncErrorEvent(item, e, monitor);
}
/*
* (non-Javadoc)
* @see
* com.aptana.ide.core.io.sync.SyncEventHandlerAdapter#syncEvent(com.aptana.ide.core.io.sync.VirtualFileSyncPair,
* int, int)
*/
@Override
public boolean syncEvent(VirtualFileSyncPair item, int index, int totalItems, IProgressMonitor monitor)
{
SubProgressMonitor itemProgressMonitor = itemsProgress.get(item);
if (itemProgressMonitor == null && item != null)
{
itemProgressMonitor = new SubProgressMonitor(monitor, 1);
itemsProgress.put(item, itemProgressMonitor);
itemsTransfer.put(item, Long.valueOf(0));
monitor.subTask(FileUtil.compressPath(item.getRelativePath(), PATH_DISPLAY_CHARACTERS));
itemProgressMonitor.beginTask(item.getRelativePath(), getItemProgressAmount(item));
}
return !monitor.isCanceled() && super.syncEvent(item, index, totalItems, monitor);
}
/*
* (non-Javadoc)
* @see
* com.aptana.ide.core.io.sync.SyncEventHandlerAdapter#syncTransferring(com.aptana.ide.core.io.sync.VirtualFileSyncPair
* , long)
*/
@Override
public void syncTransferring(VirtualFileSyncPair item, long bytes, IProgressMonitor monitor)
{
SubProgressMonitor itemProgressMonitor = itemsProgress.get(item);
if (itemProgressMonitor != null)
{
long delta = bytes - ((Long) itemsTransfer.get(item));
itemsTransfer.put(item, Long.valueOf(bytes));
itemProgressMonitor.worked((int) (delta / TRANSFER_SCALE));
}
super.syncTransferring(item, bytes, monitor);
}
private static int getItemProgressAmount(VirtualFileSyncPair item)
{
switch (item.getSyncDirection())
{
case VirtualFileSyncPair.Direction_ClientToServer:
return (int) (item.getSourceFile().fetchInfo().getLength() / TRANSFER_SCALE);
case VirtualFileSyncPair.Direction_ServerToClient:
return (int) (item.getDestinationFile().fetchInfo().getLength() / TRANSFER_SCALE);
}
return 1;
}
}