diff options
Diffstat (limited to 'bundles/org.eclipse.e4.tools.services/src/org/eclipse/e4/tools/services/impl/MessageFactoryServiceImpl.java')
-rw-r--r-- | bundles/org.eclipse.e4.tools.services/src/org/eclipse/e4/tools/services/impl/MessageFactoryServiceImpl.java | 66 |
1 files changed, 56 insertions, 10 deletions
diff --git a/bundles/org.eclipse.e4.tools.services/src/org/eclipse/e4/tools/services/impl/MessageFactoryServiceImpl.java b/bundles/org.eclipse.e4.tools.services/src/org/eclipse/e4/tools/services/impl/MessageFactoryServiceImpl.java index 2d8d3496..e09b23b6 100644 --- a/bundles/org.eclipse.e4.tools.services/src/org/eclipse/e4/tools/services/impl/MessageFactoryServiceImpl.java +++ b/bundles/org.eclipse.e4.tools.services/src/org/eclipse/e4/tools/services/impl/MessageFactoryServiceImpl.java @@ -19,15 +19,25 @@ import java.security.PrivilegedAction; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; +import java.util.Locale; import java.util.Map; import java.util.Map.Entry; +import java.util.MissingResourceException; +import java.util.ResourceBundle; import org.eclipse.e4.tools.services.IMessageFactoryService; import org.eclipse.e4.tools.services.Message; import org.eclipse.e4.tools.services.Message.ReferenceType; +import org.eclipse.e4.tools.services.ToolsServicesActivator; +import org.eclipse.osgi.service.localization.BundleLocalization; +import org.osgi.framework.Bundle; +import org.osgi.framework.FrameworkUtil; +import org.osgi.service.log.LogService; public class MessageFactoryServiceImpl implements IMessageFactoryService { + private static LogService logService = ToolsServicesActivator.getDefault().getLogService(); + // Cache so when multiple instance use the same message class private Map<Object, Reference<Object>> SOFT_CACHE = Collections .synchronizedMap(new HashMap<Object, Reference<Object>>()); @@ -37,9 +47,9 @@ public class MessageFactoryServiceImpl implements IMessageFactoryService { private int CLEANUPCOUNT = 0; - public <M> M createInstance(final String locale, final Class<M> messages) + public <M> M createInstance(final String locale, final Class<M> messages, final BundleLocalization localization) throws InstantiationException, IllegalAccessException { - String key = messages.getName() + "_" + locale; + String key = messages.getName() + "_" + locale; //$NON-NLS-1$ final Message annotation = messages.getAnnotation(Message.class); Map<Object, Reference<Object>> cache = null; @@ -85,13 +95,13 @@ public class MessageFactoryServiceImpl implements IMessageFactoryService { M instance; if (System.getSecurityManager() == null) { - instance = doCreateInstance(locale, messages, annotation); + instance = doCreateInstance(locale, messages, annotation, localization); } else { instance = AccessController.doPrivileged(new PrivilegedAction<M>() { public M run() { try { - return doCreateInstance(locale, messages, annotation); + return doCreateInstance(locale, messages, annotation, localization); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { @@ -115,13 +125,49 @@ public class MessageFactoryServiceImpl implements IMessageFactoryService { } private static <M> M doCreateInstance(String locale, Class<M> messages, - Message annotation) throws InstantiationException, + Message annotation, BundleLocalization localization) throws InstantiationException, IllegalAccessException { - String basename = messages.getName().replace('.', '/'); - PropertiesBundleTranslationProvider provider = new PropertiesBundleTranslationProvider( - messages.getClassLoader(), basename); - + Locale loc = null; + try { + loc = locale == null ? Locale.getDefault() : ResourceBundleHelper.toLocale(locale); + } + catch (Exception e) { + //parsing the locale String to a Locale failed, so we use the default Locale + if (logService != null) + logService.log(LogService.LOG_ERROR, "Invalid locale", e); //$NON-NLS-1$ + loc = Locale.getDefault(); + } + + ResourceBundle resourceBundle = null; + if (annotation != null && annotation.contributorURI().length() > 0) { + resourceBundle = ResourceBundleHelper.getResourceBundleForUri(annotation.contributorURI(), loc, localization); + } + + if (resourceBundle == null) { + //check for the resource bundle relative to the messages class + String baseName = messages.getName().replace('.', '/'); + + try { + resourceBundle = ResourceBundleHelper.getEquinoxResourceBundle(baseName, loc, messages.getClassLoader()); + } + catch (MissingResourceException e) { + //do nothing as this just means there is no resource bundle named + //like the messages class in the same package + //therefore we will go on and search for the OSGi resource bundle + } + } + + if (resourceBundle == null) { + //retrieve the OSGi resource bundle + Bundle bundle = FrameworkUtil.getBundle(messages); + resourceBundle = localization.getLocalization(bundle, locale); + } + + //always create a provider, if there is no resource bundle found, simply the modified keys will + //be returned by this provider to show that there is something wrong on loading it + ResourceBundleTranslationProvider provider = new ResourceBundleTranslationProvider(resourceBundle); + M instance = messages.newInstance(); Field[] fields = messages.getDeclaredFields(); @@ -131,7 +177,7 @@ public class MessageFactoryServiceImpl implements IMessageFactoryService { } fields[i].set(instance, - provider.translate(locale, fields[i].getName())); + provider.translate(fields[i].getName())); } return instance; |