@Override public String toString() { if (isTraverse()) { return "**"; } else { StringBuilder buf = new StringBuilder(); elements.forEach(buf::append); return buf.toString(); } } }
private static List<Path> consumeStep(LinkedList<Segment> segments) { assert segments != null; assert segments.isEmpty() == false; assert segments.getFirst().isTraverse() == false; List<Path> results = new ArrayList<>(); results.add(new Path(segment)); while (isGlobRequired(current) && segments.isEmpty() == false && segments.getFirst().isTraverse() == false) { current = segments.removeFirst(); Set<String> suffixCandidates = resolve(current);
private static boolean isPlain(FilePattern.Segment segment) { return segment.isTraverse() == false && segment.getElements().stream() .map(FilePattern.PatternElement::getKind) .allMatch(Predicate.isEqual(FilePattern.PatternElementKind.TOKEN)); }
LinkedList<Segment> segments = new LinkedList<>(pattern.getSegments()); while (segments.isEmpty() == false) { if (segments.getFirst().isTraverse()) { segments.removeFirst(); current = recursiveStep(fs, current);
buf.append('/'); if (segment.isTraverse()) { buf.append(WILDCARD_REPLACEMENT);
private static Set<String> resolve(Segment segment) { assert segment != null; assert segment.isTraverse() == false; List<Set<String>> candidates = new ArrayList<>(); for (PatternElement element : segment.getElements()) { switch (element.getKind()) { case TOKEN: candidates.add(Collections.singleton(element.getToken())); break; case WILDCARD: candidates.add(Collections.singleton("*")); //$NON-NLS-1$ break; case SELECTION: candidates.add(new TreeSet<>(((Selection) element).getContents())); break; default: throw new AssertionError(); } } List<String> results = stringCrossJoin(candidates); return new TreeSet<>(results); }
/** * A complex pattern. */ @Test public void complex() { FilePattern compiled = FilePattern.compile("alpha/**/{beta|gamma}/${date}-*.csv"); assertThat(compiled.containsVariables(), is(true)); List<Segment> segments = compiled.getSegments(); assertThat(segments.size(), is(4)); assertThat(segments.get(0).isTraverse(), is(false)); assertThat(segments.get(0).getElements(), is(kind(TOKEN))); assertThat(segments.get(0).getElements(), is(token("alpha"))); assertThat(segments.get(1).isTraverse(), is(true)); assertThat(segments.get(2).isTraverse(), is(false)); assertThat(segments.get(2).getElements(), is(kind(SELECTION))); assertThat(segments.get(2).getElements(), is(token("{beta|gamma}"))); assertThat(segments.get(3).isTraverse(), is(false)); assertThat(segments.get(3).getElements(), is(kind(VARIABLE, TOKEN, WILDCARD, TOKEN))); assertThat(segments.get(3).getElements(), is(token("${date}", "-", "*", ".csv"))); }
/** * multiple segments. */ @Test public void segments() { FilePattern compiled = FilePattern.compile("alpha/beta/gamma"); List<Segment> segments = compiled.getSegments(); assertThat(segments.size(), is(3)); assertThat(segments.get(0).isTraverse(), is(false)); assertThat(segments.get(0).getElements(), is(kind(TOKEN))); assertThat(segments.get(0).getElements(), is(token("alpha"))); assertThat(segments.get(1).isTraverse(), is(false)); assertThat(segments.get(1).getElements(), is(kind(TOKEN))); assertThat(segments.get(1).getElements(), is(token("beta"))); assertThat(segments.get(2).isTraverse(), is(false)); assertThat(segments.get(2).getElements(), is(kind(TOKEN))); assertThat(segments.get(2).getElements(), is(token("gamma"))); }
/** * A complex pattern (all csv). */ @Test public void all_csv() { FilePattern compiled = FilePattern.compile("**/*.csv"); List<Segment> segments = compiled.getSegments(); assertThat(segments.size(), is(2)); assertThat(segments.get(0).isTraverse(), is(true)); assertThat(segments.get(1).isTraverse(), is(false)); assertThat(segments.get(1).getElements(), is(kind(WILDCARD, TOKEN))); assertThat(segments.get(1).getElements(), is(token("*", ".csv"))); }
/** * A selection pattern. */ @Test public void selection() { FilePattern compiled = FilePattern.compile("{alpha|beta|gamma}"); assertThat(compiled.containsVariables(), is(false)); List<Segment> segments = compiled.getSegments(); assertThat(segments.size(), is(1)); assertThat(segments.get(0).isTraverse(), is(false)); assertThat(segments.get(0).getElements(), is(kind(SELECTION))); assertThat(segments.get(0).getElements(), is(token("{alpha|beta|gamma}"))); }
/** * Returns whether this pattern contains traverse ({@code **}). * @return {@code true} if contains * @since 0.7.0 */ public boolean containsTraverse() { for (Segment segment : segments) { if (segment.isTraverse()) { return true; } } return false; }
/** * A variable pattern. */ @Test public void variable() { FilePattern compiled = FilePattern.compile("${v}"); assertThat(compiled.containsVariables(), is(true)); List<Segment> segments = compiled.getSegments(); assertThat(segments.size(), is(1)); assertThat(segments.get(0).isTraverse(), is(false)); assertThat(segments.get(0).getElements(), is(kind(VARIABLE))); assertThat(segments.get(0).getElements(), is(token("${v}"))); }
/** * A selection pattern. */ @Test public void selection_empty() { FilePattern compiled = FilePattern.compile("{}"); assertThat(compiled.containsVariables(), is(false)); List<Segment> segments = compiled.getSegments(); assertThat(segments.size(), is(1)); assertThat(segments.get(0).isTraverse(), is(false)); assertThat(segments.get(0).getElements(), is(kind(SELECTION))); assertThat(segments.get(0).getElements(), is(token("{}"))); }
/** * A token. */ @Test public void token() { FilePattern compiled = FilePattern.compile("a"); assertThat(compiled.containsVariables(), is(false)); List<Segment> segments = compiled.getSegments(); assertThat(segments.size(), is(1)); assertThat(segments.get(0).isTraverse(), is(false)); assertThat(segments.get(0).getElements(), is(kind(TOKEN))); assertThat(segments.get(0).getElements(), is(token("a"))); }
/** * A selection pattern. */ @Test public void selection_containsEmpty() { FilePattern compiled = FilePattern.compile("{alpha||gamma}"); assertThat(compiled.containsVariables(), is(false)); List<Segment> segments = compiled.getSegments(); assertThat(segments.size(), is(1)); assertThat(segments.get(0).isTraverse(), is(false)); assertThat(segments.get(0).getElements(), is(kind(SELECTION))); assertThat(segments.get(0).getElements(), is(token("{alpha||gamma}"))); }
/** * A wildcard pattern. */ @Test public void wildcard() { FilePattern compiled = FilePattern.compile("*"); assertThat(compiled.containsVariables(), is(false)); List<Segment> segments = compiled.getSegments(); assertThat(segments.size(), is(1)); assertThat(segments.get(0).isTraverse(), is(false)); assertThat(segments.get(0).getElements(), is(kind(WILDCARD))); assertThat(segments.get(0).getElements(), is(token("*"))); }
/** * An empty variable pattern. */ @Test public void variable_empty() { FilePattern compiled = FilePattern.compile("${}"); List<Segment> segments = compiled.getSegments(); assertThat(segments.size(), is(1)); assertThat(segments.get(0).isTraverse(), is(false)); assertThat(segments.get(0).getElements(), is(kind(VARIABLE))); assertThat(segments.get(0).getElements(), is(token("${}"))); }
/** * A contains wildcard pattern. */ @Test public void containsWildcard() { FilePattern compiled = FilePattern.compile("data-*.csv"); List<Segment> segments = compiled.getSegments(); assertThat(segments.size(), is(1)); assertThat(segments.get(0).isTraverse(), is(false)); assertThat(segments.get(0).getElements(), is(kind(TOKEN, WILDCARD, TOKEN))); assertThat(segments.get(0).getElements(), is(token("data-", "*", ".csv"))); }
/** * A traverse pattern. */ @Test public void traverse() { FilePattern compiled = FilePattern.compile("**"); List<Segment> segments = compiled.getSegments(); assertThat(segments.size(), is(1)); assertThat(segments.get(0).isTraverse(), is(true)); assertThat(segments.get(0).getElements(), is(kind())); }
private static boolean isGlobRequired(Segment segment) { assert segment != null; assert segment.isTraverse() == false; for (PatternElement element : segment.getElements()) { if (element.getKind() == PatternElementKind.WILDCARD) { return false; } } return true; }