[config] Add nullness annotations to config validation (#2690)

Signed-off-by: Christoph Weitkamp <github@christophweitkamp.de>
pull/2741/head
Christoph Weitkamp 2022-02-06 20:30:20 +01:00 committed by GitHub
parent 5a4b6fedce
commit 87ecfade74
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 84 additions and 121 deletions

View File

@ -12,6 +12,8 @@
*/
package org.openhab.core.config.core.internal.validation;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.config.core.ConfigDescriptionParameter;
import org.openhab.core.config.core.validation.ConfigValidationMessage;
@ -21,6 +23,7 @@ import org.openhab.core.config.core.validation.ConfigValidationMessage;
*
* @author Thomas Höfer - Initial contribution
*/
@NonNullByDefault
public interface ConfigDescriptionParameterValidator {
/**
@ -32,5 +35,6 @@ public interface ConfigDescriptionParameterValidator {
* @return a {@link ConfigValidationMessage} if value does not meet the declaration of the parameter,
* otherwise null
*/
ConfigValidationMessage validate(ConfigDescriptionParameter parameter, Object value);
@Nullable
ConfigValidationMessage validate(ConfigDescriptionParameter parameter, @Nullable Object value);
}

View File

@ -12,12 +12,15 @@
*/
package org.openhab.core.config.core.internal.validation;
import org.eclipse.jdt.annotation.NonNullByDefault;
/**
* The {@link ConfigDescriptionParameterValidatorFactory} creates the corresponding
* {@link ConfigDescriptionParameterValidator}s used by ConfigDescriptionValidator.
*
* @author Thomas Höfer - Initial contribution
*/
@NonNullByDefault
public final class ConfigDescriptionParameterValidatorFactory {
private ConfigDescriptionParameterValidatorFactory() {

View File

@ -14,13 +14,13 @@ package org.openhab.core.config.core.internal.validation;
import java.net.URI;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.config.core.ConfigDescription;
import org.openhab.core.config.core.ConfigDescriptionParameter;
import org.openhab.core.config.core.ConfigDescriptionRegistry;
@ -32,10 +32,7 @@ import org.openhab.core.i18n.TranslationProvider;
import org.osgi.framework.BundleContext;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Deactivate;
import org.osgi.service.component.annotations.Reference;
import org.osgi.service.component.annotations.ReferenceCardinality;
import org.osgi.service.component.annotations.ReferencePolicy;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -49,29 +46,29 @@ import org.slf4j.LoggerFactory;
* @author Chris Jackson - Handle checks on multiple selection parameters
*/
@Component
@NonNullByDefault
public final class ConfigDescriptionValidatorImpl implements ConfigDescriptionValidator {
private static final List<ConfigDescriptionParameterValidator> VALIDATORS = List.of( //
ConfigDescriptionParameterValidatorFactory.createRequiredValidator(), //
ConfigDescriptionParameterValidatorFactory.createTypeValidator(), //
ConfigDescriptionParameterValidatorFactory.createMinMaxValidator(), //
ConfigDescriptionParameterValidatorFactory.createPatternValidator() //
);
private final Logger logger = LoggerFactory.getLogger(ConfigDescriptionValidatorImpl.class);
private ConfigDescriptionRegistry configDescriptionRegistry;
private TranslationProvider translationProvider;
private static final List<ConfigDescriptionParameterValidator> VALIDATORS = Collections
.unmodifiableList(Arrays.asList(ConfigDescriptionParameterValidatorFactory.createRequiredValidator(),
ConfigDescriptionParameterValidatorFactory.createTypeValidator(),
ConfigDescriptionParameterValidatorFactory.createMinMaxValidator(),
ConfigDescriptionParameterValidatorFactory.createPatternValidator()));
private BundleContext bundleContext;
private final ConfigDescriptionRegistry configDescriptionRegistry;
private final TranslationProvider translationProvider;
private final BundleContext bundleContext;
@Activate
protected void activate(BundleContext bundleContext) {
public ConfigDescriptionValidatorImpl(final BundleContext bundleContext,
final @Reference ConfigDescriptionRegistry configDescriptionRegistry,
final @Reference TranslationProvider translationProvider) {
this.bundleContext = bundleContext;
}
@Deactivate
protected void deactivate() {
this.bundleContext = null;
this.configDescriptionRegistry = configDescriptionRegistry;
this.translationProvider = translationProvider;
}
/**
@ -86,7 +83,7 @@ public final class ConfigDescriptionValidatorImpl implements ConfigDescriptionVa
* @throws NullPointerException if given config description URI or configuration parameters are null
*/
@Override
@SuppressWarnings("unchecked")
@SuppressWarnings({ "unchecked", "null" })
public void validate(Map<String, Object> configurationParameters, URI configDescriptionURI) {
Objects.requireNonNull(configurationParameters, "Configuration parameters must not be null");
Objects.requireNonNull(configDescriptionURI, "Config description URI must not be null");
@ -150,8 +147,8 @@ public final class ConfigDescriptionValidatorImpl implements ConfigDescriptionVa
* @return the {@link ConfigValidationMessage} if the given value is not valid for the config description parameter,
* otherwise null
*/
private ConfigValidationMessage validateParameter(ConfigDescriptionParameter configDescriptionParameter,
Object value) {
private @Nullable ConfigValidationMessage validateParameter(ConfigDescriptionParameter configDescriptionParameter,
@Nullable Object value) {
for (ConfigDescriptionParameterValidator validator : VALIDATORS) {
ConfigValidationMessage message = validator.validate(configDescriptionParameter, value);
if (message != null) {
@ -170,33 +167,11 @@ public final class ConfigDescriptionValidatorImpl implements ConfigDescriptionVa
* config description registry is not available or because of config description could not be found for
* given URI)
*/
private ConfigDescription getConfigDescription(URI configDescriptionURI) {
if (configDescriptionRegistry == null) {
logger.warn("No config description registry available.");
return null;
}
private @Nullable ConfigDescription getConfigDescription(URI configDescriptionURI) {
ConfigDescription configDescription = configDescriptionRegistry.getConfigDescription(configDescriptionURI);
if (configDescription == null) {
logger.warn("No config description found for URI '{}'", configDescriptionURI);
}
return configDescription;
}
@Reference(cardinality = ReferenceCardinality.OPTIONAL, policy = ReferencePolicy.DYNAMIC)
protected void setConfigDescriptionRegistry(ConfigDescriptionRegistry configDescriptionRegistry) {
this.configDescriptionRegistry = configDescriptionRegistry;
}
protected void unsetConfigDescriptionRegistry(ConfigDescriptionRegistry configDescriptionRegistry) {
this.configDescriptionRegistry = null;
}
@Reference(cardinality = ReferenceCardinality.OPTIONAL, policy = ReferencePolicy.DYNAMIC)
protected void setTranslationProvider(TranslationProvider translationProvider) {
this.translationProvider = translationProvider;
}
protected void unsetTranslationProvider(TranslationProvider translationProvider) {
this.translationProvider = null;
}
}

View File

@ -12,15 +12,18 @@
*/
package org.openhab.core.config.core.internal.validation;
import org.eclipse.jdt.annotation.NonNullByDefault;
/**
* Utility class providing the {@link MessageKey}s for config description validation. The {@link MessageKey}
* consists of a key to be used for internationalization and a general default text.
*
* @author Thomas Höfer - Initial contribution
*/
@NonNullByDefault
final class MessageKey {
static final MessageKey PARAMETER_REQUIRED = new MessageKey("parameter_required", "The parameter is required");
static final MessageKey PARAMETER_REQUIRED = new MessageKey("parameter_required", "The parameter is required.");
static final MessageKey DATA_TYPE_VIOLATED = new MessageKey("data_type_violated",
"The data type of the value ({0}) does not match with the type declaration ({1}) in the configuration description.");

View File

@ -14,6 +14,8 @@ package org.openhab.core.config.core.internal.validation;
import java.math.BigDecimal;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.config.core.ConfigDescriptionParameter;
import org.openhab.core.config.core.ConfigDescriptionParameter.Type;
import org.openhab.core.config.core.ParameterOption;
@ -26,12 +28,12 @@ import org.openhab.core.config.core.validation.ConfigValidationMessage;
*
* @author Thomas Höfer - Initial contribution
* @authod Chris Jackson - Allow options to be outside of min/max value
* @param <T>
*/
@NonNullByDefault
final class MinMaxValidator implements ConfigDescriptionParameterValidator {
@Override
public ConfigValidationMessage validate(ConfigDescriptionParameter parameter, Object value) {
public @Nullable ConfigValidationMessage validate(ConfigDescriptionParameter parameter, @Nullable Object value) {
if (value == null || parameter.getType() == Type.BOOLEAN) {
return null;
}
@ -61,7 +63,6 @@ final class MinMaxValidator implements ConfigDescriptionParameterValidator {
max);
}
}
return null;
}

View File

@ -12,6 +12,8 @@
*/
package org.openhab.core.config.core.internal.validation;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.config.core.ConfigDescriptionParameter;
import org.openhab.core.config.core.ConfigDescriptionParameter.Type;
import org.openhab.core.config.core.validation.ConfigValidationMessage;
@ -22,10 +24,11 @@ import org.openhab.core.config.core.validation.ConfigValidationMessage;
*
* @author Thomas Höfer - Initial contribution
*/
@NonNullByDefault
final class PatternValidator implements ConfigDescriptionParameterValidator {
@Override
public ConfigValidationMessage validate(ConfigDescriptionParameter parameter, Object value) {
public @Nullable ConfigValidationMessage validate(ConfigDescriptionParameter parameter, @Nullable Object value) {
if (value == null || parameter.getType() != Type.TEXT || parameter.getPattern() == null) {
return null;
}
@ -35,7 +38,6 @@ final class PatternValidator implements ConfigDescriptionParameterValidator {
return new ConfigValidationMessage(parameter.getName(), messageKey.defaultMessage, messageKey.key,
String.valueOf(value), parameter.getPattern());
}
return null;
}
}

View File

@ -12,6 +12,8 @@
*/
package org.openhab.core.config.core.internal.validation;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.config.core.ConfigDescriptionParameter;
import org.openhab.core.config.core.validation.ConfigValidationMessage;
@ -20,15 +22,15 @@ import org.openhab.core.config.core.validation.ConfigValidationMessage;
*
* @author Thomas Höfer - Initial contribution
*/
@NonNullByDefault
final class RequiredValidator implements ConfigDescriptionParameterValidator {
@Override
public ConfigValidationMessage validate(ConfigDescriptionParameter param, Object value) {
public @Nullable ConfigValidationMessage validate(ConfigDescriptionParameter param, @Nullable Object value) {
if (param.isRequired() && value == null) {
MessageKey messageKey = MessageKey.PARAMETER_REQUIRED;
return new ConfigValidationMessage(param.getName(), messageKey.defaultMessage, messageKey.key);
}
return null;
}
}

View File

@ -12,8 +12,6 @@
*/
package org.openhab.core.config.core.internal.validation;
import static java.util.Map.entry;
import java.math.BigDecimal;
import java.util.Map;
@ -27,9 +25,12 @@ import org.openhab.core.config.core.ConfigDescriptionParameter.Type;
*/
final class TypeIntrospections {
private static final Map<Type, TypeIntrospection> INTROSPECTIONS = Map.ofEntries(
entry(Type.BOOLEAN, new BooleanIntrospection()), entry(Type.TEXT, new StringIntrospection()),
entry(Type.INTEGER, new IntegerIntrospection()), entry(Type.DECIMAL, new FloatIntrospection()));
private static final Map<Type, TypeIntrospection> INTROSPECTIONS = Map.of( //
Type.BOOLEAN, new BooleanIntrospection(), //
Type.TEXT, new StringIntrospection(), //
Type.INTEGER, new IntegerIntrospection(), //
Type.DECIMAL, new FloatIntrospection() //
);
private TypeIntrospections() {
super();

View File

@ -12,8 +12,9 @@
*/
package org.openhab.core.config.core.internal.validation;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.config.core.ConfigDescriptionParameter;
import org.openhab.core.config.core.ConfigDescriptionParameter.Type;
import org.openhab.core.config.core.internal.validation.TypeIntrospections.TypeIntrospection;
import org.openhab.core.config.core.validation.ConfigValidationMessage;
@ -23,25 +24,21 @@ import org.openhab.core.config.core.validation.ConfigValidationMessage;
*
* @author Thomas Höfer - Initial contribution
*/
@NonNullByDefault
final class TypeValidator implements ConfigDescriptionParameterValidator {
@Override
public ConfigValidationMessage validate(ConfigDescriptionParameter parameter, Object value) {
public @Nullable ConfigValidationMessage validate(ConfigDescriptionParameter parameter, @Nullable Object value) {
if (value == null) {
return null;
}
TypeIntrospection typeIntrospection = TypeIntrospections.get(parameter.getType());
if (!typeIntrospection.isAssignable(value)) {
return createDataTypeViolationMessage(parameter.getName(), parameter.getType(), value.getClass());
return new ConfigValidationMessage(parameter.getName(), MessageKey.DATA_TYPE_VIOLATED.defaultMessage,
MessageKey.DATA_TYPE_VIOLATED.key, value.getClass(), parameter.getType());
}
return null;
}
private static ConfigValidationMessage createDataTypeViolationMessage(String parameterName, Type type,
Class<?> clazz) {
return new ConfigValidationMessage(parameterName, MessageKey.DATA_TYPE_VIOLATED.defaultMessage,
MessageKey.DATA_TYPE_VIOLATED.key, clazz, type);
}
}

View File

@ -15,6 +15,7 @@ package org.openhab.core.config.core.validation;
import java.net.URI;
import java.util.Map;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.openhab.core.config.core.ConfigDescription;
import org.openhab.core.config.core.Configuration;
@ -27,6 +28,7 @@ import org.openhab.core.config.core.Configuration;
* @author Thomas Höfer - Initial contribution
* @author Chris Jackson - Handle checks on multiple selection parameters
*/
@NonNullByDefault
public interface ConfigDescriptionValidator {
/**

View File

@ -12,10 +12,8 @@
*/
package org.openhab.core.config.core.internal.validation;
import static java.util.stream.Collectors.toList;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.*;
@ -26,7 +24,6 @@ import java.net.URISyntaxException;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Stream;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
@ -41,10 +38,9 @@ import org.openhab.core.config.core.ConfigDescriptionRegistry;
import org.openhab.core.config.core.validation.ConfigDescriptionValidator;
import org.openhab.core.config.core.validation.ConfigValidationException;
import org.openhab.core.config.core.validation.ConfigValidationMessage;
import org.openhab.core.i18n.TranslationProvider;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Testing the {@link ConfigDescriptionValidator}.
@ -54,8 +50,6 @@ import org.slf4j.LoggerFactory;
*/
public class ConfigDescriptionValidatorTest {
private final Logger logger = LoggerFactory.getLogger(ConfigDescriptionValidatorTest.class);
private static final int MIN_VIOLATED = 1;
private static final int MAX_VIOLATED = 1234;
@ -144,10 +138,10 @@ public class ConfigDescriptionValidatorTest {
}
private static final ConfigDescription CONFIG_DESCRIPTION = ConfigDescriptionBuilder.create(CONFIG_DESCRIPTION_URI)
.withParameters(Stream.of(BOOL_PARAM, BOOL_REQUIRED_PARAM, TXT_PARAM, TXT_REQUIRED_PARAM, TXT_MIN_PARAM,
.withParameters(List.of(BOOL_PARAM, BOOL_REQUIRED_PARAM, TXT_PARAM, TXT_REQUIRED_PARAM, TXT_MIN_PARAM,
TXT_MAX_PARAM, TXT_PATTERN_PARAM, TXT_MAX_PATTERN_PARAM, TXT_MULTIPLE_LIMIT_PARAM, INT_PARAM,
INT_REQUIRED_PARAM, INT_MIN_PARAM, INT_MAX_PARAM, DECIMAL_PARAM, DECIMAL_REQUIRED_PARAM,
DECIMAL_MIN_PARAM, DECIMAL_MAX_PARAM).collect(toList()))
DECIMAL_MIN_PARAM, DECIMAL_MAX_PARAM))
.build();
private Map<String, Object> params;
@ -165,9 +159,8 @@ public class ConfigDescriptionValidatorTest {
BundleContext bundleContext = mock(BundleContext.class);
when(bundleContext.getBundle()).thenReturn(mock(Bundle.class));
configDescriptionValidator = new ConfigDescriptionValidatorImpl();
configDescriptionValidator.setConfigDescriptionRegistry(configDescriptionRegistry);
configDescriptionValidator.activate(bundleContext);
configDescriptionValidator = new ConfigDescriptionValidatorImpl(bundleContext, configDescriptionRegistry,
mock(TranslationProvider.class));
params = new LinkedHashMap<>();
params.put(BOOL_PARAM_NAME, null);
@ -232,7 +225,7 @@ public class ConfigDescriptionValidatorTest {
@Test
public void assertValidationThrowsExceptionContainingMessagesForAllRequiredConfigParameters() {
List<ConfigValidationMessage> expected = Stream.of(
List<ConfigValidationMessage> expected = List.of(
new ConfigValidationMessage(BOOL_REQUIRED_PARAM_NAME, MessageKey.PARAMETER_REQUIRED.defaultMessage,
MessageKey.PARAMETER_REQUIRED.key),
new ConfigValidationMessage(DECIMAL_REQUIRED_PARAM_NAME, MessageKey.PARAMETER_REQUIRED.defaultMessage,
@ -240,8 +233,7 @@ public class ConfigDescriptionValidatorTest {
new ConfigValidationMessage(TXT_REQUIRED_PARAM_NAME, MessageKey.PARAMETER_REQUIRED.defaultMessage,
MessageKey.PARAMETER_REQUIRED.key),
new ConfigValidationMessage(INT_REQUIRED_PARAM_NAME, MessageKey.PARAMETER_REQUIRED.defaultMessage,
MessageKey.PARAMETER_REQUIRED.key))
.collect(toList());
MessageKey.PARAMETER_REQUIRED.key));
params.put(BOOL_PARAM_NAME, null);
params.put(TXT_PARAM_NAME, null);
params.put(INT_PARAM_NAME, null);
@ -313,7 +305,7 @@ public class ConfigDescriptionValidatorTest {
@Test
public void assertValidationThrowsExceptionContainingMessagesForAllMinMaxConfigParameters() {
List<ConfigValidationMessage> expected = Stream.of(
List<ConfigValidationMessage> expected = List.of(
new ConfigValidationMessage(TXT_MAX_PARAM_NAME, MessageKey.MAX_VALUE_TXT_VIOLATED.defaultMessage,
MessageKey.MAX_VALUE_TXT_VIOLATED.key, MAX.toString()),
new ConfigValidationMessage(INT_MIN_PARAM_NAME, MessageKey.MIN_VALUE_NUMERIC_VIOLATED.defaultMessage,
@ -327,8 +319,7 @@ public class ConfigDescriptionValidatorTest {
MessageKey.MAX_VALUE_NUMERIC_VIOLATED.key, MAX.toString()),
new ConfigValidationMessage(DECIMAL_MAX_PARAM_NAME,
MessageKey.MAX_VALUE_NUMERIC_VIOLATED.defaultMessage, MessageKey.MAX_VALUE_NUMERIC_VIOLATED.key,
DECIMAL_MAX.toString()))
.collect(toList());
DECIMAL_MAX.toString()));
params.put(TXT_MIN_PARAM_NAME, String.valueOf(MIN_VIOLATED));
params.put(TXT_MAX_PARAM_NAME, String.valueOf(MAX_VIOLATED));
params.put(INT_MIN_PARAM_NAME, MIN_VIOLATED);
@ -375,7 +366,7 @@ public class ConfigDescriptionValidatorTest {
@Test
public void assertValidationThrowsExceptionContainingMessagesForMultipleInvalidTypedConfigParameters() {
List<ConfigValidationMessage> expected = Stream.of(
List<ConfigValidationMessage> expected = List.of(
new ConfigValidationMessage(BOOL_PARAM_NAME, MessageKey.DATA_TYPE_VIOLATED.defaultMessage,
MessageKey.DATA_TYPE_VIOLATED.key, Long.class, Type.BOOLEAN),
new ConfigValidationMessage(INT_PARAM_NAME, MessageKey.DATA_TYPE_VIOLATED.defaultMessage,
@ -383,8 +374,7 @@ public class ConfigDescriptionValidatorTest {
new ConfigValidationMessage(TXT_PARAM_NAME, MessageKey.DATA_TYPE_VIOLATED.defaultMessage,
MessageKey.DATA_TYPE_VIOLATED.key, Long.class, Type.TEXT),
new ConfigValidationMessage(DECIMAL_PARAM_NAME, MessageKey.DATA_TYPE_VIOLATED.defaultMessage,
MessageKey.DATA_TYPE_VIOLATED.key, Long.class, Type.DECIMAL))
.collect(toList());
MessageKey.DATA_TYPE_VIOLATED.key, Long.class, Type.DECIMAL));
params.put(BOOL_PARAM_NAME, INVALID);
params.put(TXT_PARAM_NAME, INVALID);
params.put(INT_PARAM_NAME, INVALID);
@ -434,7 +424,7 @@ public class ConfigDescriptionValidatorTest {
@Test
public void assertValidationThrowsExceptionContainingMultipleVariousViolations() {
List<ConfigValidationMessage> expected = Stream.of(
List<ConfigValidationMessage> expected = List.of(
new ConfigValidationMessage(BOOL_REQUIRED_PARAM_NAME, MessageKey.PARAMETER_REQUIRED.defaultMessage,
MessageKey.PARAMETER_REQUIRED.key),
new ConfigValidationMessage(TXT_MAX_PARAM_NAME, MessageKey.MAX_VALUE_TXT_VIOLATED.defaultMessage,
@ -449,8 +439,7 @@ public class ConfigDescriptionValidatorTest {
MessageKey.DATA_TYPE_VIOLATED.key, Long.class, Type.DECIMAL),
new ConfigValidationMessage(DECIMAL_MAX_PARAM_NAME,
MessageKey.MAX_VALUE_NUMERIC_VIOLATED.defaultMessage, MessageKey.MAX_VALUE_NUMERIC_VIOLATED.key,
DECIMAL_MAX.toString()))
.collect(toList());
DECIMAL_MAX.toString()));
params.put(BOOL_REQUIRED_PARAM_NAME, null);
params.put(TXT_REQUIRED_PARAM_NAME, null);
params.put(TXT_MAX_PARAM_NAME, String.valueOf(MAX_VIOLATED));
@ -489,28 +478,11 @@ public class ConfigDescriptionValidatorTest {
configDescriptionValidator.validate(params, CONFIG_DESCRIPTION_URI);
}
@Test
public void assertValidateThrowsNPEforNullParamerters() {
assertThrows(NullPointerException.class,
() -> configDescriptionValidator.validate(null, CONFIG_DESCRIPTION_URI));
}
@Test
public void assertValidateThrowsNPEforNullConfigDescriptionUri() {
assertThrows(NullPointerException.class, () -> configDescriptionValidator.validate(params, null));
}
@Test
public void assertValidateCanHandleUnknownURIs() throws Exception {
configDescriptionValidator.validate(params, new URI(UNKNOWN));
}
@Test
public void assertValidateCanHandleSituationsWithoutConfigDescriptionRegistry() {
configDescriptionValidator.setConfigDescriptionRegistry(null);
configDescriptionValidator.validate(params, CONFIG_DESCRIPTION_URI);
}
@SuppressWarnings("unchecked")
private static List<ConfigValidationMessage> getConfigValidationMessages(ConfigValidationException cve) {
try {
@ -521,8 +493,4 @@ public class ConfigDescriptionValidatorTest {
throw new IllegalStateException("Failed to get configValidationMessages: " + e.getMessage(), e);
}
}
private void failBecauseOfMissingConfigValidationException() {
fail("A config validation exception was expected but it was not thrown");
}
}

View File

@ -139,8 +139,7 @@ public class ConfigValidationExceptionTest {
}
@Test
@SuppressWarnings("unused")
public void assertThatNPEisThrownForNullConfigValidationMessages() {
public void assertThatNPEIsThrownForNullConfigValidationMessages() {
assertThrows(NullPointerException.class,
() -> new ConfigValidationException(BUNDLE, TRANSLATION_PROVIDER, null));
}

View File

@ -286,16 +286,22 @@ public class ThingManagerImpl
@Override
public void validateConfigurationParameters(Thing thing, Map<String, Object> configurationParameters) {
ThingType thingType = thingTypeRegistry.getThingType(thing.getThingTypeUID());
if (thingType != null && thingType.getConfigDescriptionURI() != null) {
configDescriptionValidator.validate(configurationParameters, thingType.getConfigDescriptionURI());
if (thingType != null) {
URI configDescriptionURI = thingType.getConfigDescriptionURI();
if (configDescriptionURI != null) {
configDescriptionValidator.validate(configurationParameters, configDescriptionURI);
}
}
}
@Override
public void validateConfigurationParameters(Channel channel, Map<String, Object> configurationParameters) {
ChannelType channelType = channelTypeRegistry.getChannelType(channel.getChannelTypeUID());
if (channelType != null && channelType.getConfigDescriptionURI() != null) {
configDescriptionValidator.validate(configurationParameters, channelType.getConfigDescriptionURI());
if (channelType != null) {
URI configDescriptionURI = channelType.getConfigDescriptionURI();
if (configDescriptionURI != null) {
configDescriptionValidator.validate(configurationParameters, configDescriptionURI);
}
}
}