getOutputTypes();
- /** Returns the root directory in which the CLDR release is located. */
- Path getCldrDirectory();
-
/**
* Returns an additional "specials" directory containing additional ICU specific XML
* files depending on the given output type. This is where the converter finds any XML
@@ -83,12 +80,19 @@ public interface LdmlConverterConfig {
CldrDraftStatus getMinimumDraftStatus();
/**
- * Returns the set of locale IDs to be processed for the given directory.
+ * Returns the complete set of locale IDs which should be considered for processing for this
+ * configuration.
*
- * This set can contain IDs which have noICU data associated with them if they are
- * suitable aliases (e.g. they are deprecated versions of locale IDs for which data does
+ *
Note that this set can contain IDs which have no CLDR data associated with them if they
+ * are suitable aliases (e.g. they are deprecated versions of locale IDs for which data does
* exist).
*/
+ Set getAllLocaleIds();
+
+ /**
+ * Returns the set of locale IDs to be processed for the given directory. This set must always
+ * be a subset of {@link #getAllLocaleIds()}.
+ */
Set getTargetLocaleIds(IcuLocaleDir dir);
/**
diff --git a/tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/SupplementalData.java b/tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/SupplementalData.java
index b05d67359c2..1f0756802ff 100644
--- a/tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/SupplementalData.java
+++ b/tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/SupplementalData.java
@@ -17,20 +17,24 @@ import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
+import java.util.Set;
import java.util.function.Function;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Stream;
import org.unicode.cldr.api.AttributeKey;
-import org.unicode.cldr.api.CldrData;
+import org.unicode.cldr.api.CldrDataSupplier;
+import org.unicode.cldr.api.CldrDataType;
import com.google.common.base.Ascii;
import com.google.common.base.Splitter;
import com.google.common.base.Strings;
import com.google.common.collect.HashBasedTable;
import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableTable;
+import com.google.common.collect.Sets;
import com.google.common.collect.Table;
/**
@@ -43,6 +47,13 @@ import com.google.common.collect.Table;
*/
// TODO: This should be moved into the API and leverage some of the existing utility functions.
public final class SupplementalData {
+ // Special IDs which are not supported via CLDR, but for which synthetic data is injected.
+ // The "TRADITIONAL" variants are here because their calendar differs from the non-variant
+ // locale. However CLDR cannot represent this currently because calendar defaults are in
+ // supplemental data (rather than locale data) and are keyed only on territory.
+ private static final ImmutableSet PHANTOM_LOCALE_IDS =
+ ImmutableSet.of("ja_JP_TRADITIONAL", "th_TH_TRADITIONAL");
+
private static final Pattern SCRIPT_SUBTAG = Pattern.compile("[A-Z][a-z]{3}");
private static final PathMatcher ALIAS =
@@ -88,18 +99,18 @@ public final class SupplementalData {
}
/**
- * Creates a supplemental data API instance from the given CLDR data.
+ * Creates a supplemental data API instance from the given CLDR data supplier.
*
- * @param supplementalData the raw CLDR supplemental data instance.
+ * @param src the CLDR data supplier.
* @return the supplemental data API.
*/
- public static SupplementalData create(CldrData supplementalData) {
+ public static SupplementalData create(CldrDataSupplier src) {
Table aliasTable = HashBasedTable.create();
Map parentLocaleMap = new HashMap<>();
Map defaultCalendarMap = new HashMap<>();
Map likelySubtagMap = new HashMap<>();
- supplementalData.accept(
+ src.getDataForType(CldrDataType.SUPPLEMENTAL).accept(
ARBITRARY,
v -> {
if (ALIAS.matches(v.getPath())) {
@@ -122,17 +133,9 @@ public final class SupplementalData {
}
});
- // WARNING: The original mapper code determines the full set of deprecated territories and
- // then removes the following hard-coded list without any explanation as to why. While this
- // is presumably to "undeprecate" them for the purposes of the locale processing, there's
- // no explanation of where this list comes from, and thus no way to maintain it.
- //
- // asList("062", "172", "200", "830", "AN", "CS", "QU")
- // .forEach(t -> aliasTable.remove(Alias.TERRITORY, t));
- // TODO: Understand and document what on Earth this is all about or delete this comment.
-
+ Set availableIds = Sets.union(src.getAvailableLocaleIds(), PHANTOM_LOCALE_IDS);
return new SupplementalData(
- aliasTable, parentLocaleMap, defaultCalendarMap, likelySubtagMap);
+ availableIds, aliasTable, parentLocaleMap, defaultCalendarMap, likelySubtagMap);
}
// A simple-as-possible, mutable, locale ID data "struct" to handle the IDs used during ICU
@@ -256,22 +259,30 @@ public final class SupplementalData {
}
}
+ private final ImmutableSet availableIds;
private final ImmutableTable aliasTable;
private final ImmutableMap parentLocaleMap;
private final ImmutableMap defaultCalendarMap;
private final ImmutableMap likelySubtagMap;
private SupplementalData(
+ Set availableIds,
Table aliasTable,
Map parentLocaleMap,
Map defaultCalendarMap,
Map likelySubtagMap) {
+
+ this.availableIds = ImmutableSet.copyOf(availableIds);
this.aliasTable = ImmutableTable.copyOf(aliasTable);
this.parentLocaleMap = ImmutableMap.copyOf(parentLocaleMap);
this.defaultCalendarMap = ImmutableMap.copyOf(defaultCalendarMap);
this.likelySubtagMap = ImmutableMap.copyOf(likelySubtagMap);
}
+ public ImmutableSet getAvailableLocaleIds() {
+ return availableIds;
+ }
+
/**
* Returns the "maximized" form of a given locale ID, by adding likely subtags where possible.
*/
diff --git a/tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/ant/ConvertIcuDataTask.java b/tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/ant/ConvertIcuDataTask.java
index 01861d700f2..876393c03c9 100644
--- a/tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/ant/ConvertIcuDataTask.java
+++ b/tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/ant/ConvertIcuDataTask.java
@@ -12,19 +12,26 @@ import static java.util.stream.Collectors.joining;
import java.nio.file.Path;
import java.util.Arrays;
+import java.util.Optional;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task;
+import org.unicode.cldr.api.CldrDataSupplier;
import org.unicode.cldr.api.CldrDraftStatus;
import org.unicode.icu.tool.cldrtoicu.IcuConverterConfig;
import org.unicode.icu.tool.cldrtoicu.LdmlConverter;
+import org.unicode.icu.tool.cldrtoicu.LdmlConverter.OutputType;
import org.unicode.icu.tool.cldrtoicu.LdmlConverterConfig.IcuLocaleDir;
+import org.unicode.icu.tool.cldrtoicu.SupplementalData;
import com.google.common.base.Ascii;
import com.google.common.base.CaseFormat;
import com.google.common.base.CharMatcher;
import com.google.common.base.Splitter;
+import com.google.common.collect.HashMultimap;
import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.SetMultimap;
// Note: Auto-magical Ant methods are listed as "unused" by IDEs, unless the warning is suppressed.
public final class ConvertIcuDataTask extends Task {
@@ -36,6 +43,12 @@ public final class ConvertIcuDataTask extends Task {
private static final CharMatcher LOWER_UNDERSCORE = inRange('a', 'z').or(DIGIT_OR_UNDERSCORE);
private static final CharMatcher VALID_ENUM_CHAR = LOWER_UNDERSCORE.or(UPPER_UNDERSCORE);
+ private Path cldrPath;
+ private CldrDraftStatus minimumDraftStatus;
+ // Set of default locale ID specifiers (wildcard IDs which are expanded).
+ private ImmutableSet localeIdSpec;
+ // Per directory overrides (fully specified locale IDs).
+ private final SetMultimap perDirectoryIds = HashMultimap.create();
private final IcuConverterConfig.Builder config = IcuConverterConfig.builder();
@SuppressWarnings("unused")
@@ -45,21 +58,24 @@ public final class ConvertIcuDataTask extends Task {
@SuppressWarnings("unused")
public void setCldrDir(Path path) {
- config.setCldrDir(path);
+ this.cldrPath = checkNotNull(path);
}
@SuppressWarnings("unused")
public void setMinimalDraftStatus(String status) {
- config.setMinimalDraftStatus(resolve(CldrDraftStatus.class, status));
+ minimumDraftStatus = resolve(CldrDraftStatus.class, status);
}
@SuppressWarnings("unused")
public void setOutputTypes(String types) {
- config.setOutputTypes(
+ ImmutableList typeList =
LIST_SPLITTER
.splitToList(types).stream()
- .map(s -> resolve(LdmlConverter.OutputType.class, s))
- .collect(toImmutableList()));
+ .map(s -> resolve(OutputType.class, s))
+ .collect(toImmutableList());
+ if (!typeList.isEmpty()) {
+ config.setOutputTypes(typeList);
+ }
}
@SuppressWarnings("unused")
@@ -73,59 +89,118 @@ public final class ConvertIcuDataTask extends Task {
}
public static final class LocaleIds extends Task {
- private ImmutableList dirs = ImmutableList.of();
- private ImmutableList ids = ImmutableList.of();
-
- @SuppressWarnings("unused")
- public void setDirs(String directories) {
- this.dirs = LIST_SPLITTER.splitToList(directories).stream()
- .map(s -> resolve(IcuLocaleDir.class, s))
- .collect(toImmutableList());
- }
+ private ImmutableSet ids;
@SuppressWarnings("unused")
public void addText(String localeIds) {
- // Need to filter out '//' style end-of-line comments first (replace with \n to avoid
- // inadvertantly joining two elements.
- localeIds = localeIds.replaceAll("//[^\n]*\n", "\n");
- this.ids = ImmutableList.copyOf(LIST_SPLITTER.splitToList(localeIds));
+ this.ids = parseLocaleIds(localeIds);
+ }
+
+ @Override
+ public void init() throws BuildException {
+ checkBuild(!ids.isEmpty(), "Locale IDs must be specified");
}
}
- public static final class ForcedAlias extends Task {
+ public static final class DirectoryFilter extends Task {
private IcuLocaleDir dir;
- private String source;
- private String target;
+ private ImmutableSet ids;
@SuppressWarnings("unused")
public void setDir(String directory) {
this.dir = resolve(IcuLocaleDir.class, directory);
}
+ @SuppressWarnings("unused")
+ public void addText(String localeIds) {
+ this.ids = parseLocaleIds(localeIds);
+ }
+
+ @Override
+ public void init() throws BuildException {
+ checkBuild(dir != null, "Directory must be specified");
+ checkBuild(!ids.isEmpty(), "Locale IDs must be specified");
+ }
+ }
+
+ public static final class ForcedAlias extends Task {
+ private Optional dir = Optional.empty();
+ private String source = "";
+ private String target = "";
+
+ @SuppressWarnings("unused")
+ public void setDir(String directory) {
+ this.dir = resolveOpt(IcuLocaleDir.class, directory);
+ }
+
@SuppressWarnings("unused")
public void setSource(String source) {
- this.source = checkNotNull(source);
+ this.source = whitespace().trimFrom(source);
}
@SuppressWarnings("unused")
public void setTarget(String target) {
- this.target = checkNotNull(target);
+ this.target = whitespace().trimFrom(target);
+ }
+
+ @Override
+ public void init() throws BuildException {
+ checkBuild(!source.isEmpty(), "Alias source must not be empty");
+ checkBuild(!target.isEmpty(), "Alias target must not be empty");
}
}
@SuppressWarnings("unused")
public void addConfiguredLocaleIds(LocaleIds localeIds) {
- localeIds.dirs.forEach(d -> config.addLocaleIds(d, localeIds.ids));
+ checkBuild(this.localeIdSpec == null, "Cannot add more that one element");
+ this.localeIdSpec = localeIds.ids;
+ }
+
+ @SuppressWarnings("unused")
+ public void addConfiguredDirectoryFilter(DirectoryFilter filter) {
+ perDirectoryIds.putAll(filter.dir, filter.ids);
}
@SuppressWarnings("unused")
public void addConfiguredForcedAlias(ForcedAlias alias) {
- config.addForcedAlias(alias.dir, alias.source, alias.target);
+ if (alias.dir.isPresent()) {
+ config.addForcedAlias(alias.dir.get(), alias.source, alias.target);
+ } else {
+ for (IcuLocaleDir dir : IcuLocaleDir.values()) {
+ config.addForcedAlias(dir, alias.source, alias.target);
+ }
+ }
}
@SuppressWarnings("unused")
public void execute() throws BuildException {
- LdmlConverter.convert(config.build());
+ CldrDataSupplier src =
+ CldrDataSupplier.forCldrFilesIn(cldrPath).withDraftStatusAtLeast(minimumDraftStatus);
+ SupplementalData supplementalData = SupplementalData.create(src);
+ ImmutableSet defaultTargetIds =
+ LocaleIdResolver.expandTargetIds(this.localeIdSpec, supplementalData);
+ for (IcuLocaleDir dir : IcuLocaleDir.values()) {
+ config.addLocaleIds(dir, perDirectoryIds.asMap().getOrDefault(dir, defaultTargetIds));
+ }
+ config.setMinimumDraftStatus(minimumDraftStatus);
+ LdmlConverter.convert(src, supplementalData, config.build());
+ }
+
+ private static void checkBuild(boolean condition, String message) {
+ if (!condition) {
+ throw new BuildException(message);
+ }
+ }
+
+ private static ImmutableSet parseLocaleIds(String localeIds) {
+ // Need to filter out '//' style end-of-line comments first (replace with \n to avoid
+ // inadvertantly joining two elements.
+ localeIds = localeIds.replaceAll("//[^\n]*\n", "\n");
+ return ImmutableSet.copyOf(LIST_SPLITTER.splitToList(localeIds));
+ }
+
+ private static > Optional resolveOpt(Class enumClass, String name) {
+ return !name.isEmpty() ? Optional.of(resolve(enumClass, name)) : Optional.empty();
}
private static > T resolve(Class enumClass, String name) {
diff --git a/tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/ant/LocaleIdResolver.java b/tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/ant/LocaleIdResolver.java
new file mode 100644
index 00000000000..601fa568599
--- /dev/null
+++ b/tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/ant/LocaleIdResolver.java
@@ -0,0 +1,123 @@
+// © 2019 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+
+// © 2019 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+package org.unicode.icu.tool.cldrtoicu.ant;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.collect.ImmutableSet.toImmutableSet;
+
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.function.Predicate;
+import java.util.regex.Pattern;
+
+import org.unicode.icu.tool.cldrtoicu.SupplementalData;
+
+import com.google.common.base.Ascii;
+import com.google.common.collect.ImmutableListMultimap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Multimaps;
+import com.google.common.collect.Sets;
+
+/** Helper class to reslove ID configuration. */
+final class LocaleIdResolver {
+ /** Returns the expanded set of target locale IDs based on the given ID specifications. */
+ public static ImmutableSet expandTargetIds(
+ Set idSpecs, SupplementalData supplementalData) {
+ return new LocaleIdResolver(supplementalData).resolve(idSpecs);
+ }
+
+ private final SupplementalData supplementalData;
+
+ private LocaleIdResolver(SupplementalData supplementalData) {
+ this.supplementalData = checkNotNull(supplementalData);
+ }
+
+ // ---- Code below here is to expand the incoming set of locale IDs ----
+
+ private static final Pattern WILDCARD_LOCALE = Pattern.compile("[a-z]{2}(?:_[A-Z][a-z]{3})?");
+
+ private ImmutableSet resolve(Set idSpecs) {
+ ImmutableSet allAvailableIds = supplementalData.getAvailableLocaleIds();
+ // Get the minimized wildcard set, converting things like "en_Latn" --> "en".
+ ImmutableSet wildcardIds = idSpecs.stream()
+ .filter(supplementalData.getAvailableLocaleIds()::contains)
+ .filter(id -> WILDCARD_LOCALE.matcher(id).matches())
+ .map(this::removeDefaultScript)
+ .collect(toImmutableSet());
+
+ // Get the set of IDs which are implied by the wildcard IDs.
+ Set targetIds = new TreeSet<>();
+ allAvailableIds.forEach(id -> addWildcardMatches(id, wildcardIds::contains, targetIds));
+
+ // Get the IDs which don't need to be in the config (because they are implied).
+ Set redundant = Sets.intersection(idSpecs, targetIds);
+ if (!redundant.isEmpty()) {
+ System.err.println("Configuration lists redundant locale IDs");
+ System.err.println("The following IDs should be removed from the configuration:");
+ Iterables.partition(redundant, 16)
+ .forEach(ids -> System.err.println(String.join(", ", ids)));
+
+ // Note that the minimal configuration includes aliases.
+ Set minimalConfigIds = new TreeSet<>(Sets.difference(idSpecs, targetIds));
+ minimalConfigIds.remove("root");
+ ImmutableListMultimap idsByFirstChar =
+ Multimaps.index(minimalConfigIds, s -> s.charAt(0));
+
+ System.err.println("Canonical ID list is:");
+ for (char c: idsByFirstChar.keySet()) {
+ System.err.println(" // " + Ascii.toUpperCase(c));
+ Iterables.partition(idsByFirstChar.get(c), 16)
+ .forEach(ids -> System.err.println(" " + String.join(", ", ids)));
+ System.err.println();
+ }
+ System.err.flush();
+ throw new IllegalStateException("Non-canonical configuration");
+ }
+
+ // We return the set of IDs made up of:
+ // 1: The original IDs specified by the configuration (and any parent IDs).
+ // 2: IDs expanded from wildcard IDs (e.g. "en_Latn_GB" & "en_Latn" from "en").
+ // (this is what's already in targetIds).
+ // 3: The "root" ID.
+ idSpecs.forEach(id -> addRecursively(id, targetIds));
+ return ImmutableSet.builder().add("root").addAll(targetIds).build();
+ }
+
+ // E.g. "xx_Fooo" --> "xx" --> "xx_Baar_YY" ==> "xx_Fooo"
+ // E.g. "xx_Fooo" --> "xx" --> "xx_Fooo_YY" ==> "xx"
+ private String removeDefaultScript(String id) {
+ if (id.contains("_")) {
+ String lang = id.substring(0, 2);
+ String maxId = supplementalData.maximize(lang)
+ .orElseThrow(
+ () -> new IllegalStateException("cannot maximize language subtag: " + lang));
+ if (maxId.startsWith(id)) {
+ return lang;
+ }
+ }
+ return id;
+ }
+
+ private void addRecursively(String id, Set dst) {
+ while (!id.equals("root") && dst.add(id)) {
+ id = supplementalData.getParent(id);
+ }
+ }
+
+ private boolean addWildcardMatches(
+ String id, Predicate isWildcard, Set dst) {
+ if (id.equals("root")) {
+ return false;
+ }
+ String parentId = supplementalData.getParent(id);
+ if (isWildcard.test(parentId) || addWildcardMatches(parentId, isWildcard, dst)) {
+ dst.add(id);
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/mapper/TransformsMapper.java b/tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/mapper/TransformsMapper.java
index 14c4d340bce..e0844e653dd 100644
--- a/tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/mapper/TransformsMapper.java
+++ b/tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/mapper/TransformsMapper.java
@@ -15,6 +15,7 @@ import java.io.PrintWriter;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
+import java.util.List;
import java.util.Optional;
import java.util.function.Function;
@@ -30,6 +31,7 @@ import org.unicode.icu.tool.cldrtoicu.RbPath;
import org.unicode.icu.tool.cldrtoicu.RbValue;
import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.ImmutableList;
import com.ibm.icu.text.Transliterator;
/**
@@ -78,7 +80,9 @@ public final class TransformsMapper {
* @param ruleFileOutputDir the directory into which transliteration rule files will be written.
* @return the IcuData instance to be written to a file.
*/
- public static IcuData process(CldrDataSupplier src, Path ruleFileOutputDir) {
+ public static IcuData process(
+ CldrDataSupplier src, Path ruleFileOutputDir, List header) {
+
Function fileWriterFn = p -> {
Path file = ruleFileOutputDir.resolve(p);
try {
@@ -88,12 +92,14 @@ public final class TransformsMapper {
}
};
CldrData cldrData = src.getDataForType(SUPPLEMENTAL);
- return process(cldrData, fileWriterFn);
+ return process(cldrData, fileWriterFn, header);
}
@VisibleForTesting // It's easier to supply a fake data instance than a fake supplier.
- static IcuData process(CldrData cldrData, Function fileWriterFn) {
- RuleVisitor visitor = new RuleVisitor(fileWriterFn);
+ static IcuData process(
+ CldrData cldrData, Function fileWriterFn, List header) {
+
+ RuleVisitor visitor = new RuleVisitor(fileWriterFn, header);
cldrData.accept(DTD, visitor);
addSpecialCaseValues(visitor.icuData);
return visitor.icuData;
@@ -102,9 +108,11 @@ public final class TransformsMapper {
private static class RuleVisitor implements ValueVisitor {
private final IcuData icuData = new IcuData("root", false);
private final Function outFn;
+ private final ImmutableList header;
- RuleVisitor(Function outFn) {
+ RuleVisitor(Function outFn, List header) {
this.outFn = checkNotNull(outFn);
+ this.header = ImmutableList.copyOf(header);
icuData.setFileComment("File: root.txt");
}
@@ -124,8 +132,8 @@ public final class TransformsMapper {
private void writeDataFile(String filename, CldrValue value) {
try (PrintWriter out = outFn.apply(Paths.get(filename))) {
- out.println("\uFEFF# © 2016 and later: Unicode, Inc. and others.");
- out.println("# License & terms of use: http://www.unicode.org/copyright.html#License");
+ out.print("\uFEFF");
+ header.forEach(s -> out.println("# " + s));
out.println("#");
out.println("# File: " + filename);
out.println("# Generated from CLDR");
diff --git a/tools/cldr/cldr-to-icu/src/main/resources/ldml2icu_header.txt b/tools/cldr/cldr-to-icu/src/main/resources/ldml2icu_header.txt
index a9bd38f4299..70f6b838a4f 100644
--- a/tools/cldr/cldr-to-icu/src/main/resources/ldml2icu_header.txt
+++ b/tools/cldr/cldr-to-icu/src/main/resources/ldml2icu_header.txt
@@ -1,2 +1,2 @@
-// © 2016 and later: Unicode, Inc. and others.
-// License & terms of use: http://www.unicode.org/copyright.html#License
\ No newline at end of file
+© 2016 and later: Unicode, Inc. and others.
+License & terms of use: http://www.unicode.org/copyright.html#License
diff --git a/tools/cldr/cldr-to-icu/src/test/java/org/unicode/icu/tool/cldrtoicu/SupplementalDataTest.java b/tools/cldr/cldr-to-icu/src/test/java/org/unicode/icu/tool/cldrtoicu/SupplementalDataTest.java
index 17368f411d4..5ea8b4c4214 100644
--- a/tools/cldr/cldr-to-icu/src/test/java/org/unicode/icu/tool/cldrtoicu/SupplementalDataTest.java
+++ b/tools/cldr/cldr-to-icu/src/test/java/org/unicode/icu/tool/cldrtoicu/SupplementalDataTest.java
@@ -5,8 +5,6 @@ package org.unicode.icu.tool.cldrtoicu;
import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth.assertWithMessage;
import static com.google.common.truth.Truth8.assertThat;
-import static java.util.Arrays.asList;
-import static org.unicode.cldr.api.CldrDataType.SUPPLEMENTAL;
import static org.unicode.cldr.api.CldrValue.parseValue;
import java.nio.file.Path;
@@ -25,6 +23,7 @@ import org.unicode.cldr.tool.LikelySubtags;
import org.unicode.cldr.util.LanguageTagCanonicalizer;
import org.unicode.cldr.util.LocaleIDParser;
import org.unicode.cldr.util.SupplementalDataInfo;
+import org.unicode.icu.tool.cldrtoicu.testing.FakeDataSupplier;
import com.google.common.base.Joiner;
import com.google.common.collect.ImmutableSet;
@@ -41,8 +40,7 @@ public class SupplementalDataTest {
@BeforeClass
public static void loadRegressionData() {
Path cldrRoot = Paths.get(System.getProperty("CLDR_DIR"));
- regressionData = SupplementalData
- .create(CldrDataSupplier.forCldrFilesIn(cldrRoot).getDataForType(SUPPLEMENTAL));
+ regressionData = SupplementalData.create(CldrDataSupplier.forCldrFilesIn(cldrRoot));
SupplementalDataInfo sdi =
SupplementalDataInfo.getInstance(cldrRoot.resolve("common/supplemental").toString());
likelySubtags = new LikelySubtags(sdi);
@@ -348,6 +346,6 @@ public class SupplementalDataTest {
}
private static SupplementalData fakeSupplementalData(CldrValue... values) {
- return SupplementalData.create(CldrDataSupplier.forValues(asList(values)));
+ return SupplementalData.create(new FakeDataSupplier().addSupplementalData(values));
}
}
diff --git a/tools/cldr/cldr-to-icu/src/test/java/org/unicode/icu/tool/cldrtoicu/mapper/TransformsMapperTest.java b/tools/cldr/cldr-to-icu/src/test/java/org/unicode/icu/tool/cldrtoicu/mapper/TransformsMapperTest.java
index 7ba5ef918de..08c3049429a 100644
--- a/tools/cldr/cldr-to-icu/src/test/java/org/unicode/icu/tool/cldrtoicu/mapper/TransformsMapperTest.java
+++ b/tools/cldr/cldr-to-icu/src/test/java/org/unicode/icu/tool/cldrtoicu/mapper/TransformsMapperTest.java
@@ -21,7 +21,6 @@ import java.util.Arrays;
import java.util.Map;
import java.util.TreeMap;
import java.util.function.Function;
-import java.util.stream.Stream;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -38,10 +37,14 @@ import com.google.common.collect.ImmutableList;
@RunWith(JUnit4.class)
public class TransformsMapperTest {
- private static final ImmutableList FILE_HEADER = ImmutableList.of(
- "\uFEFF# © 2016 and later: Unicode, Inc. and others.",
- "# License & terms of use: http://www.unicode.org/copyright.html#License",
- "#");
+ private static final ImmutableList HEADER_LINES = ImmutableList.of(
+ "First header line",
+ "Second header line");
+
+ private static final String FILE_HEADER =
+ "\uFEFF# First header line\n"
+ + "# Second header line\n"
+ + "#\n";
private static final int DEFAULT_PATH_COUNT = 7;
@@ -64,7 +67,7 @@ public class TransformsMapperTest {
@Test
public void testDefaultContent() {
Map fileMap = new TreeMap<>();
- IcuData icuData = TransformsMapper.process(cldrData(), wrap(fileMap));
+ IcuData icuData = TransformsMapper.process(cldrData(), wrap(fileMap), HEADER_LINES);
assertThat(fileMap).isEmpty();
@@ -88,7 +91,7 @@ public class TransformsMapperTest {
cldrData(oneWay("foo", "bar", FORWARD, null, INTERNAL, "first second third", ++idx));
Map fileMap = new TreeMap<>();
- IcuData icuData = TransformsMapper.process(cldrData, wrap(fileMap));
+ IcuData icuData = TransformsMapper.process(cldrData, wrap(fileMap), HEADER_LINES);
assertThat(icuData).getPaths().hasSize(DEFAULT_PATH_COUNT + 5);
assertThat(icuData).hasValuesFor("RuleBasedTransliteratorIDs/first/alias", "foo-bar");
@@ -118,7 +121,7 @@ public class TransformsMapperTest {
cldrData(oneWay("foo", "bar", BACKWARD, "variant", EXTERNAL, "one two three", ++idx));
Map fileMap = new TreeMap<>();
- IcuData icuData = TransformsMapper.process(cldrData, wrap(fileMap));
+ IcuData icuData = TransformsMapper.process(cldrData, wrap(fileMap), HEADER_LINES);
assertThat(icuData).getPaths().hasSize(DEFAULT_PATH_COUNT + 5);
assertThat(icuData).hasValuesFor("RuleBasedTransliteratorIDs/one/alias", "bar-foo/variant");
@@ -149,7 +152,7 @@ public class TransformsMapperTest {
both("foo", "bar", null, INTERNAL, "forward-alias", "backward-alias", ++idx));
Map fileMap = new TreeMap<>();
- IcuData icuData = TransformsMapper.process(cldrData, wrap(fileMap));
+ IcuData icuData = TransformsMapper.process(cldrData, wrap(fileMap), HEADER_LINES);
// 3 for each direction.
assertThat(icuData).getPaths().hasSize(DEFAULT_PATH_COUNT + 6);
@@ -188,9 +191,7 @@ public class TransformsMapperTest {
private String headerPlusLines(String... lines) {
// For now the files always contain a blank line at the end (to match legacy behaviour) but
// this can, and probably should be changed.
- return Stream
- .concat(FILE_HEADER.stream(), Arrays.stream(lines))
- .collect(joining("\n", "", "\n\n"));
+ return Arrays.stream(lines).collect(joining("\n", FILE_HEADER, "\n\n"));
}
private static CldrData cldrData(CldrValue... values) {