blob: 7e8ff509c05ae8f809816a0c1db1cba672447d9a [file] [log] [blame]
package org.unicode.cldr.test;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.unicode.cldr.test.CheckCLDR.CheckStatus.Subtype;
import org.unicode.cldr.util.CLDRFile;
import org.unicode.cldr.util.CLDRLocale;
import org.unicode.cldr.util.CldrUtility;
import org.unicode.cldr.util.Factory;
public class CheckChildren<resolvedCldrFileToCheck> extends FactoryCheckCLDR {
CLDRFile[] immediateChildren;
Map<String, String> tempSet = new HashMap<>();
public CheckChildren(Factory factory) {
super(factory);
}
@Override
public CheckCLDR handleCheck(
String path, String fullPath, String value, Options options, List<CheckStatus> result) {
if (fullPath == null) return this; // skip paths that we don't have
if (value == null) return this; // skip null values
if (!accept(result)) return this;
if (immediateChildren == null) return this; // skip - test isn't even relevant
String winningValue = this.getCldrFileToCheck().getWinningValue(fullPath);
if (!value.equals(winningValue)) {
return this; // only run this test against winning values.
}
// String current = getResolvedCldrFileToCheck().getStringValue(path);
tempSet.clear();
for (int i = 0; i < immediateChildren.length; ++i) {
String otherValue;
try {
otherValue = immediateChildren[i].getWinningValue(path);
} catch (RuntimeException e) {
throw e;
}
if (!otherValue.equals(CldrUtility.NO_INHERITANCE_MARKER)) {
tempSet.put(immediateChildren[i].getLocaleID(), otherValue);
} else {
tempSet.put(immediateChildren[i].getLocaleID(), value);
}
}
if (tempSet.values().contains(value)) return this;
CheckStatus item =
new CheckStatus()
.setCause(this)
.setMainType(CheckStatus.errorType)
.setSubtype(Subtype.valueAlwaysOverridden)
.setCheckOnSubmit(false)
.setMessage(
"Value always overridden in children: {0}",
new Object[] {tempSet.keySet().toString()});
result.add(item);
tempSet.clear(); // free for gc
return this;
}
@Override
public void reset() {
super.reset();
immediateChildren = null; // reset this beforehand
tempSet.clear();
}
@Override
public CheckCLDR handleSetCldrFileToCheck(
CLDRFile cldrFileToCheck, Options options, List<CheckStatus> possibleErrors) {
if (cldrFileToCheck == null) return this;
if (cldrFileToCheck.getLocaleID().equals("root"))
return this; // Root's children can override.
// Skip if the phase is not final testing
if (Phase.FINAL_TESTING == getPhase() || Phase.BUILD == getPhase()) {
setSkipTest(false); // ok
} else {
setSkipTest(true);
return this;
}
List<CLDRFile> iChildren = new ArrayList<>();
super.handleSetCldrFileToCheck(cldrFileToCheck, options, possibleErrors);
CLDRLocale myLocale = CLDRLocale.getInstance(cldrFileToCheck.getLocaleID());
if (myLocale.getCountry() != null && myLocale.getCountry().length() == 2) {
immediateChildren = null;
return this; // We don't care if a country locale's children override, since the country
// locale needs to stand on its own.
}
Set<CLDRLocale> subLocales = getFactory().subLocalesOf(myLocale);
if (subLocales == null) return this;
for (CLDRLocale locale : subLocales) {
CLDRFile child = getFactory().make(locale.getBaseName(), true);
if (child == null) {
CheckStatus item =
new CheckStatus()
.setCause(this)
.setMainType(CheckStatus.errorType)
.setSubtype(Subtype.nullChildFile)
.setMessage("Null file from: {0}", new Object[] {locale});
possibleErrors.add(item);
} else {
iChildren.add(child);
}
}
if (iChildren.size() == 0) immediateChildren = null;
else {
immediateChildren = new CLDRFile[iChildren.size()];
immediateChildren = iChildren.toArray(immediateChildren);
}
return this;
}
}