/* * ==================================================================== * Copyright (c) 2004-2012 TMate Software Ltd. All rights reserved. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms * are also available at http://svnkit.com/license.html * If newer versions of this license are posted there, you may use a * newer version instead, at your option. * ==================================================================== */ package org.tmatesoft.svn.core.internal.wc; import org.tmatesoft.svn.core.internal.util.SVNHashMap; import java.util.Map; import org.tmatesoft.svn.core.SVNDepth; 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.SVNPathUtil; import org.tmatesoft.svn.core.internal.util.SVNURLUtil; import org.tmatesoft.svn.core.io.ISVNReporter; import org.tmatesoft.svn.core.io.ISVNReporterBaton; import org.tmatesoft.svn.core.io.SVNRepository; import org.tmatesoft.svn.util.SVNLogType; /** * @version 1.3 * @author TMate Software Ltd. */ public class SVNStatusReporter implements ISVNReporterBaton, ISVNReporter { private ISVNReporter myReporter; private ISVNReporterBaton myBaton; private SVNURL myCommonAncestorLocation; private SVNRepository myRepository; private SVNURL myRepositoryRoot; private Map myLocks; private SVNStatusEditor myEditor; public SVNStatusReporter(SVNRepository repos, ISVNReporterBaton baton, SVNStatusEditor editor) { myBaton = baton; myRepository = repos; myCommonAncestorLocation = repos.getLocation(); myEditor = editor; myLocks = new SVNHashMap(); } public SVNLock getLock(SVNURL url) { // get decoded path if (myRepositoryRoot == null || myLocks.isEmpty() || url == null) { return null; } String urlString = url.getPath(); String root = myRepositoryRoot.getPath(); String path; if (urlString.equals(root)) { path = "/"; } else { path = urlString.substring(root.length()); } return (SVNLock) myLocks.get(path); } public void report(ISVNReporter reporter) throws SVNException { myReporter = reporter; myBaton.report(this); } public void setPath(String path, String lockToken, long revision, boolean startEmpty) throws SVNException { setPath(path, lockToken, revision, SVNDepth.INFINITY, startEmpty); } public void deletePath(String path) throws SVNException { myReporter.deletePath(path); } public void linkPath(SVNURL url, String path, String lockToken, long revision, boolean startEmpty) throws SVNException { linkPath(url, path, lockToken, revision, SVNDepth.INFINITY, startEmpty); } public void finishReport() throws SVNException { // collect locks SVNLock[] locks = null; SVNURL oldLocation = myRepository.getLocation(); try { myRepositoryRoot = myRepository.getRepositoryRoot(true); myRepository.setLocation(myCommonAncestorLocation, false); locks = myRepository.getLocks(""); } catch (SVNException e) { if (!(e.getErrorMessage() != null && e.getErrorMessage().getErrorCode() == SVNErrorCode.RA_NOT_IMPLEMENTED)) { throw e; } } finally { myRepository.setLocation(oldLocation, false); myRepository.closeSession(); } if (locks != null) { for (int i = 0; i < locks.length; i++) { SVNLock lock = locks[i]; myLocks.put(lock.getPath(), lock); } } myEditor.setRepositoryInfo(myRepositoryRoot, myLocks); myReporter.finishReport(); } public void abortReport() throws SVNException { myReporter.abortReport(); } public void linkPath(SVNURL url, String path, String lockToken, long revision, SVNDepth depth, boolean startEmpty) throws SVNException { SVNURL rootURL = SVNURLUtil.getCommonURLAncestor(url, myCommonAncestorLocation); if (rootURL == null) { SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.BAD_URL, "Can not determine common ancestor of ''{0}'' and ''{1}'';\nprobably these entries belong to different repositories.", new Object[] {url, myCommonAncestorLocation}); SVNErrorManager.error(err, SVNLogType.WC); } if (SVNPathUtil.getPathAsChild(rootURL.getPath(), myCommonAncestorLocation.getPath()) != null) { myCommonAncestorLocation = rootURL; } myReporter.linkPath(url, path, lockToken, revision, depth, startEmpty); } public void setPath(String path, String lockToken, long revision, SVNDepth depth, boolean startEmpty) throws SVNException { myReporter.setPath(path, lockToken, revision, depth, startEmpty); } }