blob: 38991e5dda6b840648f3d4795cf0885714df126c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2003 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.team.internal.ccvs.core.resources;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.*;
import org.eclipse.team.core.TeamException;
import org.eclipse.team.core.variants.CachedResourceVariant;
import org.eclipse.team.internal.ccvs.core.*;
import org.eclipse.team.internal.ccvs.core.client.Update;
import org.eclipse.team.internal.ccvs.core.syncinfo.ResourceSyncInfo;
import org.eclipse.team.internal.ccvs.core.util.Assert;
import org.eclipse.team.internal.ccvs.core.util.Util;
/**
* The purpose of this class and its subclasses is to implement the corresponding
* ICVSRemoteResource interfaces for the purpose of communicating information about
* resources that reside in a CVS repository but have not necessarily been loaded
* locally.
*/
public abstract class RemoteResource extends CachedResourceVariant implements ICVSRemoteResource {
protected RemoteFolder parent;
protected String name;
// relative synchronization state calculated by server of this remote file compare to the current local
// workspace copy.
private int workspaceSyncState = Update.STATE_NONE;
/**
* Constructor for RemoteResource.
*/
public RemoteResource(RemoteFolder parent, String name) {
this.parent = parent;
this.name = name;
}
/*
* @see ICVSRemoteResource#getName()
*/
public String getName() {
return name;
}
/*
* @see ICVSResource#getRelativePath(ICVSFolder)
*/
public String getRelativePath(ICVSFolder ancestor) throws CVSException {
return Util.appendPath(parent.getRelativePath(ancestor), getName());
}
/*
* @see ICVSRemoteResource#getParent()
*/
public ICVSRemoteResource getRemoteParent() {
return parent;
}
public abstract String getRepositoryRelativePath();
public abstract ICVSRepositoryLocation getRepository();
public int getWorkspaceSyncState() {
return workspaceSyncState;
}
public void setWorkspaceSyncState(int workspaceSyncState) {
this.workspaceSyncState = workspaceSyncState;
}
/*
* @see ICVSResource#delete()
*/
public void delete() {
// For now, do nothing but we could provide this in the future.
}
/*
* @see ICVSResource#exists()
*
* This method is used by the Command framework so it must return true so that
* the proper information gets sent to the server. (i.e. it is used to fake that
* the file exists locally so cvs commands can be used to retrieve information about
* the remote resource from the server)
*/
public boolean exists() {
return true;
}
/*
* @see ICVSRemoteResource#exists(IProgressMonitor)
*/
public boolean exists(IProgressMonitor monitor) throws TeamException {
return parent.exists(this, monitor);
}
/*
* @see ICVSResource#getParent()
*/
public ICVSFolder getParent() {
return parent;
}
/*
* @see ICVSResource#isIgnored()
*/
public boolean isIgnored() {
return false;
}
/*
* @see ICVSResource#isManaged()
*/
public boolean isManaged() {
return parent != null;
}
public boolean isModified(IProgressMonitor monitor) throws CVSException {
// it is safe to always consider a remote file handle as modified. This will cause any
// CVS command to fetch new contents from the server.
return true;
}
/*
* @see ICVSResource#unmanage()
*/
public void unmanage(IProgressMonitor monitor) throws CVSException {
// do nothing
}
/*
* @see ICVSResource#getSyncInfo()
*/
public abstract ResourceSyncInfo getSyncInfo();
/*
* @see ICVSResource#setSyncInfo(ResourceSyncInfo)
*/
public void setSyncInfo(ResourceSyncInfo info, int modificationState) {
// ensure that clients are not trying to set sync info on remote handles.
Assert.isTrue(false);
}
public boolean equals(Object target) {
if (this == target)
return true;
if (!(target instanceof RemoteResource))
return false;
RemoteResource remote = (RemoteResource) target;
return remote.isContainer() == isContainer()
&& remote.getRepository().equals(getRepository())
&& remote.getRepositoryRelativePath().equals(getRepositoryRelativePath());
}
/*
* @see ICVSResource#setIgnoredAs(String)
*/
public void setIgnoredAs(String pattern) throws CVSException {
// ensure that clients are not trying to set sync info on remote handles.
Assert.isTrue(false);
}
/**
* @see org.eclipse.team.internal.ccvs.core.ICVSResource#getIResource()
*/
public IResource getIResource() throws CVSException {
return null;
}
/**
* Return a copy of the receiver that is associated with the given tag. The parent
* should be a copy of the receiver's parent which has been copied to the same tag.
*
* @param parent
* @param tagName
* @return ICVSRemoteFolder
*/
public abstract ICVSRemoteResource forTag(ICVSRemoteFolder parent, CVSTag tagName);
/**
* @see java.lang.Object#hashCode()
*/
public int hashCode() {
return getRepositoryRelativePath().hashCode();
}
/**
* Method which returns an array of bytes that can be used to recreate the remote handle.
* To recreate the remote handle, invoke the <code>fromBytes</code> method on either
* RemoteFolder or RemoteFile.
*
* TODO: It would be nice to have a method on RmeoteResource to recreate the handles
* but the file requires the bytes for the parent folder since this folder may not
* exist locally.
*
* @return
*/
abstract public byte[] getSyncBytes();
public String toString() {
return "Remote " + (isContainer() ? "Folder: " : "File: ") + getName(); //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
}
/* (non-Javadoc)
* @see org.eclipse.team.core.synchronize.ResourceVariant#getUniquePath()
*/
public String getCachePath() {
ICVSRepositoryLocation location = getRepository();
IPath path = new Path(location.getHost());
path = path.append(location.getRootDirectory());
path = path.append(parent.getRepositoryRelativePath());
path = path.append(getName() + ' ' + getContentIdentifier());
return path.toString();
}
/* (non-Javadoc)
* @see org.eclipse.team.core.synchronize.ResourceVariant#getCacheId()
*/
protected String getCacheId() {
return CVSProviderPlugin.ID;
}
/* (non-Javadoc)
* @see org.eclipse.team.core.variants.IResourceVariant#asBytes()
*/
public byte[] asBytes() {
return getSyncBytes();
}
}