package org.araqne.logstorage.exporter.impl; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; public class FileWildcardMatcher { public static Set<String> apply(Set<String> names, String expr) { Set<String> filtered = new HashSet<String>(); List<NameMatcher> matchers = new ArrayList<NameMatcher>(); String[] tokens = expr.split(","); for (String t : tokens) { matchers.add(new NameMatcher(t.trim())); } for (String name : names) { for (NameMatcher matcher : matchers) { if (matcher.matches(name)) filtered.add(name); } } return filtered; } private static class NameMatcher { private Matcher fileNameMatcher; public NameMatcher(String token) { fileNameMatcher = buildPattern(token).matcher(""); } public boolean matches(String name) { fileNameMatcher.reset(name); if (!fileNameMatcher.matches()) return false; return true; } public static Pattern buildPattern(String s) { StringBuilder sb = new StringBuilder(); sb.append("^"); for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if (c == '(' || c == ')' || c == '[' || c == ']' || c == '$' || c == '^' || c == '.' || c == '{' || c == '}' || c == '|' || c == '\\' || c == '*') { sb.append('\\'); sb.append(c); } else { sb.append(c); } } sb.append("$"); String quoted = sb.toString(); String expanded = quoted.replaceAll("(?<!\\\\\\\\)\\\\\\*", ".*"); boolean wildcard = !expanded.equals(quoted); expanded = expanded.replaceAll("\\\\\\\\\\\\\\*", "\\\\*"); if (wildcard) return Pattern.compile(expanded, Pattern.CASE_INSENSITIVE); return Pattern.compile(expanded); } } }