import java.time.DayOfWeek;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.temporal.TemporalAccessor;
import java.time.temporal.WeekFields;
import java.util.Calendar;
import java.util.Locale;
import java.util.spi.CalendarDataProvider;

public class IsoCalendarDataProvider extends CalendarDataProvider {

    @Override
    public int getFirstDayOfWeek(Locale locale) {
        return Calendar.MONDAY;
    }

    @Override
    public int getMinimalDaysInFirstWeek(Locale locale) {
        return 4;
    }

    @Override
    public Locale[] getAvailableLocales() {
        return new Locale[]{Locale.ROOT};
    }

    public static void main(String[] args) {
        //testcase here
        DateTimeFormatter formatter = new DateTimeFormatterBuilder()
                .appendPattern("YYYY")
                .toFormatter(Locale.ROOT);
        TemporalAccessor parse = formatter.parse("2018");
        System.out.println("parse.isSupported(WeekFields.ISO.weekBasedYear()): "+parse.isSupported(WeekFields.ISO.weekBasedYear())); // never passes..
        System.out.println("parse.isSupported(WeekFields.of(Locale.ROOT).weekBasedYear()): "+parse.isSupported(WeekFields.of(Locale.ROOT).weekBasedYear())); // always passes, we will run with SPI CalendarDataProvider, so the one below have to pass too
        System.out.println("parse.isSupported(WeekFields.of(DayOfWeek.MONDAY,4).weekBasedYear()): "+parse.isSupported(WeekFields.of(DayOfWeek.MONDAY,4).weekBasedYear())); // passes with SPI

    }
}
