package org.tmatesoft.svn.core.internal.wc2.ng;
import java.util.Map;
import org.tmatesoft.svn.core.SVNErrorCode;
import org.tmatesoft.svn.core.SVNErrorMessage;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNLock;
import org.tmatesoft.svn.core.SVNProperty;
import org.tmatesoft.svn.core.SVNURL;
import org.tmatesoft.svn.core.internal.util.SVNHashMap;
import org.tmatesoft.svn.core.internal.wc.SVNEventFactory;
import org.tmatesoft.svn.core.internal.wc.SVNFileUtil;
import org.tmatesoft.svn.core.internal.wc17.SVNWCContext;
import org.tmatesoft.svn.core.internal.wc2.ng.SvnNgLockUtil.LockInfo;
import org.tmatesoft.svn.core.io.ISVNLockHandler;
import org.tmatesoft.svn.core.io.SVNRepository;
import org.tmatesoft.svn.core.wc.ISVNEventHandler;
import org.tmatesoft.svn.core.wc.SVNEventAction;
import org.tmatesoft.svn.core.wc2.SvnUnlock;
public class SvnNgUnlock extends SvnNgOperationRunner<SVNLock, SvnUnlock> {
@Override
protected SVNLock run(SVNWCContext context) throws SVNException {
final Map entriesMap = new SVNHashMap();
Map pathsRevisionsMap = new SVNHashMap();
final SvnNgRepositoryAccess wcAccess = getRepositoryAccess();
final SVNURL topURL = SvnNgLockUtil.collectLockInfo(this, getWcContext(), wcAccess, getOperation().getTargets(), entriesMap, pathsRevisionsMap, false, getOperation().isBreakLock());
SVNRepository repository = getRepositoryAccess().createRepository(topURL, null, true);
final SVNURL rootURL = repository.getRepositoryRoot(true);
repository.unlock(pathsRevisionsMap, getOperation().isBreakLock(), new ISVNLockHandler() {
public void handleLock(String path, SVNLock lock, SVNErrorMessage error) throws SVNException {
}
public void handleUnlock(String path, SVNLock lock, SVNErrorMessage error) throws SVNException {
SVNURL fullURL = rootURL.appendPath(path, false);
LockInfo lockInfo = (LockInfo) entriesMap.get(fullURL);
SVNEventAction action = null;
if (error == null || (error != null && error.getErrorCode() != SVNErrorCode.FS_LOCK_OWNER_MISMATCH)) {
getWcContext().getDb().removeLock(lockInfo.getFile());
if (getWcContext().getProperty(lockInfo.getFile(), SVNProperty.NEEDS_LOCK) != null) {
SVNFileUtil.setReadonly(lockInfo.getFile(), true);
}
action = SVNEventAction.UNLOCKED;
}
if (error != null) {
action = SVNEventAction.UNLOCK_FAILED;
}
if (action != null) {
handleEvent(SVNEventFactory.createLockEvent(lockInfo.getFile(), action, lock, error), ISVNEventHandler.UNKNOWN);
}
}
});
return getOperation().first();
}
}