]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_4_2-src/main/classes/core/src/com/ibm/icu/impl/ResourceBundleWrapper.java
go
[Dictionary.git] / jars / icu4j-4_4_2-src / main / classes / core / src / com / ibm / icu / impl / ResourceBundleWrapper.java
1 /*\r
2 ******************************************************************************\r
3 * Copyright (C) 2004-2010, International Business Machines Corporation and   *\r
4 * others. All Rights Reserved.                                               *\r
5 ******************************************************************************\r
6 */\r
7 \r
8 package com.ibm.icu.impl;\r
9 \r
10 import java.io.InputStream;\r
11 import java.util.Enumeration;\r
12 import java.util.MissingResourceException;\r
13 import java.util.PropertyResourceBundle;\r
14 import java.util.ResourceBundle;\r
15 import java.util.Vector;\r
16 \r
17 import com.ibm.icu.util.ULocale;\r
18 import com.ibm.icu.util.UResourceBundle;\r
19 \r
20 /**\r
21  * just a wrapper for Java ListResourceBundles and \r
22  * @author ram\r
23  *\r
24  */\r
25 public class ResourceBundleWrapper extends UResourceBundle {\r
26     private ResourceBundle bundle = null;\r
27     private String localeID = null;\r
28     private String baseName = null;\r
29     private Vector<String> keys = null;\r
30 //    private int loadingStatus = -1;    \r
31     \r
32     private ResourceBundleWrapper(ResourceBundle bundle){\r
33         this.bundle=bundle;\r
34     }\r
35 \r
36     protected void setLoadingStatus(int newStatus){\r
37 //        loadingStatus = newStatus;\r
38     }\r
39     \r
40     protected Object handleGetObject(String aKey){\r
41         ResourceBundleWrapper current = this;\r
42         Object obj = null;\r
43         while(current!=null){\r
44             try{\r
45                 obj = current.bundle.getObject(aKey);\r
46                 break;\r
47             }catch(MissingResourceException ex){\r
48                 current = (ResourceBundleWrapper)current.getParent();\r
49             }\r
50         }\r
51         if (obj == null){\r
52             throw new MissingResourceException("Can't find resource for bundle "\r
53                                                +baseName\r
54                                                +", key "+aKey,\r
55                                                this.getClass().getName(),\r
56                                                aKey);\r
57         }\r
58         return obj;\r
59     }\r
60     \r
61     public Enumeration<String> getKeys(){\r
62         return keys.elements();\r
63     }\r
64     \r
65     private void initKeysVector(){\r
66         ResourceBundleWrapper current = this;\r
67         keys = new Vector<String>();\r
68         while(current!=null){\r
69             Enumeration<String> e = current.bundle.getKeys();\r
70             while(e.hasMoreElements()){\r
71                 String elem = e.nextElement();\r
72                 if(!keys.contains(elem)){\r
73                     keys.add(elem);\r
74                 }\r
75             }\r
76             current = (ResourceBundleWrapper)current.getParent();\r
77         }\r
78     }\r
79     protected String getLocaleID(){\r
80         return localeID;   \r
81     }\r
82  \r
83     protected String getBaseName(){\r
84         return bundle.getClass().getName().replace('.','/');   \r
85     }\r
86     \r
87     public ULocale getULocale(){\r
88         return new ULocale(localeID);   \r
89     }\r
90     \r
91     public UResourceBundle getParent(){\r
92         return (UResourceBundle)parent;   \r
93     }\r
94 \r
95     // Flag for enabling/disabling debugging code\r
96     private static final boolean DEBUG = ICUDebug.enabled("resourceBundleWrapper");\r
97     \r
98     // This method is for super class's instantiateBundle method\r
99     public static UResourceBundle getBundleInstance(String baseName, String localeID, \r
100                                                     ClassLoader root, boolean disableFallback){\r
101         UResourceBundle b = instantiateBundle(baseName, localeID, root, disableFallback);\r
102         if(b==null){\r
103             String separator ="_";\r
104             if(baseName.indexOf('/')>=0){\r
105                 separator = "/";\r
106             }\r
107             throw new MissingResourceException("Could not find the bundle "+ baseName+separator+ localeID,"","");\r
108         }\r
109         return b;\r
110     }\r
111     // recursively build bundle and override the super-class method\r
112      protected static synchronized UResourceBundle instantiateBundle(String baseName, String localeID,\r
113                                                                     ClassLoader root, boolean disableFallback) {\r
114         if (root == null) {\r
115             root = Utility.getFallbackClassLoader();\r
116         }\r
117         final ClassLoader cl = root;\r
118         String name = baseName;\r
119         ULocale defaultLocale = ULocale.getDefault();\r
120         if (localeID.length() != 0) {\r
121             name = name + "_" + localeID;\r
122         }\r
123 \r
124         ResourceBundleWrapper b = (ResourceBundleWrapper)loadFromCache(cl, name, defaultLocale);\r
125         if(b==null){\r
126             ResourceBundleWrapper parent = null;\r
127             int i = localeID.lastIndexOf('_');\r
128     \r
129             boolean loadFromProperties = false;\r
130             if (i != -1) {\r
131                 String locName = localeID.substring(0, i);\r
132                 parent = (ResourceBundleWrapper)loadFromCache(cl, baseName+"_"+locName,defaultLocale);\r
133                 if(parent == null){\r
134                     parent = (ResourceBundleWrapper)instantiateBundle(baseName, locName , cl, disableFallback);\r
135                 }\r
136             }else if(localeID.length()>0){\r
137                 parent = (ResourceBundleWrapper)loadFromCache(cl, baseName,defaultLocale);\r
138                 if(parent==null){\r
139                     parent = (ResourceBundleWrapper)instantiateBundle(baseName, "", cl, disableFallback);\r
140                 }\r
141             }\r
142             try {\r
143                 Class<? extends ResourceBundle> cls = cl.loadClass(name).asSubclass(ResourceBundle.class);\r
144                 ResourceBundle bx = cls.newInstance();\r
145                 b = new ResourceBundleWrapper(bx);\r
146                 if (parent != null) {\r
147                     b.setParent(parent);\r
148                 }\r
149                 b.baseName=baseName;\r
150                 b.localeID = localeID;            \r
151     \r
152             } catch (ClassNotFoundException e) {\r
153                 loadFromProperties = true;\r
154             } catch (NoClassDefFoundError e) {\r
155                 loadFromProperties = true;\r
156             } catch (Exception e) {\r
157                 if (DEBUG)\r
158                     System.out.println("failure");\r
159                 if (DEBUG)\r
160                     System.out.println(e);\r
161             }\r
162 \r
163             if (loadFromProperties) {\r
164                 try {\r
165                     final String resName = name.replace('.', '/') + ".properties";\r
166                     InputStream stream = java.security.AccessController.doPrivileged(\r
167                         new java.security.PrivilegedAction<InputStream>() {\r
168                             public InputStream run() {\r
169                                 if (cl != null) {\r
170                                     return cl.getResourceAsStream(resName);\r
171                                 } else {\r
172                                     return ClassLoader.getSystemResourceAsStream(resName);\r
173                                 }\r
174                             }\r
175                         }\r
176                     );\r
177                     if (stream != null) {\r
178                         // make sure it is buffered\r
179                         stream = new java.io.BufferedInputStream(stream);\r
180                         try {\r
181                             b = new ResourceBundleWrapper(new PropertyResourceBundle(stream));\r
182                             if (parent != null) {\r
183                                 b.setParent(parent);\r
184                             }\r
185                             b.baseName=baseName;\r
186                             b.localeID=localeID;\r
187                         } catch (Exception ex) {\r
188                             // throw away exception\r
189                         } finally {\r
190                             try {\r
191                                 stream.close();\r
192                             } catch (Exception ex) {\r
193                                 // throw away exception\r
194                             }\r
195                         }\r
196                     }\r
197         \r
198                     // if a bogus locale is passed then the parent should be\r
199                     // the default locale not the root locale!\r
200                     if (b==null) {\r
201                         String defaultName = defaultLocale.toString();\r
202                         if (localeID.length()>0 && localeID.indexOf('_')< 0 && defaultName.indexOf(localeID) == -1) {\r
203                             b = (ResourceBundleWrapper)loadFromCache(cl,baseName+"_"+defaultName, defaultLocale);\r
204                             if(b==null){\r
205                                 b = (ResourceBundleWrapper)instantiateBundle(baseName , defaultName, cl, disableFallback);\r
206                             }\r
207                         }\r
208                     }\r
209                     // if still could not find the bundle then return the parent\r
210                     if(b==null){\r
211                         b=parent;\r
212                     }                \r
213                 } catch (Exception e) {\r
214                     if (DEBUG)\r
215                         System.out.println("failure");\r
216                     if (DEBUG)\r
217                         System.out.println(e);\r
218                 }\r
219             }\r
220             b = (ResourceBundleWrapper)addToCache(cl, name, defaultLocale, b);\r
221         }\r
222 \r
223         if(b!=null){\r
224             b.initKeysVector();\r
225         }else{\r
226             if(DEBUG)System.out.println("Returning null for "+baseName+"_"+localeID);\r
227         }\r
228         \r
229         return b;\r
230     }\r
231 }\r