/** * Copyright (c) 2014-2017 by the respective copyright holders. * 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 */ package org.eclipse.smarthome.config.core.validation; import java.text.MessageFormat; import java.util.Collection; import java.util.Locale; import java.util.Map; import org.eclipse.smarthome.config.core.ConfigDescription; import org.eclipse.smarthome.config.core.internal.Activator; import org.osgi.framework.Bundle; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableMap; /** * A runtime exception to be thrown if given {@link Configuration} parameters do not match their declaration in the * {@link ConfigDescription}. * * @author Thomas Höfer - Initial contribution */ public final class ConfigValidationException extends RuntimeException { private static final long serialVersionUID = 1L; private final Logger logger = LoggerFactory.getLogger(ConfigValidationException.class); private final Bundle bundle; private final Collection<ConfigValidationMessage> configValidationMessages; /** * Creates a new {@link ConfigValidationException} for the given {@link ConfigValidationMessage}s. It * requires the bundle from which this exception is thrown in order to be able to provide internationalized * messages. * * @param bundle the bundle from which this exception is thrown * @param configValidationMessages the configuration description validation messages * * @throws NullPointException if given bundle or configuration description validation messages are null */ public ConfigValidationException(Bundle bundle, Collection<ConfigValidationMessage> configValidationMessages) { Preconditions.checkNotNull(bundle, "Bundle must not be null"); Preconditions.checkNotNull(configValidationMessages, "Config validation messages must not be null"); this.bundle = bundle; this.configValidationMessages = configValidationMessages; } /** * Retrieves the default validation messages (cp. {@link ConfigValidationMessage#defaultMessage}) for this * exception. * * @return an immutable map of validation messages having affected configuration parameter name as key and the * default message as value */ public Map<String, String> getValidationMessages() { ImmutableMap.Builder<String, String> builder = new ImmutableMap.Builder<>(); for (ConfigValidationMessage configValidationMessage : configValidationMessages) { builder.put(configValidationMessage.parameterName, MessageFormat.format(configValidationMessage.defaultMessage, configValidationMessage.content)); } return builder.build(); } /** * Retrieves the internationalized validation messages for this exception. If there is no text found to be * internationalized then the default message is delivered. * <p> * If there is no I18nProvider available then this operation will return the default validation messages by using * {@link ConfigValidationException#getValidationMessages()}. * </p> * * @param locale the locale to be used; if null then the default locale will be used * * @return an immutable map of internationalized validation messages having affected configuration parameter name as * key and the internationalized message as value (in case of there was no text found to be * internationalized then the default message (cp. {@link ConfigValidationMessage#defaultMessage}) is * delivered) */ public Map<String, String> getValidationMessages(Locale locale) { ImmutableMap.Builder<String, String> builder = new ImmutableMap.Builder<>(); for (ConfigValidationMessage configValidationMessage : configValidationMessages) { if (Activator.getI18nProvider() == null) { logger.warn( "I18nProvider is not available. Will provide default validation message for parameter '{}'.", configValidationMessage.parameterName); builder.put(configValidationMessage.parameterName, MessageFormat.format(configValidationMessage.defaultMessage, configValidationMessage.content)); } else { String text = Activator.getI18nProvider().getText(bundle, configValidationMessage.messageKey, configValidationMessage.defaultMessage, locale, configValidationMessage.content); builder.put(configValidationMessage.parameterName, text); } } return builder.build(); } }