This adds the generation of a new properties file from the supplementary CLDR data, metazones.properties. This allows the metazones in the zone strings to be translated into zones of the form Continent/City e.g. Europe/London.
ChangeLog: 2008-07-07 Andrew John Hughes <[EMAIL PROTECTED]> * src/gnu/supplementgen/Main.java: Add support for generating metazones.properties. (CurrencyInfo.equals(Object)): Implemented. (CurrencyInfo.hashCode()): Likewise. (ZoneInfo): New class to act as a key for zone info. (SupplementalHandler.SupplementalHandler(PrintWriter,PrintWriter,PrintWriter)): Add new print writer for metazones.properties. (SupplementalHandler.endElement(String,String,String)): Output zone data. (SupplementalHandler.startDocument()): Add header for metazones.properties. (SupplementalHandler.startElement(String,String,String,Attributes)): Collect zone data. -- Andrew :) Support Free Java! Contribute to GNU Classpath and the OpenJDK http://www.gnu.org/software/classpath http://openjdk.java.net PGP Key: 94EFD9D8 (http://subkeys.pgp.net) Fingerprint = F8EF F1EA 401E 2E60 15FA 7927 142C 2591 94EF D9D8
Index: src/gnu/supplementgen/Main.java =================================================================== RCS file: /sources/classpath/cp-tools/src/gnu/supplementgen/Main.java,v retrieving revision 1.1 diff -u -u -r1.1 Main.java --- src/gnu/supplementgen/Main.java 7 Jul 2008 00:46:25 -0000 1.1 +++ src/gnu/supplementgen/Main.java 7 Jul 2008 01:46:54 -0000 @@ -32,6 +32,7 @@ import java.util.HashMap; import java.util.Map; import java.util.Iterator; +import java.util.TreeMap; public class Main { @@ -54,13 +55,17 @@ PrintWriter output = new PrintWriter(bWriter, true); BufferedWriter weekFile = new BufferedWriter(new FileWriter("weeks.properties")); PrintWriter wOutput = new PrintWriter(weekFile, true); - handler = new SupplementalHandler(output, wOutput); + BufferedWriter zoneFile = new BufferedWriter(new FileWriter("metazones.properties")); + PrintWriter zOutput = new PrintWriter(zoneFile, true); + handler = new SupplementalHandler(output, wOutput, zOutput); reader.setContentHandler(handler); reader.parse(source); bWriter.flush(); weekFile.flush(); + zoneFile.flush(); bWriter.close(); weekFile.close(); + zoneFile.close(); } static void printUsage() @@ -89,6 +94,73 @@ this.digits = digits; this.rounding = rounding; } + + public boolean equals(Object o) + { + if (o == this) + return true; + if (o == null) + return false; + if (o instanceof CurrencyInfo) + { + CurrencyInfo oInfo = (CurrencyInfo) o; + return oInfo.digits == digits && + oInfo.rounding == rounding; + } + return false; + } + + public int hashCode() + { + return digits * 11 + rounding * 13; + } + + } + + static class ZoneInfo + implements Comparable + { + String other; + String territory; + + ZoneInfo(String other, String territory) + { + this.other = other; + this.territory = territory; + } + + public boolean equals(Object o) + { + if (o == this) + return true; + if (o == null) + return false; + if (o instanceof ZoneInfo) + { + ZoneInfo oInfo = (ZoneInfo) o; + return (oInfo.other == null ? + other == null : oInfo.other.equals(other)) && + (oInfo.territory == null ? + territory == null : oInfo.territory.equals(territory)); + } + return false; + } + + public int hashCode() + { + return other.hashCode() * 11 + + territory.hashCode() * 13; + } + + public int compareTo(Object o) + { + ZoneInfo info = (ZoneInfo) o; + int compared = other.compareTo(info.other); + if (compared == 0) + return territory.compareTo(info.territory); + return compared; + } + } static final int STATE_ALTERNATE = 6; static final int STATE_CURRENCY = 4; @@ -96,9 +168,11 @@ static final int STATE_FRACTIONS = 8; static final int STATE_IGNORING = 2; static final int STATE_INFO = 9; + static final int STATE_MAPTIMEZONES = 12; static final int STATE_REGION = 3; static final int STATE_SEENCURRENCY = 7; static final int STATE_SUPPLEMENTAL = 1; + static final int STATE_TIMEZONEDATA = 11; static final int STATE_WEEKDATA = 10; static final int STATE_ZERO = 0; Map currencyInfo = new HashMap(); @@ -108,7 +182,9 @@ int oldState; PrintWriter output; PrintWriter wOutput; + PrintWriter zOutput; Map weekInfo = new HashMap(); + Map zoneInfo = new TreeMap(); int state; @@ -118,11 +194,14 @@ * * @param output the output file for the currency data. * @param wOutput the output file for the week data. + * @param zOutput the output file for the zone data. */ - public SupplementalHandler(PrintWriter output, PrintWriter wOutput) + public SupplementalHandler(PrintWriter output, PrintWriter wOutput, + PrintWriter zOutput) { this.output = output; this.wOutput = wOutput; + this.zOutput = zOutput; } void checkMultiState(int[] currentStates, int newState) throws SAXException @@ -192,6 +271,20 @@ wOutput.println(entry.getKey() + "=" + entry.getValue()); } } + else if (localName.equals("timezoneData")) + checkState(STATE_TIMEZONEDATA, STATE_SUPPLEMENTAL); + else if (localName.equals("mapTimezones") && state == STATE_MAPTIMEZONES) + { + checkState(STATE_MAPTIMEZONES, STATE_TIMEZONEDATA); + Iterator iter = zoneInfo.entrySet().iterator(); + while (iter.hasNext()) + { + Map.Entry entry = (Map.Entry) iter.next(); + ZoneInfo zInfo = (ZoneInfo) entry.getKey(); + zOutput.println(zInfo.other + "." + zInfo.territory + + "=" + entry.getValue()); + } + } } public void startDocument() @@ -202,7 +295,10 @@ wOutput .println("# This document is automatically generated by gnu.supplementgen"); wOutput.println(); - state = STATE_ZERO; + zOutput + .println("# This document is automatically generated by gnu.supplementgen"); + zOutput.println(); + state = STATE_ZERO; ignoreLevel = 0; } @@ -247,6 +343,22 @@ } } } + else if (localName.equals("timezoneData")) + checkState(STATE_SUPPLEMENTAL, STATE_TIMEZONEDATA); + else if (localName.equals("mapTimezones")) + { + String type = atts.getValue("type"); + if (type != null && type.equals("metazones")) + checkState(STATE_TIMEZONEDATA, STATE_MAPTIMEZONES); + } + else if (localName.equals("mapZone") && state == STATE_MAPTIMEZONES) + { + String territory = atts.getValue("territory"); + if (territory.equals("001")) + territory = "DEFAULT"; + zoneInfo.put(new ZoneInfo(atts.getValue("other"), territory), + atts.getValue("type")); + } else { ignoreLevel++;