X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=base%2Fruntime%2Forg.argeo.eclipse.ui.rcp%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Feclipse%2Fui%2Fspecific%2FThreadNLS.java;fp=base%2Fruntime%2Forg.argeo.eclipse.ui.rcp%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Feclipse%2Fui%2Fspecific%2FThreadNLS.java;h=8fd1d7e390ac00e919522256e85eb2408ef8d145;hb=00474cf92c05359177aba1768bd2ef95a310afaf;hp=0000000000000000000000000000000000000000;hpb=82fc1287c13e9bd42b96af762a1c0f1549c82a4f;p=lgpl%2Fargeo-commons.git diff --git a/base/runtime/org.argeo.eclipse.ui.rcp/src/main/java/org/argeo/eclipse/ui/specific/ThreadNLS.java b/base/runtime/org.argeo.eclipse.ui.rcp/src/main/java/org/argeo/eclipse/ui/specific/ThreadNLS.java new file mode 100644 index 000000000..8fd1d7e39 --- /dev/null +++ b/base/runtime/org.argeo.eclipse.ui.rcp/src/main/java/org/argeo/eclipse/ui/specific/ThreadNLS.java @@ -0,0 +1,74 @@ +package org.argeo.eclipse.ui.specific; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.util.MissingResourceException; +import java.util.ResourceBundle; + +import org.argeo.util.LocaleUtils; +import org.eclipse.osgi.util.NLS; + +/** NLS attached to a given thread */ +public class ThreadNLS extends InheritableThreadLocal { + public final static String DEFAULT_BUNDLE_LOCATION = "/properties/plugin"; + + private final String bundleLocation; + + private Class type; + private Boolean utf8 = false; + + public ThreadNLS(String bundleLocation, Class type, Boolean utf8) { + this.bundleLocation = bundleLocation; + this.type = type; + this.utf8 = utf8; + } + + public ThreadNLS(Class type) { + this(DEFAULT_BUNDLE_LOCATION, type, false); + } + + @Override + protected T initialValue() { + ResourceBundle bundle = ResourceBundle.getBundle(bundleLocation, + LocaleUtils.threadLocale.get(), type.getClassLoader()); + T result; + try { + NLS.initializeMessages(bundleLocation, type); + Constructor constructor = type.getConstructor(); + constructor.setAccessible(true); + result = constructor.newInstance(); + final Field[] fieldArray = type.getDeclaredFields(); + for (int i = 0; i < fieldArray.length; i++) { + int modifiers = fieldArray[i].getModifiers(); + if (String.class.isAssignableFrom(fieldArray[i].getType()) + && Modifier.isPublic(modifiers) + && !Modifier.isStatic(modifiers)) { + try { + String value = bundle + .getString(fieldArray[i].getName()); + byte[] bytes = value.getBytes(); + + String forcedValue; + if (utf8) + forcedValue = new String(bytes, "UTF8"); + else + forcedValue = value; + if (value != null) { + fieldArray[i].setAccessible(true); + fieldArray[i].set(result, forcedValue); + } + } catch (final MissingResourceException mre) { + fieldArray[i].setAccessible(true); + fieldArray[i].set(result, ""); + mre.printStackTrace(); + } + } + } + return result; + } catch (final Exception ex) { + throw new IllegalStateException(ex.getMessage()); + } + } + +}