package org.tmatesoft.svn.core.internal.wc2.ng; import java.io.File; import java.util.Map; import org.tmatesoft.svn.core.*; import org.tmatesoft.svn.core.internal.util.SVNDate; import org.tmatesoft.svn.core.internal.util.SVNEncodingUtil; import org.tmatesoft.svn.core.internal.util.SVNHashMap; import org.tmatesoft.svn.core.internal.util.SVNXMLUtil; import org.tmatesoft.svn.core.internal.wc.SVNErrorManager; 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.wc17.db.ISVNWCDb.SVNWCDbLock; 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.SvnSetLock; import org.tmatesoft.svn.util.SVNLogType; public class SvnNgSetLock extends SvnNgOperationRunner<SVNLock, SvnSetLock> implements ISVNLockHandler { @Override protected SVNLock run(SVNWCContext context) throws SVNException { String lockMessage = getOperation().getLockMessage(); if (lockMessage != null) { if (!SVNEncodingUtil.isXMLSafe(lockMessage)) { SVNErrorMessage errorMessage = SVNErrorMessage.create(SVNErrorCode.XML_UNESCAPABLE_DATA, "Lock comment contains illegal characters"); SVNErrorManager.error(errorMessage, SVNLogType.WC); } } final Map entriesMap = new SVNHashMap(); Map pathsRevisionsMap = new SVNHashMap(); final SvnNgRepositoryAccess repositoryAccess = getRepositoryAccess(); final SVNURL topURL = SvnNgLockUtil.collectLockInfo(this, getWcContext(), repositoryAccess, getOperation().getTargets(), entriesMap, pathsRevisionsMap, true, getOperation().isStealLock()); SVNRepository repository = getRepositoryAccess().createRepository(topURL, null, true); final SVNURL rootURL = repository.getRepositoryRoot(true); repository.lock(pathsRevisionsMap, getOperation().getLockMessage(), getOperation().isStealLock(), new ISVNLockHandler() { public void handleLock(String path, SVNLock lock, SVNErrorMessage error) throws SVNException { SVNURL fullURL = rootURL.appendPath(path, false); LockInfo lockInfo = (LockInfo) entriesMap.get(fullURL); if (error == null) { SVNWCDbLock dbLock = new SVNWCDbLock(); dbLock.token = lock.getID(); dbLock.owner = lock.getOwner(); dbLock.comment = lock.getComment(); dbLock.date = SVNDate.fromDate(lock.getCreationDate()); getWcContext().getDb().addLock(lockInfo.getFile(), dbLock); if (getWcContext().getProperty(lockInfo.getFile(), SVNProperty.NEEDS_LOCK) != null) { SVNFileUtil.setReadonly(lockInfo.getFile(), false); } handleEvent(SVNEventFactory.createLockEvent(lockInfo.getFile(), SVNEventAction.LOCKED, lock, null), ISVNEventHandler.UNKNOWN); } else { handleEvent(SVNEventFactory.createLockEvent(lockInfo.getFile(), SVNEventAction.LOCK_FAILED, lock, error), ISVNEventHandler.UNKNOWN); } } public void handleUnlock(String path, SVNLock lock, SVNErrorMessage error) { } }); return getOperation().first(); } public void handleLock(String path, SVNLock lock, SVNErrorMessage error) throws SVNException { if (error != null) { handleEvent(SVNEventFactory.createLockEvent(new File(path), SVNEventAction.LOCK_FAILED, lock, error), ISVNEventHandler.UNKNOWN); } else { handleEvent(SVNEventFactory.createLockEvent(new File(path), SVNEventAction.LOCKED, lock, null), ISVNEventHandler.UNKNOWN); } } public void handleUnlock(String path, SVNLock lock, SVNErrorMessage error) throws SVNException { } }