package org.tmatesoft.svn.core.wc2;
import org.tmatesoft.svn.core.SVNCommitInfo;
import org.tmatesoft.svn.core.SVNErrorCode;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNProperty;
import org.tmatesoft.svn.core.SVNPropertyValue;
import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager;
import org.tmatesoft.svn.core.wc.ISVNCommitHandler;
import org.tmatesoft.svn.core.wc.SVNPropertyData;
import org.tmatesoft.svn.core.wc.SVNRevision;
/**
* Sets <code>propertyName</code> to <code>propertyValue</code> on each <code>targets</code>.
* If <code>propertyValue</code> is <code>null</code>, operation will delete the property.
* Targets should represent URLs.
*
* <p/>
* <code>baseRevision</code> must not be null; in this case, the property
* will only be set if it has not changed since <code>baseRevision</code>.
*
* <p/>
* The {@link ISVNAuthenticationManager authentication manager} and
* {@link ISVNCommitHandler commit handler}, either provided by a caller or
* default ones, will be used to immediately attempt to commit the property
* change in the repository.
*
* {@link #run()} returns {@link SVNCommitInfo} commit information if the commit succeeds.
* This method throws SVNException if the following is true:
* <ul>
* <li><code>url</code> does not exist in <code>baseRevision
* </code> <li>exception with
* {@link SVNErrorCode#CLIENT_PROPERTY_NAME} error code - if
* <code>propertyName</code> is a revision property name or not a
* valid property name or not a regular property name (one
* starting with an <span class="javastring">"svn:entry"</span>
* or <code>"svn:wc"</code> prefix) <li>
* exception with {@link SVNErrorCode#UNSUPPORTED_FEATURE} error
* code - if <code>propertyName</code> is either equal to
* {@link SVNProperty#EOL_STYLE} or {@link SVNProperty#KEYWORDS}
* or {@link SVNProperty#CHARSET}
* </ul>
*
* @author TMate Software Ltd.
* @version 1.7
*/
public class SvnRemoteSetProperty extends AbstractSvnCommit {
private boolean force;
private String propertyName;
private SVNPropertyValue propertyValue;
private SVNRevision baseRevision;
private ISvnObjectReceiver<SVNPropertyData> propertyReceiver;
private SVNPropertyValue originalPropertyValue;
protected SvnRemoteSetProperty(SvnOperationFactory factory) {
super(factory);
}
/**
* Returns whether to skip validity checking of <code>propertyName</code> and <code>propertyValue</code>.
*
* @return force <code>true</code> if validity checking should be skipped, otherwise <code>false</code>
* @see #setForce(boolean)
*/
public boolean isForce() {
return force;
}
/**
* Sets whether to skip validity checking of <code>propertyName</code> and <code>propertyValue</code>.
* If <code>force</code> is <code>true</code>, this
* operation does no validity checking. But if <code>force</code> is <code>false</code>,
* and <code>propertyName</code> is not a
* valid property for <code>targets</code>, it throws an exception, either with
* an error code {@link org.tmatesoft.svn.core.SVNErrorCode#ILLEGAL_TARGET}
* (if the property is not appropriate for target), or with
* {@link org.tmatesoft.svn.core.SVNErrorCode#BAD_MIME_TYPE} (if
* <code>propertyName</code> is <code>"svn:mime-type"</code>,
* but <code>propertyValue</code> is not a valid mime-type).
*
* @param force <code>true</code> if validity checking should be skipped, otherwise <code>false</code>
*/
public void setForce(boolean force) {
this.force = force;
}
/**
* Gets name of the property.
*
* @return name of the property
* @see #setPropertyName(String)
*/
public String getPropertyName() {
return propertyName;
}
/**
* Sets name of the property.
* If <code>propertyName</code> is an svn-controlled property (i.e. prefixed
* with <span class="javastring">"svn:"</span>), then the caller is
* responsible for ensuring that the value uses LF line-endings.
*
*/
public void setPropertyName(String propertyName) {
this.propertyName = propertyName;
}
/**
* Returns the property's value.
* If <code>propertyValue</code> is <code>null</code>, operation will delete the property.
*
* @return value of the property
*/
public SVNPropertyValue getPropertyValue() {
return propertyValue;
}
/**
* Sets the property's value.
* If <code>propertyValue</code> is <code>null</code>, operation will delete the property.
*
* @param propertyValue value of the property
*/
public void setPropertyValue(SVNPropertyValue propertyValue) {
this.propertyValue = propertyValue;
}
/**
* Returns operation's revision to change properties against
*
* @return base revision of the operation
*/
public SVNRevision getBaseRevision() {
return baseRevision;
}
/**
* Sets operation's revision to change properties against
*
* @param baseRevision base revision of the operation
*/
public void setBaseRevision(SVNRevision baseRevision) {
this.baseRevision = baseRevision;
}
/**
* Returns operation's property receiver.
*
* @return property receiver of the operation
*/
public ISvnObjectReceiver<SVNPropertyData> getPropertyReceiver() {
return propertyReceiver;
}
/**
* Sets operation's property receiver.
*
* @param propertyReceiver property receiver of the operation
*/
public void setPropertyReceiver(ISvnObjectReceiver<SVNPropertyData> propertyReceiver) {
this.propertyReceiver = propertyReceiver;
}
/**
* Returns property's original value, it was set by caller
*
* @return original value of the property
*/
public SVNPropertyValue getOriginalPropertyValue() {
return originalPropertyValue;
}
/**
* Sets property's original value to hold this information for the caller
*
* @param originalPropertyValue original value of the property
*/
public void setOriginalPropertyValue(SVNPropertyValue originalPropertyValue) {
this.originalPropertyValue = originalPropertyValue;
}
@Override
protected void ensureArgumentsAreValid() throws SVNException {
super.ensureArgumentsAreValid();
if (getBaseRevision() == null) {
setBaseRevision(SVNRevision.HEAD);
}
}
/**
* 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;
}
}