From 6f18e4ac1dfca07995ac0e6eaca12963649a84ac Mon Sep 17 00:00:00 2001 From: Robert D Date: Sun, 19 Feb 2023 19:20:04 +0100 Subject: [PATCH] Add typing of item and value to JRuleItemEvent --- README.md | 6 +- .../JRuleItemChangeExecutionContext.java | 25 ++++--- ...leItemReceivedCommandExecutionContext.java | 15 ++-- ...uleItemReceivedUpdateExecutionContext.java | 19 +++-- .../internal/handler/JRuleEventHandler.java | 20 ++++-- .../jrule/rules/event/JRuleItemEvent.java | 71 +++++++++++++++---- .../jrule/rules/user/TestReceiveCommands.java | 37 ++++++---- .../jrule/rules/user/TestRules.java | 22 +++--- .../internal/rules/JRuleAbstractTest.java | 2 +- .../rules/delayed/JRuleDelayedTest.java | 7 +- .../internal/rules/timers/JRuleTimerTest.java | 18 +++-- .../itemchange/JRuleGroupItemChangeTest.java | 10 +++ 12 files changed, 175 insertions(+), 77 deletions(-) diff --git a/README.md b/README.md index d68151a5..605488b2 100644 --- a/README.md +++ b/README.md @@ -221,7 +221,9 @@ To add an OR statement we simply add multiple @JRuleWhen statements @JRuleWhenItemChange(item = MyTestNumber, from = "14", to = "10") @JRuleWhenItemChange(item = MyTestNumber, from = "10", to = "12") public void myOrRuleNumber(JRuleEvent event) { - logInfo("Got change number: {}", event.getState().getValue()); + logInfo("Got change number: {}", event.getState().asStringValue()); + // or + logInfo("Got change number: {}", event.getItem().getState().asStringValue()); } ``` @@ -631,7 +633,7 @@ triggered the rule. @JRuleWhenItemChange(item = MyTestSwitch1, to = ON) @JRuleWhenItemChange(item = MyTestSwitch2, to = ON) public void triggerNameExample(JRuleEvent event) { - logInfo("The rule was triggered by the following item: {}", event.getItemName()); + logInfo("The rule was triggered by the following item: {}", event.getItem().getName()); logInfo("The rule was Old Value was: {} and new value: {}", event.getOldState().getValue(), event.getState().getValue()); } diff --git a/src/main/java/org/openhab/automation/jrule/internal/engine/excutioncontext/JRuleItemChangeExecutionContext.java b/src/main/java/org/openhab/automation/jrule/internal/engine/excutioncontext/JRuleItemChangeExecutionContext.java index a75d1f2f..5dedbe83 100644 --- a/src/main/java/org/openhab/automation/jrule/internal/engine/excutioncontext/JRuleItemChangeExecutionContext.java +++ b/src/main/java/org/openhab/automation/jrule/internal/engine/excutioncontext/JRuleItemChangeExecutionContext.java @@ -19,14 +19,13 @@ import java.util.Optional; import org.openhab.automation.jrule.internal.handler.JRuleEventHandler; +import org.openhab.automation.jrule.items.JRuleItem; import org.openhab.automation.jrule.rules.JRule; import org.openhab.automation.jrule.rules.JRuleMemberOf; import org.openhab.automation.jrule.rules.event.JRuleEvent; import org.openhab.automation.jrule.rules.event.JRuleItemEvent; import org.openhab.core.events.AbstractEvent; -import org.openhab.core.items.events.GroupItemStateChangedEvent; -import org.openhab.core.items.events.ItemEvent; -import org.openhab.core.items.events.ItemStateChangedEvent; +import org.openhab.core.items.events.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -89,19 +88,23 @@ && matchCondition(((ItemStateChangedEvent) event).getItemState().toString(), @Override public JRuleEvent createJRuleEvent(AbstractEvent event) { - final String itemName; - final String memberName; + final JRuleItem item; + final JRuleItem memberItem; if (getMemberOf() != JRuleMemberOf.None) { - itemName = this.getItemName(); - memberName = ((ItemEvent) event).getItemName(); + item = JRuleItem.forName(this.getItemName()); + memberItem = JRuleItem.forName(((ItemEvent) event).getItemName()); } else { - itemName = this.getItemName(); - memberName = event instanceof GroupItemStateChangedEvent - ? ((GroupItemStateChangedEvent) event).getMemberName() + item = JRuleItem.forName(this.getItemName()); + memberItem = event instanceof GroupItemStateChangedEvent + ? JRuleItem.forName(((GroupItemStateChangedEvent) event).getMemberName()) : null; } - return new JRuleItemEvent(itemName, memberName, + // updating the item state to be sure that it's update when the JRule method is fired + JRuleEventHandler.get().setValue(((ItemStateChangedEvent) event).getItemName(), + ((ItemStateChangedEvent) event).getItemState()); + + return new JRuleItemEvent(item, memberItem, JRuleEventHandler.get().toValue(((ItemStateChangedEvent) event).getItemState()), JRuleEventHandler.get().toValue(((ItemStateChangedEvent) event).getOldItemState())); } diff --git a/src/main/java/org/openhab/automation/jrule/internal/engine/excutioncontext/JRuleItemReceivedCommandExecutionContext.java b/src/main/java/org/openhab/automation/jrule/internal/engine/excutioncontext/JRuleItemReceivedCommandExecutionContext.java index 4151b435..548b2a1c 100644 --- a/src/main/java/org/openhab/automation/jrule/internal/engine/excutioncontext/JRuleItemReceivedCommandExecutionContext.java +++ b/src/main/java/org/openhab/automation/jrule/internal/engine/excutioncontext/JRuleItemReceivedCommandExecutionContext.java @@ -19,6 +19,7 @@ import java.util.Optional; import org.openhab.automation.jrule.internal.handler.JRuleEventHandler; +import org.openhab.automation.jrule.items.JRuleItem; import org.openhab.automation.jrule.rules.JRule; import org.openhab.automation.jrule.rules.JRuleMemberOf; import org.openhab.automation.jrule.rules.event.JRuleEvent; @@ -77,17 +78,17 @@ && matchCondition(((ItemCommandEvent) event).getItemCommand().toString(), null) @Override public JRuleEvent createJRuleEvent(AbstractEvent event) { - final String itemName; - final String memberName; + final JRuleItem item; + final JRuleItem memberItem; if (getMemberOf() != JRuleMemberOf.None) { - memberName = ((ItemEvent) event).getItemName(); - itemName = ((ItemEvent) event).getItemName(); + memberItem = JRuleItem.forName(((ItemEvent) event).getItemName()); + item = JRuleItem.forName(((ItemEvent) event).getItemName()); } else { - memberName = null; - itemName = this.getItemName(); + memberItem = null; + item = JRuleItem.forName(this.getItemName()); } - return new JRuleItemEvent(itemName, memberName, + return new JRuleItemEvent(item, memberItem, JRuleEventHandler.get().toValue(((ItemCommandEvent) event).getItemCommand()), null); } diff --git a/src/main/java/org/openhab/automation/jrule/internal/engine/excutioncontext/JRuleItemReceivedUpdateExecutionContext.java b/src/main/java/org/openhab/automation/jrule/internal/engine/excutioncontext/JRuleItemReceivedUpdateExecutionContext.java index e057f726..d69c9cf4 100644 --- a/src/main/java/org/openhab/automation/jrule/internal/engine/excutioncontext/JRuleItemReceivedUpdateExecutionContext.java +++ b/src/main/java/org/openhab/automation/jrule/internal/engine/excutioncontext/JRuleItemReceivedUpdateExecutionContext.java @@ -19,6 +19,7 @@ import java.util.Optional; import org.openhab.automation.jrule.internal.handler.JRuleEventHandler; +import org.openhab.automation.jrule.items.JRuleItem; import org.openhab.automation.jrule.rules.JRule; import org.openhab.automation.jrule.rules.JRuleMemberOf; import org.openhab.automation.jrule.rules.event.JRuleEvent; @@ -75,17 +76,21 @@ && matchCondition(((ItemStateEvent) event).getItemState().toString(), null) @Override public JRuleEvent createJRuleEvent(AbstractEvent event) { - final String itemName; - final String memberName; + final JRuleItem item; + final JRuleItem memberItem; if (getMemberOf() != JRuleMemberOf.None) { - memberName = ((ItemEvent) event).getItemName(); - itemName = ((ItemEvent) event).getItemName(); + memberItem = JRuleItem.forName(((ItemEvent) event).getItemName()); + item = JRuleItem.forName(((ItemEvent) event).getItemName()); } else { - memberName = null; - itemName = this.getItemName(); + memberItem = null; + item = JRuleItem.forName(this.getItemName()); } - return new JRuleItemEvent(itemName, memberName, + // updating the item state to be sure that it's update when the JRule method is fired + JRuleEventHandler.get().setValue(((ItemStateEvent) event).getItemName(), + ((ItemStateEvent) event).getItemState()); + + return new JRuleItemEvent(item, memberItem, JRuleEventHandler.get().toValue(((ItemStateEvent) event).getItemState()), null); } diff --git a/src/main/java/org/openhab/automation/jrule/internal/handler/JRuleEventHandler.java b/src/main/java/org/openhab/automation/jrule/internal/handler/JRuleEventHandler.java index 8367847a..97ab3651 100644 --- a/src/main/java/org/openhab/automation/jrule/internal/handler/JRuleEventHandler.java +++ b/src/main/java/org/openhab/automation/jrule/internal/handler/JRuleEventHandler.java @@ -25,10 +25,7 @@ import org.openhab.automation.jrule.rules.JRule; import org.openhab.automation.jrule.rules.value.*; import org.openhab.core.events.EventPublisher; -import org.openhab.core.items.GroupItem; -import org.openhab.core.items.Item; -import org.openhab.core.items.ItemNotFoundException; -import org.openhab.core.items.ItemRegistry; +import org.openhab.core.items.*; import org.openhab.core.items.events.ItemEvent; import org.openhab.core.items.events.ItemEventFactory; import org.openhab.core.library.types.*; @@ -179,6 +176,21 @@ public State getStateFromItem(String itemName) { } } + public void setValue(String itemName, State itemState) { + if (itemRegistry == null) { + throw new JRuleRuntimeException("ItemRegistry must not be null"); + } + try { + Item item = itemRegistry.getItem(itemName); + if (!(item instanceof GenericItem)) { + throw new JRuleRuntimeException("Given item must be of type GenericItem"); + } + ((GenericItem) item).setState(itemState); + } catch (ItemNotFoundException e) { + throw new JRuleRuntimeException(String.format("Failed to find item: %s", itemName)); + } + } + public void setItemRegistry(@NonNull ItemRegistry itemRegistry) { this.itemRegistry = itemRegistry; } diff --git a/src/main/java/org/openhab/automation/jrule/rules/event/JRuleItemEvent.java b/src/main/java/org/openhab/automation/jrule/rules/event/JRuleItemEvent.java index 2b5b3054..9f552324 100644 --- a/src/main/java/org/openhab/automation/jrule/rules/event/JRuleItemEvent.java +++ b/src/main/java/org/openhab/automation/jrule/rules/event/JRuleItemEvent.java @@ -12,44 +12,87 @@ */ package org.openhab.automation.jrule.rules.event; +import org.openhab.automation.jrule.exception.JRuleRuntimeException; +import org.openhab.automation.jrule.items.JRuleItem; import org.openhab.automation.jrule.rules.value.JRuleValue; /** * The {@link JRuleItemEvent} + *
+ * ATTENTION: For Command events the state isn't updated in the item yet, so use the state property. * * @author Robert Delbrück */ public class JRuleItemEvent extends JRuleEvent { - private final String itemName; - private final String memberName; + private final JRuleItem item; + private final JRuleItem memberItem; private final JRuleValue state; private final JRuleValue oldState; - public JRuleItemEvent(String itemName, String memberName, JRuleValue state, JRuleValue oldState) { - this.itemName = itemName; - this.memberName = memberName; + public JRuleItemEvent(JRuleItem item, JRuleItem memberItem, JRuleValue state, JRuleValue oldState) { + this.item = item; + this.memberItem = memberItem; this.state = state; this.oldState = oldState; } - public JRuleValue getState() { - return state; + public JRuleItem getItem() { + return item; } - public JRuleValue getOldState() { - return oldState; + /** + * Casts the item to the given type. + * + * @param asType Cast to this type + * @return the casted item + * @param new item type + */ + public I getItem(Class asType) { + if (!asType.isAssignableFrom(item.getClass())) { + throw new JRuleRuntimeException(String.format("'%s' cannot be cast to '%s'", item.getClass(), asType)); + } + return (I) item; + } + + public JRuleItem getMemberItem() { + return memberItem; } - public String getMemberName() { - return memberName; + /** + * Casts the member-item to the given type. + * + * @param asType Cast to this type + * @return the casted member-item + * @param new item type + */ + public I getMemberItem(Class asType) { + if (!asType.isAssignableFrom(memberItem.getClass())) { + throw new JRuleRuntimeException( + String.format("'%s' cannot be cast to '%s'", memberItem.getClass(), asType)); + } + return (I) memberItem; } - public String getItemName() { - return itemName; + /** + * Gets the new state of the item. Must be used while receiving commands. + * + * @return the new item state + */ + public JRuleValue getState() { + return state; + } + + /** + * Gets the old state of the item. Just for Item-Change-Events + * + * @return the old state of the item + */ + public JRuleValue getOldState() { + return oldState; } @Override public String toString() { - return String.format("JRuleEvent [state=%s, oldState=%s, itemName=%s]", state, oldState, itemName); + return String.format("JRuleEvent [item=%s, memberItem=%s, oldState=%s]", item, memberItem, oldState); } } diff --git a/src/test/java/org/openhab/automation/jrule/rules/user/TestReceiveCommands.java b/src/test/java/org/openhab/automation/jrule/rules/user/TestReceiveCommands.java index bb1ef88d..1f1abdcd 100644 --- a/src/test/java/org/openhab/automation/jrule/rules/user/TestReceiveCommands.java +++ b/src/test/java/org/openhab/automation/jrule/rules/user/TestReceiveCommands.java @@ -12,6 +12,7 @@ */ package org.openhab.automation.jrule.rules.user; +import org.openhab.automation.jrule.items.*; import org.openhab.automation.jrule.rules.JRule; import org.openhab.automation.jrule.rules.JRuleName; import org.openhab.automation.jrule.rules.JRuleWhenItemReceivedCommand; @@ -137,72 +138,84 @@ public void receiveQuantityCommand(JRuleItemEvent event) { @JRuleName(NAME_RECEIVE_SWITCH_UPDATE) @JRuleWhenItemReceivedUpdate(item = ITEM_SWITCH_EVENT) public void receiveSwitchUpdate(JRuleItemEvent event) { - logInfo("received: '{}', type: '{}'", event.getState(), event.getState().getClass()); + logInfo("received: '{}', type: '{}'", event.getItem().getState(), event.getItem().getState().getClass()); + logInfo("received value: {}", event.getItem(JRuleSwitchItem.class).getStateAsOnOff()); } @JRuleName(NAME_RECEIVE_NUMBER_UPDATE) @JRuleWhenItemReceivedUpdate(item = ITEM_NUMBER_EVENT) public void receiveNumberUpdate(JRuleItemEvent event) { - logInfo("received: '{}', type: '{}'", event.getState(), event.getState().getClass()); + logInfo("received: '{}', type: '{}'", event.getItem().getState(), event.getItem().getState().getClass()); + logInfo("received value: {}", event.getItem(JRuleNumberItem.class).getStateAsDecimal().floatValue()); } @JRuleName(NAME_RECEIVE_STRING_UPDATE) @JRuleWhenItemReceivedUpdate(item = ITEM_STRING_EVENT) public void receiveStringUpdate(JRuleItemEvent event) { - logInfo("received: '{}', type: '{}'", event.getState(), event.getState().getClass()); + logInfo("received: '{}', type: '{}'", event.getItem().getState(), event.getItem().getState().getClass()); + logInfo("received value: {}", event.getItem(JRuleStringItem.class).getStateAsString()); } @JRuleName(NAME_RECEIVE_DATETIME_UPDATE) @JRuleWhenItemReceivedUpdate(item = ITEM_DATETIME_EVENT) public void receiveDatetimeUpdate(JRuleItemEvent event) { - logInfo("received: '{}', type: '{}'", event.getState(), event.getState().getClass()); + logInfo("received: '{}', type: '{}'", event.getItem().getState(), event.getItem().getState().getClass()); + logInfo("received value: {}", event.getItem(JRuleDateTimeItem.class).getStateAsDateTime().getValue()); } @JRuleName(NAME_RECEIVE_PLAYER_UPDATE) @JRuleWhenItemReceivedUpdate(item = ITEM_PLAYER_EVENT) public void receivePlayerUpdate(JRuleItemEvent event) { - logInfo("received: '{}', type: '{}'", event.getState(), event.getState().getClass()); + logInfo("received: '{}', type: '{}'", event.getItem().getState(), event.getItem().getState().getClass()); + logInfo("received value: {}", event.getItem(JRulePlayerItem.class).getStateAsPlayPause()); } @JRuleName(NAME_RECEIVE_CONTACT_UPDATE) @JRuleWhenItemReceivedUpdate(item = ITEM_CONTACT_EVENT) public void receiveContactUpdate(JRuleItemEvent event) { - logInfo("received: '{}', type: '{}'", event.getState(), event.getState().getClass()); + logInfo("received: '{}', type: '{}'", event.getItem().getState(), event.getItem().getState().getClass()); + logInfo("received value: {}", event.getItem(JRuleContactItem.class).getStateAsOpenClose()); } @JRuleName(NAME_RECEIVE_IMAGE_UPDATE) @JRuleWhenItemReceivedUpdate(item = ITEM_IMAGE_EVENT) public void receiveImageUpdate(JRuleItemEvent event) { - logInfo("received: '{}', type: '{}'", event.getState(), event.getState().getClass()); + logInfo("received: '{}', type: '{}'", event.getItem().getState(), event.getItem().getState().getClass()); + logInfo("received value: {}", event.getItem(JRuleImageItem.class).getStateAsRaw()); } @JRuleName(NAME_RECEIVE_ROLLERSHUTTER_UPDATE) @JRuleWhenItemReceivedUpdate(item = ITEM_ROLLERSHUTTER_EVENT) public void receiveRollershutterUpdate(JRuleItemEvent event) { - logInfo("received: '{}', type: '{}'", event.getState(), event.getState().getClass()); + logInfo("received: '{}', type: '{}'", event.getItem().getState(), event.getItem().getState().getClass()); + logInfo("received value: {}", event.getItem(JRuleRollershutterItem.class).getStateAsPercent().floatValue()); } @JRuleName(NAME_RECEIVE_DIMMER_UPDATE) @JRuleWhenItemReceivedUpdate(item = ITEM_DIMMER_EVENT) public void receiveDimmerUpdate(JRuleItemEvent event) { - logInfo("received: '{}', type: '{}'", event.getState(), event.getState().getClass()); + logInfo("received: '{}', type: '{}'", event.getItem().getState(), event.getItem().getState().getClass()); + logInfo("received value: {}", event.getItem(JRuleDimmerItem.class).getStateAsPercent().floatValue()); } @JRuleName(NAME_RECEIVE_COLOR_UPDATE) @JRuleWhenItemReceivedUpdate(item = ITEM_COLOR_EVENT) public void receiveColorUpdate(JRuleItemEvent event) { - logInfo("received: '{}', type: '{}'", event.getState(), event.getState().getClass()); + logInfo("received: '{}', type: '{}'", event.getItem().getState(), event.getItem().getState().getClass()); + logInfo("received value: {}", event.getItem(JRuleColorItem.class).getStateAsHsb()); } @JRuleName(NAME_RECEIVE_LOCATION_UPDATE) @JRuleWhenItemReceivedUpdate(item = ITEM_LOCATION_EVENT) public void receiveLocationUpdate(JRuleItemEvent event) { - logInfo("received: '{}', type: '{}'", event.getState(), event.getState().getClass()); + logInfo("received: '{}', type: '{}'", event.getItem().getState(), event.getItem().getState().getClass()); + logInfo("received value: {}", event.getItem(JRuleLocationItem.class).getStateAsPoint()); } @JRuleName(NAME_RECEIVE_QUANTITY_UPDATE) @JRuleWhenItemReceivedUpdate(item = ITEM_QUANTITY_EVENT) public void receiveQuantityUpdate(JRuleItemEvent event) { - logInfo("received: '{}', type: '{}'", event.getState(), event.getState().getClass()); + logInfo("received: '{}', type: '{}'", event.getItem().getState(), event.getItem().getState().getClass()); + logInfo("received value: {}", event.getItem(JRuleQuantityItem.class).getStateAsDecimal().floatValue()); } } 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 765462da..bb435584 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 @@ -148,25 +148,25 @@ public void switchReceivedOnCommand(JRuleItemEvent event) { @JRuleName(NAME_SWITCH_ITEM_RECEIVED_ANY_UPDATE) @JRuleWhenItemReceivedUpdate(item = ITEM_RECEIVING_COMMAND_SWITCH) public void switchItemReceivedUpdate(JRuleItemEvent event) { - logInfo("received update: {}", event.getState().stringValue()); + logInfo("received update: {}", event.getItem().getState().stringValue()); } @JRuleName(NAME_SWITCH_ITEM_RECEIVED_ON_UPDATE) @JRuleWhenItemReceivedUpdate(item = ITEM_RECEIVING_COMMAND_SWITCH, state = JRuleSwitchItem.ON) public void switchReceivedOnUpdate(JRuleItemEvent event) { - logInfo("received update: {}", event.getState().stringValue()); + logInfo("received update: {}", event.getItem().getState().stringValue()); } @JRuleName(NAME_SWITCH_ITEM_CHANGED) @JRuleWhenItemChange(item = ITEM_RECEIVING_COMMAND_SWITCH) public void switchItemChanged(JRuleItemEvent event) { - logInfo("changed from '{}' to '{}'", event.getOldState(), event.getState()); + logInfo("changed from '{}' to '{}'", event.getOldState(), event.getItem().getState()); } @JRuleName(NAME_SWITCH_ITEM_CHANGED_TO_ON) @JRuleWhenItemChange(item = ITEM_RECEIVING_COMMAND_SWITCH, from = JRuleSwitchItem.OFF, to = JRuleSwitchItem.ON) public void switchReceivedChangedToOn(JRuleItemEvent event) { - logInfo("changed: {}", event.getState().stringValue()); + logInfo("changed: {}", event.getItem().getState().stringValue()); } @JRuleName(NAME_INVOKE_MQTT_ACTION) @@ -200,27 +200,29 @@ public void mqttThingChangedToOffline(JRuleThingEvent event) { @JRuleName(NAME_MEMBER_OF_GROUP_RECEIVED_COMMAND) @JRuleWhenItemReceivedCommand(item = ITEM_SWITCH_GROUP, memberOf = JRuleMemberOf.All) public synchronized void memberOfGroupReceivedCommand(JRuleItemEvent event) { - logInfo("Member of Group ({}) received command", event.getMemberName()); + logInfo("Member of Group ({}) received command", event.getMemberItem().getName()); } @JRuleName(NAME_MEMBER_OF_GROUP_RECEIVED_UPDATE) @JRuleWhenItemReceivedUpdate(item = ITEM_SWITCH_GROUP, memberOf = JRuleMemberOf.All) public synchronized void memberOfGroupReceivedUpdate(JRuleItemEvent event) { - final String memberThatChangedStatus = event.getMemberName(); - logInfo("Member of Group ({}) received update", event.getMemberName()); + final String memberThatChangedStatus = event.getMemberItem().getName(); + logInfo("Member of Group ({}) received update", event.getMemberItem().getName()); + logInfo("Member of Group ({}) received update value", + event.getMemberItem(JRuleSwitchItem.class).getStateAsOnOff()); } @JRuleName(NAME_MEMBER_OF_GROUP_CHANGED) @JRuleWhenItemChange(item = ITEM_SWITCH_GROUP, memberOf = JRuleMemberOf.All) public synchronized void memberOfGroupChanged(JRuleItemEvent event) { - final String memberThatChangedStatus = event.getMemberName(); - logInfo("Member of Group ({}) changed", event.getMemberName()); + final String memberThatChangedStatus = event.getMemberItem().getName(); + logInfo("Member of Group ({}) changed", event.getMemberItem().getName()); } @JRuleName(NAME_PRECONDITION_LTE_AND_GTE_FOR_NUMBER) @JRuleWhenItemChange(item = ITEM_NUMBER_CONDITION, condition = @JRuleCondition(lte = 20, gte = 18)) public synchronized void conditionLteAndGteForNumber(JRuleItemEvent event) { - logInfo("trigger when between 18 and 20, current: {}", event.getState().stringValue()); + logInfo("trigger when between 18 and 20, current: {}", event.getItem().getState().stringValue()); } @JRuleName(NAME_CRON_EVERY_5_SEC) diff --git a/src/test/java/org/openhab/binding/jrule/internal/rules/JRuleAbstractTest.java b/src/test/java/org/openhab/binding/jrule/internal/rules/JRuleAbstractTest.java index 37f8717e..a9752851 100644 --- a/src/test/java/org/openhab/binding/jrule/internal/rules/JRuleAbstractTest.java +++ b/src/test/java/org/openhab/binding/jrule/internal/rules/JRuleAbstractTest.java @@ -82,7 +82,7 @@ protected void fireEvents(boolean async, List events) { eventBus.fire(async, events); } - protected void setState(GenericItem item, State state) throws ItemNotFoundException { + protected void registerItem(GenericItem item, State state) throws ItemNotFoundException { item.setState(state); when(itemRegistry.getItem(item.getName())).thenReturn(item); } diff --git a/src/test/java/org/openhab/binding/jrule/internal/rules/delayed/JRuleDelayedTest.java b/src/test/java/org/openhab/binding/jrule/internal/rules/delayed/JRuleDelayedTest.java index bd07d619..42e03327 100644 --- a/src/test/java/org/openhab/binding/jrule/internal/rules/delayed/JRuleDelayedTest.java +++ b/src/test/java/org/openhab/binding/jrule/internal/rules/delayed/JRuleDelayedTest.java @@ -49,7 +49,9 @@ public void cleanup() { public void testDelayed() throws ItemNotFoundException, InterruptedException { JRuleDelayedTestRules rule = initRule(JRuleDelayedTestRules.class); // Set item state in ItemRegistry - setState(new StringItem(JRuleDelayedTestRules.TARGET_ITEM), UnDefType.UNDEF); + + registerItem(new StringItem(JRuleDelayedTestRules.TARGET_ITEM), UnDefType.UNDEF); + registerItem(new StringItem(JRuleDelayedTestRules.TRIGGER_ITEM), UnDefType.UNDEF); JRuleItemRegistry.get(JRuleDelayedTestRules.TARGET_ITEM, TargetItem.class); ZonedDateTime fired = ZonedDateTime.now(); @@ -66,7 +68,8 @@ public void testDelayed() throws ItemNotFoundException, InterruptedException { public void testDelayedNotWaiting() throws ItemNotFoundException, InterruptedException { JRuleDelayedTestRules rule = initRule(JRuleDelayedTestRules.class); // Set item state in ItemRegistry - setState(new StringItem(JRuleDelayedTestRules.TARGET_ITEM), UnDefType.UNDEF); + registerItem(new StringItem(JRuleDelayedTestRules.TARGET_ITEM), UnDefType.UNDEF); + registerItem(new StringItem(JRuleDelayedTestRules.TRIGGER_ITEM), UnDefType.UNDEF); JRuleItemRegistry.get(JRuleDelayedTestRules.TARGET_ITEM, TargetItem.class); ZonedDateTime fired = ZonedDateTime.now(); diff --git a/src/test/java/org/openhab/binding/jrule/internal/rules/timers/JRuleTimerTest.java b/src/test/java/org/openhab/binding/jrule/internal/rules/timers/JRuleTimerTest.java index b9b59738..91a180cc 100644 --- a/src/test/java/org/openhab/binding/jrule/internal/rules/timers/JRuleTimerTest.java +++ b/src/test/java/org/openhab/binding/jrule/internal/rules/timers/JRuleTimerTest.java @@ -40,7 +40,8 @@ public class JRuleTimerTest extends JRuleAbstractTest { public void testTimer() throws ItemNotFoundException, InterruptedException { JRuleTimerTestRules rule = initRule(JRuleTimerTestRules.class); // Set item state in ItemRegistry - setState(new StringItem(JRuleTimerTestRules.TARGET_ITEM), UnDefType.UNDEF); + registerItem(new StringItem(JRuleTimerTestRules.TARGET_ITEM), UnDefType.UNDEF); + registerItem(new StringItem(JRuleTimerTestRules.TRIGGER_ITEM), UnDefType.UNDEF); JRuleItemRegistry.get(JRuleTimerTestRules.TARGET_ITEM, TargetItem.class); fireEvents(false, List.of(itemChangeEvent(JRuleTimerTestRules.TRIGGER_ITEM, "nothing", "timers"))); @@ -60,9 +61,10 @@ public void testTimer() throws ItemNotFoundException, InterruptedException { public void testRepeatingTimer() throws ItemNotFoundException, InterruptedException { JRuleTimerTestRules rule = initRule(JRuleTimerTestRules.class); // Set item state in ItemRegistry - setState(new StringItem(JRuleTimerTestRules.TARGET_ITEM_REPEATING), UnDefType.UNDEF); - setState(new StringItem(JRuleTimerTestRules.TARGET_ITEM_REPEATING_WITH_NAME), UnDefType.UNDEF); - setState(new StringItem(JRuleTimerTestRules.TARGET_ITEM_REPEATING_WITH_NAME_REPLACED), UnDefType.UNDEF); + registerItem(new StringItem(JRuleTimerTestRules.TARGET_ITEM_REPEATING), UnDefType.UNDEF); + registerItem(new StringItem(JRuleTimerTestRules.TARGET_ITEM_REPEATING_WITH_NAME), UnDefType.UNDEF); + registerItem(new StringItem(JRuleTimerTestRules.TARGET_ITEM_REPEATING_WITH_NAME_REPLACED), UnDefType.UNDEF); + registerItem(new StringItem(JRuleTimerTestRules.TRIGGER_ITEM), UnDefType.UNDEF); JRuleItemRegistry.get(JRuleTimerTestRules.TARGET_ITEM_REPEATING, TargetItem.class); JRuleItemRegistry.get(JRuleTimerTestRules.TARGET_ITEM_REPEATING_WITH_NAME, TargetItem.class); @@ -81,7 +83,7 @@ public void testRepeatingTimer() throws ItemNotFoundException, InterruptedExcept public void testRepeatingTimerComplex() throws ItemNotFoundException, InterruptedException { JRuleTimerTestRules rule = initRule(JRuleTimerTestRules.class); // Set item state in ItemRegistry - setState(new StringItem(JRuleTimerTestRules.TARGET_ITEM_REPEATING_WITH_NAME_REPLACED), UnDefType.UNDEF); + registerItem(new StringItem(JRuleTimerTestRules.TARGET_ITEM_REPEATING_WITH_NAME_REPLACED), UnDefType.UNDEF); JRuleItemRegistry.get(JRuleTimerTestRules.TARGET_ITEM_REPEATING_WITH_NAME_REPLACED, TargetItem.class); fireEvents(true, List.of(itemCommandEvent(JRuleTimerTestRules.TRIGGER_ITEM, "timers-repeating-complex"))); @@ -100,7 +102,8 @@ public void testRepeatingTimerComplex() throws ItemNotFoundException, Interrupte public void testGetTimedLock() throws ItemNotFoundException, InterruptedException { JRuleTimerTestRules rule = initRule(JRuleTimerTestRules.class); // Set item state in ItemRegistry - setState(new StringItem(JRuleTimerTestRules.TARGET_ITEM), UnDefType.UNDEF); + registerItem(new StringItem(JRuleTimerTestRules.TARGET_ITEM), UnDefType.UNDEF); + registerItem(new StringItem(JRuleTimerTestRules.TRIGGER_ITEM), UnDefType.UNDEF); JRuleItemRegistry.get(JRuleTimerTestRules.TARGET_ITEM, TargetItem.class); fireEvents(false, List.of(itemChangeEvent(JRuleTimerTestRules.TRIGGER_ITEM, "nothing", "locks"))); @@ -115,7 +118,8 @@ public void testGetTimedLock() throws ItemNotFoundException, InterruptedExceptio public void testDebounce() throws ItemNotFoundException, InterruptedException { JRuleTimerTestRules rule = initRule(JRuleTimerTestRules.class); // Set item state in ItemRegistry - setState(new StringItem(JRuleTimerTestRules.TARGET_ITEM), UnDefType.UNDEF); + registerItem(new StringItem(JRuleTimerTestRules.TARGET_ITEM), UnDefType.UNDEF); + registerItem(new StringItem(JRuleTimerTestRules.TRIGGER_ITEM), UnDefType.UNDEF); JRuleItemRegistry.get(JRuleTimerTestRules.TARGET_ITEM, TargetItem.class); fireEvents(false, List.of(itemChangeEvent(JRuleTimerTestRules.TRIGGER_ITEM, "nothing", "debounce"))); diff --git a/src/test/java/org/openhab/binding/jrule/internal/triggers/itemchange/JRuleGroupItemChangeTest.java b/src/test/java/org/openhab/binding/jrule/internal/triggers/itemchange/JRuleGroupItemChangeTest.java index a550b817..06923b6e 100644 --- a/src/test/java/org/openhab/binding/jrule/internal/triggers/itemchange/JRuleGroupItemChangeTest.java +++ b/src/test/java/org/openhab/binding/jrule/internal/triggers/itemchange/JRuleGroupItemChangeTest.java @@ -34,6 +34,7 @@ import org.openhab.core.library.CoreItemFactory; import org.openhab.core.library.items.StringItem; import org.openhab.core.library.types.StringType; +import org.openhab.core.types.UnDefType; /** * The {@link JRuleGroupItemChangeRules} contains tests for @JRuleWhenItemChange with memberOf=true trigger @@ -79,6 +80,9 @@ public void testItemChange_no_from_to() throws ItemNotFoundException { return stringItem; }); + registerItem(new StringItem(JRuleGroupItemChangeRules.GROUP_ITEM), UnDefType.UNDEF); + registerItem(new StringItem(JRuleGroupItemChangeRules.GROUP_ITEM_TO), UnDefType.UNDEF); + JRuleGroupItemChangeRules rule = initRule(JRuleGroupItemChangeRules.class); // Only last event should trigger rule method fireEvents(false, List.of(itemChangeEvent(OTHER_ITEM, "2", "1"), itemChangeEvent(MEMBER_ITEM, "2", "1"))); @@ -207,6 +211,8 @@ public void testItemChange_from() throws ItemNotFoundException { return stringItem; }); + registerItem(new StringItem(GROUP_ITEM_FROM), UnDefType.UNDEF); + JRuleGroupItemChangeRules rule = initRule(JRuleGroupItemChangeRules.class); // Only last event should trigger rule method fireEvents(false, List.of(itemChangeEvent(MEMBER_ITEM, "2", "1"), itemChangeEvent(MEMBER_ITEM, "1", "2"))); @@ -277,6 +283,8 @@ public void testItemChange_to() throws ItemNotFoundException { return stringItem; }); + registerItem(new StringItem(JRuleGroupItemChangeRules.GROUP_ITEM_TO), UnDefType.UNDEF); + JRuleGroupItemChangeRules rule = initRule(JRuleGroupItemChangeRules.class); // Only last event should trigger rule method fireEvents(false, List.of(itemChangeEvent(MEMBER_ITEM, "1", "2"), itemChangeEvent(MEMBER_ITEM, "2", "1"))); @@ -293,6 +301,8 @@ public void testItemChange_from_to() throws ItemNotFoundException { return stringItem; }); + registerItem(new StringItem(JRuleGroupItemChangeRules.GROUP_ITEM_FROM_TO), UnDefType.UNDEF); + JRuleGroupItemChangeRules rule = initRule(JRuleGroupItemChangeRules.class); // Only last event should trigger rule method fireEvents(false, List.of(itemChangeEvent(MEMBER_ITEM, "2", "1"), itemChangeEvent(MEMBER_ITEM, "3", "2"),