package org.smoothbuild.builtin.file.match; import static org.smoothbuild.builtin.file.match.Constants.DOUBLE_STAR; import static org.smoothbuild.builtin.file.match.Constants.SINGLE_STAR; import static org.smoothbuild.builtin.file.match.Constants.SINGLE_STAR_CHAR; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * Pattern for matching dir/file name. * * <ul> * <li>Each star '*' in pattern matches zero or more characters.</li> * <li>Double stars "**" are forbidden unless whole pattern equals to "**". Such * pattern matches one or more whole dir/file names</li> * </ul> */ public class NamePattern { private final String value; public static NamePattern namePattern(String value) { return new NamePattern(value); } private NamePattern(String value) { if (!(value.indexOf('/') == -1)) { throw new IllegalArgumentException("NamePattern cannot contain slash."); } if (!(0 < value.length())) { throw new IllegalArgumentException("Pattern length can't be zero."); } if (!(!value.contains(DOUBLE_STAR) || value.length() == DOUBLE_STAR.length())) { throw new IllegalArgumentException(); } this.value = value; } public String value() { return value; } public boolean hasStars() { return value.indexOf(SINGLE_STAR_CHAR) != -1; } public boolean isSingleStar() { return value.equals(SINGLE_STAR); } public boolean isDoubleStar() { return value.equals(DOUBLE_STAR); } public List<String> parts() { if (isDoubleStar()) { return Arrays.asList(DOUBLE_STAR); } List<String> result = new ArrayList<>(); int startIndex = 0; while (startIndex < value.length()) { int foundIndex = value.indexOf(SINGLE_STAR_CHAR, startIndex); if (foundIndex == -1) { result.add(value.substring(startIndex)); startIndex = value.length(); } else { if (foundIndex != startIndex) { result.add(value.substring(startIndex, foundIndex)); } result.add(SINGLE_STAR); startIndex = foundIndex + 1; } } return result; } }