/******************************************************************************
* Copyright (c) 2008 Versant Corporation and others.
* 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:
* Remy Chi Jian Suen (Versant Corporation) - initial API and implementation
******************************************************************************/
package org.eclipse.team.internal.ecf.core.variants;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.ecf.core.identity.ID;
import org.eclipse.team.core.TeamException;
import org.eclipse.team.core.variants.AbstractResourceVariantTree;
import org.eclipse.team.core.variants.IResourceVariant;
import org.eclipse.team.internal.ecf.core.RemoteShare;
final class RemoteResourceVariantTree extends AbstractResourceVariantTree {
private final RemoteShare share;
private final ID ownId;
private final ID remoteId;
private IResource[] roots;
public RemoteResourceVariantTree(RemoteShare share, ID ownId, ID remoteId) {
this.share = share;
this.ownId = ownId;
this.remoteId = remoteId;
}
public void setResources(IResource[] roots) {
this.roots = roots;
}
protected IResourceVariant[] fetchMembers(IResourceVariant variant, IProgressMonitor monitor) throws TeamException {
return share.fetchMembers(ownId, remoteId, variant, monitor);
}
protected IResourceVariant fetchVariant(IResource resource, int depth, IProgressMonitor monitor) throws TeamException {
return share.fetchVariant(ownId, remoteId, resource, monitor);
}
protected boolean setVariant(IResource local, IResourceVariant remote) {
return true;
}
public void flushVariants(IResource resource, int depth) {
// does not appear to be called by the Team APIs
}
public IResourceVariant getResourceVariant(IResource resource) throws TeamException {
return share.getResourceVariant(ownId, remoteId, resource);
}
public boolean hasResourceVariant(IResource resource) {
return true;
}
public IResource[] members(IResource resource) throws TeamException {
if (resource.getType() == IResource.FILE || !resource.exists()) {
return new IResource[0];
}
try {
IResource[] members = ((IContainer) resource).members();
List nonDerivedMembers = new ArrayList(members.length);
for (int i = 0; i < members.length; i++) {
if (!members[i].isDerived()) {
nonDerivedMembers.add(members[i]);
}
}
return (IResource[]) nonDerivedMembers.toArray(new IResource[nonDerivedMembers.size()]);
} catch (CoreException e) {
throw new TeamException(e.getStatus());
}
}
public IResource[] roots() {
return roots == null ? new IResource[0] : roots;
}
}