From 4f2514b81a1d0194ccb4b99440782d4a57ce66ee Mon Sep 17 00:00:00 2001
From: rschoene <rene.schoene@tu-dresden.de>
Date: Thu, 28 Jul 2022 09:24:41 +0200
Subject: [PATCH] attempt with ragconnect 0.2.2 failed

- compiles, but dependency definitions are not able to model data flow to NTAs. appears to not work
---
 ...rag.java-old-ragconnect-conventions.gradle | 18 ++++++
 .../src/main/resources/tasks.gradle           |  4 +-
 .../src/main/jastadd/OldWorldModelB.connect   | 36 ++++++-----
 .../src/main/jastadd/forwardsComp.jadd        | 11 +---
 .../de/tudresden/inf/st/old/b/OldMainB.java   | 60 +++++++++++++++++--
 5 files changed, 95 insertions(+), 34 deletions(-)
 create mode 100644 buildSrc/src/main/groovy/ros3rag.java-old-ragconnect-conventions.gradle

diff --git a/buildSrc/src/main/groovy/ros3rag.java-old-ragconnect-conventions.gradle b/buildSrc/src/main/groovy/ros3rag.java-old-ragconnect-conventions.gradle
new file mode 100644
index 0000000..1f856db
--- /dev/null
+++ b/buildSrc/src/main/groovy/ros3rag.java-old-ragconnect-conventions.gradle
@@ -0,0 +1,18 @@
+plugins {
+  id 'ros3rag.java-jastadd-conventions'
+}
+
+configurations {
+  ragconnect
+  grammar2uml
+  relast
+}
+
+dependencies {
+  api group: 'net.sf.beaver', name: 'beaver-rt', version: '0.9.11'
+  grammar2uml group: 'de.tudresden.inf.st', name: 'grammar2uml', version: '0.2.3'
+
+  relast group: 'org.jastadd', name: 'relast', version: "0.4.0-143"
+
+  implementation group: 'de.tudresden.inf.st', name: 'dumpAst', version: '1.2.1-77'
+}
diff --git a/ros3rag.common/src/main/resources/tasks.gradle b/ros3rag.common/src/main/resources/tasks.gradle
index b0c1d78..402e14e 100644
--- a/ros3rag.common/src/main/resources/tasks.gradle
+++ b/ros3rag.common/src/main/resources/tasks.gradle
@@ -65,7 +65,9 @@ task oldRagConnect(type: JavaExec) {
             file('src/gen/workaround/merged.connect'),
             '--rootNode=' + project.ext.ragConnectRootNode,
             '--protocols=' + project.ext.ragConnectProtocols,
-            '--List=JastAddList'
+            '--List=JastAddList',
+//            '--logReads',
+            '--logWrites',
     ])
 }
 
diff --git a/ros3rag.old.b/src/main/jastadd/OldWorldModelB.connect b/ros3rag.old.b/src/main/jastadd/OldWorldModelB.connect
index 165fa1a..d6ed83d 100644
--- a/ros3rag.old.b/src/main/jastadd/OldWorldModelB.connect
+++ b/ros3rag.old.b/src/main/jastadd/OldWorldModelB.connect
@@ -46,9 +46,7 @@ ConvertCommand maps de.tudresden.inf.st.ceti.Command command to Operation {:
 
 // --- sending ---
 send WorldModelB.NextOperationAsNtaToken using PrintCommand ;
-// (direct manipulation is dangerous) send WorldModelB.NextOperation using PrintAndRememberOperation ;
 send Robot.MyPosition ;
-// (direct manipulation is dangerous) send Robot.myPosition(String) using ImmediateUpdate ;
 
 PrintCommand maps de.tudresden.inf.st.ceti.Command cmd to byte[] {:
   if (cmd == null) {
@@ -58,23 +56,6 @@ PrintCommand maps de.tudresden.inf.st.ceti.Command cmd to byte[] {:
   return cmd.toByteArray();
 :}
 
-// (direct manipulation is dangerous)
-//PrintAndRememberOperation maps Operation op to byte[] {:
-//  byte[] result = op.toProtobufByteArray();
-//  if (result == null) {
-//    reject();
-//  }
-//  ((WorldModelB) this).addExecutedOperation(op);
-//  return result;
-//:}
-//
-// (direct manipulation is dangerous)
-//ImmediateUpdate maps String pos to String {:
-//  Robot robot = (Robot) this;
-//  robot.setCurrentPosition(pos);
-//  return pos;
-//:}
-
 ConfigChangeCommandCheckForOwnedCollaborationZone maps byte[] bytes to String {:
   de.tudresden.inf.st.ceti.Command command = null;
   try {
@@ -187,3 +168,20 @@ CommandCheckForOccupiedCollaborationZone maps byte[] bytes to String {:
   }
   return String.join(",", occupiedZoneNames);
 :}
+
+// probably need dependency definitions
+
+// WorldModelB.NextOperationAsNtaToken
+WorldModelB.NextOperationAsNtaToken canDependOn WorldModelB.OtherSceneAsJson as NextOperationWorldModelOtherSceneDep ;
+WorldModelB.NextOperationAsNtaToken canDependOn WorldModelB.MySceneAsProtobuf as NextOperationWorldModelMySceneDep ;
+WorldModelB.NextOperationAsNtaToken canDependOn Robot.CurrentPosition as NextOperationRobotCurrentPositionDep ;
+WorldModelB.NextOperationAsNtaToken canDependOn RobotObject.State as NextOperationRobotObjectStateDep ;
+WorldModelB.NextOperationAsNtaToken canDependOn Robot.OccupiedCollaborationZoneNames as NextOperationRobotOccupiedDep ;
+WorldModelB.NextOperationAsNtaToken canDependOn Robot.OwnedCollaborationZoneNames as NextOperationRobotOwnedDep ;
+
+// Robot.MyPosition
+//Robot.MyPosition canDependOn RobotObject.State as MyPositionRobotObjectStateDep ;
+Robot.MyPosition canDependOn WorldModelB.MySceneAsProtobuf as MyPositionMySceneDep ;
+Robot.MyPosition canDependOn Robot.CurrentPosition as MyPositionRobotCurrentPositionDep ;
+Robot.MyPosition canDependOn Robot.OccupiedCollaborationZoneNames as MyPositionRobotOccupiedDep ;
+Robot.MyPosition canDependOn Robot.OwnedCollaborationZoneNames as MyPositionRobotOwnedDep ;
diff --git a/ros3rag.old.b/src/main/jastadd/forwardsComp.jadd b/ros3rag.old.b/src/main/jastadd/forwardsComp.jadd
index 7406eb8..8c40534 100644
--- a/ros3rag.old.b/src/main/jastadd/forwardsComp.jadd
+++ b/ros3rag.old.b/src/main/jastadd/forwardsComp.jadd
@@ -9,16 +9,7 @@ aspect ForwardsCompatibility {
   }
 
   static Robot ASTNode.hackTemporaryRobot;
-//  refine MqttHandler public boolean MqttHandler.newConnection(String topic, java.util.function.Consumer<byte[]> callback) {
-//    if (topic.equals("/ceti_cell_placeworld/command")) {
-//      // add decorator consumer to set hackTemporaryRobot
-//      java.util.function.Consumer<byte[]> decoratedConsumer = input -> {
-//
-//      };
-//    }
-//    refined();
-//  }
-    refine ROS2RAG public boolean Robot.connectOwnedCollaborationZoneNames(String uriString) throws java.io.IOException {
+  refine ROS2RAG public boolean Robot.connectOwnedCollaborationZoneNames(String uriString) throws java.io.IOException {
   String scheme,host, path;
 java.net.URI uri;
 try {
diff --git a/ros3rag.old.b/src/main/java/de/tudresden/inf/st/old/b/OldMainB.java b/ros3rag.old.b/src/main/java/de/tudresden/inf/st/old/b/OldMainB.java
index 7cf3c3e..8727575 100644
--- a/ros3rag.old.b/src/main/java/de/tudresden/inf/st/old/b/OldMainB.java
+++ b/ros3rag.old.b/src/main/java/de/tudresden/inf/st/old/b/OldMainB.java
@@ -166,6 +166,17 @@ public class OldMainB extends SharedMainParts<MqttHandler, ArtificialRoot> {
       checkSuccess(robot.connectMyPosition(mqttUri(topicPosition, config), true),
           "MyPosition (" + robot.getName() + ")");
     }
+
+    // TODO make the actual dependencies
+    model.getWorldModelB().addNextOperationWorldModelMySceneDep(model.getWorldModelB());
+    model.getWorldModelB().addNextOperationWorldModelOtherSceneDep(model.getWorldModelB());
+    for (Robot robot : model.getWorldModelB().getRobotList()) {
+      model.getWorldModelB().addNextOperationRobotCurrentPositionDep(robot);
+      robot.addMyPositionRobotCurrentPositionDep(robot);
+      robot.addMyPositionRobotOccupiedDep(robot);
+      robot.addMyPositionRobotOwnedDep(robot);
+      robot.addMyPositionMySceneDep(model.getWorldModelB());
+    }
   }
 
   private void checkSuccess(boolean connectSuccess, String target) {
@@ -179,10 +190,51 @@ public class OldMainB extends SharedMainParts<MqttHandler, ArtificialRoot> {
 //    Thread t = new Thread(() -> {
       try {
         String filename = artificialRoot.getWorldModelB().dumpAst(builder -> {
-          builder.excludeChildren("Orientation", "Size");
-          builder.excludeRelations("ContainedInRegion");
-          builder.includeNonterminalAttributes("LogicalScene", "diffScenes", "diffToOperations");
-          builder.includeAttributes("realRegion", "computeOperations", "myPosition");
+          builder.includeChildWhen((parentNode, childNode, contextName) -> {
+            switch (contextName) {
+              case "Orientation":
+              case "Size":
+                return false;
+              default:
+                return true;
+            }
+          });
+          builder.includeTokensWhen((node, tokenName, value) -> {
+            switch (tokenName) {
+              case "_internal_MySceneAsProtobuf":
+              case "_internal_OtherSceneAsJson":
+                return false;
+              default:
+                return true;
+            }
+          });
+          builder.includeAttributeWhen((node, attributeName, isNTA, value) -> {
+            if (isNTA) {
+              switch (attributeName) {
+                case "diffScenes":
+                case "diffToOperations":
+                case "LogicalScene":
+                  return true;
+                default:
+                  return false;
+              }
+            } else {
+              switch (attributeName) {
+                case "realRegion":
+                case "computeOperations":
+                case "myPosition":
+                  return true;
+                default:
+                  return false;
+              }
+            }
+          });
+          builder.includeRelationsWhen((sourceNode, targetNode, roleName) -> {
+            if (roleName.startsWith("_internal_") && (roleName.endsWith("Source") || roleName.endsWith("Target"))) {
+              return false;
+            }
+            return !roleName.equals("ContainedInRegion");
+          });
           builder.includeNullNodes();
         });
         mainHandler.publish(TOPIC_MODEL_SVG_PATH, filename.getBytes(StandardCharsets.UTF_8));
-- 
GitLab