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