diff --git a/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/ConfigDescriptionParameterValidator.java b/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/ConfigDescriptionParameterValidator.java index 1d9c2d6245..5b3637076a 100644 --- a/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/ConfigDescriptionParameterValidator.java +++ b/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/ConfigDescriptionParameterValidator.java @@ -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); } diff --git a/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/ConfigDescriptionParameterValidatorFactory.java b/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/ConfigDescriptionParameterValidatorFactory.java index b725be4cfc..bd2e7e2e43 100644 --- a/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/ConfigDescriptionParameterValidatorFactory.java +++ b/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/ConfigDescriptionParameterValidatorFactory.java @@ -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() { diff --git a/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/ConfigDescriptionValidatorImpl.java b/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/ConfigDescriptionValidatorImpl.java index f3748e07d5..39ddeb08c9 100644 --- a/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/ConfigDescriptionValidatorImpl.java +++ b/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/ConfigDescriptionValidatorImpl.java @@ -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; - } } diff --git a/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/MessageKey.java b/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/MessageKey.java index e2c4484f92..d75b99e2fe 100644 --- a/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/MessageKey.java +++ b/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/MessageKey.java @@ -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."); diff --git a/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/MinMaxValidator.java b/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/MinMaxValidator.java index 2345498de8..68e1a06452 100644 --- a/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/MinMaxValidator.java +++ b/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/MinMaxValidator.java @@ -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; } diff --git a/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/PatternValidator.java b/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/PatternValidator.java index 8487efb521..3fa51a123d 100644 --- a/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/PatternValidator.java +++ b/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/PatternValidator.java @@ -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; } } diff --git a/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/RequiredValidator.java b/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/RequiredValidator.java index 380829316a..8bb239dcc7 100644 --- a/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/RequiredValidator.java +++ b/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/RequiredValidator.java @@ -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; } } diff --git a/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/TypeIntrospections.java b/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/TypeIntrospections.java index 3518b56212..fa2f701b15 100644 --- a/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/TypeIntrospections.java +++ b/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/TypeIntrospections.java @@ -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(); diff --git a/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/TypeValidator.java b/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/TypeValidator.java index fae3f56371..e88027e679 100644 --- a/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/TypeValidator.java +++ b/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/TypeValidator.java @@ -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); - } } diff --git a/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/validation/ConfigDescriptionValidator.java b/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/validation/ConfigDescriptionValidator.java index 3cb4c47c5c..b564ac66e4 100644 --- a/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/validation/ConfigDescriptionValidator.java +++ b/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/validation/ConfigDescriptionValidator.java @@ -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 { /** diff --git a/bundles/org.openhab.core.config.core/src/test/java/org/openhab/core/config/core/internal/validation/ConfigDescriptionValidatorTest.java b/bundles/org.openhab.core.config.core/src/test/java/org/openhab/core/config/core/internal/validation/ConfigDescriptionValidatorTest.java index ff2fcfcb9e..b1d4f96fa6 100644 --- a/bundles/org.openhab.core.config.core/src/test/java/org/openhab/core/config/core/internal/validation/ConfigDescriptionValidatorTest.java +++ b/bundles/org.openhab.core.config.core/src/test/java/org/openhab/core/config/core/internal/validation/ConfigDescriptionValidatorTest.java @@ -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"); - } } diff --git a/bundles/org.openhab.core.config.core/src/test/java/org/openhab/core/config/core/internal/validation/ConfigValidationExceptionTest.java b/bundles/org.openhab.core.config.core/src/test/java/org/openhab/core/config/core/internal/validation/ConfigValidationExceptionTest.java index f5830713bd..c0b9cc30c8 100644 --- a/bundles/org.openhab.core.config.core/src/test/java/org/openhab/core/config/core/internal/validation/ConfigValidationExceptionTest.java +++ b/bundles/org.openhab.core.config.core/src/test/java/org/openhab/core/config/core/internal/validation/ConfigValidationExceptionTest.java @@ -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)); } diff --git a/bundles/org.openhab.core.thing/src/main/java/org/openhab/core/thing/internal/ThingManagerImpl.java b/bundles/org.openhab.core.thing/src/main/java/org/openhab/core/thing/internal/ThingManagerImpl.java index d50875ae79..f4ce81815f 100644 --- a/bundles/org.openhab.core.thing/src/main/java/org/openhab/core/thing/internal/ThingManagerImpl.java +++ b/bundles/org.openhab.core.thing/src/main/java/org/openhab/core/thing/internal/ThingManagerImpl.java @@ -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); + } } }