]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_2_1-src/src/com/ibm/icu/impl/ResourceBundleWrapper.java
go
[Dictionary.git] / jars / icu4j-4_2_1-src / src / com / ibm / icu / impl / ResourceBundleWrapper.java
1 /*\r
2 ******************************************************************************\r
3 * Copyright (C) 2004-2008, 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 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 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();\r
68         while(current!=null){\r
69             Enumeration e = current.bundle.getKeys();\r
70             while(e.hasMoreElements()){\r
71                 String elem = (String)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             // we're on the bootstrap\r
116             root = ClassLoader.getSystemClassLoader();\r
117         }\r
118         final ClassLoader cl = root;\r
119         String name = baseName;\r
120         ULocale defaultLocale = ULocale.getDefault();\r
121         if (localeID.length() != 0) {\r
122             name = name + "_" + localeID;\r
123         }\r
124 \r
125         ResourceBundleWrapper b = (ResourceBundleWrapper)loadFromCache(cl, name, defaultLocale);\r
126         if(b==null){\r
127             ResourceBundleWrapper parent = null;\r
128             int i = localeID.lastIndexOf('_');\r
129     \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 cls = cl.loadClass(name);\r
144                 ResourceBundle bx = (ResourceBundle) 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                 \r
154                 final String resName = name.replace('.', '/') + ".properties";\r
155                 InputStream stream = (InputStream)java.security.AccessController.doPrivileged(\r
156                     new java.security.PrivilegedAction() {\r
157                         public Object run() {\r
158                             if (cl != null) {\r
159                                 return cl.getResourceAsStream(resName);\r
160                             } else {\r
161                                 return ClassLoader.getSystemResourceAsStream(resName);\r
162                             }\r
163                         }\r
164                     }\r
165                 );\r
166                 if (stream != null) {\r
167                     // make sure it is buffered\r
168                     stream = new java.io.BufferedInputStream(stream);\r
169                     try {\r
170                         b = new ResourceBundleWrapper(new PropertyResourceBundle(stream));\r
171                         if (parent != null) {\r
172                             b.setParent(parent);\r
173                         }\r
174                         b.baseName=baseName;\r
175                         b.localeID=localeID;\r
176                     } catch (Exception ex) {\r
177                         // throw away exception\r
178                     } finally {\r
179                         try {\r
180                             stream.close();\r
181                         } catch (Exception ex) {\r
182                             // throw away exception\r
183                         }\r
184                     }\r
185                 }\r
186     \r
187                 // if a bogus locale is passed then the parent should be\r
188                 // the default locale not the root locale!\r
189                 if (b==null) {\r
190                     String defaultName = defaultLocale.toString();\r
191                     if (localeID.length()>0 && localeID.indexOf('_')< 0 && defaultName.indexOf(localeID) == -1) {\r
192                         b = (ResourceBundleWrapper)loadFromCache(cl,baseName+"_"+defaultName, defaultLocale);\r
193                         if(b==null){\r
194                             b = (ResourceBundleWrapper)instantiateBundle(baseName , defaultName, cl, disableFallback);\r
195                         }\r
196                     }\r
197                 }\r
198                 // if still could not find the bundle then return the parent\r
199                 if(b==null){\r
200                     b=parent;\r
201                 }\r
202             } catch (Exception e) {\r
203                 if (DEBUG)\r
204                     System.out.println("failure");\r
205                 if (DEBUG)\r
206                     System.out.println(e);\r
207             }\r
208 \r
209             addToCache(cl, name, defaultLocale, b);\r
210         }\r
211         if(b!=null){\r
212             b.initKeysVector();\r
213         }else{\r
214             if(DEBUG)System.out.println("Returning null for "+baseName+"_"+localeID);\r
215         }\r
216         \r
217         return b;\r
218     }\r
219 }\r