package org.tmatesoft.svn.core.wc2;
import java.io.File;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNURL;
import org.tmatesoft.svn.core.internal.util.SVNPathUtil;
import org.tmatesoft.svn.core.internal.wc16.SVNUpdateClient16;
import org.tmatesoft.svn.core.wc.SVNRevision;
/**
* Represents target of the operation on whose operation will be executed.
* Can specify working copy path or repository URL.
*
* @author TMate Software Ltd.
* @version 1.7
*/
public class SvnTarget {
private SVNURL url;
private File file;
private SVNRevision pegRevision;
/**
* Creates a target from file
* @param file target file
* @return a new <code>SvnTarget</code> object representing the file
*/
public static SvnTarget fromFile(File file) {
return fromFile(file, SVNRevision.UNDEFINED);
}
/**
* Creates a target from file and its peg revision
* @param file target file
* @param pegRevision revision in which the file item is first looked up
* @return a new <code>SvnTarget</code> object representing the file with revisition
*/
public static SvnTarget fromFile(File file, SVNRevision pegRevision) {
return new SvnTarget(file, pegRevision);
}
/**
* Creates a target from URL
* @param url target URL
* @return a new <code>SvnTarget</code> object representing URL
*/
public static SvnTarget fromURL(SVNURL url) {
return fromURL(url, SVNRevision.UNDEFINED);
}
/**
* Creates a target from URL and its peg revision
* @param url target URL
* @param pegRevision revision in which the file item is first looked up
* @return a new <code>SvnTarget</code> object representing URL with revisition
*/
public static SvnTarget fromURL(SVNURL url, SVNRevision pegRevision) {
return new SvnTarget(url, pegRevision);
}
private SvnTarget(File file, SVNRevision pegRevision) {
this.file = new File(SVNPathUtil.validateFilePath(file.getAbsolutePath()));
setPegRevision(pegRevision);
}
private SvnTarget(SVNURL url, SVNRevision pegRevision) {
this.url = getCanonicalUrl(url);
setPegRevision(pegRevision);
}
private SVNURL getCanonicalUrl(SVNURL url) {
if (url == null) {
return null;
}
SVNURL canonicalUrl = null;
try {
canonicalUrl = SVNUpdateClient16.canonicalizeURL(url, true);
} catch (SVNException e) {
}
return canonicalUrl != null ? canonicalUrl : url;
}
/**
* Determines whether target is located in the local working copy and its peg revision is working copy specific.
* @return <code>true</code> if the target and its peg revision refers to local working copy, otherwise <code>false</code>
*/
public boolean isLocal() {
return isFile() && getResolvedPegRevision().isLocal();
}
/**
* Determines whether target represents file
* @return <code>true</code> if the target is file, otherwise <code>false</code>
*/
public boolean isFile() {
return this.file != null;
}
/**
* Determines whether target represents URL
* @return <code>true</code> if the target is URL, otherwise <code>false</code>
*/
public boolean isURL() {
return this.url != null;
}
/**
* Returns target's URL, if target is not URL returns null.
* @return url of the target
*/
public SVNURL getURL() {
return this.url;
}
/**
* Returns target's file, if target is not file returns null.
* @return url of the target
*/
public File getFile() {
return this.file;
}
/**
* Returns target's peg revision, if it was not defined returns null.
* @return peg revision of the target
*/
public SVNRevision getPegRevision() {
return this.pegRevision;
}
/**
* Calls <code>getResolvedPegRevision</code> with {@link org.tmatesoft.svn.core.wc.SVNRevision#HEAD},
* {@link org.tmatesoft.svn.core.wc.SVNRevision#WORKING} as default values
* @return peg revision of the target
* @see #getResolvedPegRevision(SVNRevision, SVNRevision)
*/
public SVNRevision getResolvedPegRevision() {
return getResolvedPegRevision(SVNRevision.HEAD, SVNRevision.WORKING);
}
/**
* Returns target's peg revision if defined, if not defined determines whether target is remote or local,
* and returns corresponding default revision
* @param defaultRemote default revision if target is remote target
* @param defaultLocal default revision if target is local target
* @return peg revision of the target
*/
public SVNRevision getResolvedPegRevision(SVNRevision defaultRemote, SVNRevision defaultLocal) {
if (getPegRevision() == null || getPegRevision() == SVNRevision.UNDEFINED) {
if (defaultLocal == null) {
defaultLocal = SVNRevision.WORKING;
}
if (defaultRemote == null) {
defaultRemote = SVNRevision.HEAD;
}
return isURL() ? defaultRemote : defaultLocal;
}
return getPegRevision();
}
private void setPegRevision(SVNRevision revision) {
if (revision == null) {
revision = SVNRevision.UNDEFINED;
}
this.pegRevision = revision;
}
/**
* Determines whether target is remote or local, and returns corresponding <code>String</code> representation of the target's path
* @return <code>String</code> representation of the target's path
* @throws {@link IllegalStateException} if neither file not URL was specified as a target
*/
public String getPathOrUrlString() {
if (isFile()) {
return getFile().getPath();
} else if (isURL()) {
return getURL().toString();
}
throw new IllegalStateException("A target can be either an URL or a path");
}
/**
* Determines whether target is remote or local, and returns corresponding <code>String</code> representation of the target's path
* @return <code>String</code> representation of the target
* @throws {@link IllegalStateException} if neither file not URL was specified as a target's path
*/
public String getPathOrUrlDecodedString() {
if (isFile()) {
return getFile().getPath();
} else if (isURL()) {
return getURL().toString();
}
throw new IllegalStateException("A target can be either an URL or a path");
}
/**
* Determines whether target is remote or local, and returns corresponding <code>String</code>
* representation of the target's path and peg revision.
*
* @return <code>String</code> of the target's path and peg revision
*/
public String toString() {
if (isFile()) {
return getFile().getAbsolutePath() + '@' + getPegRevision();
} else if (isURL()) {
return getURL().toString() + '@' + getPegRevision();
}
return "INVALID TARGET";
}
}