]> git.basschouten.com Git - openhab-addons.git/commitdiff
[MAP] Adds fallback to original value when input not found (#13560)
authorGaël L'hopital <gael@lhopital.org>
Mon, 17 Oct 2022 17:43:12 +0000 (19:43 +0200)
committerGitHub <noreply@github.com>
Mon, 17 Oct 2022 17:43:12 +0000 (19:43 +0200)
* [MAP] Adding fallback to original value
Solves #10092

Signed-off-by: clinique <gael@lhopital.org>
bundles/org.openhab.transform.map/README.md
bundles/org.openhab.transform.map/conf/transform/map/doorstatus_fallback.map [new file with mode: 0644]
bundles/org.openhab.transform.map/src/main/java/org/openhab/transform/map/internal/MapTransformationService.java
bundles/org.openhab.transform.map/src/test/java/org/openhab/transform/map/internal/MapTransformationServiceTest.java

index e1aecbd176e3ac6980f9e45c941747018c5fbb77..c70d7fbaf7e5684bceb2eaeee3cc5ddbf659c13d 100644 (file)
@@ -7,7 +7,9 @@ This file should be in property syntax, i.e. simple lines with "key=value" pairs
 The file format is documented [here](https://docs.oracle.com/javase/8/docs/api/java/util/Properties.html#load-java.io.Reader-).
 To organize the various transformations one might use subfolders.
 
-A default value can be provided if no matching entry is found by using "=value" syntax
+A default value can be provided if no matching entry is found by using "=value" syntax. 
+Defining this default value using `_source_` would then return the non transformed input string.
+
 
 ## Example
 
@@ -31,6 +33,7 @@ white\ space=using escape
 | `white space` | `using escape` |
 | `anything`    | `default`      |
 
+
 ## Usage as a Profile
 
 The functionality of this `TransformationService` can be used in a `Profile` on an `ItemChannelLink` too.
diff --git a/bundles/org.openhab.transform.map/conf/transform/map/doorstatus_fallback.map b/bundles/org.openhab.transform.map/conf/transform/map/doorstatus_fallback.map
new file mode 100644 (file)
index 0000000..05b912f
--- /dev/null
@@ -0,0 +1,6 @@
+CLOSED=closed
+OPEN=open
+-=-
+
+# Default mapping for missing keys
+=_source_
index c70bfa37ffb5761efe4b423df4a1cacd2f98d9e1..4f32bec8c34c8de37701c4d6ac08b2a0c8e6d777 100644 (file)
@@ -52,12 +52,12 @@ import org.slf4j.LoggerFactory;
         "openhab.transform=MAP" })
 public class MapTransformationService
         implements TransformationService, ConfigOptionProvider, RegistryChangeListener<Transformation> {
-    private final Logger logger = LoggerFactory.getLogger(MapTransformationService.class);
-
+    private static final String SOURCE_VALUE = "_source_";
     private static final String PROFILE_CONFIG_URI = "profile:transform:MAP";
     private static final String CONFIG_PARAM_FUNCTION = "function";
     private static final Set<String> SUPPORTED_CONFIGURATION_TYPES = Set.of("map");
 
+    private final Logger logger = LoggerFactory.getLogger(MapTransformationService.class);
     private final TransformationRegistry transformationRegistry;
     private final Map<String, Properties> cachedTransformations = new ConcurrentHashMap<>();
 
@@ -89,6 +89,8 @@ public class MapTransformationService
                     target = properties.getProperty("");
                     if (target == null) {
                         throw new TransformationException("Target value not found in map for '" + source + "'");
+                    } else if (SOURCE_VALUE.equals(target)) {
+                        target = source;
                     }
                 }
 
index 5718730b6707b15f1e58d78510291788ec2b6bff..675f93d1fd769f9dcc03eefb1ff2ef979893ef81 100644 (file)
@@ -53,6 +53,7 @@ public class MapTransformationServiceTest extends JavaTest {
     private static final String NON_DEFAULTED_TRANSFORMATION_DE = "map" + File.separator + "doorstatus_de.map";
     private static final String NON_DEFAULTED_TRANSFORMATION_FR = "map" + File.separator + "doorstatus_fr.map";
     private static final String DEFAULTED_TRANSFORMATION = "map" + File.separator + "doorstatus_defaulted.map";
+    private static final String FALLBACK_TRANSFORMATION = "map" + File.separator + "doorstatus_fallback.map";
     private static final String UNKNOWN_TRANSFORMATION = "map" + File.separator + "de.map";
 
     private static final String SRC_FOLDER = "conf" + File.separator + "transform";
@@ -103,6 +104,11 @@ public class MapTransformationServiceTest extends JavaTest {
         assertEquals("Default Value", processor.transform(DEFAULTED_TRANSFORMATION, SOURCE_UNKNOWN));
     }
 
+    @Test
+    public void testTransformSucceedsWithFallbackDefault() throws TransformationException {
+        assertEquals(SOURCE_UNKNOWN, processor.transform(FALLBACK_TRANSFORMATION, SOURCE_UNKNOWN));
+    }
+
     @Test
     public void testTransformFailsOnUnknownTransformation() {
         assertThrows(TransformationException.class, () -> processor.transform(UNKNOWN_TRANSFORMATION, SOURCE_CLOSED));
@@ -123,7 +129,6 @@ public class MapTransformationServiceTest extends JavaTest {
     public void setTransformationIsNotUpdatedIfOldElementMissing() throws TransformationException {
         // update configuration
         Transformation transformationDE = Objects.requireNonNull(configurationMap.get(NON_DEFAULTED_TRANSFORMATION_DE));
-        Transformation transformationFR = Objects.requireNonNull(configurationMap.get(NON_DEFAULTED_TRANSFORMATION_FR));
         Transformation transformationModified = new Transformation(transformationDE.getUID(),
                 transformationDE.getLabel(), transformationDE.getType(), transformationDE.getConfiguration());
         processor.updated(transformationDE, transformationModified);