package dials.filter.impl; import dials.filter.FeatureFilter; import dials.filter.FilterDataException; import dials.filter.FilterDataHelper; import dials.filter.StaticDataFilter; import dials.messages.ContextualMessage; import dials.messages.DataFilterApplicationMessage; import org.joda.time.DateTime; import org.joda.time.DateTimeConstants; import java.util.Arrays; import java.util.List; public class DayOfWeekFeatureFilter extends FeatureFilter implements StaticDataFilter { public static final String DAYS_OF_WEEK = "DaysOfWeek"; private String[] daysOfWeek; @Override public boolean filter() { int currentDayOfWeek = new DateTime().getDayOfWeek(); for (String dayName : daysOfWeek) { if (DayOfWeek.getKeyForName(dayName) == currentDayOfWeek) { return true; } } return false; } @Override public void applyStaticData(DataFilterApplicationMessage message) { FilterDataHelper helper = new FilterDataHelper(message.getFilterData()); applyRequiredData(message, helper); } private void applyRequiredData(ContextualMessage message, FilterDataHelper helper) { try { daysOfWeek = helper.getData(DAYS_OF_WEEK, String.class).split(","); if (!validateDayNames(daysOfWeek)) { throw new FilterDataException("Invalid day provided for " + getClass().getSimpleName()); } recordSuccessfulDataApply(message, DAYS_OF_WEEK); } catch (FilterDataException e) { recordUnsuccessfulDataApply(message, DAYS_OF_WEEK, true, e.getMessage()); } } private boolean validateDayNames(String[] days) { for (String day : days) { if (DayOfWeek.getKeyForName(day) == -1) { return false; } } return true; } private enum DayOfWeek { MONDAY(DateTimeConstants.MONDAY, "mon", "monday"), TUESDAY(DateTimeConstants.TUESDAY, "tue", "tuesday"), WEDNESDAY(DateTimeConstants.WEDNESDAY, "wed", "wednesday"), THURSDAY(DateTimeConstants.THURSDAY, "thu", "thursday"), FRIDAY(DateTimeConstants.FRIDAY, "fri", "friday"), SATURDAY(DateTimeConstants.SATURDAY, "sat", "saturday"), SUNDAY(DateTimeConstants.SUNDAY, "sun", "sunday"); private List<String> names; private int key; private DayOfWeek(int key, String... names) { this.key = key; this.names = Arrays.asList(names); } public static int getKeyForName(String name) { for (DayOfWeek day : DayOfWeek.values()) { if (day.names.contains(name)) { return day.key; } } return -1; } } }