From cd472bc77efe9d67196f784851b2abe87bb56152 Mon Sep 17 00:00:00 2001 From: iMoHax Date: Mon, 21 Mar 2016 15:19:12 +0300 Subject: [PATCH] implement support reusing resource bundle keys --- .../ru/trader/view/support/Localization.java | 4 +- .../support/ReusingResourceBundleControl.java | 103 ++++++++++++++++++ 2 files changed, 105 insertions(+), 2 deletions(-) create mode 100644 client/src/main/java/ru/trader/view/support/ReusingResourceBundleControl.java diff --git a/client/src/main/java/ru/trader/view/support/Localization.java b/client/src/main/java/ru/trader/view/support/Localization.java index 0b6e053..7eb63d1 100644 --- a/client/src/main/java/ru/trader/view/support/Localization.java +++ b/client/src/main/java/ru/trader/view/support/Localization.java @@ -17,7 +17,7 @@ public class Localization { new Locale("en", "US") }; - private static ResourceBundle rb = ResourceBundle.getBundle("locale", DEFAULT, loader); + private static ResourceBundle rb = ResourceBundle.getBundle("locale", DEFAULT, loader, new ReusingResourceBundleControl()); private static Locale locale = DEFAULT; @@ -53,7 +53,7 @@ public class Localization { } public static ResourceBundle getResources(Locale locale){ - return ResourceBundle.getBundle("locale", locale, loader); + return ResourceBundle.getBundle("locale", locale, loader, new ReusingResourceBundleControl()); } public static ResourceBundle getResources(){ diff --git a/client/src/main/java/ru/trader/view/support/ReusingResourceBundleControl.java b/client/src/main/java/ru/trader/view/support/ReusingResourceBundleControl.java new file mode 100644 index 0000000..86089c5 --- /dev/null +++ b/client/src/main/java/ru/trader/view/support/ReusingResourceBundleControl.java @@ -0,0 +1,103 @@ +package ru.trader.view.support; + +import java.io.IOException; +import java.io.InputStream; +import java.io.Reader; +import java.net.URL; +import java.net.URLConnection; +import java.security.AccessController; +import java.security.PrivilegedActionException; +import java.security.PrivilegedExceptionAction; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class ReusingResourceBundleControl extends ResourceBundle.Control { + + + @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; + if (format.equals("java.properties")) { + final String resourceName = toResourceName(bundleName, "properties"); + if (resourceName == null) { + return bundle; + } + InputStream stream; + try { + stream = AccessController.doPrivileged( + (PrivilegedExceptionAction) () -> { + InputStream is = null; + if (reload) { + URL url = loader.getResource(resourceName); + if (url != null) { + URLConnection connection = url.openConnection(); + if (connection != null) { + // Disable caches to get fresh data for + // reloading. + connection.setUseCaches(false); + is = connection.getInputStream(); + } + } + } else { + is = loader.getResourceAsStream(resourceName); + } + return is; + }); + } catch (PrivilegedActionException e) { + throw (IOException) e.getException(); + } + if (stream != null) { + try { + bundle = new ReusingResourceBundle(stream); + } finally { + stream.close(); + } + } + } else { + throw new IllegalArgumentException("unknown format: " + format); + } + return bundle; + } + + private class ReusingResourceBundle extends PropertyResourceBundle { + public ReusingResourceBundle(InputStream stream) throws IOException { + super(stream); + } + + public ReusingResourceBundle(Reader reader) throws IOException { + super(reader); + } + + @Override + public Object handleGetObject(String key) { + try { + return replaceKey(key); + } catch (MissingResourceException ex) { + return super.handleGetObject(key); + } + } + + private Pattern pattern = Pattern.compile("\\$\\{([\\w\\.\\-]+)}"); + + private String replaceKey(String key) { + String message = (String) super.handleGetObject(key); + if (message != null) { + StringBuffer sb = new StringBuffer(); + Matcher matcher = pattern.matcher(message); + while (matcher.find()) { + matcher.appendReplacement(sb, replaceKey(matcher.group(1))); + } + matcher.appendTail(sb); + return sb.toString(); + } + throw new MissingResourceException("Can't find resource for bundle " + + this.getClass().getName() + +", key "+key, + this.getClass().getName(), + key); + } + } + +}