package at.gv.egiz.eaaf.core.impl.logging; import java.text.MessageFormat; import java.util.Locale; import java.util.MissingResourceException; import org.springframework.context.MessageSource; import org.springframework.context.MessageSourceAware; import org.springframework.context.NoSuchMessageException; import org.springframework.context.i18n.LocaleContextHolder; import at.gv.egiz.eaaf.core.api.IStatusMessenger; import lombok.extern.slf4j.Slf4j; /** * Basic {@link IStatusMessenger} implementation that operates on Spring {@link MessageSource}. * * @author tlenz * */ @Slf4j public class SpringBasedBasicStatusMessager implements IStatusMessenger, MessageSourceAware { private static final String ERROR_MESSAGES_UNAVAILABLE = "Error messages can NOT be load from application." + " Only errorCode: {0} is availabe"; private static final String ERROR_NO_MESSAGE = "No errormesseage for error with number.={0}"; private static final String MSG_WARN_NO_SOURCE = "MessageCode: {} is NOT SET for locale: {}"; private static final String MSG_INFO = "Use locale: {} as default"; private MessageSource messageSource; @Override public String getMessage(String messageId, Object[] parameters) { if (messageSource == null) { return MessageFormat.format(ERROR_MESSAGES_UNAVAILABLE, new Object[]{messageId}); } else { try { final Locale locale = LocaleContextHolder.getLocale(); return messageSource.getMessage(messageId, parameters, locale); } catch (final NoSuchMessageException e) { log.debug(MSG_WARN_NO_SOURCE, messageId, LocaleContextHolder.getLocale()); log.trace(MSG_INFO, Locale.ENGLISH); try { return messageSource.getMessage(messageId, parameters, Locale.ENGLISH); } catch (final NoSuchMessageException e2) { return MessageFormat.format(ERROR_NO_MESSAGE, new Object[]{messageId}); } } catch (final MissingResourceException e2) { return MessageFormat.format(ERROR_NO_MESSAGE, new Object[]{messageId}); } } } @Override public String getMessageWithoutDefault(String messageId, Object[] parameters) { if (messageSource == null) { return null; } else { try { final Locale locale = LocaleContextHolder.getLocale(); return messageSource.getMessage(messageId, parameters, locale); } catch (final NoSuchMessageException e) { log.debug(MSG_WARN_NO_SOURCE, messageId, LocaleContextHolder.getLocale()); log.trace(MSG_INFO, Locale.ENGLISH); try { return messageSource.getMessage(messageId, parameters, Locale.ENGLISH); } catch (final NoSuchMessageException e2) { log.debug(MSG_WARN_NO_SOURCE, messageId, Locale.ENGLISH); } } catch (final MissingResourceException e2) { log.warn("No message source", e2); } } return null; } @Override public String getResponseErrorCode(Throwable throwable) { return IStatusMessenger.CODES_INTERNAL_ERROR_GENERIC; } @Override public String mapInternalErrorToExternalError(String intErrorCode) { return IStatusMessenger.CODES_EXTERNAL_ERROR_GENERIC; } @Override public void setMessageSource(final MessageSource messageSource) { this.messageSource = messageSource; log.info("Injecting '{}' into 'LogMessageProviderFactory'", this.getClass().getName()); LogMessageProviderFactory.setStatusMessager(this); } }