]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_4_2-src/main/classes/core/src/com/ibm/icu/impl/ICUResourceBundleImpl.java
go
[Dictionary.git] / jars / icu4j-4_4_2-src / main / classes / core / src / com / ibm / icu / impl / ICUResourceBundleImpl.java
1 /*\r
2  *******************************************************************************\r
3  * Copyright (C) 2004-2009, International Business Machines Corporation and    *\r
4  * others. All Rights Reserved.                                                *\r
5  *******************************************************************************\r
6  */\r
7 package com.ibm.icu.impl;\r
8 \r
9 import java.nio.ByteBuffer;\r
10 import java.util.HashMap;\r
11 import java.util.Set;\r
12 import java.util.TreeSet;\r
13 \r
14 import com.ibm.icu.util.UResourceBundle;\r
15 import com.ibm.icu.util.UResourceBundleIterator;\r
16 import com.ibm.icu.util.UResourceTypeMismatchException;\r
17 \r
18 class ICUResourceBundleImpl extends ICUResourceBundle {\r
19     protected ICUResourceBundleImpl(ICUResourceBundleReader reader, String key, String resPath, int resource,\r
20                                     ICUResourceBundleImpl container) {\r
21         super(reader, key, resPath, resource, container);\r
22     }\r
23     protected final ICUResourceBundle createBundleObject(String _key,\r
24                                                          int _resource,\r
25                                                          HashMap<String, String> table,\r
26                                                          UResourceBundle requested,\r
27                                                          boolean[] isAlias) {\r
28         if (isAlias != null) {\r
29             isAlias[0] = false;\r
30         }\r
31         String _resPath = resPath + "/" + _key;\r
32         switch(ICUResourceBundleReader.RES_GET_TYPE(_resource)) {\r
33         case STRING :\r
34         case STRING_V2:\r
35             return new ICUResourceBundleImpl.ResourceString(reader, _key, _resPath, _resource, this);\r
36         case BINARY:\r
37             return new ICUResourceBundleImpl.ResourceBinary(reader, _key, _resPath, _resource, this);\r
38         case ALIAS:\r
39             if (isAlias != null) {\r
40                 isAlias[0] = true;\r
41             }\r
42             return findResource(_key, _resource, table, requested);\r
43         case INT:\r
44             return new ICUResourceBundleImpl.ResourceInt(reader, _key, _resPath, _resource, this);\r
45         case INT_VECTOR:\r
46             return new ICUResourceBundleImpl.ResourceIntVector(reader, _key, _resPath, _resource, this);\r
47         case ARRAY:\r
48         case ARRAY16:\r
49             return new ICUResourceBundleImpl.ResourceArray(reader, _key, _resPath, _resource, this);\r
50         case TABLE:\r
51         case TABLE16:\r
52         case TABLE32:\r
53             return new ICUResourceBundleImpl.ResourceTable(reader, _key, _resPath, _resource, this);\r
54         default :\r
55             throw new IllegalStateException("The resource type is unknown");\r
56         }\r
57     }\r
58 \r
59     // Scalar values ------------------------------------------------------- ***\r
60 \r
61     private static final class ResourceBinary extends ICUResourceBundleImpl {\r
62         public ByteBuffer getBinary() {\r
63             return reader.getBinary(resource);\r
64         }\r
65         public byte [] getBinary(byte []ba) {\r
66             return reader.getBinary(resource, ba);\r
67         }\r
68         ResourceBinary(ICUResourceBundleReader reader, String key, String resPath, int resource,\r
69                        ICUResourceBundleImpl container) {\r
70             super(reader, key, resPath, resource, container);\r
71         }\r
72     }\r
73     private static final class ResourceInt extends ICUResourceBundleImpl {\r
74         public int getInt() {\r
75             return ICUResourceBundleReader.RES_GET_INT(resource);\r
76         }\r
77         public int getUInt() {\r
78             return ICUResourceBundleReader.RES_GET_UINT(resource);\r
79         }\r
80         ResourceInt(ICUResourceBundleReader reader, String key, String resPath, int resource,\r
81                     ICUResourceBundleImpl container) {\r
82             super(reader, key, resPath, resource, container);\r
83         }\r
84     }\r
85     private static final class ResourceString extends ICUResourceBundleImpl {\r
86         private String value;\r
87         public String getString() {\r
88             return value;\r
89         }\r
90         ResourceString(ICUResourceBundleReader reader, String key, String resPath, int resource,\r
91                        ICUResourceBundleImpl container) {\r
92             super(reader, key, resPath, resource, container);\r
93             value = reader.getString(resource);\r
94         }\r
95     }\r
96     private static final class ResourceIntVector extends ICUResourceBundleImpl {\r
97         private int[] value;\r
98         public int[] getIntVector() {\r
99             return value;\r
100         }\r
101         ResourceIntVector(ICUResourceBundleReader reader, String key, String resPath, int resource,\r
102                           ICUResourceBundleImpl container) {\r
103             super(reader, key, resPath, resource, container);\r
104             value = reader.getIntVector(resource);\r
105         }\r
106     }\r
107 \r
108     // Container values ---------------------------------------------------- ***\r
109 \r
110     private static class ResourceContainer extends ICUResourceBundleImpl {\r
111         protected ICUResourceBundleReader.Container value;\r
112 \r
113         public int getSize() {\r
114             return value.getSize();\r
115         }\r
116         protected int getContainerResource(int index) {\r
117             return value.getContainerResource(index);\r
118         }\r
119         protected UResourceBundle createBundleObject(int index, String resKey, HashMap<String, String> table,\r
120                                                      UResourceBundle requested, boolean[] isAlias) {\r
121             int item = getContainerResource(index);\r
122             if (item == RES_BOGUS) {\r
123                 throw new IndexOutOfBoundsException();\r
124             }\r
125             return createBundleObject(resKey, item, table, requested, isAlias);\r
126         }\r
127         ResourceContainer(ICUResourceBundleReader reader, String key, String resPath, int resource,\r
128                           ICUResourceBundleImpl container) {\r
129             super(reader, key, resPath, resource, container);\r
130         }\r
131     }\r
132     private static class ResourceArray extends ResourceContainer {\r
133         protected String[] handleGetStringArray() {\r
134             String[] strings = new String[value.getSize()];\r
135             UResourceBundleIterator iter = getIterator();\r
136             int i = 0;\r
137             while (iter.hasNext()) {\r
138                 strings[i++] = iter.next().getString();\r
139             }\r
140             return strings;\r
141         }\r
142         public String[] getStringArray() {\r
143             return handleGetStringArray();\r
144         }\r
145         protected UResourceBundle handleGetImpl(String indexStr, HashMap<String, String> table,\r
146                                                 UResourceBundle requested,\r
147                                                 int[] index, boolean[] isAlias) {\r
148             int i = indexStr.length() > 0 ? Integer.valueOf(indexStr).intValue() : -1;\r
149             if(index != null) {\r
150                 index[0] = i;\r
151             }\r
152             if (i < 0) {\r
153                 throw new UResourceTypeMismatchException("Could not get the correct value for index: "+ index);\r
154             }\r
155             return createBundleObject(i, indexStr, table, requested, isAlias);\r
156         }\r
157         protected UResourceBundle handleGetImpl(int index, HashMap<String, String> table,\r
158                                                 UResourceBundle requested, boolean[] isAlias) {\r
159             return createBundleObject(index, Integer.toString(index), table, requested, isAlias);\r
160         }\r
161         ResourceArray(ICUResourceBundleReader reader, String key, String resPath, int resource,\r
162                       ICUResourceBundleImpl container) {\r
163             super(reader, key, resPath, resource, container);\r
164             value = reader.getArray(resource);\r
165             createLookupCache(); // Use bundle cache to access array entries\r
166         }\r
167     }\r
168     static class ResourceTable extends ResourceContainer {\r
169         protected String getKey(int index) {\r
170             return ((ICUResourceBundleReader.Table)value).getKey(index);\r
171         }\r
172         protected Set<String> handleKeySet() {\r
173             TreeSet<String> keySet = new TreeSet<String>();\r
174             ICUResourceBundleReader.Table table = (ICUResourceBundleReader.Table)value;\r
175             for (int i = 0; i < table.getSize(); ++i) {\r
176                 keySet.add(table.getKey(i));\r
177             }\r
178             return keySet;\r
179         }\r
180         protected int getTableResource(String resKey) {\r
181             return ((ICUResourceBundleReader.Table)value).getTableResource(resKey);\r
182         }\r
183         protected int getTableResource(int index) {\r
184             return getContainerResource(index);\r
185         }\r
186         protected UResourceBundle handleGetImpl(String resKey, HashMap<String, String> table,\r
187                                                 UResourceBundle requested,\r
188                                                 int[] index, boolean[] isAlias) {\r
189             int i = ((ICUResourceBundleReader.Table)value).findTableItem(resKey);\r
190             if(index != null) {\r
191                 index[0] = i;\r
192             }\r
193             if (i < 0) {\r
194                 return null;\r
195             }\r
196             return createBundleObject(i, resKey, table, requested, isAlias);\r
197         }\r
198         protected UResourceBundle handleGetImpl(int index, HashMap<String, String> table,\r
199                                                 UResourceBundle requested, boolean[] isAlias) {\r
200             String itemKey = ((ICUResourceBundleReader.Table)value).getKey(index);\r
201             if (itemKey == null) {\r
202                 throw new IndexOutOfBoundsException();\r
203             }\r
204             return createBundleObject(index, itemKey, table, requested, isAlias);\r
205         }\r
206         ResourceTable(ICUResourceBundleReader reader, String key, String resPath, int resource,\r
207                       ICUResourceBundleImpl container) {\r
208             super(reader, key, resPath, resource, container);\r
209             value = reader.getTable(resource);\r
210             createLookupCache(); // Use bundle cache to access table entries\r
211         }\r
212     }\r
213 }\r