package org.tmatesoft.svn.core.wc2;
import java.io.OutputStream;
import org.tmatesoft.svn.core.SVNErrorCode;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.wc.SVNRevision;
/**
* Represents cat operation. Outputs the content of file identified by <code>target</code> and
* revision to the output streams.
*
* <p/>
* The actual node
* revision selected is determined by the <code>target</code> as it exists in
* <code>target</code>'s <code>pegRevision</code>.
* If <code>target</code> is URL and its <code>pegRevision</code> is
* {@link SVNRevision#UNDEFINED}, then it defaults to {@link SVNRevision#HEAD}.
* If <code>target</code> is local and its <code>pegRevision</code> is
* {@link SVNRevision#UNDEFINED}, then it defaults to {@link SVNRevision#WORKING}.
*
* <p/>
* If <code>revision</code> is one of:
* <ul>
* <li>{@link SVNRevision#BASE}
* <li>{@link SVNRevision#WORKING}
* <li>{@link SVNRevision#COMMITTED}
* </ul>
* then the file contents are taken from the working copy file item (no
* network connection is needed). Otherwise the file item's contents are
* taken from the repository at a particular revision.
*
* {@link #run()} throws {@link org.tmatesoft.svn.core.SVNException} in the following cases:
* <ul>
* <li>exception with {@link SVNErrorCode#CLIENT_IS_DIRECTORY}
* error code - if <code>target</code> refers to a directory
* <li>exception with {@link SVNErrorCode#UNVERSIONED_RESOURCE}
* error code - if <code>target</code> is not under version control
* <li>it's impossible to create temporary files (
* {@link java.io.File#createTempFile(java.lang.String,java.lang.String)
* createTempFile()}fails) necessary for file translating (used when <code>target</code> is URL)
* </ul>
*
* @author TMate Software Ltd.
* @version 1.7
*/
public class SvnCat extends SvnOperation<Void> {
private boolean expandKeywords;
private OutputStream output;
protected SvnCat(SvnOperationFactory factory) {
super(factory);
}
/**
* Gets whether or not all keywords presenting in the file and listed in the file's
* {@link org.tmatesoft.svn.core.SVNProperty#KEYWORDS}property (if set) should be substituted.
*
* @return <code>true</code> if keywords should expanded, otherwise <code>false</code>
*/
public boolean isExpandKeywords() {
return expandKeywords;
}
/**
* Sets whether or not all keywords presenting in the file and listed in the file's
* {@link org.tmatesoft.svn.core.SVNProperty#KEYWORDS}property (if set) should be substituted.
*
* @param expandKeywords <code>true</code> if keywords should expanded, otherwise <code>false</code>
*/
public void setExpandKeywords(boolean expandKeywords) {
this.expandKeywords = expandKeywords;
}
/**
* Gets the output stream of the operation.
*
* @return output stream
*/
public OutputStream getOutput() {
return output;
}
/**
* Sets the output stream of the operation.
*
* @param output output stream
*/
public void setOutput(OutputStream output) {
this.output = output;
}
@Override
protected void ensureArgumentsAreValid() throws SVNException {
super.ensureArgumentsAreValid();
//here we assume we have one target
SVNRevision resolvedPegRevision;
SVNRevision resolvedRevision;
if (getFirstTarget().getPegRevision() == SVNRevision.UNDEFINED) {
resolvedPegRevision = getFirstTarget().getResolvedPegRevision(SVNRevision.HEAD, SVNRevision.WORKING);
if (getRevision() == null || getRevision() == SVNRevision.UNDEFINED) {
resolvedRevision = getFirstTarget().isURL() ? SVNRevision.HEAD : SVNRevision.BASE;
} else {
resolvedRevision = getRevision();
}
} else {
resolvedPegRevision = getFirstTarget().getPegRevision();
if (getRevision() == null || getRevision() == SVNRevision.UNDEFINED) {
resolvedRevision = resolvedPegRevision;
} else {
resolvedRevision = getRevision();
}
}
setRevision(resolvedRevision);
setSingleTarget(
getFirstTarget().isURL() ?
SvnTarget.fromURL(getFirstTarget().getURL(), resolvedPegRevision) :
SvnTarget.fromFile(getFirstTarget().getFile(), resolvedPegRevision));
}
/**
* Gets whether the operation changes working copy
* @return <code>true</code> if the operation changes the working copy, otherwise <code>false</code>
*/
@Override
public boolean isChangesWorkingCopy() {
return false;
}
}