package net.filebot.similarity; import static net.filebot.util.FileUtilities.*; import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.regex.MatchResult; import java.util.regex.Matcher; import java.util.regex.Pattern; import net.filebot.web.SimpleDate; public class DateMatcher { private final DatePattern[] patterns; public DateMatcher() { patterns = new DatePattern[6]; // match yyyy-mm-dd patterns like 2010-10-24, 2009/6/1, etc patterns[0] = new NumericDatePattern("(?= 0) { return pos; } } return -1; } public SimpleDate match(File file) { for (String name : tokenizeTail(file)) { for (DatePattern pattern : patterns) { SimpleDate match = pattern.match(name); if (match != null) { return match; } } } return null; } protected List tokenizeTail(File file) { List tail = new ArrayList(2); for (File f : listPathTail(file, 2, true)) { tail.add(getName(f)); } return tail; } private static interface DatePattern { public SimpleDate match(CharSequence seq); public int find(CharSequence seq, int fromIndex); } private static class NumericDatePattern implements DatePattern { protected final Pattern pattern; protected final int[] order; public NumericDatePattern(String pattern, int[] order) { this.pattern = Pattern.compile(pattern); this.order = order; } protected SimpleDate process(MatchResult match) { return new SimpleDate(Integer.parseInt(match.group(order[0])), Integer.parseInt(match.group(order[1])), Integer.parseInt(match.group(order[2]))); } @Override public SimpleDate match(CharSequence seq) { Matcher matcher = pattern.matcher(seq); if (matcher.find()) { return process(matcher); } return null; } @Override public int find(CharSequence seq, int fromIndex) { Matcher matcher = pattern.matcher(seq).region(fromIndex, seq.length()); if (matcher.find()) { return matcher.start(); } return -1; } } private static class DateFormatPattern implements DatePattern { protected final Pattern space = Pattern.compile("[^\\p{Alnum}]+"); protected final Pattern pattern; protected final String dateFormat; public DateFormatPattern(String pattern, String dateFormat) { this.pattern = Pattern.compile(pattern); this.dateFormat = dateFormat; } protected SimpleDate process(MatchResult match) { return SimpleDate.parse(space.matcher(match.group()).replaceAll(" "), dateFormat); } @Override public SimpleDate match(CharSequence seq) { Matcher matcher = pattern.matcher(seq); if (matcher.find()) { return process(matcher); } return null; } @Override public int find(CharSequence seq, int fromIndex) { Matcher matcher = pattern.matcher(seq).region(fromIndex, seq.length()); if (matcher.find()) { if (process(matcher) != null) { return matcher.start(); } } return -1; } } }