--- old/src/share/classes/sun/util/locale/provider/CalendarNameProviderImpl.java Mon Feb 4 13:33:00 2013 +++ new/src/share/classes/sun/util/locale/provider/CalendarNameProviderImpl.java Mon Feb 4 13:32:59 2013 @@ -25,6 +25,7 @@ package sun.util.locale.provider; import static java.util.Calendar.*; +import static java.util.GregorianCalendar.*; import java.util.Comparator; import java.util.Locale; import java.util.Map; @@ -50,6 +51,9 @@ @Override public String getDisplayName(String calendarType, int field, int value, int style, Locale locale) { + if (!valueRangeCheck(calendarType, field, value, style)) { + return null; + } String name = null; String key = getResourceKey(calendarType, field, style); if (key != null) { @@ -277,4 +281,30 @@ } return "Names"; } + + private boolean valueRangeCheck(String calType, int field, int value, int style) { + switch (field) { + case MONTH: + return value >= JANUARY && value <= UNDECIMBER; + case DAY_OF_WEEK: + return value >= SUNDAY && value <= SATURDAY; + case AM_PM: + return value == AM || value == PM; + case ERA: + switch (calType) { + case "gregory": + return value == BC || value == AD; + case "buddhist": // BC or B.E. + case "roc": // Before R.O.C. or R.O.C. + case "islamic": // Before AH or AH + return value == 0 || value == 1; + case "japanese": + return value >= 0 && value <= 4; // Seireki, Meiji, Taisho, Showa, or Heisei + default: + return false; // unknown calendar type + } + default: + return true; // no value range limitation + } + } }