/* * ==================================================================== * Copyright (c) 2004-2010 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.wc17; import java.util.HashMap; import org.tmatesoft.svn.core.SVNDepth; import org.tmatesoft.svn.core.SVNErrorCode; 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; /** * @version 1.3 * @author TMate Software Ltd. */ public class SVNStatusReporter17 implements ISVNReporterBaton, ISVNReporter { private SVNRepository repository; private SVNReporter17 reportBaton; private SVNStatusEditor17 editor; private SVNURL repositoryLocation; private HashMap<String, SVNLock> locks; private ISVNReporter reporter; private SVNURL repositoryRoot; public SVNStatusReporter17(SVNRepository repository, SVNReporter17 reportBaton, SVNStatusEditor17 editor) { this.repository = repository; this.reportBaton = reportBaton; this.editor = editor; this.repositoryLocation = repository.getLocation(); this.locks = new HashMap<String, SVNLock>(); } public void report(ISVNReporter reporter) throws SVNException { this.reporter = reporter; reportBaton.report(this); } public void setPath(String path, String lockToken, long revision, boolean startEmpty) throws SVNException { setPath(path, lockToken, revision, SVNDepth.INFINITY, startEmpty); } public void setPath(String path, String lockToken, long revision, SVNDepth depth, boolean startEmpty) throws SVNException { this.reporter.setPath(path, lockToken, revision, depth, startEmpty); } public void deletePath(String path) throws SVNException { this.reporter.deletePath(path); } public void linkPath(SVNURL url, String path, String lockToken, long revision, boolean startEmpty) throws SVNException { setPath(path, lockToken, revision, SVNDepth.INFINITY, startEmpty); } public void linkPath(SVNURL url, String path, String lockToken, long revision, SVNDepth depth, boolean startEmpty) throws SVNException { SVNURL ancestor = SVNURLUtil.getCommonURLAncestor(url, repositoryLocation); /* If we got a shorter ancestor, truncate our current ancestor. Note that svn_dirent_get_longest_ancestor will allocate its return value even if it identical to one of its arguments. */ if (SVNPathUtil.getPathAsChild(ancestor.getPath(), repositoryLocation.getPath()) != null) { repositoryLocation = ancestor; // TODO set depth infinity to reportBaton: // This depth is only used to report locks in finishReport() method // Currently SVNRepository#getLocks doesn't support depth, so the assignment is useless // But when it will, the depth should be kept and passed to SVNRepository#getLocks // rb->depth = svn_depth_infinity; } reporter.linkPath(url, path, lockToken, revision, depth, startEmpty); } public void finishReport() throws SVNException { // collect locks SVNLock[] locks = null; SVNURL oldLocation = this.repository.getLocation(); try { repositoryRoot = this.repository.getRepositoryRoot(true); this.repository.setLocation(repositoryLocation, false); locks = this.repository.getLocks(""); } catch (SVNException e) { if (!(e.getErrorMessage() != null && e.getErrorMessage().getErrorCode() == SVNErrorCode.RA_NOT_IMPLEMENTED)) { throw e; } } finally { this.repository.setLocation(oldLocation, false); this.repository.closeSession(); } if (locks != null) { for (int i = 0; i < locks.length; i++) { SVNLock lock = locks[i]; this.locks.put(lock.getPath(), lock); } } this.editor.setRepositoryInfo(this.repositoryRoot, this.locks); this.reporter.finishReport(); } public void abortReport() throws SVNException { reporter.abortReport(); } }