blob: 55616c5cda25f104890e3feb08b199661cbac0e4 [file] [log] [blame]
/*
******************************************************************************
* Copyright (C) 2005, 2007 International Business Machines Corporation and *
* others. All Rights Reserved. *
******************************************************************************
*/
package org.unicode.cldr.test;
import java.util.List;
import org.unicode.cldr.test.CheckCLDR.CheckStatus.Subtype;
import org.unicode.cldr.util.CLDRFile;
import org.unicode.cldr.util.Factory;
import org.unicode.cldr.util.InternalCldrException;
import org.unicode.cldr.util.TimezoneFormatter;
import org.unicode.cldr.util.XPathParts;
import com.ibm.icu.util.TimeZone;
public class CheckZones extends FactoryCheckCLDR {
// private final UnicodeSet commonAndInherited = new UnicodeSet(CheckExemplars.Allowed).complement();
// "[[:script=common:][:script=inherited:][:alphabetic=false:]]");
private TimezoneFormatter timezoneFormatter;
public CheckZones(Factory factory) {
super(factory);
}
@Override
public CheckCLDR setCldrFileToCheck(CLDRFile cldrFile, Options options, List<CheckStatus> possibleErrors) {
if (cldrFile == null) return this;
// if (Phase.FINAL_TESTING == getPhase()) {
// setSkipTest(false); // ok
// } else {
// setSkipTest(true);
// return this;
// }
super.setCldrFileToCheck(cldrFile, options, possibleErrors);
try {
timezoneFormatter = new TimezoneFormatter(getResolvedCldrFileToCheck());
} catch (RuntimeException e) {
possibleErrors.add(new CheckStatus().setCause(this).setMainType(CheckStatus.errorType)
.setSubtype(Subtype.cannotCreateZoneFormatter)
.setMessage("Checking zones: " + e.getMessage()));
}
return this;
}
XPathParts parts = new XPathParts(null, null);
String previousZone = new String();
String previousFrom = new String("1970-01-01");
String previousTo = new String("present");
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 (path.indexOf("timeZoneNames") < 0 || path.indexOf("usesMetazone") < 0)
return this;
if (timezoneFormatter == null) {
if (true) return this;
throw new InternalCldrException(
"This should not occur: setCldrFileToCheck must create a TimezoneFormatter.");
}
parts.set(path);
String zone = parts.getAttributeValue(3, "type");
String from;
if (parts.containsAttribute("from"))
from = parts.getAttributeValue(4, "from");
else
from = "1970-01-01";
String to;
if (parts.containsAttribute("to"))
to = parts.getAttributeValue(4, "to");
else
to = "present";
if (zone.equals(previousZone)) {
if (from.compareTo(previousTo) < 0) {
result.add(new CheckStatus().setCause(this).setMainType(CheckStatus.errorType)
.setSubtype(Subtype.multipleMetazoneMappings)
.setMessage("Multiple metazone mappings between {1} and {0}",
new Object[] { previousTo, from }));
}
if (from.compareTo(previousTo) > 0) {
result.add(new CheckStatus().setCause(this).setMainType(CheckStatus.warningType)
.setSubtype(Subtype.noMetazoneMapping)
.setMessage("No metazone mapping between {0} and {1}",
new Object[] { previousTo, from }));
}
}
else {
if (previousFrom.compareTo("1970-01-01") != 0) {
result.add(new CheckStatus().setCause(this).setMainType(CheckStatus.warningType)
.setSubtype(Subtype.noMetazoneMappingAfter1970)
.setMessage("Zone {0} has no metazone mapping between 1970-01-01 and {1}",
new Object[] { previousZone, previousFrom }));
}
if (previousTo.compareTo("present") != 0) {
result.add(new CheckStatus().setCause(this).setMainType(CheckStatus.warningType)
.setSubtype(Subtype.noMetazoneMappingBeforeNow)
.setMessage("Zone {0} has no metazone mapping between {1} and present.",
new Object[] { previousZone, previousTo }));
}
previousFrom = from;
}
previousTo = to;
previousZone = zone;
return this;
}
public static String exampleTextForXpath(XPathParts parts, TimezoneFormatter timezoneFormatter,
String path) {
parts.set(path);
if (parts.containsElement("zone")) {
String id = (String) parts.getAttributeValue(3, "type");
TimeZone tz = TimeZone.getTimeZone(id);
String pat = "vvvv";
if (parts.containsElement("exemplarCity")) {
int delim = id.indexOf('/');
if (delim >= 0) {
String formatted = id.substring(delim + 1).replaceAll("_", " ");
return formatted;
}
} else if (!parts.containsElement("usesMetazone")) {
if (parts.containsElement("generic")) {
pat = "vvvv";
if (parts.containsElement("short")) pat = "v";
} else {
pat = "zzzz";
if (parts.containsElement("short")) pat = "z";
}
boolean daylight = parts.containsElement("daylight");
int offset = tz.getRawOffset();
if (daylight)
offset += tz.getDSTSavings();
String formatted = timezoneFormatter.getFormattedZone(id, pat,
daylight, offset, true);
return formatted;
}
}
return null; // unknown
}
@Override
public CheckCLDR handleGetExamples(String path, String fullPath, String value,
Options options, List result) {
if (path.indexOf("timeZoneNames") < 0) {
return this;
}
if (timezoneFormatter == null) {
throw new InternalCldrException(
"This should not occur: setCldrFileToCheck must create a TimezoneFormatter.");
}
String formatted = exampleTextForXpath(parts, timezoneFormatter, path);
if (formatted != null) {
result.add(new CheckStatus().setCause(this).setMainType(CheckStatus.exampleType)
.setMessage("Formatted value (if removed): \"{0}\"",
new Object[] { formatted }));
}
return this;
}
}