]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_4_2-src/main/classes/core/src/com/ibm/icu/impl/duration/impl/DataRecord.java
go
[Dictionary.git] / jars / icu4j-4_4_2-src / main / classes / core / src / com / ibm / icu / impl / duration / impl / DataRecord.java
1 /*\r
2  ******************************************************************************\r
3  * Copyright (C) 2007-2009, International Business Machines Corporation and   *\r
4  * others. All Rights Reserved.                                               *\r
5  ******************************************************************************\r
6  */\r
7 \r
8 package com.ibm.icu.impl.duration.impl;\r
9 \r
10 import java.util.ArrayList;\r
11 import java.util.List;\r
12 \r
13 /**\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
17  */\r
18 public class DataRecord {\r
19     byte pl;\r
20     String[][] pluralNames;\r
21     byte[] genders; // EGender\r
22     String[] singularNames;\r
23     String[] halfNames;\r
24     String[] numberNames;\r
25     String[] mediumNames;\r
26     String[] shortNames;\r
27     String[] measures;\r
28     String[] rqdSuffixes;\r
29     String[] optSuffixes;\r
30     String[] halves;\r
31     byte[] halfPlacements; // EHalfPlacement\r
32     byte[] halfSupport; // EHalfSupport\r
33     String fifteenMinutes;\r
34     String fiveMinutes;\r
35     boolean requiresDigitSeparator;\r
36     String digitPrefix;\r
37     String countSep;\r
38     String shortUnitSep;\r
39     String[] unitSep;\r
40     boolean[] unitSepRequiresDP;\r
41     boolean[] requiresSkipMarker;\r
42     byte numberSystem; // ENumberSystem\r
43     char zero;\r
44     char decimalSep;\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
51     boolean allowZero;\r
52     boolean weeksAloneOnly;\r
53     byte useMilliseconds; // EMilliSupport\r
54     ScopeData[] scopeData;\r
55 \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
103                 ScopeData data;\r
104                 while (null != (data = ScopeData.read(in))) {\r
105                     list.add(data);\r
106                 }\r
107                 if (in.close()) {\r
108                     record.scopeData = list.toArray(new ScopeData[list.size()]);\r
109                 }\r
110             }\r
111 \r
112             if (in.close()) {\r
113                 return record;\r
114             }\r
115         } else {\r
116             throw new InternalError("did not find DataRecord while reading "\r
117                     + ln);\r
118         }\r
119         throw new InternalError("null data read while reading " + ln);\r
120         // Thread.dumpStack();\r
121         // return null;\r
122     }\r
123 \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
139                 halfPlacements);\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
157                 decimalHandling);\r
158         out.namedIndex("fractionHandling", EFractionHandling.names,\r
159                 fractionHandling);\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
168             }\r
169             out.close();\r
170         }\r
171         out.close();\r
172     }\r
173 \r
174     public static class ScopeData {\r
175         String prefix;\r
176         boolean requiresDigitPrefix;\r
177         String suffix;\r
178 \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
184             out.close();\r
185         }\r
186 \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
193                 if (in.close()) {\r
194                     return scope;\r
195                 }\r
196             }\r
197             return null;\r
198         }\r
199     }\r
200 \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
206     }\r
207 \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
213     }\r
214 \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
220     }\r
221 \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
231     }\r
232 \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
242     }\r
243 \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
249     }\r
250 \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
258     }\r
259 \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
264     }\r
265 \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
273     }\r
274 \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
282     }\r
283 \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
289     }\r
290 \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
296     }\r
297 \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
303     }\r
304 \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
310     }\r
311 }\r