package org.tmatesoft.svn.core.internal.wc2.ng;
import java.io.File;
import org.tmatesoft.svn.core.SVNErrorCode;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNNodeKind;
import org.tmatesoft.svn.core.internal.wc.SVNEventFactory;
import org.tmatesoft.svn.core.internal.wc17.SVNWCContext;
import org.tmatesoft.svn.core.internal.wc2.SvnWcGeneration;
import org.tmatesoft.svn.core.wc.SVNEvent;
import org.tmatesoft.svn.core.wc.SVNEventAction;
import org.tmatesoft.svn.core.wc.SVNPropertyData;
import org.tmatesoft.svn.core.wc2.SvnSetProperty;
import org.tmatesoft.svn.core.wc2.SvnTarget;
public class SvnNgSetProperty extends SvnNgOperationRunner<SVNPropertyData, SvnSetProperty> {
@Override
protected SVNPropertyData run(SVNWCContext context) throws SVNException {
SvnNgPropertiesManager.checkPropertyName(getOperation().getPropertyName(), getOperation().getPropertyValue());
for (SvnTarget target : getOperation().getTargets()) {
File localAbsPath = target.getFile();
SVNNodeKind kind = SVNNodeKind.NONE;
try {
kind = getWcContext().readKind(getFirstTarget(), false);
} catch (SVNException e) {
if (e.getErrorMessage().getErrorCode() == SVNErrorCode.WC_PATH_NOT_FOUND) {
notifyNonExistentPath(localAbsPath);
} else {
throw e;
}
}
if (kind == SVNNodeKind.NONE || kind == SVNNodeKind.UNKNOWN) {
notifyNonExistentPath(localAbsPath);
}
File lockedPath = context.acquireWriteLock(localAbsPath, false, true);
try {
SvnNgPropertiesManager.setProperty(getWcContext(),
localAbsPath,
getOperation().getPropertyName(),
getOperation().getPropertyValue(),
getOperation().getPropertyValueProvider(),
getOperation().getDepth(),
getOperation().isForce(),
getOperation().getEventHandler(),
getOperation(),
getOperation().getApplicableChangelists());
} finally {
context.releaseWriteLock(lockedPath);
}
}
return getOperation().first();
}
private void notifyNonExistentPath(File localAbsPath) throws SVNException {
SVNEvent event = SVNEventFactory.createSVNEvent(localAbsPath, SVNNodeKind.NONE, null, -1,
SVNEventAction.PATH_NONEXISTENT,
SVNEventAction.PATH_NONEXISTENT,
null, null, -1, -1);
if (getOperation().getEventHandler() != null) {
getOperation().getEventHandler().handleEvent(event, -1);
}
}
@Override
public boolean isApplicable(SvnSetProperty operation, SvnWcGeneration wcGeneration) throws SVNException {
return !operation.isRevisionProperty() && super.isApplicable(operation, wcGeneration);
}
}