From f4d22e35767694d97c7022946c6f203b0ccd96c5 Mon Sep 17 00:00:00 2001 From: Sami Salonen Date: Sun, 24 Jan 2021 19:09:58 +0200 Subject: [PATCH] [modbus] Take cascaded transformation into use Signed-off-by: Sami Salonen --- .../CascadedValueTransformationImpl.java | 14 +++++-- .../handler/ModbusDataThingHandler.java | 9 +++-- .../CascadedValueTransformationImplTest.java | 40 ++++++++++++++++++- .../SingleValueTransformationTest.java | 32 ++++++++++++++- 4 files changed, 86 insertions(+), 9 deletions(-) diff --git a/bundles/org.openhab.binding.modbus/src/main/java/org/openhab/binding/modbus/internal/CascadedValueTransformationImpl.java b/bundles/org.openhab.binding.modbus/src/main/java/org/openhab/binding/modbus/internal/CascadedValueTransformationImpl.java index a2000194b81b7..ec644c151d853 100644 --- a/bundles/org.openhab.binding.modbus/src/main/java/org/openhab/binding/modbus/internal/CascadedValueTransformationImpl.java +++ b/bundles/org.openhab.binding.modbus/src/main/java/org/openhab/binding/modbus/internal/CascadedValueTransformationImpl.java @@ -13,10 +13,12 @@ package org.openhab.binding.modbus.internal; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.stream.Collectors; import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; import org.osgi.framework.BundleContext; /** @@ -30,9 +32,15 @@ public class CascadedValueTransformationImpl implements ValueTransformation { private final List transformations; - public CascadedValueTransformationImpl(final String transformationString) { - transformations = Arrays.stream(transformationString.split("∩")).filter(s -> !s.isEmpty()) - .map(transformation -> new SingleValueTransformation(transformation)).collect(Collectors.toList()); + public CascadedValueTransformationImpl(@Nullable String transformationString) { + String transformationNonNull = transformationString == null ? "" : transformationString; + List localTransformations = Arrays.stream(transformationNonNull.split("∩")) + .filter(s -> !s.isEmpty()).map(transformation -> new SingleValueTransformation(transformation)) + .collect(Collectors.toList()); + if (localTransformations.isEmpty()) { + localTransformations = Collections.singletonList(new SingleValueTransformation(transformationString)); + } + transformations = localTransformations; } @Override diff --git a/bundles/org.openhab.binding.modbus/src/main/java/org/openhab/binding/modbus/internal/handler/ModbusDataThingHandler.java b/bundles/org.openhab.binding.modbus/src/main/java/org/openhab/binding/modbus/internal/handler/ModbusDataThingHandler.java index 12a7e553d852b..a079858a7ccfe 100644 --- a/bundles/org.openhab.binding.modbus/src/main/java/org/openhab/binding/modbus/internal/handler/ModbusDataThingHandler.java +++ b/bundles/org.openhab.binding.modbus/src/main/java/org/openhab/binding/modbus/internal/handler/ModbusDataThingHandler.java @@ -33,6 +33,7 @@ import org.openhab.binding.modbus.handler.EndpointNotInitializedException; import org.openhab.binding.modbus.handler.ModbusEndpointThingHandler; import org.openhab.binding.modbus.handler.ModbusPollerThingHandler; +import org.openhab.binding.modbus.internal.CascadedValueTransformationImpl; import org.openhab.binding.modbus.internal.ModbusBindingConstantsInternal; import org.openhab.binding.modbus.internal.ModbusConfigurationException; import org.openhab.binding.modbus.internal.SingleValueTransformation; @@ -130,8 +131,8 @@ public class ModbusDataThingHandler extends BaseThingHandler { private volatile @Nullable ModbusDataConfiguration config; private volatile @Nullable ValueType readValueType; private volatile @Nullable ValueType writeValueType; - private volatile @Nullable ValueTransformation readTransformation; - private volatile @Nullable ValueTransformation writeTransformation; + private volatile @Nullable CascadedValueTransformationImpl readTransformation; + private volatile @Nullable CascadedValueTransformationImpl writeTransformation; private volatile Optional readIndex = Optional.empty(); private volatile Optional readSubIndex = Optional.empty(); private volatile @Nullable Integer writeStart; @@ -505,7 +506,7 @@ private void validateAndParseReadParameters(ModbusDataConfiguration config) thro throw new ModbusConfigurationException(errmsg); } } - readTransformation = new SingleValueTransformation(config.getReadTransform()); + readTransformation = new CascadedValueTransformationImpl(config.getReadTransform()); validateReadIndex(); } @@ -514,7 +515,7 @@ private void validateAndParseWriteParameters(ModbusDataConfiguration config) thr boolean writeStartMissing = StringUtils.isBlank(config.getWriteStart()); boolean writeValueTypeMissing = StringUtils.isBlank(config.getWriteValueType()); boolean writeTransformationMissing = StringUtils.isBlank(config.getWriteTransform()); - writeTransformation = new SingleValueTransformation(config.getWriteTransform()); + writeTransformation = new CascadedValueTransformationImpl(config.getWriteTransform()); boolean writingCoil = WRITE_TYPE_COIL.equals(config.getWriteType()); writeParametersHavingTransformationOnly = (writeTypeMissing && writeStartMissing && writeValueTypeMissing && !writeTransformationMissing); diff --git a/bundles/org.openhab.binding.modbus/src/test/java/org/openhab/binding/modbus/internal/CascadedValueTransformationImplTest.java b/bundles/org.openhab.binding.modbus/src/test/java/org/openhab/binding/modbus/internal/CascadedValueTransformationImplTest.java index 842c4c02919a1..303c62b2df071 100644 --- a/bundles/org.openhab.binding.modbus/src/test/java/org/openhab/binding/modbus/internal/CascadedValueTransformationImplTest.java +++ b/bundles/org.openhab.binding.modbus/src/test/java/org/openhab/binding/modbus/internal/CascadedValueTransformationImplTest.java @@ -12,9 +12,11 @@ */ package org.openhab.binding.modbus.internal; -import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.*; import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.osgi.framework.BundleContext; /** * @author Sami Salonen - Initial contribution @@ -37,4 +39,40 @@ public void testTransformation() { assertEquals(3, transformation.toString().split("∩").length); } + + @Test + public void testTransformationEmpty() { + CascadedValueTransformationImpl transformation = new CascadedValueTransformationImpl(""); + assertFalse(transformation.isIdentityTransform()); + assertEquals("", transformation.transform(Mockito.mock(BundleContext.class), "xx")); + } + + @Test + public void testTransformationNull() { + CascadedValueTransformationImpl transformation = new CascadedValueTransformationImpl(null); + assertFalse(transformation.isIdentityTransform()); + assertEquals("", transformation.transform(Mockito.mock(BundleContext.class), "xx")); + } + + @Test + public void testTransformationDefault() { + CascadedValueTransformationImpl transformation = new CascadedValueTransformationImpl("deFault"); + assertTrue(transformation.isIdentityTransform()); + assertEquals("xx", transformation.transform(Mockito.mock(BundleContext.class), "xx")); + } + + @Test + public void testTransformationDefaultChained() { + CascadedValueTransformationImpl transformation = new CascadedValueTransformationImpl("deFault∩DEFAULT∩default"); + assertTrue(transformation.isIdentityTransform()); + assertEquals("xx", transformation.transform(Mockito.mock(BundleContext.class), "xx")); + } + + @Test + public void testTransformationDefaultChainedWithStatic() { + CascadedValueTransformationImpl transformation = new CascadedValueTransformationImpl( + "deFault∩DEFAULT∩default∩static"); + assertFalse(transformation.isIdentityTransform()); + assertEquals("static", transformation.transform(Mockito.mock(BundleContext.class), "xx")); + } } diff --git a/bundles/org.openhab.binding.modbus/src/test/java/org/openhab/binding/modbus/internal/SingleValueTransformationTest.java b/bundles/org.openhab.binding.modbus/src/test/java/org/openhab/binding/modbus/internal/SingleValueTransformationTest.java index 1b1c459674f8b..504f7dd100429 100644 --- a/bundles/org.openhab.binding.modbus/src/test/java/org/openhab/binding/modbus/internal/SingleValueTransformationTest.java +++ b/bundles/org.openhab.binding.modbus/src/test/java/org/openhab/binding/modbus/internal/SingleValueTransformationTest.java @@ -12,9 +12,11 @@ */ package org.openhab.binding.modbus.internal; -import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.*; import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.osgi.framework.BundleContext; /** * @author Sami Salonen - Initial contribution @@ -48,4 +50,32 @@ public void testTransformationNewStyle2() { assertEquals("REGEX", transformation.transformationServiceName); assertEquals(":myregex(.*)", transformation.transformationServiceParam); } + + @Test + public void testTransformationEmpty() { + SingleValueTransformation transformation = new SingleValueTransformation(""); + assertFalse(transformation.isIdentityTransform()); + assertEquals("", transformation.transform(Mockito.mock(BundleContext.class), "xx")); + } + + @Test + public void testTransformationNull() { + SingleValueTransformation transformation = new SingleValueTransformation(null); + assertFalse(transformation.isIdentityTransform()); + assertEquals("", transformation.transform(Mockito.mock(BundleContext.class), "xx")); + } + + @Test + public void testTransformationDefault() { + SingleValueTransformation transformation = new SingleValueTransformation("deFault"); + assertTrue(transformation.isIdentityTransform()); + assertEquals("xx", transformation.transform(Mockito.mock(BundleContext.class), "xx")); + } + + @Test + public void testTransformationDefaultChainedWithStatic() { + SingleValueTransformation transformation = new SingleValueTransformation("static"); + assertFalse(transformation.isIdentityTransform()); + assertEquals("static", transformation.transform(Mockito.mock(BundleContext.class), "xx")); + } }