package org.smoothbuild.builtin.file.match.testing; import static java.util.Arrays.asList; 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.NamePattern.namePattern; import static org.smoothbuild.builtin.file.match.testing.HelpTester.ALL; import static org.smoothbuild.builtin.file.match.testing.HelpTester.ALL_DOUBLE_STARS; import static org.smoothbuild.builtin.file.match.testing.HelpTester.ALL_WITH_EMPTY; import java.util.ArrayList; import java.util.List; import java.util.function.Consumer; public class MatchingPathsGenerator { public static void generatePaths(String pattern, Consumer<String> consumer) { List<List<String>> template = createGeneratorTemplate(pattern); generatePaths("", template, 0, consumer); } private static void generatePaths(String path, List<List<String>> template, int index, Consumer<String> consumer) { if (index == template.size()) { consumer.accept(path); } else { for (String suffix : template.get(index)) { if (!(suffix.equals("/") && (path.endsWith("/") || path.isEmpty()))) { generatePaths(path + suffix, template, index + 1, consumer); } } } } private static List<List<String>> createGeneratorTemplate(String pattern) { List<List<String>> result = new ArrayList<>(); if (pattern.endsWith("**")) { pattern = pattern + "/*"; } String[] parts = pattern.split("/"); for (int i = 0; i < parts.length; i++) { if (i != 0) { result.add(asList("/")); } addNameGenerators(result, parts[i]); } return result; } private static void addNameGenerators(List<List<String>> result, String name) { if (name.equals(DOUBLE_STAR)) { result.add(ALL_DOUBLE_STARS); } else if (name.equals(SINGLE_STAR)) { result.add(ALL); } else { List<String> parts = namePattern(name).parts(); for (String part : parts) { if (part.equals(SINGLE_STAR)) { result.add(ALL_WITH_EMPTY); } else { result.add(asList(part)); } } } } }