1
1
/*
2
- * Copyright (c) 2012, 2021 , Oracle and/or its affiliates. All rights reserved.
2
+ * Copyright (c) 2012, 2023 , Oracle and/or its affiliates. All rights reserved.
3
3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
4
*
5
5
* This code is free software; you can redistribute it and/or modify it
39
39
import java .util .Map ;
40
40
import java .util .TimeZone ;
41
41
import java .util .TreeMap ;
42
- import java .util .stream . Collectors ;
42
+ import java .util .regex . Pattern ;
43
43
44
44
/**
45
45
* This tool reads the IANA Language Subtag Registry data file downloaded from
@@ -136,10 +136,29 @@ private static void processDeprecatedData(String type,
136
136
}
137
137
} else { // language, extlang, legacy, and redundant
138
138
if (!initialLanguageMap .containsKey (preferred )) {
139
- sb = new StringBuilder (preferred );
140
- sb .append (',' );
141
- sb .append (tag );
142
- initialLanguageMap .put (preferred , sb );
139
+ // IANA update 4/13 introduced case where a preferred value
140
+ // can have a preferred value itself.
141
+ // eg: ar-ajp has pref ajp which has pref apc
142
+ boolean foundInOther = false ;
143
+ Pattern pattern = Pattern .compile ("," +preferred +"(,|$)" );
144
+ // Check if current pref exists inside a value for another pref
145
+ List <StringBuilder > doublePrefs = initialLanguageMap
146
+ .values ()
147
+ .stream ()
148
+ .filter (e -> pattern .matcher (e .toString ()).find ())
149
+ .toList ();
150
+ for (StringBuilder otherPrefVal : doublePrefs ) {
151
+ otherPrefVal .append ("," );
152
+ otherPrefVal .append (tag );
153
+ foundInOther = true ;
154
+ }
155
+ if (!foundInOther ) {
156
+ // does not exist in any other pref's values, so add as new entry
157
+ sb = new StringBuilder (preferred );
158
+ sb .append (',' );
159
+ sb .append (tag );
160
+ initialLanguageMap .put (preferred , sb );
161
+ }
143
162
} else {
144
163
sb = initialLanguageMap .get (preferred );
145
164
sb .append (',' );
@@ -156,7 +175,7 @@ private static void generateEquivalentMap() {
156
175
// "yue" is defined both as extlang and redundant. Remove the dup.
157
176
subtags = Arrays .stream (initialLanguageMap .get (preferred ).toString ().split ("," ))
158
177
.distinct ()
159
- .collect ( Collectors . toList () )
178
+ .toList ()
160
179
.toArray (new String [0 ]);
161
180
162
181
if (subtags .length == 2 ) {
@@ -241,7 +260,7 @@ private static String generateValuesString(String[] values) {
241
260
+ " static final Map<String, String[]> multiEquivsMap;\n "
242
261
+ " static final Map<String, String> regionVariantEquivMap;\n \n "
243
262
+ " static {\n "
244
- + " singleEquivMap = new HashMap<> (" ;
263
+ + " singleEquivMap = HashMap.newHashMap (" ;
245
264
246
265
private static final String footerText =
247
266
" }\n \n "
@@ -263,11 +282,11 @@ private static void generateSourceCode(String fileName) {
263
282
Paths .get (fileName ))) {
264
283
writer .write (getOpenJDKCopyright ());
265
284
writer .write (headerText
266
- + ( int )( sortedLanguageMap1 .size () / 0.75f + 1 ) + ");\n "
267
- + " multiEquivsMap = new HashMap<> ("
268
- + ( int )( sortedLanguageMap2 .size () / 0.75f + 1 ) + ");\n "
269
- + " regionVariantEquivMap = new HashMap<> ("
270
- + ( int )( sortedRegionVariantMap .size () / 0.75f + 1 ) + ");\n \n "
285
+ + sortedLanguageMap1 .size () + ");\n "
286
+ + " multiEquivsMap = HashMap.newHashMap ("
287
+ + sortedLanguageMap2 .size () + ");\n "
288
+ + " regionVariantEquivMap = HashMap.newHashMap ("
289
+ + sortedRegionVariantMap .size () + ");\n \n "
271
290
+ " // This is an auto-generated file and should not be manually edited.\n "
272
291
+ " // LSR Revision: " + LSRrevisionDate );
273
292
writer .newLine ();
0 commit comments