/*******************************************************************************
* Copyright (c) 2011, 2016 Eurotech and/or its affiliates
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Eurotech
*******************************************************************************/
package org.eclipse.kura;
import java.text.MessageFormat;
import java.util.Locale;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class KuraRuntimeException extends RuntimeException
{
private static final long serialVersionUID = -7202805328805688329L;
private static final Logger s_logger = LoggerFactory.getLogger(KuraRuntimeException.class);
private static final String KURA_GENERIC_MESSAGES_PATTERN = "Generic Error - {0}: {1}";
private static final String KURA_EXCEPTION_MESSAGES_BUNDLE = "org.eclipse.kura.core.messages.KuraExceptionMessagesBundle";
//TODO - add back when logger is working
//private static final Logger s_logger = LoggerFactory.getLogger(KuraException.class);
protected KuraErrorCode m_code;
private Object[] m_arguments;
@SuppressWarnings("unused")
private KuraRuntimeException() {
super();
}
/**
* Builds a new EdcException instance based on the supplied EdcErrorCode.
*
* @param code
*/
public KuraRuntimeException(KuraErrorCode code) {
m_code = code;
}
/**
* Builds a new EdcException instance based on the supplied EdcErrorCode.
*
* @param code
* @param arguments
*/
public KuraRuntimeException(KuraErrorCode code, Object... arguments) {
m_code = code;
m_arguments = arguments;
}
/**
* Builds a new EdcException instance based on the supplied EdcErrorCode, an optional Throwable cause, and optional arguments for the associated exception message.
*
* @param code
* @param cause
* @param arguments
*/
public KuraRuntimeException(KuraErrorCode code, Throwable cause, Object... arguments) {
super(cause);
m_code = code;
m_arguments = arguments;
}
public KuraErrorCode getCode() {
return m_code;
}
public String getMessage() {
return getLocalizedMessage(Locale.US);
}
public String getLocalizedMessage() {
return getLocalizedMessage(Locale.getDefault());
}
private String getLocalizedMessage(Locale locale)
{
String pattern = getMessagePattern(locale, m_code);
if (m_code == null || KuraErrorCode.INTERNAL_ERROR.equals(m_code)) {
if (m_arguments != null && m_arguments.length > 1) {
// append all arguments into a single one
StringBuilder sbAllArgs = new StringBuilder();
for (Object arg : m_arguments) {
sbAllArgs.append(" - ");
sbAllArgs.append(arg);
}
m_arguments = new Object[] {sbAllArgs.toString()};
}
}
String message = MessageFormat.format(pattern, m_arguments);
return message;
}
private String getMessagePattern(Locale locale, KuraErrorCode code)
{
//
// Load the message pattern from the bundle
String messagePattern = null;
ResourceBundle resourceBundle = null;
try {
resourceBundle = ResourceBundle.getBundle(KURA_EXCEPTION_MESSAGES_BUNDLE, locale);
if (resourceBundle != null && code != null) {
messagePattern = resourceBundle.getString(code.name());
if (messagePattern == null) {
s_logger.warn("Could not find Exception Messages for Locale {} and code {}", locale, code);
}
}
} catch (MissingResourceException mre) {
// log the failure to load a message bundle
s_logger.warn("Could not load Exception Messages Bundle for Locale {}", locale);
}
//
// If no bundle or code in the bundle is found, use a generic message
if (messagePattern == null) {
if (code != null) {
// build a generic message format
messagePattern = MessageFormat.format(KURA_GENERIC_MESSAGES_PATTERN, code.name());
}
else {
// build a generic message format
messagePattern = MessageFormat.format(KURA_GENERIC_MESSAGES_PATTERN, "Unknown");
}
}
return messagePattern;
}
}