jp.vmi.selenium.selenese.utils.PathUtils Maven / Gradle / Ivy
package jp.vmi.selenium.selenese.utils;
import java.io.File;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.StringUtils;
/**
* Path utilities.
*/
public class PathUtils {
private static final Pattern SEP_REGEX = Pattern.compile("[/\\\\]");
private static final String SEP_REPL = Matcher.quoteReplacement(File.separator);
private static final String PARENT_DIR = ".." + File.separator;
private static String normalizeInternal(String filename) {
if (filename.startsWith(PARENT_DIR))
filename = new File(filename).getAbsolutePath();
String nfn = FilenameUtils.normalize(filename);
if (nfn == null) {
try {
nfn = new File(filename).getCanonicalPath();
} catch (IOException e) {
throw new IllegalArgumentException("Filename normalization failed: " + filename, e);
}
}
return nfn;
}
/**
* Normalize filename separator.
*
* @param filename filename.
* @return separator normalized filename.
*/
public static String normalizeSeparator(String filename) {
if (filename == null)
return null;
return SEP_REGEX.matcher(filename).replaceAll(SEP_REPL);
}
/**
* Normalize filename.
*
* @param filename filename.
* @return normalized filename.
*/
public static String normalize(String filename) {
if (filename == null)
return null;
return normalizeInternal(normalizeSeparator(filename));
}
/**
* Concatinate filename.
*
* @param parent parent directory.
* @param child child file or directory.
* @return concatinated and normalized filename.
*/
public static String concat(String parent, String child) {
if (StringUtils.isEmpty(parent))
return normalize(child);
StringBuilder s = new StringBuilder(normalizeSeparator(parent));
if (!parent.endsWith(File.separator))
s.append(File.separatorChar);
s.append(normalizeSeparator(child));
return normalizeInternal(s.toString());
}
/**
* Get relative path.
*
* @param from from path.
* @param to to path.
* @return relative path.
*/
public static String relativize(String from, String to) {
from = new File(normalize(from)).toURI().toASCIIString();
to = new File(normalize(to)).toURI().toASCIIString();
int prefixLen = StringUtils.getCommonPrefix(from, to).length();
int level = StringUtils.countMatches(from.substring(prefixLen), "/");
return StringUtils.repeat("../", level) + to.substring(prefixLen);
}
}