Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
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.java66
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;

Back to the top