/**
* 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.internal;
import java.math.BigDecimal;
import org.eclipse.smarthome.config.core.ConfigDescriptionParameter;
import org.eclipse.smarthome.config.core.ConfigDescriptionParameter.Type;
import org.eclipse.smarthome.config.core.ParameterOption;
import org.eclipse.smarthome.config.core.validation.ConfigValidationMessage;
import org.eclipse.smarthome.config.core.validation.internal.TypeIntrospections.TypeIntrospection;
/**
* The {@link ConfigDescriptionParameterValidator} for the minimum and maximum attribute of a
* {@link ConfigDescriptionParameter}.
*
* @author Thomas Höfer - Initial contribution
* @authod Chris Jackson - Allow options to be outside of min/max value
* @param <T>
*/
final class MinMaxValidator implements ConfigDescriptionParameterValidator {
/*
* (non-Javadoc)
*
* @see
* org.eclipse.smarthome.config.core.validation.internal.ConfigDescriptionParameterValidator#validate(org.eclipse.
* smarthome.config.core.ConfigDescriptionParameter, java.lang.Object)
*/
@Override
public ConfigValidationMessage validate(ConfigDescriptionParameter parameter, Object value) {
if (value == null || parameter.getType() == Type.BOOLEAN) {
return null;
}
// Allow specified options to be outside of the min/max value
for (ParameterOption option : parameter.getOptions()) {
// Option values are a string, so we can do a simple compare
if (option.getValue().equals(value.toString())) {
return null;
}
}
TypeIntrospection typeIntrospection = TypeIntrospections.get(parameter.getType());
if (parameter.getMinimum() != null) {
BigDecimal min = parameter.getMinimum();
if (typeIntrospection.isMinViolated(value, min)) {
return createMinMaxViolationMessage(parameter.getName(), typeIntrospection.getMinViolationMessageKey(),
min);
}
}
if (parameter.getMaximum() != null) {
BigDecimal max = parameter.getMaximum();
if (typeIntrospection.isMaxViolated(value, max)) {
return createMinMaxViolationMessage(parameter.getName(), typeIntrospection.getMaxViolationMessageKey(),
max);
}
}
return null;
}
private static ConfigValidationMessage createMinMaxViolationMessage(String parameterName, MessageKey messageKey,
BigDecimal minMax) {
return new ConfigValidationMessage(parameterName, messageKey.defaultMessage, messageKey.key, String.valueOf(minMax));
}
}