package org.tmatesoft.svn.core.internal.wc2.ng;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import org.tmatesoft.svn.core.SVNDepth;
import org.tmatesoft.svn.core.SVNErrorCode;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNProperties;
import org.tmatesoft.svn.core.SVNURL;
import org.tmatesoft.svn.core.internal.db.SVNSqlJetDb.Mode;
import org.tmatesoft.svn.core.internal.wc.SVNFileUtil;
import org.tmatesoft.svn.core.internal.wc17.SVNWCContext;
import org.tmatesoft.svn.core.internal.wc17.SVNWCContext.CheckWCRootInfo;
import org.tmatesoft.svn.core.internal.wc17.db.SVNWCDb;
import org.tmatesoft.svn.core.internal.wc17.db.SVNWCDb.DirParsedInfo;
import org.tmatesoft.svn.core.internal.wc17.db.SVNWCDbRoot;
import org.tmatesoft.svn.core.internal.wc17.db.SvnWcDbProperties;
import org.tmatesoft.svn.core.io.SVNRepository;
public class SvnNgInheritableProperties {
public static Map<File, Map<String, SVNProperties>> getInheritalbeProperites(SVNWCContext context, SVNRepository repository, File localAbsPath, long revision, SVNDepth depth) throws SVNException {
final SVNURL originalLocation = repository.getLocation();
final Map<File, Map<String, SVNProperties>> result = new HashMap<File, Map<String, SVNProperties>>();
final DirParsedInfo pdh = ((SVNWCDb) context.getDb()).parseDir(localAbsPath, Mode.ReadOnly);
final SVNWCDbRoot wcRoot = pdh.wcDbDir.getWCRoot();
final File localRelPath = pdh.localRelPath;
try {
final Map<File, File> nodesWithIProps = SvnWcDbProperties.getInheritedPropertiesNodes(wcRoot, localRelPath, depth);
if (!nodesWithIProps.containsKey(localAbsPath)) {
if (needsCachedIProps(context, localAbsPath, repository)) {
nodesWithIProps.put(localAbsPath, localAbsPath);
}
}
for (File localNodeAbsPath : nodesWithIProps.keySet()) {
final String reposNodePath = SVNFileUtil.getFilePath(nodesWithIProps.get(localNodeAbsPath));
if ("".equals(reposNodePath)) {
continue;
}
final SVNURL nodeURL = context.getNodeUrl(localNodeAbsPath);
repository.setLocation(nodeURL, false);
Map<String, SVNProperties> iprops = null;
try {
iprops = repository.getInheritedProperties("", revision, null);
iprops = translateInheritedPropertiesPaths(iprops);
} catch (SVNException e) {
if (e.getErrorMessage().getErrorCode() != SVNErrorCode.FS_NOT_FOUND) {
throw e;
}
continue;
}
result.put(localNodeAbsPath, iprops);
}
} finally {
repository.setLocation(originalLocation, false);
}
return result;
}
public static Map<String, SVNProperties> translateInheritedPropertiesPaths(Map<String, SVNProperties> iprops) {
final Map<String, SVNProperties> filtered = new HashMap<String, SVNProperties>();
for (String path : iprops.keySet()) {
final SVNProperties props = iprops.get(path);
if (path.startsWith("/")) {
path = path.substring(1);
}
filtered.put(path, props);
}
return filtered;
}
private static boolean needsCachedIProps(SVNWCContext context, File localAbsPath, SVNRepository repository) throws SVNException {
CheckWCRootInfo rootInfo = null;
try {
rootInfo = context.checkWCRoot(localAbsPath, true);
} catch (SVNException e) {
if (e.getErrorMessage().getErrorCode() == SVNErrorCode.WC_PATH_NOT_FOUND) {
return false;
}
throw e;
}
if (rootInfo != null && (rootInfo.switched || rootInfo.wcRoot)) {
final SVNURL location = repository.getLocation();
final SVNURL root = repository.getRepositoryRoot(true);
return !location.equals(root);
}
return false;
}
}