/******************************************************************************* *******************************************************************************/ package at.gv.egiz.eidas.specific.connector.provider; import java.text.MessageFormat; import java.util.Locale; import java.util.MissingResourceException; import java.util.PropertyResourceBundle; import java.util.ResourceBundle; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import at.gv.egiz.eaaf.core.api.IStatusMessenger; import at.gv.egiz.eaaf.core.exceptions.EAAFException; @Service("StatusMessageProvider") public class StatusMessageProvider implements IStatusMessenger { private static final Logger log = LoggerFactory.getLogger(StatusMessageProvider.class); 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 ERROR_EXTERNALERROR_CODES_UNAVAILABLE = "External error-codes can NOT be load from application. Only internal errorCode: {0} is availabe" ; private static final String ERROR_NO_EXTERNALERROR_CODE = "No external error for internal error with number.={0}"; //internal messanges private static final String DEFAULT_MESSAGE_RESOURCES = "properties/status_messages_en"; private static final Locale DEFAULT_MESSAGE_LOCALES = new Locale("en", "GB"); private ResourceBundle messages; //external error codes private static final String DEFAULT_EXTERNALERROR_RESOURCES = "properties/external_statuscodes_map"; private static final Locale DEFAULT_EXTERNALERROR_LOCALES = new Locale("en", "GB"); private ResourceBundle externalError = null; @Override public String getMessage(String messageId, Object[] parameters) { // initialize messages if (messages == null) { this.messages = PropertyResourceBundle.getBundle( DEFAULT_MESSAGE_RESOURCES, DEFAULT_MESSAGE_LOCALES); } // create the message if (messages == null) { return MessageFormat.format(ERROR_MESSAGES_UNAVAILABLE, new Object[] { messageId }); } else { try { String rawMessage = messages.getString(messageId); return MessageFormat.format(rawMessage, parameters); } catch (MissingResourceException e2) { return MessageFormat.format(ERROR_NO_MESSAGE, new Object[] { messageId }); } } } @Override public String getResponseErrorCode(Throwable throwable) { String errorCode = IStatusMessenger.CODES_EXTERNAL_ERROR_GENERIC; if (throwable instanceof EAAFException) { errorCode = ((EAAFException) throwable).getErrorId(); } //TODO: maybe more internal switches are required return errorCode; } @Override public String mapInternalErrorToExternalError(String intErrorCode) { // initialize messages if (externalError == null) { this.externalError = PropertyResourceBundle.getBundle( DEFAULT_EXTERNALERROR_RESOURCES, DEFAULT_EXTERNALERROR_LOCALES); } // create the message if (externalError == null) { log.warn(MessageFormat.format(ERROR_EXTERNALERROR_CODES_UNAVAILABLE, new Object[] { intErrorCode })); return IStatusMessenger.CODES_EXTERNAL_ERROR_GENERIC; } else { try { return externalError.getString(intErrorCode); } catch (MissingResourceException e2) { log.info(MessageFormat.format(ERROR_NO_EXTERNALERROR_CODE, new Object[] { intErrorCode })); return IStatusMessenger.CODES_EXTERNAL_ERROR_GENERIC; } } } }