Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

let JRuleItemEvent contain JRuleItem #134

Merged
merged 4 commits into from
Feb 19, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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