package org.tmatesoft.svn.core.wc2;
import org.tmatesoft.svn.core.wc.SVNRevision;
/**
* Provides copy source information in copy operations.
*
* @author TMate Software Ltd.
* @version 1.7
* @see SvnCopy
*/
public class SvnCopySource extends SvnObject {
private SvnTarget source;
private SVNRevision revision;
private boolean copyContents;
/**
* Creates a new <code>SvnCopySource</code> object and initializes its fields.
*
* @param source source target with optional <code>pegRevision</code>, can be file or URL
* @param revision revision of <code>target</code>
*/
public static SvnCopySource create(SvnTarget source, SVNRevision revision) {
return new SvnCopySource(source, revision);
}
private SvnCopySource(SvnTarget source, SVNRevision revision) {
setSource(source);
if (revision == null || !revision.isValid()) {
revision = source.getResolvedPegRevision();
}
setRevision(revision);
}
/**
* Calculates whether <code>source</code> is local and <code>revision</code> is local.
*
* @return <code>true</code> if the <code>source</code> and <code>revision</code> are local, otherwise <code>false</code>
*/
public boolean isLocal() {
return getSource().isLocal() && getRevision().isLocal();
}
/**
* Returns the copy source target, can be working copy file or URL with optional <code>pegRevision</code>.
*
* @return copy source target
*/
public SvnTarget getSource() {
return source;
}
/**
* Returns the revision of the source.
*
* @return source revision
*/
public SVNRevision getRevision() {
return revision;
}
/**
* Sets the copy source target, can be working copy file or URL with optional <code>pegRevision</code>.
*
* @param source copy source target
*/
private void setSource(SvnTarget source) {
this.source = source;
}
/**
* Sets the revision of the source.
*
* @param revision source revision
*/
private void setRevision(SVNRevision revision) {
this.revision = revision;
}
/**
* Tells whether the contents of this copy source should be copied rather than the copy source itself.
* This is relevant only for directory copy sources. If a user {@link #setCopyContents(boolean) specifies}
* to copy contents of a file he will get an {@link org.tmatesoft.svn.core.SVNException}. So, if this copy source represents a
* directory and if this method returns <code>true</code>, children of this copy source
* directory will be copied to the target instead of the copy source.
*
* @return <code>true</code> to expand copy source to children; otherwise <code>false</code>
*/
public boolean isCopyContents() {
return copyContents;
}
/**
* Sets whether to expand this copy source to its contents or not.
*
* @param copyContents <code>true</code> to expand copy source to children; otherwise <code>false</code>
* @see #isCopyContents()
*/
public void setCopyContents(boolean copyContents) {
this.copyContents = copyContents;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((revision == null) ? 0 : revision.hashCode());
result = prime * result + ((source == null) ? 0 : source.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
SvnCopySource other = (SvnCopySource) obj;
if (revision == null) {
if (other.revision != null) {
return false;
}
} else if (!revision.equals(other.revision)) {
return false;
}
if (source == null) {
if (other.source != null) {
return false;
}
} else if (!source.equals(other.source)) {
return false;
}
return true;
}
/**
* Returns <code>String</code> representation of the object
*
* @return object as <code>String</code>
*/
@Override
public String toString() {
return getSource().toString() + " r" + getRevision();
}
}