diff --git a/bundles/org.openhab.core.model.rule/src/org/openhab/core/model/rule/jvmmodel/RulesJvmModelInferrer.xtend b/bundles/org.openhab.core.model.rule/src/org/openhab/core/model/rule/jvmmodel/RulesJvmModelInferrer.xtend index 1aa6c4adf..050dbe1f4 100644 --- a/bundles/org.openhab.core.model.rule/src/org/openhab/core/model/rule/jvmmodel/RulesJvmModelInferrer.xtend +++ b/bundles/org.openhab.core.model.rule/src/org/openhab/core/model/rule/jvmmodel/RulesJvmModelInferrer.xtend @@ -40,6 +40,7 @@ import org.slf4j.Logger import org.slf4j.LoggerFactory import org.eclipse.xtext.common.types.JvmFormalParameter import org.eclipse.emf.common.util.EList +import org.openhab.core.events.Event /** *

Infers a JVM model from the source model.

@@ -132,6 +133,8 @@ class RulesJvmModelInferrer extends ScriptJvmModelInferrer { if ((containsCommandTrigger(rule)) || (containsStateChangeTrigger(rule)) || (containsStateUpdateTrigger(rule))) { val itemTypeRef = ruleModel.newTypeRef(Item) parameters += rule.toParameter(VAR_TRIGGERING_ITEM, itemTypeRef) + val itemNameRef = ruleModel.newTypeRef(String) + parameters += rule.toParameter(VAR_TRIGGERING_ITEM_NAME, itemNameRef) } if (containsCommandTrigger(rule)) { val commandTypeRef = ruleModel.newTypeRef(Command) @@ -142,7 +145,7 @@ class RulesJvmModelInferrer extends ScriptJvmModelInferrer { parameters += rule.toParameter(VAR_PREVIOUS_STATE, stateTypeRef) } if (containsEventTrigger(rule)) { - val eventTypeRef = ruleModel.newTypeRef(ChannelTriggeredEvent) + val eventTypeRef = ruleModel.newTypeRef(String) parameters += rule.toParameter(VAR_RECEIVED_EVENT, eventTypeRef) } if (containsThingStateChangedEventTrigger(rule) && !containsParam(parameters, VAR_PREVIOUS_STATE)) { diff --git a/bundles/org.openhab.core.model.script.runtime/src/org/openhab/core/model/script/runtime/internal/engine/DSLScriptEngine.java b/bundles/org.openhab.core.model.script.runtime/src/org/openhab/core/model/script/runtime/internal/engine/DSLScriptEngine.java index 6cbe97030..f85958d04 100644 --- a/bundles/org.openhab.core.model.script.runtime/src/org/openhab/core/model/script/runtime/internal/engine/DSLScriptEngine.java +++ b/bundles/org.openhab.core.model.script.runtime/src/org/openhab/core/model/script/runtime/internal/engine/DSLScriptEngine.java @@ -31,10 +31,13 @@ import org.eclipse.xtext.resource.XtextResource; import org.eclipse.xtext.xbase.XExpression; import org.eclipse.xtext.xbase.interpreter.IEvaluationContext; import org.eclipse.xtext.xbase.interpreter.impl.DefaultEvaluationContext; +import org.openhab.core.items.events.ItemEvent; import org.openhab.core.model.script.engine.Script; import org.openhab.core.model.script.engine.ScriptExecutionException; import org.openhab.core.model.script.engine.ScriptParsingException; +import org.openhab.core.model.script.jvmmodel.ScriptJvmModelInferrer; import org.openhab.core.model.script.runtime.DSLScriptContextProvider; +import org.openhab.core.thing.events.ChannelTriggeredEvent; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -51,11 +54,14 @@ import org.slf4j.LoggerFactory; */ public class DSLScriptEngine implements javax.script.ScriptEngine { + private static final String OUTPUT_EVENT = "event"; + public static final String MIMETYPE_OPENHAB_DSL_RULE = "application/vnd.openhab.dsl.rule"; - private static final Map implicitVars = Map.of("command", "receivedCommand", "event", - "receivedEvent", "state", "newState", "newState", "newState", "oldState", "previousState", "triggeringItem", - "triggeringItem"); + private static final Map IMPLICIT_VARS = Map.of("command", + ScriptJvmModelInferrer.VAR_RECEIVED_COMMAND, "state", ScriptJvmModelInferrer.VAR_NEW_STATE, "newState", + ScriptJvmModelInferrer.VAR_NEW_STATE, "oldState", ScriptJvmModelInferrer.VAR_PREVIOUS_STATE, + "triggeringItem", ScriptJvmModelInferrer.VAR_TRIGGERING_ITEM); private final Logger logger = LoggerFactory.getLogger(DSLScriptEngine.class); @@ -137,12 +143,24 @@ public class DSLScriptEngine implements javax.script.ScriptEngine { } } DefaultEvaluationContext evalContext = new DefaultEvaluationContext(parentContext); - for (Map.Entry entry : implicitVars.entrySet()) { + for (Map.Entry entry : IMPLICIT_VARS.entrySet()) { Object value = context.getAttribute(entry.getKey()); if (value != null) { evalContext.newValue(QualifiedName.create(entry.getValue()), value); } } + // now add specific implicit vars, where we have to map the right content + Object value = context.getAttribute(OUTPUT_EVENT); + if (value instanceof ChannelTriggeredEvent) { + ChannelTriggeredEvent event = (ChannelTriggeredEvent) value; + evalContext.newValue(QualifiedName.create(ScriptJvmModelInferrer.VAR_RECEIVED_EVENT), event.getEvent()); + } + if (value instanceof ItemEvent) { + ItemEvent event = (ItemEvent) value; + evalContext.newValue(QualifiedName.create(ScriptJvmModelInferrer.VAR_TRIGGERING_ITEM_NAME), + event.getItemName()); + } + return evalContext; } diff --git a/bundles/org.openhab.core.model.script/src/org/openhab/core/model/script/jvmmodel/ScriptJvmModelInferrer.xtend b/bundles/org.openhab.core.model.script/src/org/openhab/core/model/script/jvmmodel/ScriptJvmModelInferrer.xtend index ee01d65bb..a94fdfdd0 100644 --- a/bundles/org.openhab.core.model.script/src/org/openhab/core/model/script/jvmmodel/ScriptJvmModelInferrer.xtend +++ b/bundles/org.openhab.core.model.script/src/org/openhab/core/model/script/jvmmodel/ScriptJvmModelInferrer.xtend @@ -25,7 +25,7 @@ import org.slf4j.LoggerFactory import org.openhab.core.items.Item import org.openhab.core.types.Command import org.openhab.core.types.State -import org.openhab.core.thing.events.ChannelTriggeredEvent +import org.openhab.core.events.Event /** *

Infers a JVM model from the source model.

@@ -43,6 +43,9 @@ class ScriptJvmModelInferrer extends AbstractModelInferrer { /** Variable name for the item in a "state triggered" or "command triggered" rule */ public static final String VAR_TRIGGERING_ITEM = "triggeringItem"; + /** Variable name for the item in a "state triggered" or "command triggered" rule */ + public static final String VAR_TRIGGERING_ITEM_NAME = "triggeringItemName"; + /** Variable name for the previous state of an item in a "changed state triggered" rule */ public static final String VAR_PREVIOUS_STATE = "previousState"; @@ -108,11 +111,13 @@ class ScriptJvmModelInferrer extends AbstractModelInferrer { static = true val itemTypeRef = script.newTypeRef(Item) parameters += script.toParameter(VAR_TRIGGERING_ITEM, itemTypeRef) + val itemNameRef = script.newTypeRef(String) + parameters += script.toParameter(VAR_TRIGGERING_ITEM_NAME, itemNameRef) val commandTypeRef = script.newTypeRef(Command) parameters += script.toParameter(VAR_RECEIVED_COMMAND, commandTypeRef) val stateTypeRef = script.newTypeRef(State) parameters += script.toParameter(VAR_PREVIOUS_STATE, stateTypeRef) - val eventTypeRef = script.newTypeRef(ChannelTriggeredEvent) + val eventTypeRef = script.newTypeRef(String) parameters += script.toParameter(VAR_RECEIVED_EVENT, eventTypeRef) val stateTypeRef2 = script.newTypeRef(State) parameters += script.toParameter(VAR_NEW_STATE, stateTypeRef2) diff --git a/bundles/org.openhab.core/src/main/java/org/openhab/core/items/events/GroupItemStateChangedEvent.java b/bundles/org.openhab.core/src/main/java/org/openhab/core/items/events/GroupItemStateChangedEvent.java index 86a1ec098..2211b3237 100644 --- a/bundles/org.openhab.core/src/main/java/org/openhab/core/items/events/GroupItemStateChangedEvent.java +++ b/bundles/org.openhab.core/src/main/java/org/openhab/core/items/events/GroupItemStateChangedEvent.java @@ -12,6 +12,7 @@ */ package org.openhab.core.items.events; +import org.eclipse.jdt.annotation.NonNullByDefault; import org.openhab.core.types.State; /** @@ -21,6 +22,7 @@ import org.openhab.core.types.State; * * @author Christoph Knauf - Initial contribution */ +@NonNullByDefault public class GroupItemStateChangedEvent extends ItemStateChangedEvent { /** diff --git a/bundles/org.openhab.core/src/main/java/org/openhab/core/items/events/ItemCommandEvent.java b/bundles/org.openhab.core/src/main/java/org/openhab/core/items/events/ItemCommandEvent.java index 57df0f8d5..efcc2709d 100644 --- a/bundles/org.openhab.core/src/main/java/org/openhab/core/items/events/ItemCommandEvent.java +++ b/bundles/org.openhab.core/src/main/java/org/openhab/core/items/events/ItemCommandEvent.java @@ -12,7 +12,8 @@ */ package org.openhab.core.items.events; -import org.openhab.core.events.AbstractEvent; +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; import org.openhab.core.types.Command; /** @@ -21,15 +22,14 @@ import org.openhab.core.types.Command; * * @author Stefan Bußweiler - Initial contribution */ -public class ItemCommandEvent extends AbstractEvent { +@NonNullByDefault +public class ItemCommandEvent extends ItemEvent { /** * The item command event type. */ public static final String TYPE = ItemCommandEvent.class.getSimpleName(); - private final String itemName; - private final Command command; /** @@ -41,9 +41,9 @@ public class ItemCommandEvent extends AbstractEvent { * @param command the command * @param source the source, can be null */ - protected ItemCommandEvent(String topic, String payload, String itemName, Command command, String source) { - super(topic, payload, source); - this.itemName = itemName; + protected ItemCommandEvent(String topic, String payload, String itemName, Command command, + @Nullable String source) { + super(topic, payload, itemName, source); this.command = command; } @@ -52,15 +52,6 @@ public class ItemCommandEvent extends AbstractEvent { return TYPE; } - /** - * Gets the item name. - * - * @return the item name - */ - public String getItemName() { - return itemName; - } - /** * Gets the item command. * diff --git a/bundles/org.openhab.core/src/main/java/org/openhab/core/items/events/ItemEvent.java b/bundles/org.openhab.core/src/main/java/org/openhab/core/items/events/ItemEvent.java new file mode 100644 index 000000000..e3e4f77c0 --- /dev/null +++ b/bundles/org.openhab.core/src/main/java/org/openhab/core/items/events/ItemEvent.java @@ -0,0 +1,50 @@ +/** + * Copyright (c) 2010-2020 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.core.items.events; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; +import org.openhab.core.events.AbstractEvent; + +/** + * {@link ItemEvent} is an abstract super class for all command and state item events. + * + * @author Kai Kreuzer - Initial contribution + */ +@NonNullByDefault +public abstract class ItemEvent extends AbstractEvent { + + protected final String itemName; + + /** + * Constructs a new item state event. + * + * @param topic the topic + * @param payload the payload + * @param itemName the item name + * @param source the source, can be null + */ + public ItemEvent(String topic, String payload, String itemName, @Nullable String source) { + super(topic, payload, source); + this.itemName = itemName; + } + + /** + * Gets the item name. + * + * @return the item name + */ + public String getItemName() { + return itemName; + } +} diff --git a/bundles/org.openhab.core/src/main/java/org/openhab/core/items/events/ItemEventFactory.java b/bundles/org.openhab.core/src/main/java/org/openhab/core/items/events/ItemEventFactory.java index 6b22ba32a..107d17292 100644 --- a/bundles/org.openhab.core/src/main/java/org/openhab/core/items/events/ItemEventFactory.java +++ b/bundles/org.openhab.core/src/main/java/org/openhab/core/items/events/ItemEventFactory.java @@ -77,7 +77,7 @@ public class ItemEventFactory extends AbstractEventFactory { } else if (ItemStateEvent.TYPE.equals(eventType)) { return createStateEvent(topic, payload, source); } else if (ItemStatePredictedEvent.TYPE.equals(eventType)) { - return createStatePredictedEvent(topic, payload, source); + return createStatePredictedEvent(topic, payload); } else if (ItemStateChangedEvent.TYPE.equals(eventType)) { return createStateChangedEvent(topic, payload); } else if (ItemAddedEvent.TYPE.equals(eventType)) { @@ -115,7 +115,7 @@ public class ItemEventFactory extends AbstractEventFactory { return new ItemStateEvent(topic, payload, itemName, state, source); } - private Event createStatePredictedEvent(String topic, String payload, String source) { + private Event createStatePredictedEvent(String topic, String payload) { String itemName = getItemName(topic); ItemStatePredictedEventPayloadBean bean = deserializePayload(payload, ItemStatePredictedEventPayloadBean.class); State state = getState(bean.getPredictedType(), bean.getPredictedValue()); @@ -262,7 +262,7 @@ public class ItemEventFactory extends AbstractEventFactory { * @return the created item state event * @throws IllegalArgumentException if itemName or state is null */ - public static ItemStateEvent createStateEvent(String itemName, State state) { + public static ItemEvent createStateEvent(String itemName, State state) { return createStateEvent(itemName, state, null); } diff --git a/bundles/org.openhab.core/src/main/java/org/openhab/core/items/events/ItemStateChangedEvent.java b/bundles/org.openhab.core/src/main/java/org/openhab/core/items/events/ItemStateChangedEvent.java index e734c4c24..073d0ec0c 100644 --- a/bundles/org.openhab.core/src/main/java/org/openhab/core/items/events/ItemStateChangedEvent.java +++ b/bundles/org.openhab.core/src/main/java/org/openhab/core/items/events/ItemStateChangedEvent.java @@ -12,7 +12,7 @@ */ package org.openhab.core.items.events; -import org.openhab.core.events.AbstractEvent; +import org.eclipse.jdt.annotation.NonNullByDefault; import org.openhab.core.types.State; /** @@ -22,15 +22,14 @@ import org.openhab.core.types.State; * * @author Dennis Nobel - Initial contribution */ -public class ItemStateChangedEvent extends AbstractEvent { +@NonNullByDefault +public class ItemStateChangedEvent extends ItemEvent { /** * The item state changed event type. */ public static final String TYPE = ItemStateChangedEvent.class.getSimpleName(); - protected final String itemName; - protected final State itemState; protected final State oldItemState; @@ -46,8 +45,7 @@ public class ItemStateChangedEvent extends AbstractEvent { */ protected ItemStateChangedEvent(String topic, String payload, String itemName, State newItemState, State oldItemState) { - super(topic, payload, null); - this.itemName = itemName; + super(topic, payload, itemName, null); this.itemState = newItemState; this.oldItemState = oldItemState; } @@ -57,15 +55,6 @@ public class ItemStateChangedEvent extends AbstractEvent { return TYPE; } - /** - * Gets the item name. - * - * @return the item name - */ - public String getItemName() { - return itemName; - } - /** * Gets the item state. * diff --git a/bundles/org.openhab.core/src/main/java/org/openhab/core/items/events/ItemStateEvent.java b/bundles/org.openhab.core/src/main/java/org/openhab/core/items/events/ItemStateEvent.java index 564da2679..96b0fb460 100644 --- a/bundles/org.openhab.core/src/main/java/org/openhab/core/items/events/ItemStateEvent.java +++ b/bundles/org.openhab.core/src/main/java/org/openhab/core/items/events/ItemStateEvent.java @@ -12,7 +12,8 @@ */ package org.openhab.core.items.events; -import org.openhab.core.events.AbstractEvent; +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; import org.openhab.core.types.State; /** @@ -21,15 +22,14 @@ import org.openhab.core.types.State; * * @author Stefan Bußweiler - Initial contribution */ -public class ItemStateEvent extends AbstractEvent { +@NonNullByDefault +public class ItemStateEvent extends ItemEvent { /** * The item state event type. */ public static final String TYPE = ItemStateEvent.class.getSimpleName(); - private final String itemName; - private final State itemState; /** @@ -41,9 +41,8 @@ public class ItemStateEvent extends AbstractEvent { * @param itemState the item state * @param source the source, can be null */ - protected ItemStateEvent(String topic, String payload, String itemName, State itemState, String source) { - super(topic, payload, source); - this.itemName = itemName; + protected ItemStateEvent(String topic, String payload, String itemName, State itemState, @Nullable String source) { + super(topic, payload, itemName, source); this.itemState = itemState; } @@ -52,15 +51,6 @@ public class ItemStateEvent extends AbstractEvent { return TYPE; } - /** - * Gets the item name. - * - * @return the item name - */ - public String getItemName() { - return itemName; - } - /** * Gets the item state. * diff --git a/bundles/org.openhab.core/src/main/java/org/openhab/core/items/events/ItemStatePredictedEvent.java b/bundles/org.openhab.core/src/main/java/org/openhab/core/items/events/ItemStatePredictedEvent.java index eefcba729..c4acc2427 100644 --- a/bundles/org.openhab.core/src/main/java/org/openhab/core/items/events/ItemStatePredictedEvent.java +++ b/bundles/org.openhab.core/src/main/java/org/openhab/core/items/events/ItemStatePredictedEvent.java @@ -12,7 +12,7 @@ */ package org.openhab.core.items.events; -import org.openhab.core.events.AbstractEvent; +import org.eclipse.jdt.annotation.NonNullByDefault; import org.openhab.core.types.State; /** @@ -26,14 +26,14 @@ import org.openhab.core.types.State; * * @author Simon Kaufmann - Initial contribution */ -public class ItemStatePredictedEvent extends AbstractEvent { +@NonNullByDefault +public class ItemStatePredictedEvent extends ItemEvent { /** * The item state predicted event type. */ public static final String TYPE = ItemStatePredictedEvent.class.getSimpleName(); - protected final String itemName; protected final State predictedState; protected final boolean isConfirmation; @@ -48,8 +48,7 @@ public class ItemStatePredictedEvent extends AbstractEvent { */ public ItemStatePredictedEvent(String topic, String payload, String itemName, State predictedState, boolean isConfirmation) { - super(topic, payload, null); - this.itemName = itemName; + super(topic, payload, itemName, null); this.predictedState = predictedState; this.isConfirmation = isConfirmation; } @@ -59,15 +58,6 @@ public class ItemStatePredictedEvent extends AbstractEvent { return TYPE; } - /** - * Gets the item name. - * - * @return the item name - */ - public String getItemName() { - return itemName; - } - /** * Gets the predicted item state. *