package org.oddjob.schedules.units; import java.util.Arrays; import org.oddjob.arooa.convert.ConversionProvider; import org.oddjob.arooa.convert.ConversionRegistry; import org.oddjob.arooa.convert.Convertlet; import org.oddjob.arooa.convert.ConvertletException; public interface WeekOfMonth { enum Weeks implements WeekOfMonth { /** First week of the month. */ FIRST { @Override public int getWeekNumber() { return 1; } }, /** Second week of the month. */ SECOND { @Override public int getWeekNumber() { return 2; } }, /** Third week of the month. */ THIRD { @Override public int getWeekNumber() { return 3; } }, /** Fourth week of the month. */ FOURTH { @Override public int getWeekNumber() { return 4; } }, /** Fifth week of the month. */ FIFTH { @Override public int getWeekNumber() { return 5; } }, /** Last week of the month. */ LAST { @Override public int getWeekNumber() { return -1; } }, /** The Week before the last week of the month. */ PENULTIMATE { @Override public int getWeekNumber() { return -2; } }, } public static class Number implements WeekOfMonth { private final int weekNumber; public Number(int weekNumber) { this.weekNumber = weekNumber; } @Override public int getWeekNumber() { return weekNumber; } @Override public String toString() { return "" + weekNumber; } } public static class Conversions implements ConversionProvider { @Override public void registerWith(ConversionRegistry registry) { registry.register(String.class, WeekOfMonth.class, new Convertlet<String, WeekOfMonth>() { @Override public WeekOfMonth convert(String from) throws ConvertletException { try { final int week = Integer.parseInt(from); return new Number(week); } catch (NumberFormatException e) { try { return Weeks.valueOf(from.toUpperCase()); } catch (IllegalArgumentException enumEx) { throw new ConvertletException("[" + from + "] is not a valid day of month. Valid values are " + Arrays.asList(Weeks.values()) + " or an integer."); } } } }); } } public int getWeekNumber(); }