package org.tmatesoft.svn.core.internal.wc2.remote;
import java.io.File;
import java.util.Collection;
import java.util.Iterator;
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.SVNURL;
import org.tmatesoft.svn.core.internal.util.SVNEncodingUtil;
import org.tmatesoft.svn.core.internal.util.SVNHashMap;
import org.tmatesoft.svn.core.internal.util.SVNHashSet;
import org.tmatesoft.svn.core.internal.util.SVNURLUtil;
import org.tmatesoft.svn.core.internal.wc.SVNErrorManager;
import org.tmatesoft.svn.core.internal.wc.SVNEventFactory;
import org.tmatesoft.svn.core.internal.wc2.SvnRemoteOperationRunner;
import org.tmatesoft.svn.core.internal.wc2.SvnWcGeneration;
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.SvnSetLock;
import org.tmatesoft.svn.core.wc2.SvnTarget;
import org.tmatesoft.svn.core.wc2.SvnUnlock;
import org.tmatesoft.svn.util.SVNLogType;
public class SvnRemoteUnlock extends SvnRemoteOperationRunner<SVNLock, SvnUnlock> implements ISVNLockHandler {
@Override
public boolean isApplicable(SvnUnlock operation, SvnWcGeneration wcGeneration) throws SVNException {
return operation.hasRemoteTargets();
}
@Override
protected SVNLock run() throws SVNException {
int i = 0;
SVNURL[] urls = new SVNURL[getOperation().getTargets().size()];
for (SvnTarget target : getOperation().getTargets()) {
urls[i++] = target.getURL();
}
Collection<String> paths = new SVNHashSet();
SVNURL topURL = SVNURLUtil.condenceURLs(urls, paths, false);
if (paths.isEmpty()) {
paths.add("");
}
Map<String, String> pathsToTokens = new SVNHashMap();
for (Iterator<String> p = paths.iterator(); p.hasNext();) {
String path = (String) p.next();
path = SVNEncodingUtil.uriDecode(path);
pathsToTokens.put(path, null);
}
checkCancelled();
SVNRepository repository = getRepositoryAccess().createRepository(topURL, null, true);
if (!getOperation().isBreakLock()) {
pathsToTokens = fetchLockTokens(repository, pathsToTokens);
}
repository.unlock(pathsToTokens, getOperation().isBreakLock(), this);
return getOperation().first();
}
private Map<String, String> fetchLockTokens(SVNRepository repository, Map<String, String> pathsTokensMap) throws SVNException {
Map<String, String> tokens = new SVNHashMap();
for (Iterator<String> paths = pathsTokensMap.keySet().iterator(); paths.hasNext();) {
String path = paths.next();
SVNLock lock = repository.getLock(path);
if (lock == null || lock.getID() == null) {
SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.CLIENT_MISSING_LOCK_TOKEN, "''{0}'' is not locked", path);
SVNErrorManager.error(err, SVNLogType.WC);
continue;
}
tokens.put(path, lock.getID());
}
return tokens;
}
public void handleLock(String path, SVNLock lock, SVNErrorMessage error) throws SVNException {
}
public void handleUnlock(String path, SVNLock lock, SVNErrorMessage error) throws SVNException {
if (error != null) {
handleEvent(SVNEventFactory.createLockEvent(new File(path), SVNEventAction.UNLOCK_FAILED, null, error), ISVNEventHandler.UNKNOWN);
} else {
handleEvent(SVNEventFactory.createLockEvent(new File(path), SVNEventAction.UNLOCKED, null, null), ISVNEventHandler.UNKNOWN);
}
}
}