]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-3783 Fix regression on fallback
authorFabrice Bellingard <fabrice.bellingard@sonarsource.com>
Mon, 8 Oct 2012 08:35:22 +0000 (10:35 +0200)
committerFabrice Bellingard <fabrice.bellingard@sonarsource.com>
Mon, 8 Oct 2012 08:36:24 +0000 (10:36 +0200)
sonar-core/src/main/java/org/sonar/core/i18n/I18nManager.java
sonar-core/src/test/java/org/sonar/core/i18n/I18nManagerTest.java
sonar-core/src/test/resources/org/sonar/core/i18n/forgePlugin/org/sonar/l10n/forge.properties
sonar-core/src/test/resources/org/sonar/core/i18n/frenchPack/org/sonar/l10n/forge_fr.properties

index 727e7d03905ee354d2ef365f5af3445452173c23..3125faea3fbe62ce79147d4ff4fe2f57ffb1a6dc 100644 (file)
@@ -109,7 +109,15 @@ public class I18nManager implements I18n, ServerExtension, BatchExtension {
     String bundleKey = propertyToBundles.get(key);
     ResourceBundle resourceBundle = null;
     if (bundleKey != null) {
-      resourceBundle = getBundle(bundleKey, locale);
+      try {
+        // First, we check if the bundle exists in the language pack classloader
+        resourceBundle = ResourceBundle.getBundle(bundleKey, locale, languagePackClassLoader);
+        String message = resourceBundle.getString(key);
+        return MessageFormat.format(message, parameters);
+      } catch (MissingResourceException e1) {
+        // well, maybe the plugin has specified its own bundles, let's see
+        resourceBundle = getBundleFromCorrespondingPluginClassloader(bundleKey, locale);
+      }
     }
     return message(resourceBundle, key, defaultValue, parameters);
   }
@@ -135,14 +143,7 @@ public class I18nManager implements I18n, ServerExtension, BatchExtension {
       filePath += "/" + filename;
       InputStream input = classloader.getResourceAsStream(filePath);
       if (input != null) {
-        try {
-          result = IOUtils.toString(input, "UTF-8");
-
-        } catch (IOException e) {
-          throw new SonarException("Fail to load file: " + filePath, e);
-        } finally {
-          IOUtils.closeQuietly(input);
-        }
+        result = readInputStream(filePath, input);
       }
 
       if (keepInCache) {
@@ -157,27 +158,32 @@ public class I18nManager implements I18n, ServerExtension, BatchExtension {
     return result;
   }
 
+  String readInputStream(String filePath, InputStream input) {
+    String result = null;
+    try {
+      result = IOUtils.toString(input, "UTF-8");
+    } catch (IOException e) {
+      throw new SonarException("Fail to load file: " + filePath, e);
+    } finally {
+      IOUtils.closeQuietly(input);
+    }
+    return result;
+  }
+
   Set<String> getPropertyKeys() {
     return propertyToBundles.keySet();
   }
 
-  ResourceBundle getBundle(String bundleKey, Locale locale) {
-    ResourceBundle bundle = null;
-    try {
-      // First, we check if the bundle exists in the language pack classloader
-      bundle = ResourceBundle.getBundle(bundleKey, locale, languagePackClassLoader);
-    } catch (MissingResourceException e1) {
-      // well, maybe the plugin has specified its own bundles, let's see
-      ClassLoader classloader = bundleToClassloaders.get(bundleKey);
-      if (classloader != null) {
-        try {
-          bundle = ResourceBundle.getBundle(bundleKey, locale, classloader);
-        } catch (MissingResourceException e2) {
-          // Well, here, there's nothing much we can do...
-        }
+  ResourceBundle getBundleFromCorrespondingPluginClassloader(String bundleKey, Locale locale) {
+    ClassLoader classloader = bundleToClassloaders.get(bundleKey);
+    if (classloader != null) {
+      try {
+        return ResourceBundle.getBundle(bundleKey, locale, classloader);
+      } catch (MissingResourceException e2) {
+        // Well, here, there's nothing much we can do...
       }
     }
-    return bundle;
+    return null;
   }
 
   ClassLoader getClassLoaderForProperty(String propertyKey, Locale locale) {
index be28db66446ae2f732b740654d9e2f4e6c944a49..5a2d6e8205feabbf61e43296949541e74291b6f3 100644 (file)
@@ -212,7 +212,16 @@ public class I18nManagerTest {
   @Test
   public void shouldLookInCoreClassloaderForPluginsThatDontEmbedAllLanguages() {
     assertThat(manager.message(Locale.ENGLISH, "forge_plugin.page", null)).isEqualTo("This is my plugin");
-    assertThat(manager.message(Locale.FRENCH, "forge_plugin.page", null)).isEqualTo("C'est mon plugin");
+    assertThat(manager.message(Locale.FRENCH, "forge_plugin.page", null)).isEqualTo("Mon plugin!");
+  }
+
+  // see SONAR-3783 => test that there will be no future regression on fallback for keys spread accross several classloaders
+  @Test
+  public void shouldFallbackOnOriginalPluginIfTranslationNotPresentInLanguagePack() {
+    // the "forge_plugin.page" has been translated in French
+    assertThat(manager.message(Locale.FRENCH, "forge_plugin.page", null)).isEqualTo("Mon plugin!");
+    // but not the "forge_plugin.key_not_translated" key
+    assertThat(manager.message(Locale.FRENCH, "forge_plugin.key_not_translated", null)).isEqualTo("Key Not Translated");
   }
 
   private URLClassLoader newForgeClassLoader() {
index f2ccf6fc16f3b8527a3faffe8b4f6fc963368308..4d907c9fbbba23c001306593c9eb172cd23d8453 100644 (file)
@@ -1 +1,2 @@
-forge_plugin.page=This is my plugin
\ No newline at end of file
+forge_plugin.page=This is my plugin
+forge_plugin.key_not_translated=Key Not Translated
\ No newline at end of file
index 96fb089d580471891540e9532554ed731e428018..9d06fab3ec797b0df2164eb53427f1cdf245d49f 100644 (file)
@@ -1 +1 @@
-forge_plugin.page=C'est mon plugin
\ No newline at end of file
+forge_plugin.page=Mon plugin!
\ No newline at end of file