/* * Copyright (c) 2013 EMC Corporation * All Rights Reserved */ package com.emc.storageos.svcs.errorhandling.utils; import static com.emc.storageos.svcs.errorhandling.utils.MessageUtils.bundleForClass; import static com.emc.storageos.svcs.errorhandling.utils.MessageUtils.bundleForName; import static java.text.MessageFormat.format; import java.lang.reflect.Array; import java.text.MessageFormat; import java.util.*; import org.apache.commons.lang3.text.WordUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.emc.storageos.svcs.errorhandling.resources.ServiceCode; public class Messages { private static final Logger _logger = LoggerFactory.getLogger(Messages.class); private Messages() { // nothing to do } public static String localize(final Locale locale, final ServiceCode code) { try { final ResourceBundle bundle = bundleForClass(ServiceCode.class, locale); return bundle.getString(code.name()); } catch (MissingResourceException e) { _logger.error("Unable to find resource for ServiceCode " + code.name(), e); return WordUtils.capitalize(code.name().replaceAll("_", " ").toLowerCase()); } } public static String localize(final String bundle, final Locale locale, final String key, final Object... parameters) { final String pattern; if (bundle == null) { pattern = key; } else { pattern = getPattern(locale, key, bundle); } if (pattern == null) { return format("Untranslated message (locale={0}, bundle={1}, key={2}, arguments={3})", locale, bundle, key, Arrays.toString(parameters)); } final Object[] arguments = parametersToArguments(parameters); try { final MessageFormat format = new MessageFormat(pattern, locale); return format.format(arguments); } catch (final Exception e) { _logger.warn("Invalid patten defined in {} for {}", bundle, key); return format("{0} (locale={1},bundle={2},key={3},arguments={4})", pattern, locale, bundle, key, Arrays.toString(parameters)); } } private static Object[] parametersToArguments(final Object[] parameters) { if (parameters == null) { return null; } final Object[] arguments = new Object[parameters.length]; for (int i = 0; i < parameters.length; i++) { arguments[i] = get(parameters[i]); } return arguments; } public static Object get(final Object param) { if (param == null) { // parameter is null so return null return null; } if (!isArray(param)) { // parameter is not an array so does not need to be converted return param; } // convert the array to a list final int length = Array.getLength(param); final List<Object> list = new ArrayList<Object>(length); for (int i = 0; i < length; i++) { final Object item = Array.get(param, i); // recursive call! list.add(get(item)); } return list; } private static boolean isArray(final Object object) { return object.getClass().isArray(); } public static String getPattern(final Locale locale, final String key, final String bundle) { if (key != null) { try { return bundleForName(bundle, locale).getString(key); } catch (final Exception e) { _logger.debug("Unable to find a message for {} in {}", key, bundle); } } return null; } }