From c78a75bbcd4bc7a190ba17acd2487328a82e092f Mon Sep 17 00:00:00 2001 From: querdenker2k Date: Sun, 28 Jul 2024 07:04:36 +0200 Subject: [PATCH] add option to overwrite metadata --- .../jrule/internal/items/JRuleInternalItem.java | 4 ++-- .../openhab/automation/jrule/items/JRuleItem.java | 2 +- .../items/metadata/JRuleMetadataRegistry.java | 11 ++++++++--- .../automation/jrule/items/JRuleItemTestBase.java | 15 +++++++++++++-- .../automation/jrule/rules/user/TestRules.java | 2 +- 5 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/openhab/automation/jrule/internal/items/JRuleInternalItem.java b/src/main/java/org/openhab/automation/jrule/internal/items/JRuleInternalItem.java index 04490557..2dbb299b 100644 --- a/src/main/java/org/openhab/automation/jrule/internal/items/JRuleInternalItem.java +++ b/src/main/java/org/openhab/automation/jrule/internal/items/JRuleInternalItem.java @@ -86,8 +86,8 @@ public Map getMetadata() { } @Override - public void addMetadata(String namespace, JRuleItemMetadata metadata) { - this.metadataRegistry.addMetadata(namespace, name, metadata); + public void addMetadata(String namespace, JRuleItemMetadata metadata, boolean override) { + this.metadataRegistry.addMetadata(namespace, name, metadata, override); } @Override diff --git a/src/main/java/org/openhab/automation/jrule/items/JRuleItem.java b/src/main/java/org/openhab/automation/jrule/items/JRuleItem.java index e5aa506d..f5519bf6 100644 --- a/src/main/java/org/openhab/automation/jrule/items/JRuleItem.java +++ b/src/main/java/org/openhab/automation/jrule/items/JRuleItem.java @@ -49,7 +49,7 @@ static Optional forNameOptional(String itemName) { @NonNullByDefault Map getMetadata(); - void addMetadata(String namespace, JRuleItemMetadata metadata); + void addMetadata(String namespace, JRuleItemMetadata metadata, boolean override); @NonNullByDefault List getTags(); diff --git a/src/main/java/org/openhab/automation/jrule/items/metadata/JRuleMetadataRegistry.java b/src/main/java/org/openhab/automation/jrule/items/metadata/JRuleMetadataRegistry.java index 32f2ca01..9bedf563 100644 --- a/src/main/java/org/openhab/automation/jrule/items/metadata/JRuleMetadataRegistry.java +++ b/src/main/java/org/openhab/automation/jrule/items/metadata/JRuleMetadataRegistry.java @@ -41,8 +41,13 @@ public static Map getAllMetadata(String itemName, Met metadata -> new JRuleItemMetadata(metadata.getValue(), metadata.getConfiguration()))); } - public void addMetadata(String namespace, String itemName, JRuleItemMetadata metadata) { - metadataRegistry.add( - new Metadata(new MetadataKey(namespace, itemName), metadata.getValue(), metadata.getConfiguration())); + public void addMetadata(String namespace, String itemName, JRuleItemMetadata metadata, boolean override) { + MetadataKey key = new MetadataKey(namespace, itemName); + Metadata foundMetadata = metadataRegistry.get(key); + if (foundMetadata != null && override) { + metadataRegistry.remove(key); + } + + metadataRegistry.add(new Metadata(key, metadata.getValue(), metadata.getConfiguration())); } } diff --git a/src/test/java/org/openhab/automation/jrule/items/JRuleItemTestBase.java b/src/test/java/org/openhab/automation/jrule/items/JRuleItemTestBase.java index db5bc4e1..2e73324e 100644 --- a/src/test/java/org/openhab/automation/jrule/items/JRuleItemTestBase.java +++ b/src/test/java/org/openhab/automation/jrule/items/JRuleItemTestBase.java @@ -53,6 +53,8 @@ public abstract class JRuleItemTestBase { public static final String ITEM_NAME_2 = "Name2"; public static final String GROUP_NAME_2 = "Group2"; public static final String SUB_ITEM_NAME = "NameSub"; + public static final String METADATA_WHAT_S_THE_TIME = "what's the time"; + public static final String METADATA_VOICE_SYSTEM = "voiceSystem"; protected EventPublisher eventPublisher; @@ -104,7 +106,8 @@ public void init() throws ItemNotFoundException { JRuleItemRegistry.setMetadataRegistry(metadataRegistry); Mockito.when(mock.getAllMetadata(Mockito.anyString())) - .thenReturn(Map.of("Speech", new JRuleItemMetadata("SetLightState", Map.of("location", "Livingroom")))); + .thenReturn(Map.of("Speech", new JRuleItemMetadata("SetLightState", Map.of("location", "Livingroom")), + METADATA_VOICE_SYSTEM, new JRuleItemMetadata(METADATA_WHAT_S_THE_TIME))); } protected abstract JRuleItem getJRuleItem(); @@ -138,7 +141,15 @@ public void testGetMetadata() { @Test public void testAddMetadata() { JRuleItem item = getJRuleItem(); - item.addMetadata("voiceSystem", new JRuleItemMetadata("what's the time")); + item.addMetadata(METADATA_VOICE_SYSTEM, new JRuleItemMetadata(METADATA_WHAT_S_THE_TIME), false); + Assertions.assertEquals(METADATA_WHAT_S_THE_TIME, item.getMetadata().get(METADATA_VOICE_SYSTEM).getValue()); + + item.addMetadata(METADATA_VOICE_SYSTEM, new JRuleItemMetadata("something else"), false); + Assertions.assertEquals(METADATA_WHAT_S_THE_TIME, item.getMetadata().get(METADATA_VOICE_SYSTEM).getValue()); + + // not handled by the mock, therefor it's ok here + item.addMetadata(METADATA_VOICE_SYSTEM, new JRuleItemMetadata("something else"), true); + Assertions.assertEquals(METADATA_WHAT_S_THE_TIME, item.getMetadata().get(METADATA_VOICE_SYSTEM).getValue()); } @Test diff --git a/src/test/java/org/openhab/automation/jrule/rules/user/TestRules.java b/src/test/java/org/openhab/automation/jrule/rules/user/TestRules.java index 49353090..0ead8a28 100755 --- a/src/test/java/org/openhab/automation/jrule/rules/user/TestRules.java +++ b/src/test/java/org/openhab/automation/jrule/rules/user/TestRules.java @@ -391,7 +391,7 @@ public void getTagsAndMetadata() { logInfo("Metadata Configuration: '{}'", item.getMetadata().get("Speech").getConfiguration()); // add something new and check it - item.addMetadata("VoiceSystem", new JRuleItemMetadata("myNewValue", Map.of("mykey", "myvalue"))); + item.addMetadata("VoiceSystem", new JRuleItemMetadata("myNewValue", Map.of("mykey", "myvalue")), false); logInfo("Metadata: '{}'", item.getMetadata()); logInfo("Metadata Value: '{}'", item.getMetadata().get("VoiceSystem").getValue()); logInfo("Metadata Configuration: '{}'", item.getMetadata().get("VoiceSystem").getConfiguration());