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