• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* GENERATED SOURCE. DO NOT MODIFY. */
2 // © 2016 and later: Unicode, Inc. and others.
3 // License & terms of use: http://www.unicode.org/copyright.html
4 /*
5  *******************************************************************************
6  * Copyright (C) 2004-2016, International Business Machines Corporation and
7  * others. All Rights Reserved.
8  *******************************************************************************
9  */
10 package android.icu.impl;
11 
12 import java.nio.ByteBuffer;
13 import java.util.HashMap;
14 import java.util.Set;
15 import java.util.TreeSet;
16 
17 import android.icu.util.UResourceBundle;
18 import android.icu.util.UResourceTypeMismatchException;
19 
20 class ICUResourceBundleImpl extends ICUResourceBundle {
21     protected int resource;
22 
ICUResourceBundleImpl(ICUResourceBundleImpl container, String key, int resource)23     protected ICUResourceBundleImpl(ICUResourceBundleImpl container, String key, int resource) {
24         super(container, key);
25         this.resource = resource;
26     }
ICUResourceBundleImpl(WholeBundle wholeBundle)27     ICUResourceBundleImpl(WholeBundle wholeBundle) {
28         super(wholeBundle);
29         resource = wholeBundle.reader.getRootResource();
30     }
getResource()31     public int getResource() {
32         return resource;
33     }
createBundleObject(String _key, int _resource, HashMap<String, String> aliasesVisited, UResourceBundle requested)34     protected final ICUResourceBundle createBundleObject(String _key,
35                                                          int _resource,
36                                                          HashMap<String, String> aliasesVisited,
37                                                          UResourceBundle requested) {
38         switch(ICUResourceBundleReader.RES_GET_TYPE(_resource)) {
39         case STRING :
40         case STRING_V2:
41             return new ICUResourceBundleImpl.ResourceString(this, _key, _resource);
42         case BINARY:
43             return new ICUResourceBundleImpl.ResourceBinary(this, _key, _resource);
44         case ALIAS:
45             return getAliasedResource(this, null, 0, _key, _resource, aliasesVisited, requested);
46         case INT:
47             return new ICUResourceBundleImpl.ResourceInt(this, _key, _resource);
48         case INT_VECTOR:
49             return new ICUResourceBundleImpl.ResourceIntVector(this, _key, _resource);
50         case ARRAY:
51         case ARRAY16:
52             return new ICUResourceBundleImpl.ResourceArray(this, _key, _resource);
53         case TABLE:
54         case TABLE16:
55         case TABLE32:
56             return new ICUResourceBundleImpl.ResourceTable(this, _key, _resource);
57         default :
58             throw new IllegalStateException("The resource type is unknown");
59         }
60     }
61 
62     // Scalar values ------------------------------------------------------- ***
63 
64     private static final class ResourceBinary extends ICUResourceBundleImpl {
65         @Override
getType()66         public int getType() {
67             return BINARY;
68         }
69         @Override
getBinary()70         public ByteBuffer getBinary() {
71             return wholeBundle.reader.getBinary(resource);
72         }
73         @Override
getBinary(byte []ba)74         public byte [] getBinary(byte []ba) {
75             return wholeBundle.reader.getBinary(resource, ba);
76         }
ResourceBinary(ICUResourceBundleImpl container, String key, int resource)77         ResourceBinary(ICUResourceBundleImpl container, String key, int resource) {
78             super(container, key, resource);
79         }
80     }
81     private static final class ResourceInt extends ICUResourceBundleImpl {
82         @Override
getType()83         public int getType() {
84             return INT;
85         }
86         @Override
getInt()87         public int getInt() {
88             return ICUResourceBundleReader.RES_GET_INT(resource);
89         }
90         @Override
getUInt()91         public int getUInt() {
92             return ICUResourceBundleReader.RES_GET_UINT(resource);
93         }
ResourceInt(ICUResourceBundleImpl container, String key, int resource)94         ResourceInt(ICUResourceBundleImpl container, String key, int resource) {
95             super(container, key, resource);
96         }
97     }
98     private static final class ResourceString extends ICUResourceBundleImpl {
99         private String value;
100         @Override
getType()101         public int getType() {
102             return STRING;
103         }
104         @Override
getString()105         public String getString() {
106             if (value != null) {
107                 return value;
108             }
109             return wholeBundle.reader.getString(resource);
110         }
ResourceString(ICUResourceBundleImpl container, String key, int resource)111         ResourceString(ICUResourceBundleImpl container, String key, int resource) {
112             super(container, key, resource);
113             String s = wholeBundle.reader.getString(resource);
114             // Allow the reader cache's SoftReference to do its job.
115             if (s.length() < ICUResourceBundleReader.LARGE_SIZE / 2 ||
116                     CacheValue.futureInstancesWillBeStrong()) {
117                 value = s;
118             }
119         }
120     }
121     private static final class ResourceIntVector extends ICUResourceBundleImpl {
122         @Override
getType()123         public int getType() {
124             return INT_VECTOR;
125         }
126         @Override
getIntVector()127         public int[] getIntVector() {
128             return wholeBundle.reader.getIntVector(resource);
129         }
ResourceIntVector(ICUResourceBundleImpl container, String key, int resource)130         ResourceIntVector(ICUResourceBundleImpl container, String key, int resource) {
131             super(container, key, resource);
132         }
133     }
134 
135     // Container values ---------------------------------------------------- ***
136 
137     static abstract class ResourceContainer extends ICUResourceBundleImpl {
138         protected ICUResourceBundleReader.Container value;
139 
140         @Override
getSize()141         public int getSize() {
142             return value.getSize();
143         }
144         @Override
getString(int index)145         public String getString(int index) {
146             int res = value.getContainerResource(wholeBundle.reader, index);
147             if (res == RES_BOGUS) {
148                 throw new IndexOutOfBoundsException();
149             }
150             String s = wholeBundle.reader.getString(res);
151             if (s != null) {
152                 return s;
153             }
154             return super.getString(index);
155         }
getContainerResource(int index)156         protected int getContainerResource(int index) {
157             return value.getContainerResource(wholeBundle.reader, index);
158         }
createBundleObject(int index, String resKey, HashMap<String, String> aliasesVisited, UResourceBundle requested)159         protected UResourceBundle createBundleObject(int index, String resKey, HashMap<String, String> aliasesVisited,
160                                                      UResourceBundle requested) {
161             int item = getContainerResource(index);
162             if (item == RES_BOGUS) {
163                 throw new IndexOutOfBoundsException();
164             }
165             return createBundleObject(resKey, item, aliasesVisited, requested);
166         }
167 
ResourceContainer(ICUResourceBundleImpl container, String key, int resource)168         ResourceContainer(ICUResourceBundleImpl container, String key, int resource) {
169             super(container, key, resource);
170         }
ResourceContainer(WholeBundle wholeBundle)171         ResourceContainer(WholeBundle wholeBundle) {
172             super(wholeBundle);
173         }
174     }
175     static class ResourceArray extends ResourceContainer {
176         @Override
getType()177         public int getType() {
178             return ARRAY;
179         }
180         @Override
handleGetStringArray()181         protected String[] handleGetStringArray() {
182             ICUResourceBundleReader reader = wholeBundle.reader;
183             int length = value.getSize();
184             String[] strings = new String[length];
185             for (int i = 0; i < length; ++i) {
186                 String s = reader.getString(value.getContainerResource(reader, i));
187                 if (s == null) {
188                     throw new UResourceTypeMismatchException("");
189                 }
190                 strings[i] = s;
191             }
192             return strings;
193         }
194         @Override
getStringArray()195         public String[] getStringArray() {
196             return handleGetStringArray();
197         }
198         @Override
handleGet(String indexStr, HashMap<String, String> aliasesVisited, UResourceBundle requested)199         protected UResourceBundle handleGet(String indexStr, HashMap<String, String> aliasesVisited,
200                                             UResourceBundle requested) {
201             int i = Integer.parseInt(indexStr);
202             return createBundleObject(i, indexStr, aliasesVisited, requested);
203         }
204         @Override
handleGet(int index, HashMap<String, String> aliasesVisited, UResourceBundle requested)205         protected UResourceBundle handleGet(int index, HashMap<String, String> aliasesVisited,
206                                             UResourceBundle requested) {
207             return createBundleObject(index, Integer.toString(index), aliasesVisited, requested);
208         }
ResourceArray(ICUResourceBundleImpl container, String key, int resource)209         ResourceArray(ICUResourceBundleImpl container, String key, int resource) {
210             super(container, key, resource);
211             value = wholeBundle.reader.getArray(resource);
212         }
213     }
214     static class ResourceTable extends ResourceContainer {
215         @Override
getType()216         public int getType() {
217             return TABLE;
218         }
getKey(int index)219         protected String getKey(int index) {
220             return ((ICUResourceBundleReader.Table)value).getKey(wholeBundle.reader, index);
221         }
222         @Override
handleKeySet()223         protected Set<String> handleKeySet() {
224             ICUResourceBundleReader reader = wholeBundle.reader;
225             TreeSet<String> keySet = new TreeSet<String>();
226             ICUResourceBundleReader.Table table = (ICUResourceBundleReader.Table)value;
227             for (int i = 0; i < table.getSize(); ++i) {
228                 keySet.add(table.getKey(reader, i));
229             }
230             return keySet;
231         }
232         @Override
handleGet(String resKey, HashMap<String, String> aliasesVisited, UResourceBundle requested)233         protected UResourceBundle handleGet(String resKey, HashMap<String, String> aliasesVisited,
234                                             UResourceBundle requested) {
235             int i = ((ICUResourceBundleReader.Table)value).findTableItem(wholeBundle.reader, resKey);
236             if (i < 0) {
237                 return null;
238             }
239             return createBundleObject(resKey, getContainerResource(i), aliasesVisited, requested);
240         }
241         @Override
handleGet(int index, HashMap<String, String> aliasesVisited, UResourceBundle requested)242         protected UResourceBundle handleGet(int index, HashMap<String, String> aliasesVisited,
243                                             UResourceBundle requested) {
244             String itemKey = ((ICUResourceBundleReader.Table)value).getKey(wholeBundle.reader, index);
245             if (itemKey == null) {
246                 throw new IndexOutOfBoundsException();
247             }
248             return createBundleObject(itemKey, getContainerResource(index), aliasesVisited, requested);
249         }
250         @Override
handleGetObject(String key)251         protected Object handleGetObject(String key) {
252             // Fast path for common cases: Avoid creating UResourceBundles if possible.
253             // It would be even better if we could override getString(key)/getStringArray(key),
254             // so that we know the expected object type,
255             // but those are final in java.util.ResourceBundle.
256             ICUResourceBundleReader reader = wholeBundle.reader;
257             int index = ((ICUResourceBundleReader.Table)value).findTableItem(reader, key);
258             if (index >= 0) {
259                 int res = value.getContainerResource(reader, index);
260                 // getString(key)
261                 String s = reader.getString(res);
262                 if (s != null) {
263                     return s;
264                 }
265                 // getStringArray(key)
266                 ICUResourceBundleReader.Container array = reader.getArray(res);
267                 if (array != null) {
268                     int length = array.getSize();
269                     String[] strings = new String[length];
270                     for (int j = 0;; ++j) {
271                         if (j == length) {
272                             return strings;
273                         }
274                         s = reader.getString(array.getContainerResource(reader, j));
275                         if (s == null) {
276                             // Equivalent to resolveObject(key, requested):
277                             // If this is not a string array,
278                             // then build and return a UResourceBundle.
279                             break;
280                         }
281                         strings[j] = s;
282                     }
283                 }
284             }
285             return super.handleGetObject(key);
286         }
287         /**
288          * Returns a String if found, or null if not found or if the key item is not a string.
289          */
findString(String key)290         String findString(String key) {
291             ICUResourceBundleReader reader = wholeBundle.reader;
292             int index = ((ICUResourceBundleReader.Table)value).findTableItem(reader, key);
293             if (index < 0) {
294                 return null;
295             }
296             return reader.getString(value.getContainerResource(reader, index));
297         }
ResourceTable(ICUResourceBundleImpl container, String key, int resource)298         ResourceTable(ICUResourceBundleImpl container, String key, int resource) {
299             super(container, key, resource);
300             value = wholeBundle.reader.getTable(resource);
301         }
302         /**
303          * Constructor for the root table of a bundle.
304          */
ResourceTable(WholeBundle wholeBundle, int rootRes)305         ResourceTable(WholeBundle wholeBundle, int rootRes) {
306             super(wholeBundle);
307             value = wholeBundle.reader.getTable(rootRes);
308         }
309     }
310 }
311