blob: fea20170493598454416f765df9280a89eae75a4 [file] [log] [blame]
package org.unicode.cldr.tool;
import java.io.File;
import java.util.EnumSet;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import org.unicode.cldr.util.CLDRPaths;
import org.unicode.cldr.util.SupplementalDataInfo;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import com.ibm.icu.impl.locale.XCldrStub.ImmutableMap;
import com.ibm.icu.util.VersionInfo;
/**
* Enums that should exactly match what is in cldr-archive; eg, v2_0_1 means that there is a folder "cldr-2.0.1"
* @author markdavis
*
*/
// TODO compute the VersionInfo for each at creation time, and stash as field.
public enum CldrVersion {
unknown,
v1_1,
v1_1_1,
v1_2,
v1_3,
v1_4,
v1_4_1,
v1_5_0_1,
v1_5_1,
v1_6_1,
v1_7_2,
v1_8_1,
v1_9_1,
v2_0_1,
v21_0,
v22_1,
v23_1,
v24_0,
v25_0,
v26_0,
v27_0,
v28_0,
v29_0,
v30_0,
v31_0,
v32_0,
v33_0,
v33_1,
v34_0,
v35_0,
v35_1,
v36_0,
v36_1,
v37_0,
v38_0,
v38_1,
v39_0,
v40_0,
v41_0,
baseline;
private final String baseDirectory;
private final String dotName;
private final VersionInfo versionInfo;
/**
* Get the closest available version (successively dropping lower-significance values)
* We do this because the archive might contain a dot-dot version
* but have a folder called by the round(er) version number.
*/
public static CldrVersion from(VersionInfo versionInfo) {
if (versionInfo == null) {
return unknown;
}
while (true) {
CldrVersion result = versionInfoToCldrVersion.get(versionInfo);
if (result != null) {
return result;
}
versionInfo = versionInfo.getMilli() != 0 ? VersionInfo.getInstance(versionInfo.getMajor(), versionInfo.getMinor())
: versionInfo.getMinor() != 0 ? VersionInfo.getInstance(versionInfo.getMajor())
: unknown.versionInfo; // will always terminate with unknown.
}
}
public static CldrVersion from(String versionString) {
return valueOf(versionString.charAt(0) < 'A' ? "v" + versionString.replace('.', '_') : versionString);
}
public VersionInfo getVersionInfo() {
return versionInfo;
}
@Override
public String toString() {
return dotName;
}
public String getBaseDirectory() {
return baseDirectory;
}
public boolean isOlderThan(CldrVersion other) {
return compareTo(other) < 0;
}
private CldrVersion() {
String oldName = name();
if (oldName.charAt(0) == 'v') {
dotName = oldName.substring(1).replace('_', '.');
versionInfo = VersionInfo.getInstance(dotName);
baseDirectory = CLDRPaths.ARCHIVE_DIRECTORY + "cldr-" + toString() + "/";
} else {
dotName = oldName;
baseDirectory = CLDRPaths.BASE_DIRECTORY;
SupplementalDataInfo sdi = SupplementalDataInfo.getInstance();
versionInfo = "baseline".equals(oldName) ? sdi.getCldrVersion() : VersionInfo.getInstance(0);
}
}
public static final CldrVersion LAST_RELEASE_VERSION = values()[values().length-2];
public static final List<CldrVersion> CLDR_VERSIONS_ASCENDING;
public static final List<CldrVersion> CLDR_VERSIONS_DESCENDING;
private static final Map<VersionInfo, CldrVersion> versionInfoToCldrVersion;
static {
EnumSet<CldrVersion> temp = EnumSet.allOf(CldrVersion.class);
CLDR_VERSIONS_ASCENDING = ImmutableList.copyOf(temp);
CLDR_VERSIONS_DESCENDING = ImmutableList.copyOf(Lists.reverse(CLDR_VERSIONS_ASCENDING));
Map<VersionInfo, CldrVersion> temp2 = new LinkedHashMap<>();
for (CldrVersion item : CLDR_VERSIONS_ASCENDING) {
VersionInfo version2 = item.versionInfo;
temp2.put(version2, item);
if (version2.getMilli() != 0) {
version2 = VersionInfo.getInstance(version2.getMajor(), version2.getMinor());
if (!temp2.containsKey(version2)) {
temp2.put(version2, item);
}
}
if (version2.getMinor() != 0) {
version2 = VersionInfo.getInstance(version2.getMajor());
if (!temp2.containsKey(version2)) {
temp2.put(version2, item);
}
}
}
versionInfoToCldrVersion = ImmutableMap.copyOf(temp2);
}
public List<File> getPathsForFactory() {
return ImmutableList.copyOf(versionInfo != null && versionInfo.getMajor() < 27
? new File[] { new File(getBaseDirectory() + "common/main/") }
: new File[] {
new File(getBaseDirectory() + "common/main/"),
new File(getBaseDirectory() + "common/annotations/") });
}
/**
* For testing
*/
public static void checkVersions() {
// System.out.println(Arrays.asList(CldrVersion.values()));
Set<VersionInfo> allFileVersions = new TreeSet<>();
Set<VersionInfo> allTc = new TreeSet<>();
Set<VersionInfo> missingEnums = new TreeSet<>();
Set<CldrVersion> extraEnums = EnumSet.copyOf(CLDR_VERSIONS_ASCENDING);
extraEnums.remove(CldrVersion.baseline);
extraEnums.remove(CldrVersion.unknown);
for (String subdir : new File(CLDRPaths.ARCHIVE_DIRECTORY).list()) {
if (subdir.startsWith("cldr-")) {
String versionString = subdir.substring("cldr-".length());
VersionInfo versionInfo = VersionInfo.getInstance(versionString);
allFileVersions.add(versionInfo);
try {
CldrVersion found = CldrVersion.from(versionString);
extraEnums.remove(found);
} catch (Exception e) {
missingEnums.add(versionInfo);
}
}
}
Set<String> errorMessages = new LinkedHashSet<>();
// get versions from ToolConstants
for (String tc : ToolConstants.CLDR_VERSIONS) {
VersionInfo versionInfo = VersionInfo.getInstance(tc);
allTc.add(versionInfo);
}
// same?
if (!allTc.equals(allFileVersions)) {
LinkedHashSet<VersionInfo> tcMFile = new LinkedHashSet<>(allTc);
tcMFile.removeAll(allFileVersions);
if (!tcMFile.isEmpty()) {
errorMessages.add("Extra ToolConstants.CLDR_VERSIONS compared to " + CLDRPaths.ARCHIVE_DIRECTORY + ": " + tcMFile);
}
LinkedHashSet<VersionInfo> fileMTc = new LinkedHashSet<>(allFileVersions);
fileMTc.removeAll(allTc);
if (!fileMTc.isEmpty()) {
errorMessages.add("Extra folders in " + CLDRPaths.ARCHIVE_DIRECTORY + " compared to ToolConstants.CLDR_VERSIONS: " + fileMTc);
}
}
// Are there extra enums complete?
if (!extraEnums.isEmpty()) {
errorMessages.add("Extra enums compared to " + CLDRPaths.ARCHIVE_DIRECTORY + ": " + extraEnums);
}
// Is the archive complete?
if (!missingEnums.isEmpty()) {
StringBuilder temp = new StringBuilder();
allFileVersions.forEach(v -> temp.append(", v" + v.getVersionString(2, 4).replace('.', '_')));
errorMessages.add("Missing enums " + missingEnums + ", should be:\ntrunk" + temp + ", unknown");
}
if (!errorMessages.isEmpty()) {
throw new IllegalArgumentException(errorMessages.toString());
}
}
}