2 *******************************************************************************
\r
3 * Copyright (C) 2004-2009, International Business Machines Corporation and *
\r
4 * others. All Rights Reserved. *
\r
5 *******************************************************************************
\r
7 package com.ibm.icu.impl;
\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
14 import com.ibm.icu.util.UResourceBundle;
\r
15 import com.ibm.icu.util.UResourceBundleIterator;
\r
16 import com.ibm.icu.util.UResourceTypeMismatchException;
\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
23 protected final ICUResourceBundle createBundleObject(String _key,
\r
25 HashMap<String, String> table,
\r
26 UResourceBundle requested,
\r
27 boolean[] isAlias) {
\r
28 if (isAlias != null) {
\r
31 String _resPath = resPath + "/" + _key;
\r
32 switch(ICUResourceBundleReader.RES_GET_TYPE(_resource)) {
\r
35 return new ICUResourceBundleImpl.ResourceString(reader, _key, _resPath, _resource, this);
\r
37 return new ICUResourceBundleImpl.ResourceBinary(reader, _key, _resPath, _resource, this);
\r
39 if (isAlias != null) {
\r
42 return findResource(_key, _resource, table, requested);
\r
44 return new ICUResourceBundleImpl.ResourceInt(reader, _key, _resPath, _resource, this);
\r
46 return new ICUResourceBundleImpl.ResourceIntVector(reader, _key, _resPath, _resource, this);
\r
49 return new ICUResourceBundleImpl.ResourceArray(reader, _key, _resPath, _resource, this);
\r
53 return new ICUResourceBundleImpl.ResourceTable(reader, _key, _resPath, _resource, this);
\r
55 throw new IllegalStateException("The resource type is unknown");
\r
59 // Scalar values ------------------------------------------------------- ***
\r
61 private static final class ResourceBinary extends ICUResourceBundleImpl {
\r
62 public ByteBuffer getBinary() {
\r
63 return reader.getBinary(resource);
\r
65 public byte [] getBinary(byte []ba) {
\r
66 return reader.getBinary(resource, ba);
\r
68 ResourceBinary(ICUResourceBundleReader reader, String key, String resPath, int resource,
\r
69 ICUResourceBundleImpl container) {
\r
70 super(reader, key, resPath, resource, container);
\r
73 private static final class ResourceInt extends ICUResourceBundleImpl {
\r
74 public int getInt() {
\r
75 return ICUResourceBundleReader.RES_GET_INT(resource);
\r
77 public int getUInt() {
\r
78 return ICUResourceBundleReader.RES_GET_UINT(resource);
\r
80 ResourceInt(ICUResourceBundleReader reader, String key, String resPath, int resource,
\r
81 ICUResourceBundleImpl container) {
\r
82 super(reader, key, resPath, resource, container);
\r
85 private static final class ResourceString extends ICUResourceBundleImpl {
\r
86 private String value;
\r
87 public String getString() {
\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
96 private static final class ResourceIntVector extends ICUResourceBundleImpl {
\r
97 private int[] value;
\r
98 public int[] getIntVector() {
\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
108 // Container values ---------------------------------------------------- ***
\r
110 private static class ResourceContainer extends ICUResourceBundleImpl {
\r
111 protected ICUResourceBundleReader.Container value;
\r
113 public int getSize() {
\r
114 return value.getSize();
\r
116 protected int getContainerResource(int index) {
\r
117 return value.getContainerResource(index);
\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
125 return createBundleObject(resKey, item, table, requested, isAlias);
\r
127 ResourceContainer(ICUResourceBundleReader reader, String key, String resPath, int resource,
\r
128 ICUResourceBundleImpl container) {
\r
129 super(reader, key, resPath, resource, container);
\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
137 while (iter.hasNext()) {
\r
138 strings[i++] = iter.next().getString();
\r
142 public String[] getStringArray() {
\r
143 return handleGetStringArray();
\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
153 throw new UResourceTypeMismatchException("Could not get the correct value for index: "+ index);
\r
155 return createBundleObject(i, indexStr, table, requested, isAlias);
\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
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
168 static class ResourceTable extends ResourceContainer {
\r
169 protected String getKey(int index) {
\r
170 return ((ICUResourceBundleReader.Table)value).getKey(index);
\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
180 protected int getTableResource(String resKey) {
\r
181 return ((ICUResourceBundleReader.Table)value).getTableResource(resKey);
\r
183 protected int getTableResource(int index) {
\r
184 return getContainerResource(index);
\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
196 return createBundleObject(i, resKey, table, requested, isAlias);
\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
204 return createBundleObject(index, itemKey, table, requested, isAlias);
\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