package org.smoothbuild.builtin.file.match;
import static java.util.Arrays.asList;
import org.smoothbuild.io.fs.base.Path;
public class PathPattern {
private static final String DOUBLE_STAR_ERROR_MESSAGE = "Pattern can contain '**' only when "
+ "it is surrounded by '/' or placed at the beginning or the end of pattern.";
private final String value;
public static PathPattern pathPattern(String value) {
checkIsValid(value);
return new PathPattern(value);
}
private PathPattern(String value) {
this.value = value;
}
public String value() {
return value;
}
public Iterable<String> parts() {
return asList(value.split(Path.SEPARATOR));
}
private static void checkIsValid(String value) {
String message = validationError(value);
if (message != null) {
throw new IllegalPathPatternException(message);
}
}
private static String validationError(String pattern) {
if (pattern.isEmpty()) {
return "Empty pattern is not allowed";
}
if (pattern.startsWith("/")) {
return "Pattern can't start with slash character '/'.";
}
if (pattern.endsWith("/")) {
return "Pattern can't end with slash character '/'.";
}
if (pattern.contains("//")) {
return "Pattern can't contain two slashes (//) in a row";
}
if (pattern.equals(".") || pattern.startsWith("./") || pattern.contains("/./")
|| pattern.endsWith("/.")) {
return "Pattern can't contain '.' element.";
}
if (pattern.equals("..") || pattern.startsWith("../") || pattern.contains("/../")
|| pattern.endsWith("/..")) {
return "Pattern can't contain '..' element.";
}
if (pattern.contains("***")) {
return "Pattern cannot contain more than two '*' in a row.";
}
int index = 0;
index = pattern.indexOf(Constants.DOUBLE_STAR, index);
while (index != -1) {
if (index != 0 && pattern.charAt(index - 1) != '/') {
return DOUBLE_STAR_ERROR_MESSAGE;
}
int length = Constants.DOUBLE_STAR.length();
if (index < pattern.length() - length && pattern.charAt(index + length) != '/') {
return DOUBLE_STAR_ERROR_MESSAGE;
}
index = pattern.indexOf(Constants.DOUBLE_STAR, index + 1);
}
if (pattern.contains("**/**")) {
return "Pattern can't contain '**/**' element. Replace it with single '**'.";
}
return null;
}
}