package de.invesdwin.util.time.fdate; import java.time.DayOfWeek; import java.util.Calendar; import java.util.HashMap; import java.util.Map; import javax.annotation.concurrent.Immutable; import org.joda.time.DateTimeConstants; import de.invesdwin.util.error.UnknownArgumentException; @Immutable public enum FWeekday { Monday { @Override public int calendarValue() { return Calendar.MONDAY; } @Override public DayOfWeek javaTimeValue() { return DayOfWeek.MONDAY; } @Override public int jodaTimeValue() { return DateTimeConstants.MONDAY; } @Override public boolean isWeekend() { return false; } }, Tuesday { @Override public int calendarValue() { return Calendar.TUESDAY; } @Override public DayOfWeek javaTimeValue() { return DayOfWeek.TUESDAY; } @Override public int jodaTimeValue() { return DateTimeConstants.TUESDAY; } @Override public boolean isWeekend() { return false; } }, Wednesday { @Override public int calendarValue() { return Calendar.WEDNESDAY; } @Override public DayOfWeek javaTimeValue() { return DayOfWeek.WEDNESDAY; } @Override public int jodaTimeValue() { return DateTimeConstants.WEDNESDAY; } @Override public boolean isWeekend() { return false; } }, Thursday { @Override public int calendarValue() { return Calendar.THURSDAY; } @Override public DayOfWeek javaTimeValue() { return DayOfWeek.THURSDAY; } @Override public int jodaTimeValue() { return DateTimeConstants.THURSDAY; } @Override public boolean isWeekend() { return false; } }, Friday { @Override public int calendarValue() { return Calendar.FRIDAY; } @Override public DayOfWeek javaTimeValue() { return DayOfWeek.FRIDAY; } @Override public int jodaTimeValue() { return DateTimeConstants.FRIDAY; } @Override public boolean isWeekend() { return false; } }, Saturday { @Override public int calendarValue() { return Calendar.SATURDAY; } @Override public DayOfWeek javaTimeValue() { return DayOfWeek.SATURDAY; } @Override public int jodaTimeValue() { return DateTimeConstants.SATURDAY; } @Override public boolean isWeekend() { return true; } }, Sunday { @Override public int calendarValue() { return Calendar.SUNDAY; } @Override public DayOfWeek javaTimeValue() { return DayOfWeek.SUNDAY; } @Override public int jodaTimeValue() { return DateTimeConstants.SUNDAY; } @Override public boolean isWeekend() { return true; } }; private static final Map<Integer, FWeekday> CALENDAR_LOOKUP = new HashMap<Integer, FWeekday>(); private static final Map<DayOfWeek, FWeekday> JAVA_TIME_LOOKUP = new HashMap<DayOfWeek, FWeekday>(); private static final Map<Integer, FWeekday> JODA_TIME_LOOKUP = new HashMap<Integer, FWeekday>(); static { for (final FWeekday f : FWeekday.values()) { CALENDAR_LOOKUP.put(f.calendarValue(), f); JAVA_TIME_LOOKUP.put(f.javaTimeValue(), f); JODA_TIME_LOOKUP.put(f.jodaTimeValue(), f); } } public static FWeekday valueOfIndex(final int weekday) { return valueOfJodaTime(weekday); } public static FWeekday valueOfCalendar(final int weekday) { return lookup(CALENDAR_LOOKUP, weekday); } public static FWeekday valueOfJavaTime(final DayOfWeek weekday) { return lookup(JAVA_TIME_LOOKUP, weekday); } public static FWeekday valueOfJodaTime(final int weekday) { return lookup(JODA_TIME_LOOKUP, weekday); } @SuppressWarnings("unchecked") private static <T> FWeekday lookup(final Map<T, FWeekday> map, final T weekday) { if (weekday == null) { throw new NullPointerException("parameter field should not be null"); } final FWeekday value = map.get(weekday); if (value == null) { throw UnknownArgumentException.newInstance((Class<T>) weekday.getClass(), weekday); } else { return value; } } public abstract int calendarValue(); public abstract DayOfWeek javaTimeValue(); public abstract int jodaTimeValue(); public int indexValue() { return jodaTimeValue(); } public String toString3Letters() { final StringBuilder sb = new StringBuilder(); sb.append(this); sb.setLength(3); return sb.toString(); } public String toString2Letters() { final StringBuilder sb = new StringBuilder(); sb.append(this); sb.setLength(2); return sb.toString(); } public abstract boolean isWeekend(); public boolean isWorkday() { return !isWeekend(); } }