package org.core4j; import java.lang.reflect.Field; import org.core4j.xml.XName; import org.core4j.xml.XNameable; public class Predicates { public static Predicate1<String> endsWith(final String suffix) { return new Predicate1<String>() { public boolean apply(String input) { return input.endsWith(suffix); } }; } public static Predicate1<String> startsWith(final String prefix) { return new Predicate1<String>() { public boolean apply(String input) { return input.startsWith(prefix); } }; } public static <T extends XNameable> Predicate1<T> xnameEquals(final XName xname) { return new Predicate1<T>() { public boolean apply(T input) { return input.getName().equals(xname); } }; } public static <T extends XNameable> Predicate1<T> xnameEquals(final String name) { final XName xname = new XName(null, name); return new Predicate1<T>() { public boolean apply(T input) { return input.getName().equals(xname); } }; } public static <T, TField> Predicate1<T> byField(Class<T> clazz, String fieldName, Class<TField> fieldClass, final TField fieldValue) { final Field field = CoreUtils.getField(clazz, fieldName); field.setAccessible(true); return wrap(new ThrowingPredicate1<T>() { @SuppressWarnings("unchecked") public boolean apply(T input) throws Exception { TField value = (TField) field.get(input); if (value == null) { return fieldValue == null; } else { return value.equals(fieldValue); } } }); } public static <T> Predicate1<T> not(final Predicate1<T> predicate) { return new Predicate1<T>() { public boolean apply(T input) { return !predicate.apply(input); } }; } public static <T> Predicate1<T> wrap(final ThrowingPredicate1<T> fn) { return new Predicate1<T>() { public boolean apply(T input) { try { return fn.apply(input); } catch (Exception e) { throw new RuntimeException(e); } } }; } }