2 ******************************************************************************
\r
3 * Copyright (C) 2007-2009, International Business Machines Corporation and *
\r
4 * others. All Rights Reserved. *
\r
5 ******************************************************************************
\r
8 package com.ibm.icu.impl.duration.impl;
\r
10 import java.util.ArrayList;
\r
11 import java.util.List;
\r
14 * DataRecord contains the data used by PeriodFormatterData. Fields are
\r
15 * package-private for ease of access. This is a struct, it knows how to read
\r
16 * and write itself to/from simple XML, that's all.
\r
18 public class DataRecord {
\r
20 String[][] pluralNames;
\r
21 byte[] genders; // EGender
\r
22 String[] singularNames;
\r
24 String[] numberNames;
\r
25 String[] mediumNames;
\r
26 String[] shortNames;
\r
28 String[] rqdSuffixes;
\r
29 String[] optSuffixes;
\r
31 byte[] halfPlacements; // EHalfPlacement
\r
32 byte[] halfSupport; // EHalfSupport
\r
33 String fifteenMinutes;
\r
35 boolean requiresDigitSeparator;
\r
38 String shortUnitSep;
\r
40 boolean[] unitSepRequiresDP;
\r
41 boolean[] requiresSkipMarker;
\r
42 byte numberSystem; // ENumberSystem
\r
45 boolean omitSingularCount;
\r
46 boolean omitDualCount;
\r
47 byte zeroHandling; // EZeroHandling
\r
48 byte decimalHandling; // EDecimalHandling
\r
49 byte fractionHandling; // EFractionHandling
\r
50 String skippedUnitMarker;
\r
52 boolean weeksAloneOnly;
\r
53 byte useMilliseconds; // EMilliSupport
\r
54 ScopeData[] scopeData;
\r
56 public static DataRecord read(String ln, RecordReader in) {
\r
57 if (in.open("DataRecord")) {
\r
58 DataRecord record = new DataRecord();
\r
59 record.pl = in.namedIndex("pl", EPluralization.names);
\r
60 record.pluralNames = in.stringTable("pluralName");
\r
61 record.genders = in.namedIndexArray("gender", EGender.names);
\r
62 record.singularNames = in.stringArray("singularName");
\r
63 record.halfNames = in.stringArray("halfName");
\r
64 record.numberNames = in.stringArray("numberName");
\r
65 record.mediumNames = in.stringArray("mediumName");
\r
66 record.shortNames = in.stringArray("shortName");
\r
67 record.measures = in.stringArray("measure");
\r
68 record.rqdSuffixes = in.stringArray("rqdSuffix");
\r
69 record.optSuffixes = in.stringArray("optSuffix");
\r
70 record.halves = in.stringArray("halves");
\r
71 record.halfPlacements = in.namedIndexArray("halfPlacement",
\r
72 EHalfPlacement.names);
\r
73 record.halfSupport = in.namedIndexArray("halfSupport",
\r
74 EHalfSupport.names);
\r
75 record.fifteenMinutes = in.string("fifteenMinutes");
\r
76 record.fiveMinutes = in.string("fiveMinutes");
\r
77 record.requiresDigitSeparator = in.bool("requiresDigitSeparator");
\r
78 record.digitPrefix = in.string("digitPrefix");
\r
79 record.countSep = in.string("countSep");
\r
80 record.shortUnitSep = in.string("shortUnitSep");
\r
81 record.unitSep = in.stringArray("unitSep");
\r
82 record.unitSepRequiresDP = in.boolArray("unitSepRequiresDP");
\r
83 record.requiresSkipMarker = in.boolArray("requiresSkipMarker");
\r
84 record.numberSystem = in.namedIndex("numberSystem",
\r
85 ENumberSystem.names);
\r
86 record.zero = in.character("zero");
\r
87 record.decimalSep = in.character("decimalSep");
\r
88 record.omitSingularCount = in.bool("omitSingularCount");
\r
89 record.omitDualCount = in.bool("omitDualCount");
\r
90 record.zeroHandling = in.namedIndex("zeroHandling",
\r
91 EZeroHandling.names);
\r
92 record.decimalHandling = in.namedIndex("decimalHandling",
\r
93 EDecimalHandling.names);
\r
94 record.fractionHandling = in.namedIndex("fractionHandling",
\r
95 EFractionHandling.names);
\r
96 record.skippedUnitMarker = in.string("skippedUnitMarker");
\r
97 record.allowZero = in.bool("allowZero");
\r
98 record.weeksAloneOnly = in.bool("weeksAloneOnly");
\r
99 record.useMilliseconds = in.namedIndex("useMilliseconds",
\r
100 EMilliSupport.names);
\r
101 if (in.open("ScopeDataList")) {
\r
102 List<ScopeData> list = new ArrayList<ScopeData>(); // of ScopeData
\r
104 while (null != (data = ScopeData.read(in))) {
\r
108 record.scopeData = list.toArray(new ScopeData[list.size()]);
\r
116 throw new InternalError("did not find DataRecord while reading "
\r
119 throw new InternalError("null data read while reading " + ln);
\r
120 // Thread.dumpStack();
\r
124 public void write(RecordWriter out) {
\r
125 out.open("DataRecord");
\r
126 out.namedIndex("pl", EPluralization.names, pl);
\r
127 out.stringTable("pluralName", pluralNames);
\r
128 out.namedIndexArray("gender", EGender.names, genders);
\r
129 out.stringArray("singularName", singularNames);
\r
130 out.stringArray("halfName", halfNames);
\r
131 out.stringArray("numberName", numberNames);
\r
132 out.stringArray("mediumName", mediumNames);
\r
133 out.stringArray("shortName", shortNames);
\r
134 out.stringArray("measure", measures);
\r
135 out.stringArray("rqdSuffix", rqdSuffixes);
\r
136 out.stringArray("optSuffix", optSuffixes);
\r
137 out.stringArray("halves", halves);
\r
138 out.namedIndexArray("halfPlacement", EHalfPlacement.names,
\r
140 out.namedIndexArray("halfSupport", EHalfSupport.names, halfSupport);
\r
141 out.string("fifteenMinutes", fifteenMinutes);
\r
142 out.string("fiveMinutes", fiveMinutes);
\r
143 out.bool("requiresDigitSeparator", requiresDigitSeparator);
\r
144 out.string("digitPrefix", digitPrefix);
\r
145 out.string("countSep", countSep);
\r
146 out.string("shortUnitSep", shortUnitSep);
\r
147 out.stringArray("unitSep", unitSep);
\r
148 out.boolArray("unitSepRequiresDP", unitSepRequiresDP);
\r
149 out.boolArray("requiresSkipMarker", requiresSkipMarker);
\r
150 out.namedIndex("numberSystem", ENumberSystem.names, numberSystem);
\r
151 out.character("zero", zero);
\r
152 out.character("decimalSep", decimalSep);
\r
153 out.bool("omitSingularCount", omitSingularCount);
\r
154 out.bool("omitDualCount", omitDualCount);
\r
155 out.namedIndex("zeroHandling", EZeroHandling.names, zeroHandling);
\r
156 out.namedIndex("decimalHandling", EDecimalHandling.names,
\r
158 out.namedIndex("fractionHandling", EFractionHandling.names,
\r
160 out.string("skippedUnitMarker", skippedUnitMarker);
\r
161 out.bool("allowZero", allowZero);
\r
162 out.bool("weeksAloneOnly", weeksAloneOnly);
\r
163 out.namedIndex("useMilliseconds", EMilliSupport.names, useMilliseconds);
\r
164 if (scopeData != null) {
\r
165 out.open("ScopeDataList");
\r
166 for (int i = 0; i < scopeData.length; ++i) {
\r
167 scopeData[i].write(out);
\r
174 public static class ScopeData {
\r
176 boolean requiresDigitPrefix;
\r
179 public void write(RecordWriter out) {
\r
180 out.open("ScopeData");
\r
181 out.string("prefix", prefix);
\r
182 out.bool("requiresDigitPrefix", requiresDigitPrefix);
\r
183 out.string("suffix", suffix);
\r
187 public static ScopeData read(RecordReader in) {
\r
188 if (in.open("ScopeData")) {
\r
189 ScopeData scope = new ScopeData();
\r
190 scope.prefix = in.string("prefix");
\r
191 scope.requiresDigitPrefix = in.bool("requiresDigitPrefix");
\r
192 scope.suffix = in.string("suffix");
\r
201 public static interface ETimeLimit {
\r
202 public static final byte NOLIMIT = 0;
\r
203 public static final byte LT = 1;
\r
204 public static final byte MT = 2;
\r
205 public static final String[] names = { "NOLIMIT", "LT", "MT" };
\r
208 public static interface ETimeDirection {
\r
209 public static final byte NODIRECTION = 0;
\r
210 public static final byte PAST = 1;
\r
211 public static final byte FUTURE = 2;
\r
212 public static final String[] names = { "NODIRECTION", "PAST", "FUTURE" };
\r
215 public static interface EUnitVariant {
\r
216 public static final byte PLURALIZED = 0;
\r
217 public static final byte MEDIUM = 1;
\r
218 public static final byte SHORT = 2;
\r
219 public static final String[] names = { "PLURALIZED", "MEDIUM", "SHORT" };
\r
222 public static interface ECountVariant {
\r
223 public static final byte INTEGER = 0;
\r
224 public static final byte INTEGER_CUSTOM = 1;
\r
225 public static final byte HALF_FRACTION = 2;
\r
226 public static final byte DECIMAL1 = 3;
\r
227 public static final byte DECIMAL2 = 4;
\r
228 public static final byte DECIMAL3 = 5;
\r
229 public static final String[] names = { "INTEGER", "INTEGER_CUSTOM",
\r
230 "HALF_FRACTION", "DECIMAL1", "DECIMAL2", "DECIMAL3" };
\r
233 public static interface EPluralization {
\r
234 public static final byte NONE = 0;
\r
235 public static final byte PLURAL = 1;
\r
236 public static final byte DUAL = 2;
\r
237 public static final byte PAUCAL = 3;
\r
238 public static final byte HEBREW = 4;
\r
239 public static final byte ARABIC = 5;
\r
240 public static final String[] names = { "NONE", "PLURAL", "DUAL",
\r
241 "PAUCAL", "HEBREW", "ARABIC" };
\r
244 public static interface EHalfPlacement {
\r
245 public static final byte PREFIX = 0;
\r
246 public static final byte AFTER_FIRST = 1;
\r
247 public static final byte LAST = 2;
\r
248 public static final String[] names = { "PREFIX", "AFTER_FIRST", "LAST" };
\r
251 public static interface ENumberSystem {
\r
252 public static final byte DEFAULT = 0;
\r
253 public static final byte CHINESE_TRADITIONAL = 1;
\r
254 public static final byte CHINESE_SIMPLIFIED = 2;
\r
255 public static final byte KOREAN = 3;
\r
256 public static final String[] names = { "DEFAULT",
\r
257 "CHINESE_TRADITIONAL", "CHINESE_SIMPLIFIED", "KOREAN" };
\r
260 public static interface EZeroHandling {
\r
261 public static final byte ZPLURAL = 0;
\r
262 public static final byte ZSINGULAR = 1;
\r
263 public static final String[] names = { "ZPLURAL", "ZSINGULAR" };
\r
266 public static interface EDecimalHandling {
\r
267 public static final byte DPLURAL = 0;
\r
268 public static final byte DSINGULAR = 1;
\r
269 public static final byte DSINGULAR_SUBONE = 2;
\r
270 public static final byte DPAUCAL = 3;
\r
271 public static final String[] names = { "DPLURAL", "DSINGULAR",
\r
272 "DSINGULAR_SUBONE", "DPAUCAL" };
\r
275 public static interface EFractionHandling {
\r
276 public static final byte FPLURAL = 0;
\r
277 public static final byte FSINGULAR_PLURAL = 1;
\r
278 public static final byte FSINGULAR_PLURAL_ANDAHALF = 2;
\r
279 public static final byte FPAUCAL = 3;
\r
280 public static final String[] names = { "FPLURAL", "FSINGULAR_PLURAL",
\r
281 "FSINGULAR_PLURAL_ANDAHALF", "FPAUCAL" };
\r
284 public static interface EHalfSupport {
\r
285 public static final byte YES = 0;
\r
286 public static final byte NO = 1;
\r
287 public static final byte ONE_PLUS = 2;
\r
288 public static final String[] names = { "YES", "NO", "ONE_PLUS" };
\r
291 public static interface EMilliSupport {
\r
292 public static final byte YES = 0;
\r
293 public static final byte NO = 1;
\r
294 public static final byte WITH_SECONDS = 2;
\r
295 public static final String[] names = { "YES", "NO", "WITH_SECONDS" };
\r
298 public static interface ESeparatorVariant {
\r
299 public static final byte NONE = 0;
\r
300 public static final byte SHORT = 1;
\r
301 public static final byte FULL = 2;
\r
302 public static final String[] names = { "NONE", "SHORT", "FULL" };
\r
305 public static interface EGender {
\r
306 public static final byte M = 0;
\r
307 public static final byte F = 1;
\r
308 public static final byte N = 2;
\r
309 public static final String[] names = { "M", "F", "N" };
\r