/* ****************************************************************************** * Copyright (C) 2007-2009, International Business Machines Corporation and * * others. All Rights Reserved. * ****************************************************************************** */ package com.ibm.icu.impl.duration.impl; import java.util.ArrayList; import java.util.List; /** * DataRecord contains the data used by PeriodFormatterData. Fields are * package-private for ease of access. This is a struct, it knows how to read * and write itself to/from simple XML, that's all. */ public class DataRecord { byte pl; String[][] pluralNames; byte[] genders; // EGender String[] singularNames; String[] halfNames; String[] numberNames; String[] mediumNames; String[] shortNames; String[] measures; String[] rqdSuffixes; String[] optSuffixes; String[] halves; byte[] halfPlacements; // EHalfPlacement byte[] halfSupport; // EHalfSupport String fifteenMinutes; String fiveMinutes; boolean requiresDigitSeparator; String digitPrefix; String countSep; String shortUnitSep; String[] unitSep; boolean[] unitSepRequiresDP; boolean[] requiresSkipMarker; byte numberSystem; // ENumberSystem char zero; char decimalSep; boolean omitSingularCount; boolean omitDualCount; byte zeroHandling; // EZeroHandling byte decimalHandling; // EDecimalHandling byte fractionHandling; // EFractionHandling String skippedUnitMarker; boolean allowZero; boolean weeksAloneOnly; byte useMilliseconds; // EMilliSupport ScopeData[] scopeData; public static DataRecord read(String ln, RecordReader in) { if (in.open("DataRecord")) { DataRecord record = new DataRecord(); record.pl = in.namedIndex("pl", EPluralization.names); record.pluralNames = in.stringTable("pluralName"); record.genders = in.namedIndexArray("gender", EGender.names); record.singularNames = in.stringArray("singularName"); record.halfNames = in.stringArray("halfName"); record.numberNames = in.stringArray("numberName"); record.mediumNames = in.stringArray("mediumName"); record.shortNames = in.stringArray("shortName"); record.measures = in.stringArray("measure"); record.rqdSuffixes = in.stringArray("rqdSuffix"); record.optSuffixes = in.stringArray("optSuffix"); record.halves = in.stringArray("halves"); record.halfPlacements = in.namedIndexArray("halfPlacement", EHalfPlacement.names); record.halfSupport = in.namedIndexArray("halfSupport", EHalfSupport.names); record.fifteenMinutes = in.string("fifteenMinutes"); record.fiveMinutes = in.string("fiveMinutes"); record.requiresDigitSeparator = in.bool("requiresDigitSeparator"); record.digitPrefix = in.string("digitPrefix"); record.countSep = in.string("countSep"); record.shortUnitSep = in.string("shortUnitSep"); record.unitSep = in.stringArray("unitSep"); record.unitSepRequiresDP = in.boolArray("unitSepRequiresDP"); record.requiresSkipMarker = in.boolArray("requiresSkipMarker"); record.numberSystem = in.namedIndex("numberSystem", ENumberSystem.names); record.zero = in.character("zero"); record.decimalSep = in.character("decimalSep"); record.omitSingularCount = in.bool("omitSingularCount"); record.omitDualCount = in.bool("omitDualCount"); record.zeroHandling = in.namedIndex("zeroHandling", EZeroHandling.names); record.decimalHandling = in.namedIndex("decimalHandling", EDecimalHandling.names); record.fractionHandling = in.namedIndex("fractionHandling", EFractionHandling.names); record.skippedUnitMarker = in.string("skippedUnitMarker"); record.allowZero = in.bool("allowZero"); record.weeksAloneOnly = in.bool("weeksAloneOnly"); record.useMilliseconds = in.namedIndex("useMilliseconds", EMilliSupport.names); if (in.open("ScopeDataList")) { List list = new ArrayList(); // of ScopeData ScopeData data; while (null != (data = ScopeData.read(in))) { list.add(data); } if (in.close()) { record.scopeData = list.toArray(new ScopeData[list.size()]); } } if (in.close()) { return record; } } else { throw new InternalError("did not find DataRecord while reading " + ln); } throw new InternalError("null data read while reading " + ln); // Thread.dumpStack(); // return null; } public void write(RecordWriter out) { out.open("DataRecord"); out.namedIndex("pl", EPluralization.names, pl); out.stringTable("pluralName", pluralNames); out.namedIndexArray("gender", EGender.names, genders); out.stringArray("singularName", singularNames); out.stringArray("halfName", halfNames); out.stringArray("numberName", numberNames); out.stringArray("mediumName", mediumNames); out.stringArray("shortName", shortNames); out.stringArray("measure", measures); out.stringArray("rqdSuffix", rqdSuffixes); out.stringArray("optSuffix", optSuffixes); out.stringArray("halves", halves); out.namedIndexArray("halfPlacement", EHalfPlacement.names, halfPlacements); out.namedIndexArray("halfSupport", EHalfSupport.names, halfSupport); out.string("fifteenMinutes", fifteenMinutes); out.string("fiveMinutes", fiveMinutes); out.bool("requiresDigitSeparator", requiresDigitSeparator); out.string("digitPrefix", digitPrefix); out.string("countSep", countSep); out.string("shortUnitSep", shortUnitSep); out.stringArray("unitSep", unitSep); out.boolArray("unitSepRequiresDP", unitSepRequiresDP); out.boolArray("requiresSkipMarker", requiresSkipMarker); out.namedIndex("numberSystem", ENumberSystem.names, numberSystem); out.character("zero", zero); out.character("decimalSep", decimalSep); out.bool("omitSingularCount", omitSingularCount); out.bool("omitDualCount", omitDualCount); out.namedIndex("zeroHandling", EZeroHandling.names, zeroHandling); out.namedIndex("decimalHandling", EDecimalHandling.names, decimalHandling); out.namedIndex("fractionHandling", EFractionHandling.names, fractionHandling); out.string("skippedUnitMarker", skippedUnitMarker); out.bool("allowZero", allowZero); out.bool("weeksAloneOnly", weeksAloneOnly); out.namedIndex("useMilliseconds", EMilliSupport.names, useMilliseconds); if (scopeData != null) { out.open("ScopeDataList"); for (int i = 0; i < scopeData.length; ++i) { scopeData[i].write(out); } out.close(); } out.close(); } public static class ScopeData { String prefix; boolean requiresDigitPrefix; String suffix; public void write(RecordWriter out) { out.open("ScopeData"); out.string("prefix", prefix); out.bool("requiresDigitPrefix", requiresDigitPrefix); out.string("suffix", suffix); out.close(); } public static ScopeData read(RecordReader in) { if (in.open("ScopeData")) { ScopeData scope = new ScopeData(); scope.prefix = in.string("prefix"); scope.requiresDigitPrefix = in.bool("requiresDigitPrefix"); scope.suffix = in.string("suffix"); if (in.close()) { return scope; } } return null; } } public static interface ETimeLimit { public static final byte NOLIMIT = 0; public static final byte LT = 1; public static final byte MT = 2; public static final String[] names = { "NOLIMIT", "LT", "MT" }; } public static interface ETimeDirection { public static final byte NODIRECTION = 0; public static final byte PAST = 1; public static final byte FUTURE = 2; public static final String[] names = { "NODIRECTION", "PAST", "FUTURE" }; } public static interface EUnitVariant { public static final byte PLURALIZED = 0; public static final byte MEDIUM = 1; public static final byte SHORT = 2; public static final String[] names = { "PLURALIZED", "MEDIUM", "SHORT" }; } public static interface ECountVariant { public static final byte INTEGER = 0; public static final byte INTEGER_CUSTOM = 1; public static final byte HALF_FRACTION = 2; public static final byte DECIMAL1 = 3; public static final byte DECIMAL2 = 4; public static final byte DECIMAL3 = 5; public static final String[] names = { "INTEGER", "INTEGER_CUSTOM", "HALF_FRACTION", "DECIMAL1", "DECIMAL2", "DECIMAL3" }; } public static interface EPluralization { public static final byte NONE = 0; public static final byte PLURAL = 1; public static final byte DUAL = 2; public static final byte PAUCAL = 3; public static final byte HEBREW = 4; public static final byte ARABIC = 5; public static final String[] names = { "NONE", "PLURAL", "DUAL", "PAUCAL", "HEBREW", "ARABIC" }; } public static interface EHalfPlacement { public static final byte PREFIX = 0; public static final byte AFTER_FIRST = 1; public static final byte LAST = 2; public static final String[] names = { "PREFIX", "AFTER_FIRST", "LAST" }; } public static interface ENumberSystem { public static final byte DEFAULT = 0; public static final byte CHINESE_TRADITIONAL = 1; public static final byte CHINESE_SIMPLIFIED = 2; public static final byte KOREAN = 3; public static final String[] names = { "DEFAULT", "CHINESE_TRADITIONAL", "CHINESE_SIMPLIFIED", "KOREAN" }; } public static interface EZeroHandling { public static final byte ZPLURAL = 0; public static final byte ZSINGULAR = 1; public static final String[] names = { "ZPLURAL", "ZSINGULAR" }; } public static interface EDecimalHandling { public static final byte DPLURAL = 0; public static final byte DSINGULAR = 1; public static final byte DSINGULAR_SUBONE = 2; public static final byte DPAUCAL = 3; public static final String[] names = { "DPLURAL", "DSINGULAR", "DSINGULAR_SUBONE", "DPAUCAL" }; } public static interface EFractionHandling { public static final byte FPLURAL = 0; public static final byte FSINGULAR_PLURAL = 1; public static final byte FSINGULAR_PLURAL_ANDAHALF = 2; public static final byte FPAUCAL = 3; public static final String[] names = { "FPLURAL", "FSINGULAR_PLURAL", "FSINGULAR_PLURAL_ANDAHALF", "FPAUCAL" }; } public static interface EHalfSupport { public static final byte YES = 0; public static final byte NO = 1; public static final byte ONE_PLUS = 2; public static final String[] names = { "YES", "NO", "ONE_PLUS" }; } public static interface EMilliSupport { public static final byte YES = 0; public static final byte NO = 1; public static final byte WITH_SECONDS = 2; public static final String[] names = { "YES", "NO", "WITH_SECONDS" }; } public static interface ESeparatorVariant { public static final byte NONE = 0; public static final byte SHORT = 1; public static final byte FULL = 2; public static final String[] names = { "NONE", "SHORT", "FULL" }; } public static interface EGender { public static final byte M = 0; public static final byte F = 1; public static final byte N = 2; public static final String[] names = { "M", "F", "N" }; } }