package de.invesdwin.util.time.fdate; import java.time.Month; 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 FMonth { January { @Override public int calendarValue() { return Calendar.JANUARY; } @Override public Month javaTimeValue() { return Month.JANUARY; } @Override public int jodaTimeValue() { return DateTimeConstants.JANUARY; } }, February { @Override public int calendarValue() { return Calendar.FEBRUARY; } @Override public Month javaTimeValue() { return Month.FEBRUARY; } @Override public int jodaTimeValue() { return DateTimeConstants.FEBRUARY; } }, March { @Override public int calendarValue() { return Calendar.MARCH; } @Override public Month javaTimeValue() { return Month.MARCH; } @Override public int jodaTimeValue() { return DateTimeConstants.MARCH; } }, April { @Override public int calendarValue() { return Calendar.APRIL; } @Override public Month javaTimeValue() { return Month.APRIL; } @Override public int jodaTimeValue() { return DateTimeConstants.APRIL; } }, May { @Override public int calendarValue() { return Calendar.MAY; } @Override public Month javaTimeValue() { return Month.MAY; } @Override public int jodaTimeValue() { return DateTimeConstants.MAY; } }, June { @Override public int calendarValue() { return Calendar.JUNE; } @Override public Month javaTimeValue() { return Month.JUNE; } @Override public int jodaTimeValue() { return DateTimeConstants.JUNE; } }, July { @Override public int calendarValue() { return Calendar.JULY; } @Override public Month javaTimeValue() { return Month.JULY; } @Override public int jodaTimeValue() { return DateTimeConstants.JULY; } }, August { @Override public int calendarValue() { return Calendar.AUGUST; } @Override public Month javaTimeValue() { return Month.AUGUST; } @Override public int jodaTimeValue() { return DateTimeConstants.AUGUST; } }, September { @Override public int calendarValue() { return Calendar.SEPTEMBER; } @Override public Month javaTimeValue() { return Month.SEPTEMBER; } @Override public int jodaTimeValue() { return DateTimeConstants.SEPTEMBER; } }, October { @Override public int calendarValue() { return Calendar.OCTOBER; } @Override public Month javaTimeValue() { return Month.OCTOBER; } @Override public int jodaTimeValue() { return DateTimeConstants.OCTOBER; } }, November { @Override public int calendarValue() { return Calendar.NOVEMBER; } @Override public Month javaTimeValue() { return Month.NOVEMBER; } @Override public int jodaTimeValue() { return DateTimeConstants.NOVEMBER; } }, December { @Override public int calendarValue() { return Calendar.DECEMBER; } @Override public Month javaTimeValue() { return Month.DECEMBER; } @Override public int jodaTimeValue() { return DateTimeConstants.DECEMBER; } }; private static final Map<Integer, FMonth> CALENDAR_LOOKUP = new HashMap<Integer, FMonth>(); private static final Map<Month, FMonth> JAVA_TIME_LOOKUP = new HashMap<Month, FMonth>(); private static final Map<Integer, FMonth> JODA_TIME_LOOKUP = new HashMap<Integer, FMonth>(); static { for (final FMonth f : FMonth.values()) { CALENDAR_LOOKUP.put(f.calendarValue(), f); JAVA_TIME_LOOKUP.put(f.javaTimeValue(), f); JODA_TIME_LOOKUP.put(f.jodaTimeValue(), f); } } public static FMonth valueOfCalendar(final int month) { return lookup(CALENDAR_LOOKUP, month); } public static FMonth valueOfJavaTime(final Month month) { return lookup(JAVA_TIME_LOOKUP, month); } public static FMonth valueOfJodaTime(final int month) { return lookup(JODA_TIME_LOOKUP, month); } public static FMonth valueOfIndex(final int month) { return valueOfJodaTime(month); } @SuppressWarnings("unchecked") private static <T> FMonth lookup(final Map<T, FMonth> map, final T month) { if (month == null) { throw new NullPointerException("parameter field should not be null"); } final FMonth value = map.get(month); if (value == null) { throw UnknownArgumentException.newInstance((Class<T>) month.getClass(), month); } else { return value; } } public abstract int calendarValue(); public abstract Month 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(); } }