package de.invesdwin.util.time.fdate; import java.time.temporal.ChronoField; import java.util.Calendar; import java.util.HashMap; import java.util.Map; import javax.annotation.concurrent.Immutable; import org.joda.time.DateTimeFieldType; import de.invesdwin.util.error.UnknownArgumentException; @Immutable public enum FDateField { Year { @Override public int calendarValue() { return Calendar.YEAR; } @Override public ChronoField javaTimeValue() { return ChronoField.YEAR; } @Override public DateTimeFieldType jodaTimeValue() { return DateTimeFieldType.year(); } }, Month { @Override public int calendarValue() { return Calendar.MONTH; } @Override public ChronoField javaTimeValue() { return ChronoField.MONTH_OF_YEAR; } @Override public DateTimeFieldType jodaTimeValue() { return DateTimeFieldType.monthOfYear(); } }, /** * Also known as DAY_OF_MONTH. */ Day { @Override public int calendarValue() { return Calendar.DAY_OF_MONTH; } @Override public ChronoField javaTimeValue() { return ChronoField.DAY_OF_MONTH; } @Override public DateTimeFieldType jodaTimeValue() { return DateTimeFieldType.dayOfMonth(); } }, Weekday { @Override public int calendarValue() { return Calendar.DAY_OF_WEEK; } @Override public ChronoField javaTimeValue() { return ChronoField.DAY_OF_WEEK; } @Override public DateTimeFieldType jodaTimeValue() { return DateTimeFieldType.dayOfWeek(); } }, Hour { @Override public int calendarValue() { return Calendar.HOUR_OF_DAY; } @Override public ChronoField javaTimeValue() { return ChronoField.HOUR_OF_DAY; } @Override public DateTimeFieldType jodaTimeValue() { return DateTimeFieldType.hourOfDay(); } }, Minute { @Override public int calendarValue() { return Calendar.MINUTE; } @Override public ChronoField javaTimeValue() { return ChronoField.MINUTE_OF_HOUR; } @Override public DateTimeFieldType jodaTimeValue() { return DateTimeFieldType.minuteOfHour(); } }, Second { @Override public int calendarValue() { return Calendar.SECOND; } @Override public ChronoField javaTimeValue() { return ChronoField.SECOND_OF_MINUTE; } @Override public DateTimeFieldType jodaTimeValue() { return DateTimeFieldType.secondOfMinute(); } }, Millisecond { @Override public int calendarValue() { return Calendar.MILLISECOND; } @Override public ChronoField javaTimeValue() { return ChronoField.MILLI_OF_SECOND; } @Override public DateTimeFieldType jodaTimeValue() { return DateTimeFieldType.millisOfSecond(); } }; private static final Map<Integer, FDateField> CALENDAR_LOOKUP = new HashMap<Integer, FDateField>(); private static final Map<ChronoField, FDateField> JAVA_TIME_LOOKUP = new HashMap<ChronoField, FDateField>(); private static final Map<DateTimeFieldType, FDateField> JODA_TIME_LOOKUP = new HashMap<DateTimeFieldType, FDateField>(); static { for (final FDateField f : FDateField.values()) { CALENDAR_LOOKUP.put(f.calendarValue(), f); JAVA_TIME_LOOKUP.put(f.javaTimeValue(), f); JODA_TIME_LOOKUP.put(f.jodaTimeValue(), f); } } public abstract int calendarValue(); public abstract ChronoField javaTimeValue(); public abstract DateTimeFieldType jodaTimeValue(); public static FDateField valueOfCalendar(final int field) { return lookup(CALENDAR_LOOKUP, field); } public static FDateField valueOfJavaTime(final ChronoField field) { return lookup(JAVA_TIME_LOOKUP, field); } public static FDateField valueOfJodaTime(final DateTimeFieldType field) { return lookup(JODA_TIME_LOOKUP, field); } @SuppressWarnings("unchecked") private static <T> FDateField lookup(final Map<T, FDateField> map, final T field) { if (field == null) { throw new NullPointerException("parameter field should not be null"); } final FDateField value = map.get(field); if (value == null) { throw UnknownArgumentException.newInstance((Class<T>) field.getClass(), field); } else { return value; } } }