Skip to content

Commit

Permalink
Add typing of item and value to JRuleItemEvent
Browse files Browse the repository at this point in the history
  • Loading branch information
querdenker2k committed Feb 19, 2023
1 parent 0ac526c commit 6f18e4a
Show file tree
Hide file tree
Showing 12 changed files with 175 additions and 77 deletions.
6 changes: 4 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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());
}
```

Expand Down Expand Up @@ -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());

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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()));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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.*;
Expand Down Expand Up @@ -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;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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}
* <br>
* 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 <I> new item type
*/
public <I extends JRuleItem> I getItem(Class<I> 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 <I> new item type
*/
public <I extends JRuleItem> I getMemberItem(Class<I> 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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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());
}
}
Loading

0 comments on commit 6f18e4a

Please sign in to comment.