package ameba.i18n; import ameba.util.IOUtils; import com.google.common.base.Charsets; import java.io.IOException; import java.io.InputStreamReader; import java.net.URL; import java.net.URLConnection; import java.security.AccessController; import java.security.PrivilegedActionException; import java.security.PrivilegedExceptionAction; import java.util.Enumeration; import java.util.Locale; import java.util.Properties; import java.util.ResourceBundle; /** * <p>MultiResourceBundleControl class.</p> * * @author icode * */ public class MultiResourceBundleControl extends ResourceBundle.Control { boolean noCache = false; /** * {@inheritDoc} */ @Override public long getTimeToLive(String baseName, Locale locale) { return noCache ? ResourceBundle.Control.TTL_DONT_CACHE : super.getTimeToLive(baseName, locale); } /** {@inheritDoc} */ @Override public ResourceBundle newBundle( String baseName, Locale locale, String format, ClassLoader loader, boolean reload) throws IllegalAccessException, InstantiationException, IOException { String bundleName = toBundleName(baseName, locale); ResourceBundle bundle = null; switch (format) { case "java.class": try { Class bundleClass = loader.loadClass(bundleName); // If the class isn't a ResourceBundle subclass, throw a // ClassCastException. if (ResourceBundle.class.isAssignableFrom(bundleClass)) { bundle = (ResourceBundle) bundleClass.newInstance(); } else { throw new ClassCastException(bundleClass.getName() + " cannot be cast to ResourceBundle"); } } catch (ClassNotFoundException e) { // no op } break; case "java.properties": final String resourceName = toResourceName(bundleName, "properties"); final ClassLoader classLoader = loader; final boolean reloadFlag = reload; Properties properties; try { properties = AccessController.doPrivileged( (PrivilegedExceptionAction<Properties>) () -> { Properties properties1 = null; Enumeration<URL> urls = classLoader.getResources(resourceName); if (urls != null && urls.hasMoreElements()) { properties1 = new Properties(); while (urls.hasMoreElements()) { URL url = urls.nextElement(); if (url.getPath().endsWith("/classes/" + resourceName)) continue; URLConnection connection = url.openConnection(); if (connection != null) { // Disable caches to get fresh data for // reloading. if (reloadFlag) { connection.setUseCaches(false); } InputStreamReader reader = null; try { reader = new InputStreamReader( connection.getInputStream(), Charsets.UTF_8); properties1.load(reader); } finally { IOUtils.closeQuietly(reader); } } } } return properties1; }); } catch (PrivilegedActionException e) { throw (IOException) e.getException(); } if (properties != null) { bundle = new PropertiesResourceBundle(properties); } break; default: throw new IllegalArgumentException("unknown format: " + format); } return bundle; } }