@SuppressWarnings("unchecked") public int parseInto(DateTimeParserBucket bucket, String text, int position) { Locale locale = bucket.getLocale(); // handle languages which might have non ASCII A-Z or punctuation // bug 1788282 Set<String> validValues = null; int maxLength = 0; synchronized (cParseCache) { Map<DateTimeFieldType, Object[]> innerMap = cParseCache.get(locale); if (innerMap == null) { innerMap = new HashMap<DateTimeFieldType, Object[]>(); cParseCache.put(locale, innerMap); } Object[] array = innerMap.get(iFieldType); if (array == null) { validValues = new HashSet<String>(32); MutableDateTime dt = new MutableDateTime(0L, DateTimeZone.UTC); Property property = dt.property(iFieldType); int min = property.getMinimumValueOverall(); int max = property.getMaximumValueOverall(); if (max - min > 32) { // protect against invalid fields return ~position; } maxLength = property.getMaximumTextLength(locale); for (int i = min; i <= max; i++) { property.set(i); validValues.add(property.getAsShortText(locale)); validValues.add(property.getAsShortText(locale).toLowerCase(locale)); validValues.add(property.getAsShortText(locale).toUpperCase(locale)); validValues.add(property.getAsText(locale)); validValues.add(property.getAsText(locale).toLowerCase(locale)); validValues.add(property.getAsText(locale).toUpperCase(locale)); } if ("en".equals(locale.getLanguage()) && iFieldType == DateTimeFieldType.era()) { // hack to support for parsing "BCE" and "CE" if the language is English validValues.add("BCE"); validValues.add("bce"); validValues.add("CE"); validValues.add("ce"); maxLength = 3; } array = new Object[] {validValues, Integer.valueOf(maxLength)}; innerMap.put(iFieldType, array); } else { validValues = (Set<String>) array[0]; maxLength = ((Integer) array[1]).intValue(); } } // match the longest string first using our knowledge of the max length int limit = Math.min(text.length(), position + maxLength); for (int i = limit; i > position; i--) { String match = text.substring(position, i); if (validValues.contains(match)) { bucket.saveField(iFieldType, match, locale); return i; } } return ~position; }