2 ******************************************************************************
\r
3 * Copyright (C) 2007, International Business Machines Corporation and *
\r
4 * others. All Rights Reserved. *
\r
5 ******************************************************************************
\r
8 package com.ibm.icu.impl.duration.impl;
\r
13 * DataRecord contains the data used by PeriodFormatterData. Fields
\r
14 * are package-private for ease of access. This is a struct, it knows
\r
15 * how to read and write itself to/from simple XML, that's all.
\r
17 public class DataRecord {
\r
19 String[][] pluralNames;
\r
20 byte[] genders; // EGender
\r
21 String[] singularNames;
\r
23 String[] numberNames;
\r
24 String[] mediumNames;
\r
25 String[] shortNames;
\r
27 String[] rqdSuffixes;
\r
28 String[] optSuffixes;
\r
30 byte[] halfPlacements; // EHalfPlacement
\r
31 byte[] halfSupport; // EHalfSupport
\r
32 String fifteenMinutes;
\r
34 boolean requiresDigitSeparator;
\r
37 String shortUnitSep;
\r
39 boolean[] unitSepRequiresDP;
\r
40 boolean[] requiresSkipMarker;
\r
41 byte numberSystem; // ENumberSystem
\r
44 boolean omitSingularCount;
\r
45 boolean omitDualCount;
\r
46 byte zeroHandling; // EZeroHandling
\r
47 byte decimalHandling; // EDecimalHandling
\r
48 byte fractionHandling; // EFractionHandling
\r
49 String skippedUnitMarker;
\r
51 boolean weeksAloneOnly;
\r
52 byte useMilliseconds; // EMilliSupport
\r
53 ScopeData[] scopeData;
\r
55 public static DataRecord read(String ln, RecordReader in) {
\r
56 if (in.open("DataRecord")) {
\r
57 DataRecord record = new DataRecord();
\r
58 record.pl = in.namedIndex("pl", EPluralization.names);
\r
59 record.pluralNames = in.stringTable("pluralName");
\r
60 record.genders = in.namedIndexArray("gender", EGender.names);
\r
61 record.singularNames = in.stringArray("singularName");
\r
62 record.halfNames = in.stringArray("halfName");
\r
63 record.numberNames = in.stringArray("numberName");
\r
64 record.mediumNames = in.stringArray("mediumName");
\r
65 record.shortNames = in.stringArray("shortName");
\r
66 record.measures = in.stringArray("measure");
\r
67 record.rqdSuffixes = in.stringArray("rqdSuffix");
\r
68 record.optSuffixes = in.stringArray("optSuffix");
\r
69 record.halves = in.stringArray("halves");
\r
70 record.halfPlacements = in.namedIndexArray("halfPlacement", EHalfPlacement.names);
\r
71 record.halfSupport = in.namedIndexArray("halfSupport", EHalfSupport.names);
\r
72 record.fifteenMinutes = in.string("fifteenMinutes");
\r
73 record.fiveMinutes = in.string("fiveMinutes");
\r
74 record.requiresDigitSeparator = in.bool("requiresDigitSeparator");
\r
75 record.digitPrefix = in.string("digitPrefix");
\r
76 record.countSep = in.string("countSep");
\r
77 record.shortUnitSep = in.string("shortUnitSep");
\r
78 record.unitSep = in.stringArray("unitSep");
\r
79 record.unitSepRequiresDP = in.boolArray("unitSepRequiresDP");
\r
80 record.requiresSkipMarker = in.boolArray("requiresSkipMarker");
\r
81 record.numberSystem = in.namedIndex("numberSystem", ENumberSystem.names);
\r
82 record.zero = in.character("zero");
\r
83 record.decimalSep = in.character("decimalSep");
\r
84 record.omitSingularCount = in.bool("omitSingularCount");
\r
85 record.omitDualCount = in.bool("omitDualCount");
\r
86 record.zeroHandling = in.namedIndex("zeroHandling", EZeroHandling.names);
\r
87 record.decimalHandling = in.namedIndex("decimalHandling", EDecimalHandling.names);
\r
88 record.fractionHandling = in.namedIndex("fractionHandling", EFractionHandling.names);
\r
89 record.skippedUnitMarker = in.string("skippedUnitMarker");
\r
90 record.allowZero = in.bool("allowZero");
\r
91 record.weeksAloneOnly = in.bool("weeksAloneOnly");
\r
92 record.useMilliseconds = in.namedIndex("useMilliseconds", EMilliSupport.names);
\r
93 if (in.open("ScopeDataList")) {
\r
94 List list = new ArrayList(); // of ScopeData
\r
96 while (null != (data = ScopeData.read(in))) {
\r
100 record.scopeData = (ScopeData[]) list.toArray(new ScopeData[list.size()]);
\r
108 throw new InternalError("did not find DataRecord while reading " + ln);
\r
110 throw new InternalError("null data read while reading "+ln);
\r
111 // Thread.dumpStack();
\r
115 public void write(RecordWriter out) {
\r
116 out.open("DataRecord");
\r
117 out.namedIndex("pl", EPluralization.names, pl);
\r
118 out.stringTable("pluralName", pluralNames);
\r
119 out.namedIndexArray("gender", EGender.names, genders);
\r
120 out.stringArray("singularName", singularNames);
\r
121 out.stringArray("halfName", halfNames);
\r
122 out.stringArray("numberName", numberNames);
\r
123 out.stringArray("mediumName", mediumNames);
\r
124 out.stringArray("shortName", shortNames);
\r
125 out.stringArray("measure", measures);
\r
126 out.stringArray("rqdSuffix", rqdSuffixes);
\r
127 out.stringArray("optSuffix", optSuffixes);
\r
128 out.stringArray("halves", halves);
\r
129 out.namedIndexArray("halfPlacement", EHalfPlacement.names, halfPlacements);
\r
130 out.namedIndexArray("halfSupport", EHalfSupport.names, halfSupport);
\r
131 out.string("fifteenMinutes", fifteenMinutes);
\r
132 out.string("fiveMinutes", fiveMinutes);
\r
133 out.bool("requiresDigitSeparator", requiresDigitSeparator);
\r
134 out.string("digitPrefix", digitPrefix);
\r
135 out.string("countSep", countSep);
\r
136 out.string("shortUnitSep", shortUnitSep);
\r
137 out.stringArray("unitSep", unitSep);
\r
138 out.boolArray("unitSepRequiresDP", unitSepRequiresDP);
\r
139 out.boolArray("requiresSkipMarker", requiresSkipMarker);
\r
140 out.namedIndex("numberSystem", ENumberSystem.names, numberSystem);
\r
141 out.character("zero", zero);
\r
142 out.character("decimalSep", decimalSep);
\r
143 out.bool("omitSingularCount", omitSingularCount);
\r
144 out.bool("omitDualCount", omitDualCount);
\r
145 out.namedIndex("zeroHandling", EZeroHandling.names, zeroHandling);
\r
146 out.namedIndex("decimalHandling", EDecimalHandling.names, decimalHandling);
\r
147 out.namedIndex("fractionHandling", EFractionHandling.names, fractionHandling);
\r
148 out.string("skippedUnitMarker", skippedUnitMarker);
\r
149 out.bool("allowZero", allowZero);
\r
150 out.bool("weeksAloneOnly", weeksAloneOnly);
\r
151 out.namedIndex("useMilliseconds", EMilliSupport.names, useMilliseconds);
\r
152 if (scopeData != null) {
\r
153 out.open("ScopeDataList");
\r
154 for (int i = 0; i < scopeData.length; ++i) {
\r
155 scopeData[i].write(out);
\r
162 public static class ScopeData {
\r
164 boolean requiresDigitPrefix;
\r
167 public void write(RecordWriter out) {
\r
168 out.open("ScopeData");
\r
169 out.string("prefix", prefix);
\r
170 out.bool("requiresDigitPrefix", requiresDigitPrefix);
\r
171 out.string("suffix", suffix);
\r
175 public static ScopeData read(RecordReader in) {
\r
176 if (in.open("ScopeData")) {
\r
177 ScopeData scope = new ScopeData();
\r
178 scope.prefix = in.string("prefix");
\r
179 scope.requiresDigitPrefix = in.bool("requiresDigitPrefix");
\r
180 scope.suffix = in.string("suffix");
\r
189 public static interface ETimeLimit {
\r
190 public static final byte NOLIMIT = 0;
\r
191 public static final byte LT = 1;
\r
192 public static final byte MT = 2;
\r
193 public static final String[] names = { "NOLIMIT", "LT", "MT" };
\r
196 public static interface ETimeDirection {
\r
197 public static final byte NODIRECTION = 0;
\r
198 public static final byte PAST = 1;
\r
199 public static final byte FUTURE = 2;
\r
200 public static final String[] names = { "NODIRECTION", "PAST", "FUTURE" };
\r
203 public static interface EUnitVariant {
\r
204 public static final byte PLURALIZED = 0;
\r
205 public static final byte MEDIUM = 1;
\r
206 public static final byte SHORT = 2;
\r
207 public static final String[] names = { "PLURALIZED", "MEDIUM", "SHORT" };
\r
210 public static interface ECountVariant {
\r
211 public static final byte INTEGER = 0;
\r
212 public static final byte INTEGER_CUSTOM = 1;
\r
213 public static final byte HALF_FRACTION = 2;
\r
214 public static final byte DECIMAL1 = 3;
\r
215 public static final byte DECIMAL2 = 4;
\r
216 public static final byte DECIMAL3 = 5;
\r
217 public static final String[] names = {
\r
218 "INTEGER", "INTEGER_CUSTOM", "HALF_FRACTION", "DECIMAL1",
\r
219 "DECIMAL2", "DECIMAL3" };
\r
222 public static interface EPluralization {
\r
223 public static final byte NONE = 0;
\r
224 public static final byte PLURAL = 1;
\r
225 public static final byte DUAL = 2;
\r
226 public static final byte PAUCAL = 3;
\r
227 public static final byte HEBREW = 4;
\r
228 public static final byte ARABIC = 5;
\r
229 public static final String[] names = {
\r
230 "NONE", "PLURAL", "DUAL", "PAUCAL", "HEBREW", "ARABIC"
\r
234 public static interface EHalfPlacement {
\r
235 public static final byte PREFIX = 0;
\r
236 public static final byte AFTER_FIRST = 1;
\r
237 public static final byte LAST = 2;
\r
238 public static final String[] names = {
\r
239 "PREFIX", "AFTER_FIRST", "LAST"
\r
243 public static interface ENumberSystem {
\r
244 public static final byte DEFAULT = 0;
\r
245 public static final byte CHINESE_TRADITIONAL = 1;
\r
246 public static final byte CHINESE_SIMPLIFIED = 2;
\r
247 public static final byte KOREAN = 3;
\r
248 public static final String[] names = {
\r
249 "DEFAULT", "CHINESE_TRADITIONAL", "CHINESE_SIMPLIFIED", "KOREAN"
\r
253 public static interface EZeroHandling {
\r
254 public static final byte ZPLURAL = 0;
\r
255 public static final byte ZSINGULAR = 1;
\r
256 public static final String[] names = {
\r
257 "ZPLURAL", "ZSINGULAR"
\r
261 public static interface EDecimalHandling {
\r
262 public static final byte DPLURAL = 0;
\r
263 public static final byte DSINGULAR = 1;
\r
264 public static final byte DSINGULAR_SUBONE = 2;
\r
265 public static final byte DPAUCAL = 3;
\r
266 public static final String[] names = {
\r
267 "DPLURAL", "DSINGULAR", "DSINGULAR_SUBONE", "DPAUCAL"
\r
271 public static interface EFractionHandling {
\r
272 public static final byte FPLURAL = 0;
\r
273 public static final byte FSINGULAR_PLURAL = 1;
\r
274 public static final byte FSINGULAR_PLURAL_ANDAHALF = 2;
\r
275 public static final byte FPAUCAL = 3;
\r
276 public static final String[] names = {
\r
277 "FPLURAL", "FSINGULAR_PLURAL", "FSINGULAR_PLURAL_ANDAHALF",
\r
282 public static interface EHalfSupport {
\r
283 public static final byte YES = 0;
\r
284 public static final byte NO = 1;
\r
285 public static final byte ONE_PLUS = 2;
\r
286 public static final String[] names = {
\r
287 "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 = {
\r
296 "YES", "NO", "WITH_SECONDS"
\r
300 public static interface ESeparatorVariant {
\r
301 public static final byte NONE = 0;
\r
302 public static final byte SHORT = 1;
\r
303 public static final byte FULL = 2;
\r
304 public static final String[] names = {
\r
305 "NONE", "SHORT", "FULL"
\r
309 public static interface EGender {
\r
310 public static final byte M = 0;
\r
311 public static final byte F = 1;
\r
312 public static final byte N = 2;
\r
313 public static final String[] names = {
\r