/* * ==================================================================== * 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.util; import java.util.Collection; import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.SVNURL; /** * @author TMate Software Ltd. * @version 1.3 */ public class SVNURLUtil { public static String getRelativeURL(SVNURL parent, SVNURL child, boolean encoded) { String parentURLAsString = encoded ? parent.toString() : parent.toDecodedString(); String childURLAsString = encoded ? child.toString() : child.toDecodedString(); String relativePath = SVNPathUtil.getPathAsChild(parentURLAsString, childURLAsString); return relativePath == null ? "" : relativePath; } public static boolean isAncestor(SVNURL ancestor, SVNURL descendant) { if (ancestor == null || descendant == null) { return false; } String aStr = ancestor.toString(); String dStr = descendant.toString(); if (aStr.length() > dStr.length()) { return false; } if (dStr.startsWith(aStr)) { if (aStr.length() == dStr.length()) { return true; } return dStr.charAt(aStr.length()) == '/'; } return false; } public static SVNURL getCommonURLAncestor(SVNURL url1, SVNURL url2) { // skip protocol and host, if they are different -> return null; if (url1 == null || url2 == null) { return null; } if (!url1.getProtocol().equals(url2.getProtocol()) || !url1.getHost().equals(url2.getHost()) || url1.getPort() != url2.getPort()) { return null; } if (url1.getUserInfo() != null) { if (!url1.getUserInfo().equals(url2.getUserInfo())) { return null; } } else { if (url2.getUserInfo() != null) { return null; } } String path1 = url1.getPath(); String path2 = url2.getPath(); String commonPath = SVNPathUtil.getCommonPathAncestor(path1, path2); try { return url1.setPath(commonPath, false); } catch (SVNException e) { } return null; } public static SVNURL condenceURLs(SVNURL[] urls, Collection condencedPaths, boolean removeRedundantURLs) { if (urls == null || urls.length == 0) { return null; } if (urls.length == 1) { return urls[0]; } SVNURL rootURL = urls[0]; for (int i = 0; i < urls.length; i++) { rootURL = getCommonURLAncestor(rootURL, urls[i]); } if (condencedPaths != null && removeRedundantURLs) { for (int i = 0; i < urls.length; i++) { SVNURL url1 = urls[i]; if (url1 == null) { continue; } for (int j = 0; j < urls.length; j++) { if (i == j) { continue; } SVNURL url2 = urls[j]; if (url2 == null) { continue; } SVNURL common = getCommonURLAncestor(url1, url2); if (common == null) { continue; } if (common.equals(url1)) { urls[j] = null; } else if (common.equals(url2)) { urls[i] = null; } } } for (int j = 0; j < urls.length; j++) { SVNURL url = urls[j]; if (url != null && url.equals(rootURL)) { urls[j] = null; } } } if (condencedPaths != null) { for (int i = 0; i < urls.length; i++) { SVNURL url = urls[i]; if (url == null) { continue; } String path = url.toString(); if (rootURL != null) { path = path.substring(rootURL.toString().length()); if (path.startsWith("/")) { path = path.substring(1); } } condencedPaths.add(path); } } return rootURL; } }