mirror of
https://github.com/danieldemus/openhab-core.git
synced 2026-07-29 12:34:22 +02:00
Check valid properties for channel (#5416)
Null key or value are rejected and an IllegalArgumentException is thrown. Signed-off-by: Laurent Garnier <lg.hc@free.fr>
This commit is contained in:
+15
@@ -15,6 +15,7 @@ package org.openhab.core.thing.binding.builder;
|
|||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import org.eclipse.jdt.annotation.NonNullByDefault;
|
import org.eclipse.jdt.annotation.NonNullByDefault;
|
||||||
import org.eclipse.jdt.annotation.Nullable;
|
import org.eclipse.jdt.annotation.Nullable;
|
||||||
@@ -26,6 +27,8 @@ import org.openhab.core.thing.type.AutoUpdatePolicy;
|
|||||||
import org.openhab.core.thing.type.ChannelKind;
|
import org.openhab.core.thing.type.ChannelKind;
|
||||||
import org.openhab.core.thing.type.ChannelType;
|
import org.openhab.core.thing.type.ChannelType;
|
||||||
import org.openhab.core.thing.type.ChannelTypeUID;
|
import org.openhab.core.thing.type.ChannelTypeUID;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@link ChannelBuilder} is responsible for creating {@link Channel}s.
|
* {@link ChannelBuilder} is responsible for creating {@link Channel}s.
|
||||||
@@ -47,6 +50,8 @@ public class ChannelBuilder {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private final Logger logger = LoggerFactory.getLogger(ChannelBuilder.class);
|
||||||
|
|
||||||
private final ChannelUID channelUID;
|
private final ChannelUID channelUID;
|
||||||
private @Nullable String acceptedItemType;
|
private @Nullable String acceptedItemType;
|
||||||
private ChannelKind kind;
|
private ChannelKind kind;
|
||||||
@@ -137,6 +142,16 @@ public class ChannelBuilder {
|
|||||||
* @return channel builder
|
* @return channel builder
|
||||||
*/
|
*/
|
||||||
public ChannelBuilder withProperties(Map<String, String> properties) {
|
public ChannelBuilder withProperties(Map<String, String> properties) {
|
||||||
|
String propertiesWithNullKeyOrValue = properties.entrySet().stream()
|
||||||
|
.filter(e -> e.getKey() == null || e.getValue() == null).map(e -> String.valueOf(e.getKey())).sorted()
|
||||||
|
.collect(Collectors.joining(", "));
|
||||||
|
if (!propertiesWithNullKeyOrValue.isEmpty()) {
|
||||||
|
logger.error(
|
||||||
|
"Unexpected properties ({}) with null key or value for channel {}; probably a bug in the related binding!",
|
||||||
|
propertiesWithNullKeyOrValue, channelUID);
|
||||||
|
throw new IllegalArgumentException("Unexpected properties (%s) with null key or value for channel %s"
|
||||||
|
.formatted(propertiesWithNullKeyOrValue, channelUID.getAsString()));
|
||||||
|
}
|
||||||
this.properties = properties;
|
this.properties = properties;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|||||||
+25
@@ -15,11 +15,14 @@ package org.openhab.core.thing.binding.builder;
|
|||||||
import static org.hamcrest.CoreMatchers.*;
|
import static org.hamcrest.CoreMatchers.*;
|
||||||
import static org.hamcrest.MatcherAssert.assertThat;
|
import static org.hamcrest.MatcherAssert.assertThat;
|
||||||
import static org.hamcrest.collection.IsCollectionWithSize.hasSize;
|
import static org.hamcrest.collection.IsCollectionWithSize.hasSize;
|
||||||
|
import static org.junit.jupiter.api.Assertions.*;
|
||||||
import static org.openhab.core.thing.DefaultSystemChannelTypeProvider.SYSTEM_OUTDOOR_TEMPERATURE;
|
import static org.openhab.core.thing.DefaultSystemChannelTypeProvider.SYSTEM_OUTDOOR_TEMPERATURE;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.eclipse.jdt.annotation.NonNullByDefault;
|
import org.eclipse.jdt.annotation.NonNullByDefault;
|
||||||
|
import org.eclipse.jdt.annotation.Nullable;
|
||||||
import org.junit.jupiter.api.BeforeEach;
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.openhab.core.library.CoreItemFactory;
|
import org.openhab.core.library.CoreItemFactory;
|
||||||
@@ -41,6 +44,7 @@ public class ChannelBuilderTest {
|
|||||||
|
|
||||||
private static final String KEY1 = "key1";
|
private static final String KEY1 = "key1";
|
||||||
private static final String KEY2 = "key2";
|
private static final String KEY2 = "key2";
|
||||||
|
private static final String KEY3 = "key3";
|
||||||
private static final String VALUE1 = "value1";
|
private static final String VALUE1 = "value1";
|
||||||
private static final String VALUE2 = "value2";
|
private static final String VALUE2 = "value2";
|
||||||
|
|
||||||
@@ -101,4 +105,25 @@ public class ChannelBuilderTest {
|
|||||||
assertThat(otherChannel.getAcceptedItemType(), is(not(channel.getAcceptedItemType())));
|
assertThat(otherChannel.getAcceptedItemType(), is(not(channel.getAcceptedItemType())));
|
||||||
assertThat(otherChannel.getProperties().size(), is(not(channel.getProperties().size())));
|
assertThat(otherChannel.getProperties().size(), is(not(channel.getProperties().size())));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testChannelBuilderWithInvalidProperties() {
|
||||||
|
Map<@Nullable String, @Nullable String> map = new HashMap<>();
|
||||||
|
map.put(KEY1, null);
|
||||||
|
map.put(KEY2, VALUE2);
|
||||||
|
map.put(KEY3, null);
|
||||||
|
map.put(null, VALUE1);
|
||||||
|
|
||||||
|
IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> {
|
||||||
|
builder.withProperties(toNonNullStringMap(map));
|
||||||
|
});
|
||||||
|
assertEquals(
|
||||||
|
"Unexpected properties (key1, key3, null) with null key or value for channel bindingId:thingTypeId:thingId:temperature",
|
||||||
|
exception.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked") // Map may contain null keys or values; this is intentional for this test
|
||||||
|
private static Map<String, String> toNonNullStringMap(Map<@Nullable String, @Nullable String> source) {
|
||||||
|
return (Map<String, String>) (Map<?, ?>) source;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user