]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_4_2-src/main/classes/core/src/com/ibm/icu/impl/duration/impl/ResourceBasedPeriodFormatterDataService.java
go
[Dictionary.git] / jars / icu4j-4_4_2-src / main / classes / core / src / com / ibm / icu / impl / duration / impl / ResourceBasedPeriodFormatterDataService.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.io.BufferedReader;\r
11 import java.io.IOException;\r
12 import java.io.InputStream;\r
13 import java.io.InputStreamReader;\r
14 import java.io.UnsupportedEncodingException;\r
15 import java.util.ArrayList;\r
16 import java.util.Collection;\r
17 import java.util.Collections;\r
18 import java.util.HashMap;\r
19 import java.util.List;\r
20 import java.util.Map;\r
21 import java.util.MissingResourceException;\r
22 \r
23 import com.ibm.icu.impl.ICUData;\r
24 \r
25 /**\r
26  * A PeriodFormatterDataService that serves PeriodFormatterData objects based on\r
27  * data files stored as resources in this directory. These are text files named\r
28  * after the locale, for example, 'pfd_he_IL.txt' specifies an period formatter\r
29  * data file for Hebrew as spoken in Israel. Data is in a JSON-like format.\r
30  */\r
31 public class ResourceBasedPeriodFormatterDataService extends\r
32         PeriodFormatterDataService {\r
33     private Collection<String> availableLocales; // of String\r
34 \r
35     private PeriodFormatterData lastData = null;\r
36     private String lastLocale = null;\r
37     private Map<String, PeriodFormatterData> cache = new HashMap<String, PeriodFormatterData>(); // String -> PeriodFormatterData\r
38     // private PeriodFormatterData fallbackFormatterData;\r
39 \r
40     private static final String PATH = "data/";\r
41 \r
42     private static final ResourceBasedPeriodFormatterDataService singleton = new ResourceBasedPeriodFormatterDataService();\r
43 \r
44     /**\r
45      * Returns the singleton instance of this class.\r
46      */\r
47     public static ResourceBasedPeriodFormatterDataService getInstance() {\r
48         return singleton;\r
49     }\r
50 \r
51     /**\r
52      * Constructs the service.\r
53      */\r
54     private ResourceBasedPeriodFormatterDataService() {\r
55         List<String> localeNames = new ArrayList<String>(); // of String\r
56         InputStream is = ICUData.getRequiredStream(getClass(), PATH\r
57                 + "index.txt");\r
58         try {\r
59             BufferedReader br = new BufferedReader(new InputStreamReader(is,\r
60                     "UTF-8"));\r
61             String string = null;\r
62             while (null != (string = br.readLine())) {\r
63                 string = string.trim();\r
64                 if (string.startsWith("#") || string.length() == 0) {\r
65                     continue;\r
66                 }\r
67                 localeNames.add(string);\r
68             }\r
69         } catch (IOException e) {\r
70             throw new IllegalStateException("IO Error reading " + PATH\r
71                     + "index.txt: " + e.toString());\r
72         }\r
73         availableLocales = Collections.unmodifiableList(localeNames);\r
74     }\r
75 \r
76     public PeriodFormatterData get(String localeName) {\r
77         // remove tag info including calendar, we don't use the calendar\r
78         int x = localeName.indexOf('@');\r
79         if (x != -1) {\r
80             localeName = localeName.substring(0, x);\r
81         }\r
82 \r
83         synchronized (this) {\r
84             if (lastLocale != null && lastLocale.equals(localeName)) {\r
85                 return lastData;\r
86             }\r
87 \r
88             PeriodFormatterData ld = cache.get(localeName);\r
89             if (ld == null) {\r
90                 String ln = localeName;\r
91                 while (!availableLocales.contains(ln)) {\r
92                     int ix = ln.lastIndexOf("_");\r
93                     if (ix > -1) {\r
94                         ln = ln.substring(0, ix);\r
95                     } else if (!"test".equals(ln)) {\r
96                         ln = "test";\r
97                     } else {\r
98                         ln = null;\r
99                         break;\r
100                     }\r
101                 }\r
102                 if (ln != null) {\r
103                     String name = PATH + "pfd_" + ln + ".xml";\r
104                     try {\r
105                         InputStream is = ICUData.getStream(getClass(), name);\r
106                         if (is == null) {\r
107                             throw new MissingResourceException(\r
108                                     "no resource named " + name, name, "");\r
109                         } else {\r
110                             DataRecord dr = DataRecord.read(ln,\r
111                                     new XMLRecordReader(new InputStreamReader(\r
112                                             is, "UTF-8")));\r
113                             if (dr != null) {\r
114                                 // debug\r
115                                 // if (false && ln.equals("ar_EG")) {\r
116                                 // OutputStreamWriter osw = new\r
117                                 // OutputStreamWriter(System.out, "UTF-8");\r
118                                 // XMLRecordWriter xrw = new\r
119                                 // XMLRecordWriter(osw);\r
120                                 // dr.write(xrw);\r
121                                 // osw.flush();\r
122                                 // }\r
123                                 ld = new PeriodFormatterData(localeName, dr);\r
124                             }\r
125                         }\r
126                     } catch (UnsupportedEncodingException e) {\r
127                         throw new MissingResourceException(\r
128                                 "Unhandled Encoding for resource " + name,\r
129                                 name, "");\r
130                     }\r
131                 } else {\r
132                     throw new MissingResourceException(\r
133                             "Duration data not found for  " + localeName, PATH,\r
134                             localeName);\r
135                 }\r
136 \r
137                 // if (ld == null) {\r
138                 // ld = getFallbackFormatterData();\r
139                 // }\r
140                 cache.put(localeName, ld);\r
141             }\r
142             lastData = ld;\r
143             lastLocale = localeName;\r
144 \r
145             return ld;\r
146         }\r
147     }\r
148 \r
149     public Collection<String> getAvailableLocales() {\r
150         return availableLocales;\r
151     }\r
152 \r
153     // PeriodFormatterData getFallbackFormatterData() {\r
154     // synchronized (this) {\r
155     // if (fallbackFormatterData == null) {\r
156     // DataRecord dr = new DataRecord(); // hack, no default, will die if used\r
157     // fallbackFormatterData = new PeriodFormatterData(null, dr);\r
158     // }\r
159     // return fallbackFormatterData;\r
160     // }\r
161     // }\r
162 }\r