package org.tmatesoft.svn.core.wc2;
import org.tmatesoft.svn.core.SVNDepth;
import org.tmatesoft.svn.core.SVNErrorCode;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNPropertyValue;
import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager;
import org.tmatesoft.svn.core.wc.SVNPropertyData;
import org.tmatesoft.svn.core.wc2.hooks.ISvnPropertyValueProvider;
/**
* Represents set property operation.
* Sets <code>propertyName</code> to <code>propertyValue</code> on <code>target</code>
* or
* sets <code>propertyName</code> to <code>propertyValue</code> on
* <code>revision</code> in the repository represented by target.
* A <code>propertyValue</code> of <code>null</code> will
* delete the property.
*
* <p/>
* If <code>propertyName</code> is an svn-controlled property (i.e. prefixed
* with <code>"svn:"</code>), then the caller is
* responsible for ensuring that the value is UTF8-encoded and uses LF
* line-endings.
*
* <ul>
* <li>
* <p/>
* <b>If it is the property of the target:</b>
*
* <p/>
* <code>Target</code> should represent working copy path.
*
* <p/>
* If <code>depth</code> is {@link SVNDepth#EMPTY},
* set the property on <code>target</code> only; if {@link SVNDepth#FILES},
* set it on <code>target</code> and its file children (if any); if
* {@link SVNDepth#IMMEDIATES}, on <code>target</code> and all of its
* immediate children (both files and directories); if
* {@link SVNDepth#INFINITY}, on <code>target</code> and everything beneath
* it.
*
* <p/>
* <code>changeLists</code> is a collection of <code>String</code>
* changelist names, used as a restrictive filter on items whose properties
* are set; that is, don't set properties on any item unless it's a member
* of one of those changelists. If <code>changelists</code> is empty (or
* <span class="javakeyword">null</span>), no changelist filtering occurs.
* *
* <p>
* {@link #run()} methods operates only on working copies and does not open any network
* connection.
* This method throws {@link SVNException} if one of the following is true:
* <ul>
* <li><code>target</code> does not exist
* <li>exception with
* {@link SVNErrorCode#CLIENT_PROPERTY_NAME} error code - if
* changed property name is a revision property name or not a
* valid property name or not a regular property name (one
* starting with a <span class="javastring">"svn:entry"</span>
* or <span class="javastring">"svn:wc"</span> prefix)
* </ul>
*
* </li>
* <li>
* <p/>
* <b>If it is the property of revision</b>:
*
* <p/>
* <code>Target</code> can be either URL or working copy path.
* If <code>target</code> is working copy path, repository URL is obtained from this.
*
* <p/>
* <code>Revision must be set</code>.
*
* <p/>
* The {@link ISVNAuthenticationManager authentication
* manager}, either provided by a caller or a default one, will be used for
* authentication.
*
* <p/>
* Although this routine accepts a working copy path it doesn't affect the
* working copy at all; it's a pure network operation that changes an
* *unversioned* property attached to a revision. This can be used to tweak
* log messages, dates, authors, and the like. Be careful: it's a lossy
* operation.
*
* <p>
* Also note that unless the administrator creates a pre-revprop-change hook
* in the repository, this feature will fail.
*
* {@link #run()} return {@link SVNPropertyData} information of the property
* This method throws {@link SVNException} if one of the following is true:
* <ul>
* <li>exception with {@link SVNErrorCode#CLIENT_PROPERTY_NAME}
* error code - if <code>propertyName</code> is invalid
* </ul>
* </li>
* </ul>
*
* @author TMate Software Ltd.
* @version 1.7
*/
public class SvnSetProperty extends SvnReceivingOperation<SVNPropertyData> {
private boolean force;
private boolean revisionProperty;
private String propertyName;
private SVNPropertyValue propertyValue;
private ISvnPropertyValueProvider propertyValueProvider;
protected SvnSetProperty(SvnOperationFactory factory) {
super(factory);
}
/**
* Sets whether to skip validity checking.
*
* @return <code>true</code> if validity checking should not be done, otherwise <code>false</code>
* @see #setForce(boolean)
*/
public boolean isForce() {
return force;
}
/**
* Sets whether to skip validity checking.
*
* <p/>
* <ul>
* <li>
* For <code>target</code>'s property:
* If <code>force</code> is <code>true</code>, no validity checking is done.
* But if <code>force</code> is <code>false</code>, and <code>propertyName</code> is not a
* valid property for target, {@link SVNException} is thrown, either with
* an error code {@link org.tmatesoft.svn.core.SVNErrorCode#ILLEGAL_TARGET}
* (if the property is not appropriate for target), or with
* {@link SVNErrorCode#BAD_MIME_TYPE} (if
* <code>propertyName</code> is <span class="javastring">"svn:mime-type"</span>,
* but <code>propertyValue</code> is not a valid mime-type).
* </li>
* <li>
* <p/>
* For revision property:
* If <code>force</code> is <code>true</code> new lines in the author property are allowed.
* </li>
* </ul>
*/
public void setForce(boolean force) {
this.force = force;
}
/**
* Returns property value.
*
* @return value of the property
*/
public SVNPropertyValue getPropertyValue() {
return propertyValue;
}
/**
* Sets property value
*
* @param propertyValue value of the property
*/
public void setPropertyValue(SVNPropertyValue propertyValue) {
this.propertyValue = propertyValue;
}
/**
* Sets property value provider callback
*
* @param propertyValueProvider callback that will be called to get property values to set
*/
public void setPropertyValueProvider(ISvnPropertyValueProvider propertyValueProvider) {
this.propertyValueProvider = propertyValueProvider;
}
/**
* Returns property value provider callback
*
* @return property value provider callback set on this operation
*/
public ISvnPropertyValueProvider getPropertyValueProvider() {
return this.propertyValueProvider;
}
/**
* Returns property name.
*
* @return name of the property
*/
public String getPropertyName() {
return propertyName;
}
/**
* Sets property name
*
* @param propertyName name of the property
*/
public void setPropertyName(String propertyName) {
this.propertyName = propertyName;
}
@Override
protected void ensureArgumentsAreValid() throws SVNException {
super.ensureArgumentsAreValid();
if (getDepth() == null || getDepth() == SVNDepth.UNKNOWN) {
setDepth(SVNDepth.EMPTY);
}
}
/**
* Sets whether it is revision property.
*
* @param revisionProperty <code>true</code> if it is revision property, <code>true</code> if it is <code>target</code>'s property
*/
public void setRevisionProperty(boolean revisionProperty) {
this.revisionProperty = revisionProperty;
}
/**
* Gets whether it is revision property.
*
* @return <code>true</code> if it is revision property, <code>true</code> if it is <code>target</code>'s property
*/
public boolean isRevisionProperty() {
return revisionProperty;
}
/**
* 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 true;
}
}