1 package com.tonbeller.tbutils.res; 2 3 import java.io.File ; 4 import java.io.FileInputStream ; 5 import java.io.FileNotFoundException ; 6 import java.io.IOException ; 7 import java.util.HashMap ; 8 import java.util.Locale ; 9 import java.util.Map ; 10 import java.util.MissingResourceException ; 11 import java.util.Properties ; 12 import java.util.ResourceBundle ; 13 import java.util.StringTokenizer ; 14 15 import org.apache.log4j.Logger; 16 17 58 public class ResourcesFactory { 59 63 public static final String INITIAL_PROVIDER = "tbeller.InitialResourceProvider"; 64 65 public static final String USE_JNDI_PROVIDER = "tbeller.usejndi"; 67 68 public static final String TBELLER_BUNDLES = "tbeller.bundles"; 69 70 public static final String TBELLER_PROPERTIES = "tbeller.properties"; 71 72 public static final String TBELLER_HOME = "tbeller.home"; 74 75 public static final String TBELLER_LOCALE = "tbeller.locale"; 76 77 private static Logger logger = Logger.getLogger(ResourcesFactory.class); 78 79 Map locale2providerMap = new HashMap (); 80 81 File homeDir; 82 83 Locale fixedLocale; 84 85 String [] properties; 86 87 String [] bundles; 88 89 static ResourcesFactory instance = new ResourcesFactory(); 90 91 private ResourcesFactory() { 92 initialize(); 93 } 94 95 public static ResourcesFactory instance() { 96 return instance; 97 } 98 99 105 Resources getResources(Locale requestLocale, String bundleName) { 106 Locale locale = fixedLocale; 107 if (locale == null) 108 locale = requestLocale; 109 if (locale == null) 110 locale = Locale.getDefault(); 111 112 CompositeResourceProvider crp = new CompositeResourceProvider(); 113 ResourceProvider baseProvider = getProvider(locale); 114 crp.add(baseProvider); 115 116 ResourceProvider bundleProvider = getProvider(locale, bundleName); 117 if (bundleProvider != null) 118 crp.add(bundleProvider); 119 120 return new Resources(crp, locale, homeDir); 121 } 122 123 129 public Locale getFixedLocale() { 130 return fixedLocale; 131 } 132 133 137 static ResourceProvider getProvider(Locale locale, String bundleName) { 138 if (bundleName == null) 139 return null; 140 try { 141 ResourceBundle resb = ResourceBundle.getBundle(bundleName, locale); 142 return new BundleResourceProvider(bundleName, resb); 143 } catch (MissingResourceException e) { 144 return null; 145 } 146 } 147 148 ResourceProvider getProvider(Locale locale) { 149 String key = locale.getLanguage() + locale.getCountry() + locale.getVariant(); 150 ResourceProvider p = (ResourceProvider) locale2providerMap.get(key); 151 if (p != null) 152 return p; 153 p = createProvider(locale); 154 locale2providerMap.put(key, p); 155 return p; 156 } 157 158 void initialize() { 159 ResourceProvider p = getInitialProvider(); 160 try { 161 initialize(p); 162 } finally { 163 p.close(); 164 } 165 } 166 167 private ResourceProvider getInitialProvider() { 168 ResourceProvider m = new SimpleInitialProvider(); 169 String clazz = m.getString(INITIAL_PROVIDER); 170 if (clazz != null) { 171 try { 172 return (ResourceProvider) Class.forName(clazz).newInstance(); 173 } catch (Exception e) { 174 logger.error("could not instantiate " + clazz, e); 175 } 176 } 177 if ("false".equals(m.getString(USE_JNDI_PROVIDER))) 178 return new SimpleInitialProvider(); 179 return new JNDIInitialProvider(); 180 } 181 182 void initialize(ResourceProvider resp) { 183 locale2providerMap.clear(); 184 185 ResourceProvider p = new ReplacingResourceProvider(resp); 186 bundles = tokenize(p.getString(TBELLER_BUNDLES)); 187 188 CompositeResourceProvider c = new CompositeResourceProvider(); 190 c.add(p); 191 addBundleProviders(Locale.getDefault(), c); 192 p = new ReplacingResourceProvider(c); 193 194 initHome(p); 195 initLocale(p); 196 properties = tokenize(p.getString(TBELLER_PROPERTIES)); 197 } 198 199 String [] tokenize(String s) { 200 if (s == null) 201 return new String [0]; 202 StringTokenizer st = new StringTokenizer (s); 203 String [] a = new String [st.countTokens()]; 204 for (int i = 0; i < a.length; i++) 205 a[i] = st.nextToken(); 206 return a; 207 } 208 209 CompositeResourceProvider createProvider(Locale locale) { 210 CompositeResourceProvider c = new CompositeResourceProvider(); 211 c.add(new SystemResourceProvider()); 212 addPropertyProviders(locale, c); 213 addBundleProviders(locale, c); 214 return c; 215 } 216 217 221 private void addPropertyProviders(Locale locale, CompositeResourceProvider c) { 222 for (int i = 0; i < properties.length; i++) { 223 File f = propertyFile(properties[i], locale); 224 Properties props = new Properties (); 225 FileInputStream fis = null; 226 try { 227 fis = new FileInputStream (f); 228 props.load(fis); 229 c.add(new PropertyResourceProvider(f.getCanonicalPath(), props)); 230 } catch (FileNotFoundException e) { 231 if (logger.isInfoEnabled()) 233 logger.info("optional property file not found: " + f.getAbsolutePath()); 234 } catch (IOException e) { 235 logger.error("error loading " + f.getAbsolutePath(), e); 236 } finally { 237 try { 238 if (fis != null) 239 fis.close(); 240 } catch (IOException e2) { 241 logger.error("error closing " + f.getAbsolutePath(), e2); 242 } 243 } 244 } 245 } 246 247 File propertyFile(String propertyName, Locale locale) { 248 String fn; 249 File f = new File (propertyName); 250 if (f.isAbsolute()) 251 fn = f.getAbsolutePath(); 252 else 253 fn = homeDir.getAbsolutePath() + File.separator + propertyName; 254 return findFile(fn, locale); 255 } 256 257 261 private void addBundleProviders(Locale locale, CompositeResourceProvider c) { 262 for (int i = 0; i < bundles.length; i++) { 263 try { 264 ResourceBundle rb = ResourceBundle.getBundle(bundles[i], locale); 265 c.add(new BundleResourceProvider(bundles[i], rb)); 266 } catch (MissingResourceException e) { 267 if (logger.isInfoEnabled()) 269 logger.info("optional resource bundle not found: " + bundles[i]); 270 } 271 } 272 } 273 274 File findFile(String path, Locale locale) { 275 String ext = ""; 276 277 int pos = path.lastIndexOf('.'); 278 if (pos >= 0) 279 ext = path.substring(pos, path.length()); path = path.substring(0, pos); 281 282 File f = new File (path + "_" + locale.getLanguage() + "_" + locale.getCountry() + ext); 283 if (f.exists()) 284 return f; 285 286 f = new File (path + "_" + locale.getLanguage() + ext); 287 if (f.exists()) 288 return f; 289 290 return new File (path + ext); 291 } 292 293 void initHome(ResourceProvider p) { 294 String dir = p.getString(TBELLER_HOME); 295 if (dir == null || dir.trim().length() == 0) 296 dir = System.getProperty("user.home") + File.separator + ".tonbeller"; 297 homeDir = new File (dir); 298 homeDir.mkdirs(); 299 } 300 301 void initLocale(ResourceProvider p) { 302 fixedLocale = null; 303 String lang = p.getString(TBELLER_LOCALE); 304 if (lang != null) { 305 lang = lang.trim(); 306 if (lang.length() == 2) 307 fixedLocale = new Locale (lang, lang.toUpperCase()); 308 else if (lang.length() == 5) { 309 String l = lang.substring(0, 2); 310 String c = lang.substring(3, 5); 311 fixedLocale = new Locale (l, c); 312 } else if ("browser".equals(lang)) 313 ; } 316 } 317 318 } | Popular Tags |