< prev index next >

src/java.base/share/classes/java/time/format/DateTimeFormatterBuilder.java

Print this page
rev 57376 : 8235238: Parsing a time string ignores any custom TimeZoneNameProvider
Reviewed-by: joehw, rriggs

*** 111,120 **** --- 111,121 ---- import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Map.Entry; import java.util.Objects; + import java.util.Optional; import java.util.Set; import java.util.TimeZone; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap;
*** 4121,4131 **** if (textStyle == TextStyle.NARROW) { return super.getTree(context); } Locale locale = context.getLocale(); boolean isCaseSensitive = context.isCaseSensitive(); ! Set<String> regionIds = ZoneRulesProvider.getAvailableZoneIds(); int regionIdsSize = regionIds.size(); Map<Locale, Entry<Integer, SoftReference<PrefixTree>>> cached = isCaseSensitive ? cachedTree : cachedTreeCI; --- 4122,4133 ---- if (textStyle == TextStyle.NARROW) { return super.getTree(context); } Locale locale = context.getLocale(); boolean isCaseSensitive = context.isCaseSensitive(); ! Set<String> regionIds = new HashSet<>(ZoneRulesProvider.getAvailableZoneIds()); ! Set<String> nonRegionIds = new HashSet<>(64); int regionIdsSize = regionIds.size(); Map<Locale, Entry<Integer, SoftReference<PrefixTree>>> cached = isCaseSensitive ? cachedTree : cachedTreeCI;
*** 4137,4162 **** (tree = entry.getValue().get()) == null)) { tree = PrefixTree.newTree(context); zoneStrings = TimeZoneNameUtility.getZoneStrings(locale); for (String[] names : zoneStrings) { String zid = names[0]; ! if (!regionIds.contains(zid)) { continue; } tree.add(zid, zid); // don't convert zid -> metazone zid = ZoneName.toZid(zid, locale); int i = textStyle == TextStyle.FULL ? 1 : 2; for (; i < names.length; i += 2) { tree.add(names[i], zid); } } // if we have a set of preferred zones, need a copy and // add the preferred zones again to overwrite if (preferredZones != null) { for (String[] names : zoneStrings) { String zid = names[0]; ! if (!preferredZones.contains(zid) || !regionIds.contains(zid)) { continue; } int i = textStyle == TextStyle.FULL ? 1 : 2; for (; i < names.length; i += 2) { tree.add(names[i], zid); --- 4139,4180 ---- (tree = entry.getValue().get()) == null)) { tree = PrefixTree.newTree(context); zoneStrings = TimeZoneNameUtility.getZoneStrings(locale); for (String[] names : zoneStrings) { String zid = names[0]; ! if (!regionIds.remove(zid)) { ! nonRegionIds.add(zid); continue; } tree.add(zid, zid); // don't convert zid -> metazone zid = ZoneName.toZid(zid, locale); int i = textStyle == TextStyle.FULL ? 1 : 2; for (; i < names.length; i += 2) { tree.add(names[i], zid); } } + + // add names for provider's custom ids + final PrefixTree t = tree; + regionIds.stream() + .filter(zid -> !zid.startsWith("Etc") && !zid.startsWith("GMT")) + .forEach(cid -> { + String[] cidNames = TimeZoneNameUtility.retrieveDisplayNames(cid, locale); + int i = textStyle == TextStyle.FULL ? 1 : 2; + for (; i < cidNames.length; i += 2) { + if (cidNames[i] != null && !cidNames[i].isEmpty()) { + t.add(cidNames[i], cid); + } + } + }); + // if we have a set of preferred zones, need a copy and // add the preferred zones again to overwrite if (preferredZones != null) { for (String[] names : zoneStrings) { String zid = names[0]; ! if (!preferredZones.contains(zid) || nonRegionIds.contains(zid)) { continue; } int i = textStyle == TextStyle.FULL ? 1 : 2; for (; i < names.length; i += 2) { tree.add(names[i], zid);
< prev index next >