Skip to content

Commit

Permalink
CLDR-7428 Freeze collators; new class CollatorHelper
Browse files Browse the repository at this point in the history
-Public CollatorHelper replaces old private versions in CLDRConfig and MapComparator

-New CollatorHelper.ROOT_ORDER, CollatorHelper.ROOT_NUMERIC, CollatorHelper.EMOJI_COLLATOR

-Use those collators everywhere possible instead of recreating

-Fix some mistakes in previous commits where freeze was called too soon

-Remove dead code
  • Loading branch information
btangmu committed Nov 19, 2024
1 parent f03028c commit 5db775f
Show file tree
Hide file tree
Showing 18 changed files with 58 additions and 176 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,22 +7,15 @@

import com.ibm.icu.dev.test.TestFmwk.TestGroup;
import com.ibm.icu.dev.test.TestLog;
import com.ibm.icu.text.Collator;
import com.ibm.icu.text.RuleBasedCollator;
import com.ibm.icu.util.ULocale;
import java.io.File;
import java.io.PrintWriter;
import java.sql.SQLException;
import java.util.logging.Logger;
import org.unicode.cldr.test.CheckCLDR;
import org.unicode.cldr.util.CLDRConfig;
import org.unicode.cldr.util.CLDRConfig.Environment;
import org.unicode.cldr.util.CLDRFile;
import org.unicode.cldr.util.CLDRPaths;
import org.unicode.cldr.util.CldrUtility;
import org.unicode.cldr.util.Factory;
import org.unicode.cldr.util.StandardCodes;
import org.unicode.cldr.util.SupplementalDataInfo;
import org.unicode.cldr.web.CLDRProgressIndicator;
import org.unicode.cldr.web.DBUtils;
import org.unicode.cldr.web.SurveyLog;
Expand Down Expand Up @@ -129,13 +122,6 @@ public TestAll() {
public static class WebTestInfo {
private static WebTestInfo INSTANCE = null;

private SupplementalDataInfo supplementalDataInfo;
private StandardCodes sc;
private Factory cldrFactory;
private CLDRFile english;
private CLDRFile root;
private RuleBasedCollator col;

public static WebTestInfo getInstance() {
synchronized (WebTestInfo.class) {
if (INSTANCE == null) {
Expand All @@ -146,62 +132,6 @@ public static WebTestInfo getInstance() {
}

private WebTestInfo() {}

public SupplementalDataInfo getSupplementalDataInfo() {
synchronized (this) {
if (supplementalDataInfo == null) {
supplementalDataInfo =
SupplementalDataInfo.getInstance(CLDRPaths.SUPPLEMENTAL_DIRECTORY);
}
}
return supplementalDataInfo;
}

public StandardCodes getStandardCodes() {
synchronized (this) {
if (sc == null) {
sc = StandardCodes.make();
}
}
return sc;
}

public Factory getCldrFactory() {
synchronized (this) {
if (cldrFactory == null) {
cldrFactory = Factory.make(CLDRPaths.MAIN_DIRECTORY, ".*");
}
}
return cldrFactory;
}

public CLDRFile getEnglish() {
synchronized (this) {
if (english == null) {
english = getCldrFactory().make("en", true);
}
}
return english;
}

public CLDRFile getRoot() {
synchronized (this) {
if (root == null) {
root = getCldrFactory().make("root", true);
}
}
return root;
}

public Collator getCollator() {
synchronized (this) {
if (col == null) {
col = (RuleBasedCollator) Collator.getInstance(ULocale.ROOT);
col.setNumericCollation(true);
}
}
return col;
}
}

static boolean dbSetup = false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,7 @@
import com.ibm.icu.lang.UCharacter;
import com.ibm.icu.lang.UProperty;
import com.ibm.icu.text.Collator;
import com.ibm.icu.text.RuleBasedCollator;
import com.ibm.icu.text.Transliterator;
import com.ibm.icu.util.ULocale;
import com.ibm.icu.util.UResourceBundle;
import java.io.BufferedReader;
import java.io.File;
Expand All @@ -35,6 +33,7 @@
import org.unicode.cldr.util.CLDRFile;
import org.unicode.cldr.util.CLDRPaths;
import org.unicode.cldr.util.CldrUtility;
import org.unicode.cldr.util.CollatorHelper;
import org.unicode.cldr.util.PathUtilities;
import org.unicode.cldr.util.PatternCache;
import org.unicode.cldr.util.SimpleFactory;
Expand Down Expand Up @@ -411,9 +410,7 @@ static void testProps() {
{UProperty.DOUBLE_START, UProperty.DOUBLE_START},
{UProperty.STRING_START, UProperty.STRING_LIMIT},
};
Collator col = Collator.getInstance(ULocale.ROOT); // freeze below
((RuleBasedCollator) col).setNumericCollation(true);
col = col.freeze();
Collator col = CollatorHelper.ROOT_NUMERIC;
Map<String, Set<String>> alpha = new TreeMap<>(col);

for (int range = 0; range < ranges.length; ++range) {
Expand Down Expand Up @@ -466,13 +463,6 @@ static void testProps() {
}
out.println("</table></td></tr>");
}
Collator c = Collator.getInstance(ULocale.ROOT); // freeze below
((RuleBasedCollator) c).setNumericCollation(true);
c = c.freeze();

// int enumValue = UCharacter.getIntPropertyValue(codePoint, propEnum);
// return UCharacter.getPropertyValueName(propEnum,enumValue, (int)nameChoice);

}

private static String getName(int index, String valueName, String shortValueName) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3309,8 +3309,9 @@ private static int stepsFromRoot(String origLoc) {

/** Internal */
public static void testJavaSemantics() {
Collator caseInsensitive = Collator.getInstance(ULocale.ROOT).freeze();
Collator caseInsensitive = Collator.getInstance(ULocale.ROOT); // freeze below
caseInsensitive.setStrength(Collator.SECONDARY);
caseInsensitive = caseInsensitive.freeze();
Set<String> setWithCaseInsensitive = new TreeSet<>(caseInsensitive);
setWithCaseInsensitive.addAll(Arrays.asList(new String[] {"a", "b", "c"}));
Set<String> plainSet = new TreeSet<>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -258,8 +258,6 @@ private void addCollator(Map<String, Data> data, String type, RuleBasedCollator
dataItem.collator = col;
}

// RuleBasedCollator ROOT = (RuleBasedCollator) Collator.getInstance(ULocale.ROOT).freeze();

private class Subchart extends Chart {
private static final String HIGH_COLLATION_PRIMARY = "\uFFFF";
String title;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableSet.Builder;
import com.google.common.collect.Multimap;
import com.ibm.icu.text.Collator;
import com.ibm.icu.util.ULocale;
import java.io.IOException;
import java.util.Collection;
import java.util.Comparator;
Expand Down Expand Up @@ -76,8 +74,6 @@ public String getExplanation() {
+ "The data doesn't completely match wikipedia’s; there are some patches for CLDR languages.</p>\n";
}

Collator ENGLISH_ORDER = Collator.getInstance(ULocale.ROOT).freeze();

@Override
public void writeContents(FormattedFileWriter pw) throws IOException {

Expand Down Expand Up @@ -112,7 +108,9 @@ private void show(Multimap<String, String> lg, String parent, TablePrinter table
new Comparator<Pair<String, String>>() {
@Override
public int compare(Pair<String, String> o1, Pair<String, String> o2) {
int diff = ENGLISH_ORDER.compare(o1.getFirst(), o2.getFirst());
int diff =
CollatorHelper.ROOT_ORDER.compare(
o1.getFirst(), o2.getFirst());
if (diff != 0) {
return diff;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
package org.unicode.cldr.tool;

import com.ibm.icu.dev.util.UOption;
import com.ibm.icu.text.Collator;
import com.ibm.icu.text.RuleBasedCollator;
import com.ibm.icu.util.ULocale;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
Expand All @@ -30,14 +27,6 @@ public class CompareData {

String[] directoryList = {"main", "collation", "segmentations"};

static RuleBasedCollator uca =
(RuleBasedCollator) Collator.getInstance(ULocale.ROOT); // freeze below

{
uca.setNumericCollation(true);
uca = (RuleBasedCollator) uca.freeze();
}

static PrettyPath prettyPathMaker = new PrettyPath();
static CLDRFile english;
static Set<String> locales;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,7 @@
import com.ibm.icu.impl.Relation;
import com.ibm.icu.impl.Row;
import com.ibm.icu.impl.Row.R2;
import com.ibm.icu.text.Collator;
import com.ibm.icu.text.NumberFormat;
import com.ibm.icu.text.RuleBasedCollator;
import com.ibm.icu.text.UTF16;
import com.ibm.icu.util.ULocale;
import java.io.BufferedReader;
Expand Down Expand Up @@ -42,6 +40,7 @@
import org.unicode.cldr.util.CLDRFile;
import org.unicode.cldr.util.CLDRPaths;
import org.unicode.cldr.util.CldrUtility;
import org.unicode.cldr.util.CollatorHelper;
import org.unicode.cldr.util.Factory;
import org.unicode.cldr.util.Iso639Data;
import org.unicode.cldr.util.Iso639Data.Scope;
Expand Down Expand Up @@ -1924,12 +1923,6 @@ public String toString() {

public static class GeneralCollator implements Comparator<String> {
static UTF16.StringComparator cpCompare = new UTF16.StringComparator(true, false, 0);
static RuleBasedCollator UCA =
(RuleBasedCollator) Collator.getInstance(ULocale.ROOT).freeze();

static {
UCA.setNumericCollation(true);
}

@Override
public int compare(String s1, String s2) {
Expand All @@ -1938,7 +1931,7 @@ public int compare(String s1, String s2) {
} else if (s2 == null) {
return 1;
}
int result = UCA.compare(s1, s2);
int result = CollatorHelper.ROOT_NUMERIC.compare(s1, s2);
if (result != 0) return result;
return cpCompare.compare(s1, s2);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
import org.unicode.cldr.util.CLDRFile;
import org.unicode.cldr.util.CLDRPaths;
import org.unicode.cldr.util.CldrUtility;
import org.unicode.cldr.util.CollatorHelper;
import org.unicode.cldr.util.Factory;
import org.unicode.cldr.util.Iso639Data;
import org.unicode.cldr.util.IsoCurrencyParser;
Expand Down Expand Up @@ -318,8 +319,7 @@ public static void genSupplementalZoneData() throws IOException {
}

public static void genSupplementalZoneData(boolean skipUnaliased) throws IOException {
RuleBasedCollator col = (RuleBasedCollator) Collator.getInstance(ULocale.ROOT).freeze();
col.setNumericCollation(true);
RuleBasedCollator col = (RuleBasedCollator) CollatorHelper.ROOT_NUMERIC;
StandardCodes sc = StandardCodes.make();
Map<String, String> zone_country = sc.getZoneToCounty();
Map<String, Set<String>> country_zone = sc.getCountryToZoneSet();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
import com.ibm.icu.text.Collator;
import com.ibm.icu.text.NumberFormat;
import com.ibm.icu.text.UTF16;
import com.ibm.icu.util.ULocale;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
Expand All @@ -18,6 +17,7 @@
import org.unicode.cldr.util.CLDRFile.Status;
import org.unicode.cldr.util.CLDRPaths;
import org.unicode.cldr.util.CldrUtility;
import org.unicode.cldr.util.CollatorHelper;
import org.unicode.cldr.util.Counter;
import org.unicode.cldr.util.EscapingUtilities;
import org.unicode.cldr.util.Factory;
Expand All @@ -30,7 +30,7 @@ public class GenerateComparison {

private static PrettyPath prettyPathMaker;

private static Collator collator = Collator.getInstance(ULocale.ROOT).freeze();
private static Collator collator = CollatorHelper.ROOT_ORDER;

static class EnglishRowComparator implements Comparator<R2<String, String>> {
private static Comparator<String> unicode = new UTF16.StringComparator(true, false, 0);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import org.unicode.cldr.util.ArrayComparator;
import org.unicode.cldr.util.CLDRFile;
import org.unicode.cldr.util.CldrUtility;
import org.unicode.cldr.util.CollatorHelper;
import org.unicode.cldr.util.Factory;
import org.unicode.cldr.util.LanguageTagParser;
import org.unicode.cldr.util.Log;
Expand All @@ -40,7 +41,7 @@ class GenerateStatistics {
static CLDRFile english;
static Factory factory;
static LanguageTagParser ltp = new LanguageTagParser();
static Collator col = Collator.getInstance(ULocale.ROOT).freeze();
static Collator col = CollatorHelper.ROOT_ORDER;
static boolean notitlecase = true;

public static void generateSize(
Expand Down Expand Up @@ -344,7 +345,7 @@ private static void addCounts(

private static class LanguageList implements Comparable<Object> {
Object[] contents;
static Collator col = Collator.getInstance(ULocale.ROOT).freeze();
static Collator col = CollatorHelper.ROOT_ORDER;
static Comparator<Object[]> comp = new ArrayComparator(new Collator[] {col, col, null});

LanguageList(String locale, String englishName, String localName) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -515,9 +515,11 @@ private static boolean isLatin(String target) {
static Comparator<String> UCA;

static {
RuleBasedCollator UCA2 = (RuleBasedCollator) Collator.getInstance(ULocale.ROOT).freeze();
RuleBasedCollator UCA2 =
(RuleBasedCollator) Collator.getInstance(ULocale.ROOT); // freeze below
UCA2.setNumericCollation(true);
UCA2.setStrength(Collator.IDENTICAL);
UCA2 = (RuleBasedCollator) UCA2.freeze();
UCA =
new org.unicode.cldr.util.MultiComparator(
UCA2, new UTF16.StringComparator(true, false, 0));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import java.util.TreeSet;
import org.unicode.cldr.draft.FileUtilities;
import org.unicode.cldr.util.CldrUtility;
import org.unicode.cldr.util.CollatorHelper;
import org.unicode.cldr.util.Pair;

/**
Expand All @@ -49,7 +50,7 @@ public class MakeTransliterator {

static NumberFormat nf = NumberFormat.getInstance(ULocale.ENGLISH);

static Collator col = Collator.getInstance(ULocale.ROOT).freeze();
static Collator col = CollatorHelper.ROOT_ORDER;

static String cldrDataDir =
"C:\\cvsdata\\unicode\\cldr\\tools\\java\\org\\unicode\\cldr\\util\\data\\transforms\\";
Expand Down
4 changes: 2 additions & 2 deletions tools/cldr-code/src/main/java/org/unicode/cldr/tool/Misc.java
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
import org.unicode.cldr.util.CLDRFile;
import org.unicode.cldr.util.CLDRPaths;
import org.unicode.cldr.util.CldrUtility;
import org.unicode.cldr.util.CollatorHelper;
import org.unicode.cldr.util.Factory;
import org.unicode.cldr.util.Iso3166Data;
import org.unicode.cldr.util.LanguageTagParser;
Expand Down Expand Up @@ -466,8 +467,7 @@ private static void printCurrentTimezoneLocalizations(Set<String> languages)
}

static void printZoneAliases() {
RuleBasedCollator col = (RuleBasedCollator) Collator.getInstance(ULocale.ROOT).freeze();
col.setNumericCollation(true);
RuleBasedCollator col = (RuleBasedCollator) CollatorHelper.ROOT_NUMERIC;
StandardCodes sc = StandardCodes.make();
Map<String, String> zone_countries = sc.getZoneToCounty();
Map<String, String> old_new = sc.getZoneLinkold_new();
Expand Down
Loading

0 comments on commit 5db775f

Please sign in to comment.