blob: 5433dd458f393a7070111bd98d493e3f8d639ea9 [file] [log] [blame]
package org.eclipse.team.internal.ccvs.core.syncinfo;
/*
* (c) Copyright IBM Corp. 2000, 2001.
* All Rights Reserved.
*/
import org.eclipse.team.internal.ccvs.core.CVSException;
import org.eclipse.team.internal.ccvs.core.CVSTag;
import org.eclipse.team.internal.ccvs.core.resources.*;
import org.eclipse.team.internal.ccvs.core.util.Assert;
import org.eclipse.team.internal.ccvs.core.Policy;
/**
* Value (immutable) object that represents workspace state information about the contents of a
* folder that was retreived from a CVS repository. It is a specialized representation of the files from
* the CVS sub-directory that contain folder specific connection information (e.g. Root, Repository, Tag).
*
* @see ICVSFolder#getFolderSyncInfo()
*/
public class FolderSyncInfo {
// The Repository value for virtual directories (i.e. local with no corresponding remote)
public static final String VIRTUAL_DIRECTORY = "CVSROOT/Emptydir"; //$NON-NLS-1$
// relative path of this folder in the repository, project1/folder1/folder2
private String repository;
// :pserver:user@host:/home/user/repo
private String root;
// sticky tag (e.g. version, date, or branch tag applied to folder)
private CVSEntryLineTag tag;
// if true then it means only part of the folder was fetched from the repository, and CVS will not create
// additional files in that folder.
private boolean isStatic;
/**
* Construct a folder sync object.
*
* @param repo the relative path of this folder in the repository, cannot be <code>null</code>.
* @param root the location of the repository, cannot be <code>null</code>.
* @param tag the tag set for the folder or <code>null</code> if there is no tag applied.
* @param isStatic to indicate is only part of the folder was fetched from the server.
*/
public FolderSyncInfo(String repo, String root, CVSTag tag, boolean isStatic) {
Assert.isNotNull(repo);
Assert.isNotNull(root);
this.repository = repo;
this.root = root;
this.isStatic = isStatic;
setTag(tag);
}
public boolean equals(Object other) {
if(other == this) return true;
if (!(other instanceof FolderSyncInfo)) return false;
FolderSyncInfo syncInfo = ((FolderSyncInfo)other);
if (!getRoot().equals(syncInfo.getRoot())) return false;
if (!getRepository().equals(syncInfo.getRepository())) return false;
if (getIsStatic() != syncInfo.getIsStatic()) return false;
if ((getTag() == null) || (syncInfo.getTag() == null)) {
if ((getTag() == null) && (syncInfo.getTag() != null) && (syncInfo.getTag().getType() != CVSTag.HEAD)) {
return false;
} else if ((syncInfo.getTag() == null) && (getTag() != null) && (getTag().getType() != CVSTag.HEAD)) {
return false;
}
} else if (!getTag().equals(syncInfo.getTag())) {
return false;
}
return true;
}
/**
* Gets the root, cannot be <code>null.
*
* @return Returns a String
*/
public String getRoot() {
return root;
}
/**
* Gets the tag, may be <code>null</code>.
*
* @return Returns a String
*/
public CVSEntryLineTag getTag() {
return tag;
}
/**
* Gets the repository, may be <code>null</code>.
*
* @return Returns a String
*/
public String getRepository() {
return repository;
}
/**
* Gets the isStatic.
*
* @return Returns a boolean
*/
public boolean getIsStatic() {
return isStatic;
}
/**
* Answers a full path to the folder on the remote server. This by appending the repository to the
* repository location speficied in the root.
*
* Example:
* root = :pserver:user@host:/home/user/repo
* repository = folder1/folder2
*
* Returns:
* /home/users/repo/folder1/folder2
*
* Note: CVS supports repository root directories that end in a slash (/).
* For these directories, the remote location must contain two slashes (//)
* between the root directory and the rest of the path. For example:
* root = :pserver:user@host:/home/user/repo/
* repository = folder1/folder2
* must return:
* /home/users/repo//folder1/folder2
*
* @return the full path of this folder on the server.
* @throws a CVSException if the root or repository is malformed.
*/
public String getRemoteLocation() throws CVSException {
String result;
try {
String root = getRoot();
int index = root.indexOf('@');
if (index == -1) {
// If the username is mising, we have to find the third ':' instead.
index = root.indexOf(':');
index = root.indexOf(':', index + 1);
index = root.indexOf(':', index + 1);
}
result = getRoot().substring(index+1);
result = result.substring(result.indexOf(":")+1); //$NON-NLS-1$
result = result + "/" + getRepository(); //$NON-NLS-1$
} catch (IndexOutOfBoundsException e) {
throw new CVSException(Policy.bind("FolderSyncInfo_Maleformed_root_4")); //$NON-NLS-1$
}
return result;
}
/*
* Provide a hashCode() method that gaurentees that equal object will have the
* same hashCode
*/
public int hashCode() {
return getRoot().hashCode() | getRepository().hashCode();
}
/**
* Sets the tag for the folder.
*
* @param tag The tag to set
*/
private void setTag(CVSTag tag) {
if (tag == null || tag.equals(CVSTag.DEFAULT)) {
this.tag = null;
} else {
this.tag = new CVSEntryLineTag(tag);
}
}
/*
* @see Object#toString()
*/
public String toString() {
return getRoot() + "/" + getRepository() + "/" + getTag(); //$NON-NLS-1$ //$NON-NLS-2$
}
}