Example #1
0
  @Test
  public void getLocalizable() throws Exception {
    Locale locale = new Locale("de_DE");
    Localizable loc;

    Locale l;
    Object o;
    // implements Localizable - no proxy
    o = new Foobar();
    loc = internalGetLocalizable(o, false);
    loc.setLocale(locale);
    l = loc.getLocale();
    assertEquals(locale, l);

    // getter only - proxy
    o = ((Foobar) o).new Internal();
    loc = internalGetLocalizable(o, true);
    loc.setLocale(null);
    l = loc.getLocale();
    assertEquals(locale, l);

    // getter and setter - proxy
    o = new Foobar.StaticInternal();
    loc = internalGetLocalizable(o, true);
    loc.setLocale(locale);
    l = loc.getLocale();
    assertEquals(locale, l);

    // neither getter nor setter - proxy
    o = new Foobar.StaticInternal.Foo();
    loc = internalGetLocalizable(o, true);
    loc.setLocale(locale);
    l = loc.getLocale();
    assertEquals(null, l);
  }
Example #2
0
 private Localizable internalGetLocalizable(Object originalObject, boolean proxy) {
   Localizable result = LocalizableFactory.getLocalizable(originalObject);
   if (logger.isDebugEnabled())
     logger.debug("Localizable for original object {}: {}", originalObject, result);
   if (proxy) {
     Class c = result.getClass();
     String name = c.getName();
     assertTrue("Expected proxy but got " + name + " instead.", name.startsWith("$Proxy"));
   } else {
     assertEquals(originalObject, result);
   }
   return result;
 }
Example #3
0
 private String getDefaultMessage(Localizable l) {
   String key = l.getKey();
   Object[] args = l.getArguments();
   StringBuilder sb = new StringBuilder();
   sb.append("[failed to localize] ");
   sb.append(key);
   if (args != null) {
     sb.append('(');
     for (int i = 0; i < args.length; ++i) {
       if (i != 0) {
         sb.append(", ");
       }
       sb.append(String.valueOf(args[i]));
     }
     sb.append(')');
   }
   return sb.toString();
 }
Example #4
0
  public String localize(Localizable l) {
    String key = l.getKey();
    if (Localizable.NOT_LOCALIZABLE.equals(key)) {
      // this message is not localizable
      return (String) l.getArguments()[0];
    }
    String bundlename = l.getResourceBundleName();

    try {
      ResourceBundle bundle = _resourceBundles.get(bundlename);

      if (bundle == null) {
        try {
          bundle = ResourceBundle.getBundle(bundlename, _locale);
        } catch (MissingResourceException e) {
          // work around a bug in the com.sun.enterprise.deployment.WebBundleArchivist:
          //   all files with an extension different from .class (hence all the .properties files)
          //   get copied to the top level directory instead of being in the package where they
          //   are defined
          // so, since we can't find the bundle under its proper name, we look for it under
          //   the top-level package

          int i = bundlename.lastIndexOf('.');
          if (i != -1) {
            String alternateBundleName = bundlename.substring(i + 1);
            try {
              bundle = ResourceBundle.getBundle(alternateBundleName, _locale);
            } catch (MissingResourceException e2) {
              // try OSGi
              OsgiRegistry osgiRegistry = ReflectionHelper.getOsgiRegistryInstance();
              if (osgiRegistry != null) {
                bundle = osgiRegistry.getResourceBundle(bundlename);
              } else {
                return getDefaultMessage(l);
              }
            }
          }
        }

        _resourceBundles.put(bundlename, bundle);
      }

      if (bundle == null) {
        return getDefaultMessage(l);
      }

      if (key == null) {
        key = "undefined";
      }

      String msg;
      try {
        msg = bundle.getString(key);
      } catch (MissingResourceException e) {
        // notice that this may throw a MissingResourceException of its own (caught below)
        msg = bundle.getString("undefined");
      }

      // localize all arguments to the given localizable object
      Object[] args = l.getArguments();
      for (int i = 0; i < args.length; ++i) {
        if (args[i] instanceof Localizable) {
          args[i] = localize((Localizable) args[i]);
        }
      }

      String message = MessageFormat.format(msg, args);
      return message;

    } catch (MissingResourceException e) {
      return getDefaultMessage(l);
    }
  }