From 0fcb1e6b53ec919b208db76ab10149696ceb53f3 Mon Sep 17 00:00:00 2001 From: Manuel Krombholz <s3866577@msx.tu-dresden.de> Date: Tue, 16 Mar 2021 14:38:48 +0100 Subject: [PATCH] Added parsing support for state copy --- eraser-base/src/main/jastadd/Item.jrag | 28 +++++++++++-------- eraser-base/src/main/jastadd/Rules.jrag | 18 ++++++------ eraser-base/src/main/jastadd/eraser.flex | 2 +- eraser-base/src/main/jastadd/eraser.parser | 19 +++++++------ eraser-base/src/main/jastadd/shem.relast | 4 ++- .../st/eraser/parser/EraserParserHelper.java | 4 --- 6 files changed, 42 insertions(+), 33 deletions(-) diff --git a/eraser-base/src/main/jastadd/Item.jrag b/eraser-base/src/main/jastadd/Item.jrag index 2473947b..ece1fd87 100644 --- a/eraser-base/src/main/jastadd/Item.jrag +++ b/eraser-base/src/main/jastadd/Item.jrag @@ -281,6 +281,8 @@ aspect ItemHandling { stateUpdated(shouldSendState); } + syn ItemObserver Item.getItemObserver() = new ItemObserver(); + //--- stateUpdated --- /** * Called, whenever the state of an item is updated. Does various things including: @@ -462,23 +464,27 @@ aspect ItemHandling { //--- copyStateTo --- - protected abstract void Item.copyStateTo(Item... stateReceivers); - protected void ItemWithBooleanState.copyStateTo(Item... stateReceivers) { - Arrays.asList(stateReceivers).forEach(s -> s.setStateFromBoolean(this.getState())); + protected abstract void Item.copyStateTo(Item stateReceiver); + + protected void ItemWithBooleanState.copyStateTo(Item stateReceiver) { + stateReceiver.setStateFromBoolean(this.getState()); } - protected void ItemWithStringState.copyStateTo(Item... stateReceivers) { - Arrays.asList(stateReceivers).forEach(s -> s.setStateFromString(this.getState())); + protected void ItemWithStringState.copyStateTo(Item stateReceiver) { + stateReceiver.setStateFromString(this.getState()); } - protected void ItemWithDoubleState.copyStateTo(Item... stateReceivers) { - Arrays.asList(stateReceivers).forEach(s -> s.setStateFromDouble(this.getState())); + protected void ItemWithDoubleState.copyStateTo(Item stateReceiver) { + stateReceiver.setStateFromDouble(this.getState()); } - protected void ColorItem.copyStateTo(Item... stateReceivers) { - Arrays.asList(stateReceivers).forEach(s -> s.setStateFromColor(this.getState())); + protected void ColorItem.copyStateTo(Item stateReceiver) { + stateReceiver.setStateFromColor(this.getState()); } - protected void DateTimeItem.copyStateTo(Item... stateReceivers) { - Arrays.asList(stateReceivers).forEach(s -> s.setStateFromInstant(this.getState())); + protected void DateTimeItem.copyStateTo(Item stateReceiver) { + stateReceiver.setStateFromInstant(this.getState()); } + + + private void ColorItem.setBrightness(int value) { setState(getState().withDifferentBrightness(value)); } diff --git a/eraser-base/src/main/jastadd/Rules.jrag b/eraser-base/src/main/jastadd/Rules.jrag index 7e550453..743ccc5b 100644 --- a/eraser-base/src/main/jastadd/Rules.jrag +++ b/eraser-base/src/main/jastadd/Rules.jrag @@ -95,7 +95,11 @@ aspect Rules { getAffectedItem().setStateFromString(getNewStateProvider().get()); } public void SetStateFromTriggeringItemAction.applyFor(Item item) { - item.copyStateTo(getAffectedItem()); + Item target = getAffectedItem(); + if (target==item) { + return; + } + item.copyStateTo(target); } public void SetStateFromItemsAction.applyFor(Item item) { getAffectedItem().setStateFromString(getCombinator().apply(getSourceItems())); @@ -113,15 +117,13 @@ aspect StateSyncGroup { rewrite StateSyncGroup { to Rule { Item controllingItem = ((ItemObserver)getParent()).observedItem(); - - SetStateFromTriggeringItemAction action = new SetStateFromTriggeringItemAction(); + Rule rule = new Rule(); - /* - action.setAffectedItems(getItems()) - */ + for (Item item : getItems()) { + rule.addAction(new SetStateFromTriggeringItemAction(item)); + rule.addObserver(item.getItemObserver()); + } - Rule rule = new Rule(); - rule.addAction(action); return rule; } } diff --git a/eraser-base/src/main/jastadd/eraser.flex b/eraser-base/src/main/jastadd/eraser.flex index e81c7f7f..21987f14 100644 --- a/eraser-base/src/main/jastadd/eraser.flex +++ b/eraser-base/src/main/jastadd/eraser.flex @@ -57,7 +57,7 @@ Comment = "//" [^\n\r]+ "Influx" { return sym(Terminals.INFLUX); } "ML" { return sym(Terminals.ML); } "Rule" { return sym(Terminals.RULE); } -//"SyncState" { return sym(Terminals.SYNCSTATE); } +"SyncState" { return sym(Terminals.SYNCSTATE); } // special items (group already has a token definition) "Activity" { return sym(Terminals.ACTIVITY); } "Color" { return sym(Terminals.COLOR); } diff --git a/eraser-base/src/main/jastadd/eraser.parser b/eraser-base/src/main/jastadd/eraser.parser index 74abecdd..00ade60d 100644 --- a/eraser-base/src/main/jastadd/eraser.parser +++ b/eraser-base/src/main/jastadd/eraser.parser @@ -3,6 +3,7 @@ package de.tudresden.inf.st.eraser.jastadd.parser; import de.tudresden.inf.st.eraser.jastadd.model.*; import de.tudresden.inf.st.eraser.jastadd.model.Action; import de.tudresden.inf.st.eraser.parser.EraserParserHelper; +import de.tudresden.inf.st.eraser.jastadd.model.StateSyncGroup; import java.util.Map; import java.util.HashMap; :} ; @@ -31,6 +32,7 @@ Root goal = thing.t goal.r {: insertZero(r.getSmartHomeEntityModel().getThingList(), t); return r; :} | item.i goal.r {: return r; :} | group.g goal.r {: insertZero(r.getSmartHomeEntityModel().getGroupList(), g); return r; :} + | state_sync_group.ss goal.r {: r.addRule(ss); return r; :} | thing_type.tt goal.r {: insertZero(r.getSmartHomeEntityModel().getThingTypeList(), tt); return r; :} | parameter goal.r {: return r; :} | channel_type.ct goal.r {: insertZero(r.getSmartHomeEntityModel().getChannelTypeList(), ct); return r; :} @@ -156,14 +158,15 @@ Group group_body = -// SYNCSTATE COLON syncstate_body.ssb SEMICOLON {: eph.addStateSyncGroup(ssb); :}; -// StateSyncGroup ssg = SYNCSTATE COLON syncstate_body.ssb SEMICOLON {: return ssb; :}; -// -//// SyncState: items=["ITEM_ID", "ITEM_ID"]; -//StateSyncGroup syncstate_body = -// ITEMS EQUALS string_list.items syncstate_body.ss {: return eph.setItems(ss, items); :} -// | {: return new StateSyncGroup(); :} -// ; + + +StateSyncGroup state_sync_group = SYNCSTATE COLON syncstate_body.ssb SEMICOLON {: return ssb; :}; + +// SyncState: items=["ITEM_ID", "ITEM_ID"]; +StateSyncGroup syncstate_body = + ITEMS EQUALS string_list.items syncstate_body.ss {: return eph.setItems(ss, items); :} + | {: return new StateSyncGroup(); :} + ; ThingType thing_type = THING_TYPE COLON thing_type_body.ttb SEMICOLON {: return ttb; :} diff --git a/eraser-base/src/main/jastadd/shem.relast b/eraser-base/src/main/jastadd/shem.relast index 9e7252ff..ef377929 100644 --- a/eraser-base/src/main/jastadd/shem.relast +++ b/eraser-base/src/main/jastadd/shem.relast @@ -25,7 +25,9 @@ rel Channel.LinkedItem* <-> Item.Channel? ; Parameter : DescribableModelElement ::= <Type:ParameterValueType> [DefaultValue:ParameterDefaultValue] <Context:String> <Required:boolean> ; ParameterDefaultValue ::= <Value:String> ; -abstract Item : LabelledModelElement ::= <_fetched_data:boolean> MetaData:ItemMetaData* ItemObserver; +abstract Item : LabelledModelElement ::= <_fetched_data:boolean> MetaData:ItemMetaData* /ItemObserver/ + + rel Item.Category? -> ItemCategory ; abstract ItemWithBooleanState : Item ::= <_state:boolean> ; diff --git a/eraser-base/src/main/java/de/tudresden/inf/st/eraser/parser/EraserParserHelper.java b/eraser-base/src/main/java/de/tudresden/inf/st/eraser/parser/EraserParserHelper.java index 87cd2764..e8843f8c 100644 --- a/eraser-base/src/main/java/de/tudresden/inf/st/eraser/parser/EraserParserHelper.java +++ b/eraser-base/src/main/java/de/tudresden/inf/st/eraser/parser/EraserParserHelper.java @@ -500,10 +500,6 @@ public class EraserParserHelper { return ssg; } - public void addStateSyncGroup(StateSyncGroup ssg) { - System.out.println("Gotcha"); - } - public Rule createRule(Condition c, Action a) { Rule result = new Rule(); -- GitLab