package org.netmelody.cieye.server.configuration; import static com.google.common.collect.Iterables.any; import static com.google.common.collect.Iterables.filter; import static com.google.common.collect.Iterables.transform; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.netmelody.cieye.core.domain.Sponsor; import com.google.common.base.Function; import com.google.common.base.Predicate; public final class Biometric { private static final Pattern FINGERPRINT_TEMPLATE = Pattern.compile(".*?\\b(.*)\\b.*?"); private final Sponsor sponsor; private final Iterable<Pattern> fingerprints; public Biometric(Sponsor sponsor, Iterable<String> fingerprints) { this.sponsor = sponsor; this.fingerprints = transform(cleaned(fingerprints), toPatterns()); } public Sponsor sponsor() { return sponsor; } public boolean foundAt(final String crimescene) { return any(fingerprints, leftAt(crimescene)); } private Iterable<String> cleaned(Iterable<String> dirtyFingerprints) { final Iterable<Matcher> impressions = transform(dirtyFingerprints, toFingerprintImpressions()); return transform(filter(impressions, smudges()), toFingerprints()); } private static Function<String, Matcher> toFingerprintImpressions() { return new Function<String, Matcher>() { @Override public Matcher apply(String dirtyPrint) { return FINGERPRINT_TEMPLATE.matcher(dirtyPrint); } }; } private static Predicate<Matcher> smudges() { return new Predicate<Matcher>() { @Override public boolean apply(Matcher matcher) { return matcher.matches(); } }; } private static Function<Matcher, String> toFingerprints() { return new Function<Matcher, String>() { @Override public String apply(Matcher matcher) { return matcher.group(1); } }; } private static Predicate<Pattern> leftAt(final String crimescene) { return new Predicate<Pattern>() { @Override public boolean apply(Pattern fingerprint) { return fingerprint.matcher(crimescene).find(); } }; } private static Function<String, Pattern> toPatterns() { return new Function<String, Pattern>() { @Override public Pattern apply(String keyword) { return Pattern.compile("\\b" + Pattern.quote(keyword) + "\\b", Pattern.CASE_INSENSITIVE); } }; } }