/**
* 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;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import org.eclipse.core.runtime.IPath;
/**
* @author Kevin Sawicki (ksawicki@aptana.com)
*/
public class SyncFolder implements ISyncResource
{
/**
* MIXED
*/
public static final int MIXED = -2;
private Set<ISyncResource> children;
private SyncFolder parent;
private VirtualFileSyncPair pair;
private IPath path;
private boolean skipped = false;
private int syncState = -1;
private int transferState = -1;
private long transferredBytes;
/**
* Creates a new sync folder object
*
* @param path
* @param parent
* @param pair
*/
public SyncFolder(IPath path, SyncFolder parent, VirtualFileSyncPair pair)
{
children = new TreeSet<ISyncResource>(new Comparator<ISyncResource>()
{
public int compare(ISyncResource o1, ISyncResource o2)
{
return o1.getPath().lastSegment().compareTo(o2.getPath().lastSegment());
}
});
this.parent = parent;
this.path = path;
this.pair = pair;
}
/**
* Finds a resource for the given pair
*
* @param pair
* @return - resource found or null
*/
public ISyncResource find(VirtualFileSyncPair pair)
{
if (this.pair == pair)
{
return this;
}
for (ISyncResource resource : children)
{
if (resource instanceof SyncFolder)
{
ISyncResource pairResource = ((SyncFolder) resource).find(pair);
if (pairResource != null)
{
return pairResource;
}
}
else if (resource instanceof SyncFile)
{
if (pair == ((SyncFile) resource).getPair())
{
return resource;
}
}
}
return null;
}
/**
* Counts the number of files in this folder and its subfolders
*
* @return - number of files
*/
public int updateCount()
{
int number = 0;
for (ISyncResource resource : getNonEmptyMembers())
{
if (resource instanceof SyncFile)
{
number++;
}
else if (resource instanceof SyncFolder)
{
number += ((SyncFolder) resource).updateCount();
}
}
return number;
}
/**
* Gets all the sync pairs inside this folder and all sub folders
*
* @return - list of all child pairs
*/
public List<VirtualFileSyncPair> getPairs()
{
List<VirtualFileSyncPair> pairs = new ArrayList<VirtualFileSyncPair>();
ISyncResource[] members = members();
for (ISyncResource member : members)
{
if (!member.isSkipped())
{
if (member instanceof SyncFile)
{
pairs.add(((SyncFile) member).getPair());
}
else if (member instanceof SyncFolder)
{
SyncFolder folder = (SyncFolder) member;
if (folder.getPair() != null)
{
pairs.add(folder.getPair());
}
pairs.addAll(folder.getPairs());
}
}
}
return pairs;
}
/**
* @see com.aptana.ide.syncing.ui.views.views.ISyncResource#getName()
*/
public String getName()
{
return path.lastSegment();
}
/**
* Adds a member to this folder
*
* @param child
*/
public void addMember(ISyncResource child)
{
children.add(child);
if (child instanceof SyncFile)
{
int newState = ((SyncFile) child).getPair().getSyncState();
if (syncState == -1 || syncState == newState)
{
syncState = newState;
}
else
{
syncState = MIXED;
}
}
}
/**
* Gets a list of the non empty folders for a compressed view
*
* @return - list of sync resources
*/
public List<ISyncResource> getCompressedMembers()
{
List<ISyncResource> compressed = new ArrayList<ISyncResource>();
ISyncResource[] members = members();
for (ISyncResource member : members)
{
if (member instanceof SyncFolder)
{
SyncFolder folder = (SyncFolder) member;
if (folder.containsFiles())
{
compressed.add(folder);
}
else
{
compressed.addAll(folder.getCompressedMembers());
}
}
else
{
compressed.add(member);
}
}
return compressed;
}
/**
* Removes a member from this folder
*
* @param child
*/
public void removeMember(ISyncResource child)
{
children.remove(child);
}
/**
* Clears all members from this folder
*/
public void clearMembers()
{
children.clear();
}
/**
* True if this folder contains files
*
* @return - true if has direct folder children
*/
public boolean containsFiles()
{
for (ISyncResource resource : children)
{
if (resource instanceof SyncFile)
{
return true;
}
}
return false;
}
/**
* Gets a member directly under this folder with the given name
*
* @param name
* @return - resource if found
*/
public ISyncResource getMember(String name)
{
for (ISyncResource resource : children)
{
if (name.equals(resource.getName()))
{
return resource;
}
}
return null;
}
/**
* True if this folder is empty, meaning it doesn't contain any files and all folders are empty as well
*
* @return - true if empty
*/
public boolean isEmpty()
{
return children.isEmpty();
}
/**
* Gets all the files located in this folder or subfolders
*
* @return - list of sync files
*/
public List<ISyncResource> getAllFiles()
{
List<ISyncResource> files = new ArrayList<ISyncResource>();
for (ISyncResource resource : children)
{
if (resource instanceof SyncFile)
{
files.add(resource);
}
else if (resource instanceof SyncFolder)
{
if (!((SyncFolder) resource).isEmpty())
{
if (resource.getPair() != null
&& (resource.getSyncState() == SyncState.ClientItemOnly || resource.getSyncState() == SyncState.ServerItemOnly))
{
files.add(resource);
}
files.addAll(((SyncFolder) resource).getAllFiles());
}
else
{
files.add(resource);
}
}
}
return files;
}
/**
* Gets all the children folder and files with nothing omitted
*
* @return - collection of entire folders contents
*/
public Collection<ISyncResource> getAllChildren()
{
Set<ISyncResource> members = new HashSet<ISyncResource>();
for (ISyncResource resource : children)
{
members.add(resource);
if (resource instanceof SyncFolder)
{
members.addAll(((SyncFolder) resource).getAllChildren());
}
}
return members;
}
/**
* Gets the non empty members directly under this resources consisting of files and non empty folders
*
* @return - resources
*/
public ISyncResource[] getNonEmptyMembers()
{
Set<ISyncResource> members = new HashSet<ISyncResource>();
for (ISyncResource resource : children)
{
if (resource instanceof SyncFile)
{
members.add(resource);
}
else if (resource instanceof SyncFolder)
{
if (!((SyncFolder) resource).isEmpty())
{
members.add(resource);
}
}
}
return members.toArray(new ISyncResource[members.size()]);
}
/**
* Gets all members directly under this resource
*
* @return - resources
*/
public ISyncResource[] members()
{
return children.toArray(new ISyncResource[children.size()]);
}
/**
* @see com.aptana.ide.syncing.ui.views.views.ISyncResource#getParent()
*/
public SyncFolder getParent()
{
return parent;
}
/**
* @see com.aptana.ide.syncing.ui.views.views.ISyncResource#getPath()
*/
public IPath getPath()
{
return path;
}
/**
* @see com.aptana.ide.syncing.ui.views.views.ISyncResource#isSkipped()
*/
public boolean isSkipped()
{
return skipped;
}
/**
* @see com.aptana.ide.syncing.ui.views.views.ISyncResource#setSkipped(boolean)
*/
public void setSkipped(boolean skipped)
{
this.skipped = skipped;
for (ISyncResource resource : members())
{
resource.setSkipped(this.skipped);
}
}
/**
* Sets this folder as skipped but with the option of not propogating to all children
*
* @param skipped
* @param propogate
*/
public void setSkipped(boolean skipped, boolean propogate)
{
this.skipped = skipped;
if (propogate)
{
setSkipped(this.skipped);
}
}
/**
* Gets the sync state
*
* @return - state from SyncState or -2 to denote mixed states
*/
public int getSyncState()
{
if (this.pair != null && syncState == -1)
{
return this.pair.getSyncState();
}
return syncState;
}
public void setSyncState(int state)
{
this.syncState = state;
}
/**
* @see com.aptana.ide.syncing.ui.views.views.ISyncResource#getPair()
*/
public VirtualFileSyncPair getPair()
{
return pair;
}
/**
* @see com.aptana.ide.syncing.ui.views.views.ISyncResource#getTransferState()
*/
public int getTransferState()
{
return transferState;
}
/**
* @see com.aptana.ide.syncing.ui.views.views.ISyncResource#setTransferState(int)
*/
public void setTransferState(int state)
{
this.transferState = state;
}
/**
* @see com.aptana.ide.syncing.ui.views.views.ISyncResource#getTransferredBytes()
*/
public long getTransferredBytes()
{
return transferredBytes;
}
/**
* @see com.aptana.ide.syncing.ui.views.views.ISyncResource#setTransferredBytes(long)
*/
public void setTransferredBytes(long bytes)
{
this.transferredBytes = bytes;
}
}