[MAP] Adds fallback to original value when input not found (#13560)
* [MAP] Adding fallback to original value Solves #10092 Signed-off-by: clinique <gael@lhopital.org>
This commit is contained in:
parent
03cdc5e1b4
commit
5552220870
@ -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-).
|
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.
|
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
|
## Example
|
||||||
|
|
||||||
@ -31,6 +33,7 @@ white\ space=using escape
|
|||||||
| `white space` | `using escape` |
|
| `white space` | `using escape` |
|
||||||
| `anything` | `default` |
|
| `anything` | `default` |
|
||||||
|
|
||||||
|
|
||||||
## Usage as a Profile
|
## Usage as a Profile
|
||||||
|
|
||||||
The functionality of this `TransformationService` can be used in a `Profile` on an `ItemChannelLink` too.
|
The functionality of this `TransformationService` can be used in a `Profile` on an `ItemChannelLink` too.
|
||||||
|
|||||||
@ -0,0 +1,6 @@
|
|||||||
|
CLOSED=closed
|
||||||
|
OPEN=open
|
||||||
|
-=-
|
||||||
|
|
||||||
|
# Default mapping for missing keys
|
||||||
|
=_source_
|
||||||
@ -52,12 +52,12 @@ import org.slf4j.LoggerFactory;
|
|||||||
"openhab.transform=MAP" })
|
"openhab.transform=MAP" })
|
||||||
public class MapTransformationService
|
public class MapTransformationService
|
||||||
implements TransformationService, ConfigOptionProvider, RegistryChangeListener<Transformation> {
|
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 PROFILE_CONFIG_URI = "profile:transform:MAP";
|
||||||
private static final String CONFIG_PARAM_FUNCTION = "function";
|
private static final String CONFIG_PARAM_FUNCTION = "function";
|
||||||
private static final Set<String> SUPPORTED_CONFIGURATION_TYPES = Set.of("map");
|
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 TransformationRegistry transformationRegistry;
|
||||||
private final Map<String, Properties> cachedTransformations = new ConcurrentHashMap<>();
|
private final Map<String, Properties> cachedTransformations = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
@ -89,6 +89,8 @@ public class MapTransformationService
|
|||||||
target = properties.getProperty("");
|
target = properties.getProperty("");
|
||||||
if (target == null) {
|
if (target == null) {
|
||||||
throw new TransformationException("Target value not found in map for '" + source + "'");
|
throw new TransformationException("Target value not found in map for '" + source + "'");
|
||||||
|
} else if (SOURCE_VALUE.equals(target)) {
|
||||||
|
target = source;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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_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 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 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 UNKNOWN_TRANSFORMATION = "map" + File.separator + "de.map";
|
||||||
|
|
||||||
private static final String SRC_FOLDER = "conf" + File.separator + "transform";
|
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));
|
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
|
@Test
|
||||||
public void testTransformFailsOnUnknownTransformation() {
|
public void testTransformFailsOnUnknownTransformation() {
|
||||||
assertThrows(TransformationException.class, () -> processor.transform(UNKNOWN_TRANSFORMATION, SOURCE_CLOSED));
|
assertThrows(TransformationException.class, () -> processor.transform(UNKNOWN_TRANSFORMATION, SOURCE_CLOSED));
|
||||||
@ -123,7 +129,6 @@ public class MapTransformationServiceTest extends JavaTest {
|
|||||||
public void setTransformationIsNotUpdatedIfOldElementMissing() throws TransformationException {
|
public void setTransformationIsNotUpdatedIfOldElementMissing() throws TransformationException {
|
||||||
// update configuration
|
// update configuration
|
||||||
Transformation transformationDE = Objects.requireNonNull(configurationMap.get(NON_DEFAULTED_TRANSFORMATION_DE));
|
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(),
|
Transformation transformationModified = new Transformation(transformationDE.getUID(),
|
||||||
transformationDE.getLabel(), transformationDE.getType(), transformationDE.getConfiguration());
|
transformationDE.getLabel(), transformationDE.getType(), transformationDE.getConfiguration());
|
||||||
processor.updated(transformationDE, transformationModified);
|
processor.updated(transformationDE, transformationModified);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user