package jalview.datamodel.features; import jalview.datamodel.SequenceFeature; import jalview.util.MessageManager; import java.util.ArrayList; import java.util.List; public class FeatureMatcherSet implements FeatureMatcherSetI { private static final String OR_I18N = MessageManager .getString("label.or"); private static final String AND_18N = MessageManager .getString("label.and"); List matchConditions; boolean andConditions; /** * Constructor */ public FeatureMatcherSet() { matchConditions = new ArrayList<>(); } @Override public boolean matches(SequenceFeature feature) { /* * no conditions matches anything */ if (matchConditions.isEmpty()) { return true; } /* * AND until failure */ if (andConditions) { for (FeatureMatcherI m : matchConditions) { if (!m.matches(feature)) { return false; } } return true; } /* * OR until match */ for (FeatureMatcherI m : matchConditions) { if (m.matches(feature)) { return true; } } return false; } @Override public FeatureMatcherSetI and(FeatureMatcherI m) { if (!andConditions && matchConditions.size() > 1) { throw new IllegalStateException("Can't add an AND to OR conditions"); } matchConditions.add(m); andConditions = true; return this; } @Override public FeatureMatcherSetI or(FeatureMatcherI m) { if (andConditions && matchConditions.size() > 1) { throw new IllegalStateException("Can't add an OR to AND conditions"); } matchConditions.add(m); andConditions = false; return this; } @Override public boolean isAnded() { return andConditions; } @Override public Iterable getMatchers() { return matchConditions; } @Override public String toString() { StringBuilder sb = new StringBuilder(); boolean first = true; for (FeatureMatcherI matcher : matchConditions) { if (!first) { String joiner = andConditions ? AND_18N : OR_I18N; sb.append(" ").append(joiner.toLowerCase()).append(" "); } first = false; sb.append("(").append(matcher.toString()).append(")"); } return sb.toString(); } @Override public boolean isEmpty() { return matchConditions == null || matchConditions.isEmpty(); } }