瀏覽代碼

Updated Addis's files

Yentl Van Tendeloo 8 年之前
父節點
當前提交
bf7346ddec
共有 5 個文件被更改,包括 1360 次插入381 次删除
  1. 45 48
      addis/PM_MetaModel.mvc
  2. 884 302
      addis/PM_to_SCCD.mvc
  3. 396 6
      addis/SCCD_Example.mvc
  4. 13 12
      addis/SCCD_MetaModel.mvc
  5. 22 13
      addis/Test_PM2SCCD.py

+ 45 - 48
addis/PM_MetaModel.mvc

@@ -2,7 +2,6 @@ include "primitives.alh"
 include "object_operations.alh"
 include "modelling.alh"
 
-
 SimpleAttribute String {}
 SimpleAttribute MvCName {
     constraint = $
@@ -37,15 +36,6 @@ Class Edge {
 Class Start : Activity {
     lower_cardinality = 1
     upper_cardinality = 1
-    constraint = $
-        String function constraint(model : Element, name : String):
-            Element outgoing_edges
-            outgoing_edges = allOutgoingAssociationInstances(model, name, "Next")
-            if list_len(outgoing_edges) !=1:
-                return "A start node should have one outgoing control flow"!
-            else:
-                return "OK"!
-        $
 }
 Class Finish : Activity {
     lower_cardinality = 1
@@ -53,8 +43,8 @@ Class Finish : Activity {
         String function constraint(model : Element, name : String):
             Element incoming_edges
             incoming_edges = allIncomingAssociationInstances(model, name, "Next")
-            if (list_len(incoming_edges) !=1):
-                return "A finish node should have either one incoming control flow or decision flow"!
+            if list_len(incoming_edges) !=1:
+                return "A finish node should have exactly one incoming control-flow at " + name!
             else:
                 return "OK"!
         $
@@ -62,26 +52,31 @@ Class Finish : Activity {
 Class Fork : Activity {
     constraint = $
         String function constraint(model : Element, name : String):
-            Element outgoing_edges
             Element incoming_edges
-            outgoing_edges = allOutgoingAssociationInstances(model, name, "Next")
             incoming_edges = allIncomingAssociationInstances(model, name, "Next")
-            if bool_or(list_len(outgoing_edges) <2, list_len(incoming_edges) !=1):
-                return "All Fork nodes should have one incoming control flow and at least two outgoing control flows"!
+            if list_len(incoming_edges) <1:
+                return "A Fork node should have at-least one incoming control-flow at " + name!
             else:
                 return "OK"!
         $
 }
-
 Class Join : Activity {
     constraint = $
         String function constraint(model : Element, name : String):
-            Element outgoing_edges
             Element incoming_edges
-            outgoing_edges = allOutgoingAssociationInstances(model, name, "Next")
+            Element source
+            String type
             incoming_edges = allIncomingAssociationInstances(model, name, "Next")
-            if bool_or(list_len(outgoing_edges) !=1, list_len(incoming_edges) <2):
-                return "All Join nodes should have at least two incoming and one outgoing control flow"!
+            if list_len(incoming_edges) >0:
+                Integer i
+                i = 0
+                while i < list_len (incoming_edges):
+                    source = readAssociationSource(model, list_read(incoming_edges, i))
+                    type = read_type(model, source)
+                    if type == "Start":
+                        return "A join node can not have a Start node as an incoming flow at "+name!
+            if list_len(incoming_edges) <2:
+                return "A Join node should have at least two incoming control flows at " + name!
             else:
                 return "OK"!
         $
@@ -89,61 +84,63 @@ Class Join : Activity {
 Class Decision : Activity {
     constraint = $
         String function constraint(model : Element, name : String):
-            Element outgoing_edges
             Element incoming_edges
-            Element consumes
-            consumes = allOutgoingAssociationInstances(model, name, "DecisionConsumes")
-            outgoing_edges = allOutgoingAssociationInstances(model, name, "Next")
             incoming_edges = allIncomingAssociationInstances(model, name, "Next")
-            if bool_or(list_len(outgoing_edges) <2, list_len(incoming_edges) !=1):
-                return "All Decision nodes should have at least one incoming flow and two outgoing flows"!
-            elif list_len(consumes) != 1:
-                return "All Decision nodes should have exactly one incoming data flow"!
+            if list_len(incoming_edges) <1:
+                return "A Decision node should have at least one incoming control-flows at " + name!
             else:
                 return "OK"!
         $
 }
-
 Class Exec : Activity {
     name : MvCName
     sccd_class_id ?: String
     lower_cardinality = 1
     constraint = $
         String function constraint(model : Element, name : String):
-            Element outgoing_edges
             Element incoming_edges
-            outgoing_edges = allOutgoingAssociationInstances(model, name, "Next")
             incoming_edges = allIncomingAssociationInstances(model, name, "Next")
-            if bool_or(list_len(outgoing_edges) !=1, list_len(incoming_edges) !=1):
-                return "All Executable nodes should have exactly one incoming and one outgoing control flow"!
+            if list_len(incoming_edges) <1:
+                return "An Executable node should have at-least one incoming control-flow at " + name!
             else:
                 return "OK"!
         $
 }
-
 Class Data {
     id : String
     name : MvCName
     type : MvCName
-    constraint = $
-        String function constraint(model : Element, name : String):
-            Element outgoing_edges
-            Element incoming_edges
-            outgoing_edges = allIncomingAssociationInstances(model, name, "Consumes")
-            incoming_edges = allIncomingAssociationInstances(model, name, "Produces")
-            if bool_or(list_len(outgoing_edges) <1, list_len(incoming_edges) <1):
-                return "All Data nodes should have al-least one incoming Produces and one outgoing Consumes flow"!
-            else:
-                return "OK"!
-        $
 }
 
-Association Produces : Edge (Exec, Data) {}
+Association Produces : Edge (Exec, Data) {
+    source_lower_cardinality = 1
+}
 Association Consumes : Edge (Exec, Data) {}
-Association DecisionConsumes : Edge (Decision, Data) {}
+Association DecisionConsumes : Edge (Decision, Data) {
+    target_lower_cardinality = 1
+    target_upper_cardinality = 1
+}
 Association Next : Edge (Activity, Activity) {
     value ?: MvCName
 }
+Association S2A : Next(Start, Activity){
+    target_lower_cardinality = 1
+    target_upper_cardinality = 1
+}
+Association E2A : Next(Exec, Activity){
+    target_lower_cardinality = 1
+    target_upper_cardinality = 1
+}
+Association F2A : Next(Fork, Activity){
+    target_lower_cardinality = 2
+}
+Association J2A : Next(Join, Activity){
+    target_lower_cardinality = 1
+    target_upper_cardinality = 1
+}
+Association D2A : Next(Decision, Activity){
+    target_lower_cardinality = 2
+}
 
 Class CanvasPosition{
     x1: Natural

File diff suppressed because it is too large
+ 884 - 302
addis/PM_to_SCCD.mvc


+ 396 - 6
addis/SCCD_Example.mvc

@@ -1,16 +1,406 @@
-
-Diagram SCCD_Example {
+include "primitives.alh"
+Diagram SCCD_my_PM {
     name = "SCCD example "
     {diagram_classes} Class A {
         name = "A"
-
-        {behaviour} CompositeState manager_main {
+        constructor_body = $
+            Void function constructor(attributes : Element, parameters : Element):
+                dict_add(attributes, "id", '')
+                dict_add(attributes, "parent_id", '')
+                return !
+        $
+        {behaviour} CompositeState root_a {
+            name = "main"
+            isInitial = True
+            {composite_children} BasicState initial_a {
+                name = "Init"
+                isInitial = True
+            }
+            {composite_children} BasicState running_a {
+                name = "Running"
+                isInitial = False
+            }
+            {composite_children} BasicState done_a {
+                name = "Done"
+                isInitial = False
+            }
+        }
+    }
+    {diagram_classes} Class B {
+        name = "B"
+        constructor_body = $
+            Void function constructor(attributes : Element, parameters : Element):
+                dict_add(attributes, "id", '')
+                dict_add(attributes, "parent_id", '')
+                return !
+        $
+        {behaviour} CompositeState root_b {
+            name = "main"
+            isInitial = True
+            {composite_children} BasicState initial_b {
+                name = "Init"
+                isInitial = True
+            }
+            {composite_children} BasicState running_b {
+                name = "Running"
+                isInitial = False
+            }
+            {composite_children} BasicState done_b {
+                name = "Done"
+                isInitial = False
+            }
+        }
+    }
+    {diagram_classes} Class C {
+        name = "C"
+        constructor_body = $
+            Void function constructor(attributes : Element, parameters : Element):
+                dict_add(attributes, "id", '')
+                dict_add(attributes, "parent_id", '')
+                return !
+        $
+        {behaviour} CompositeState root_c {
+            name = "main"
+            isInitial = True
+            {composite_children} BasicState initial_c {
+                name = "Init"
+                isInitial = True
+            }
+            {composite_children} BasicState running_c {
+                name = "Running"
+                isInitial = False
+            }
+            {composite_children} BasicState done_c {
+                name = "Done"
+                isInitial = False
+            }
+        }
+    }
+    {diagram_classes} Class E {
+        name = "E"
+        constructor_body = $
+            Void function constructor(attributes : Element, parameters : Element):
+                dict_add(attributes, "id", '')
+                dict_add(attributes, "parent_id", '')
+                return !
+        $
+        {behaviour} CompositeState root_e {
             name = "main"
             isInitial = True
-            {composite_children} BasicState manager_main_start {
-                name = "start"
+            {composite_children} BasicState initial_e {
+                name = "Init"
                 isInitial = True
             }
+            {composite_children} BasicState running_e {
+                name = "Running"
+                isInitial = False
+                {state_onentry_raises} Raise {
+                    event = "save"
+                    scope = "narrow"
+                    target = $
+                        Element function raise(attributes : Element):
+                            return attributes["parent_id"]!
+                        $
+                    parameters = $
+                        Element function raise(attributes : Element):
+                            Element result
+                            result = list_create()
+                            list_append(result, "bool")
+                            list_append(result, "E")
+                            return result!
+                    $
+                }
+            }
+            {composite_children} BasicState done_e {
+                name = "Done"
+                isInitial = False
+            }
         }
     }
+    {diagram_classes} Class D {
+        name = "D"
+        constructor_body = $
+            Void function constructor(attributes : Element, parameters : Element):
+                dict_add(attributes, "id", '')
+                dict_add(attributes, "parent_id", '')
+                return !
+        $
+        {behaviour} CompositeState root_d {
+            name = "main"
+            isInitial = True
+            {composite_children} BasicState initial_d {
+                name = "Init"
+                isInitial = True
+            }
+            {composite_children} BasicState running_d {
+                name = "Running"
+                isInitial = False
+            }
+            {composite_children} BasicState done_d {
+                name = "Done"
+                isInitial = False
+            }
+        }
+    }
+    {diagram_classes} Class F {
+        name = "F"
+        constructor_body = $
+            Void function constructor(attributes : Element, parameters : Element):
+                dict_add(attributes, "id", '')
+                dict_add(attributes, "parent_id", '')
+                return !
+        $
+        {behaviour} CompositeState root_f {
+            name = "main"
+            isInitial = True
+            {composite_children} BasicState initial_f {
+                name = "Init"
+                isInitial = True
+            }
+            {composite_children} BasicState running_f {
+                name = "Running"
+                isInitial = False
+            }
+            {composite_children} BasicState done_f {
+                name = "Done"
+                isInitial = False
+            }
+        }
+    }
+
+}
+transition (initial_a, running_a){
+    event = "set_id"
+    script = $
+            Void function script(attributes : Element, parameters : Element):
+                dict_overwrite(attributes, "id", parameters[0])
+                dict_overwrite(attributes, "parent_id", parameters[1])
+                log("CREATED ---- A")
+                return!
+        $
+}
+transition (running_a, done_a){
+    after = $
+            Float function after(attributes : Element):
+                return 0.5!
+        $
+    script = $
+            Void function script(attributes : Element, parameters : Element):
+                log("FINISHED ---- A")
+                return!
+        $
+    {transition_raises} Raise {
+        scope = "narrow"
+        event = "terminated"
+        target = $
+            String function raise(attributes : Element):
+                return attributes["parent_id"]!
+            $
+        parameters = $
+            Element function raise(attributes : Element, parameters : Element):
+                Element result
+                result = list_create()
+                list_append(result, 'A')
+                return result!
+        $
+    }
+    {transition_raises} Raise {
+        scope = "cd"
+        event = "delete_instance"
+        parameters = $
+            Element function raise(attributes : Element, parameters : Element):
+                Element result
+                result = list_create()
+                list_append(result, attributes["id"])
+                return result!
+        $
+    }
+}
+transition (initial_b, running_b){
+    event = "set_id"
+    script = $
+        Void function script(attributes : Element, parameters : Element):
+            dict_overwrite(attributes, "id", parameters[0])
+            dict_overwrite(attributes, "parent_id", parameters[1])
+            log("CREATED ---- B")
+            return!
+    $
+}
+transition (running_b, done_b){
+    after = $
+        Float function after(attributes : Element):
+            return 0.9!
+    $
+    script = $
+        Void function script(attributes : Element, parameters : Element):
+            log("FINISHED ---- B")
+            return!
+    $
+    {transition_raises} Raise {
+        scope = "narrow"
+        event = "terminated"
+        target = $
+            Element function raise(attributes : Element):
+                return attributes["parent_id"]!
+            $
+        parameters = $
+            Element function raise(attributes : Element, parameters : Element):
+                Element result
+                result = list_create()
+                list_append(result, 'B')
+                return result!
+        $
+    }
+    {transition_raises} Raise {
+        scope = "cd"
+        event = "delete_instance"
+        parameters = $
+            Element function raise(attributes : Element, parameters : Element):
+                Element result
+                result = list_create()
+                list_append(result, attributes["id"])
+                return result!
+        $
+    }
+}
+transition (initial_c, running_c){
+    event = "set_id"
+    script = $
+        Void function script(attributes : Element, parameters : Element):
+            dict_overwrite(attributes, "id", parameters[0])
+            dict_overwrite(attributes, "parent_id", parameters[1])
+            log("CREATED ---- C")
+            return!
+    $
+}
+transition (running_c, done_c){
+    after = $
+        Float function after(attributes : Element):
+            return 0.5!
+    $
+    script = $
+        Void function script(attributes : Element, parameters : Element):
+            log("FINISHED ---- C")
+            return!
+    $
+    {transition_raises} Raise {
+        scope = "narrow"
+        event = "terminated"
+        target = $
+            Element function raise(attributes : Element):
+                return attributes["parent_id"]!
+            $
+        parameters = $
+            Element function raise(attributes : Element, parameters : Element):
+                Element result
+                result = list_create()
+                list_append(result, "C")
+                return result!
+        $
+    }
+    {transition_raises} Raise {
+        scope = "cd"
+        event = "delete_instance"
+        parameters = $
+            Element function raise(attributes : Element, parameters : Element):
+                Element result
+                result = list_create()
+                list_append(result, attributes["id"])
+                return result!
+        $
+    }
+}
+transition (initial_e, running_e){
+    event = "set_id"
+    script = $
+        Void function script(attributes : Element, parameters : Element):
+            dict_overwrite(attributes, "id", parameters[0])
+            dict_overwrite(attributes, "parent_id", parameters[1])
+            log("CREATED ---- E")
+            return!
+    $
+}
+transition (running_e, done_e){
+    after = $
+        Float function after(attributes : Element):
+            return 0.5!
+    $
+    script = $
+        Void function script(attributes : Element, parameters : Element):
+            log("FINISHED ---- E")
+            return!
+    $
+    {transition_raises} Raise {
+        scope = "narrow"
+        event = "terminated"
+        target = $
+            Element function raise(attributes : Element):
+                return attributes["parent_id"]!
+            $
+        parameters = $
+            Element function raise(attributes : Element, parameters : Element):
+                Element result
+                result = list_create()
+                list_append(result, "E")
+                return result!
+        $
+    }
+    {transition_raises} Raise {
+        scope = "cd"
+        event = "delete_instance"
+        parameters = $
+            Element function raise(attributes : Element, parameters : Element):
+                Element result
+                result = list_create()
+                list_append(result, attributes["id"])
+                return result!
+        $
+    }
+}
+transition (initial_f, running_f){
+    event = "set_id"
+    script = $
+        Void function script(attributes : Element, parameters : Element):
+            dict_overwrite(attributes, "id", parameters[0])
+            dict_overwrite(attributes, "parent_id", parameters[1])
+            log("CREATED ---- F")
+            return!
+    $
+}
+transition (running_f, done_f){
+    after = $
+            Float function after(attributes : Element):
+                return 0.5!
+        $
+    script = $
+            Void function script(attributes : Element, parameters : Element):
+                log("FINISHED ---- F")
+                return!
+        $
+    {transition_raises} Raise {
+        scope = "narrow"
+        event = "terminated"
+        target = $
+            Element function raise(attributes : Element):
+                return attributes["parent_id"]!
+            $
+        parameters = $
+            Element function raise(attributes : Element, parameters : Element):
+                Element result
+                result = list_create()
+                list_append(result, attributes['id'])
+                return result!
+        $
+    }
+    {transition_raises} Raise {
+        scope = "cd"
+        event = "delete_instance"
+        parameters = $
+            Element function raise(attributes : Element, parameters : Element):
+                Element result
+                result = list_create()
+                list_append(result, attributes["id"])
+                return result!
+        $
+    }
 }

+ 13 - 12
addis/SCCD_MetaModel.mvc

@@ -2,7 +2,7 @@ include "primitives.alh"
 include "object_operations.alh"
 include "modelling.alh"
 
-
+SimpleAttribute Action {}
 SimpleAttribute Neutral {}
 SimpleAttribute Boolean {
     constraint = $
@@ -78,8 +78,8 @@ Association diagram_outports(Diagram, Outport){}
 
 Class Class{
     name : String
-    constructor_body ?: String
-    destructor ?: String
+    constructor_body ?: Action
+    destructor ?: Action
     default ?: Boolean
     external ?: Boolean
     class_behaviour_items ?: String
@@ -96,7 +96,7 @@ Association class_attributes(Class, Attribute){}
 
 Class Method{
     name : String
-    body : String
+    body : Action
     return_type ?: String
 }
 
@@ -156,9 +156,9 @@ Association state_position(State, CanvasPosition){
 }
 
 Class BasicState : State{
-    isInitial : Boolean
-    onEntryScript ?: String
-    onExitScript ?: String
+    isInitial ?: Boolean
+    onEntryScript ?: Action
+    onExitScript ?: Action
 }
 
 Class ActualParameter{
@@ -170,6 +170,7 @@ Class Raise{
     scope ?: EventScope
     port ?: String
     target ?: String
+    parameter ?: Action
 }
 Association raise_parameters(Raise, ActualParameter){
     order : Natural
@@ -178,7 +179,7 @@ Association state_onentry_raises(BasicState, Raise){
     order : Natural
 }
 Association state_onexit_raises(BasicState, Raise){
-    order : Natural
+    order ?: Natural
 }
 
 Class CompositeState : BasicState{}
@@ -203,9 +204,9 @@ Class HistoryState : State{
 }
 
 Association transition(State, State){
-    name: String
-    cond ?: String
-    script ?: String
+    name ?: String
+    cond ?: Action
+    script ?: Action
     after ?: PositiveFloat
     event ?: String
     port ?: String
@@ -267,4 +268,4 @@ GlobalConstraint {
 
                 return "OK"!
         $
-    }
+    }

+ 22 - 13
addis/Test_PM2SCCD.py

@@ -15,22 +15,31 @@ except Exception as e:
 
 if "my_PM" in [i[0] for i in model_list()]:
     model_delete("my_PM")
-model_add("my_PM", "PM", open("addis/PM_Example.mvc", 'r').read())
+model_add("my_PM", "PM", open("addis/PM_example2.mvc", 'r').read())
+print "PM instance model added"
+#print verify('my_PM')
 if "SCCD_my_PM" in [i[0] for i in model_list()]:
     model_delete("SCCD_my_PM")
 model_add("SCCD_my_PM", "SCCD", open("addis/SCCD_Example.mvc", 'r').read())
-
+print "SCCD instance model added"
+print verify('SCCD_my_PM')
 
 def Activity2State():
     instantiate(None, "Association", ("PM/Activity", "SCCD/CompositeState"), ID="Activity2State_link")
-print "before mt"
-transformation_add_MT({"PM":"PM","SCCD":"SCCD"}, {"SCCD":"SCCD"}, "PM2SCCD", open("addis/PM_to_SCCD.mvc", "r").read(), Activity2State)
-print model_list()
-transformation_execute_MT("PM2SCCD", {"PM":"my_PM", "SCCD":"SCCD_my_PM"}, {"SCCD":"PM_2_SCCD_output"})
-
-
-
-
-
-
-
+print "before mt_add"
+print transformation_add_MT({"PM":"PM","SCCD":"SCCD"}, {"SCCD":"SCCD"}, "PM2SCCD", open("addis/PM_to_SCCD.mvc", "r").read(), Activity2State)
+print "mt_add_finished"
+print transformation_execute_MT("PM2SCCD", {"PM":"my_PM", "SCCD":"SCCD_my_PM"}, {"SCCD":"PM_2_SCCD_output"})
+
+alter_context("PM_2_SCCD_output", "SCCD")
+model =  element_list_nice("PM_2_SCCD_output")
+for m in model:
+    print m
+
+
+print("Upload SCCD execution semantics")
+# Add SCCD execution semantics
+transformation_add_AL({"SCCD": "SCCD"}, {}, "SCCD_execute", open("models/SCCD_execute.alc", 'r').read())
+print("DONE")
+transformation_execute_AL("SCCD_execute", {"SCCD": "PM_2_SCCD_output"}, {})
+print("Executed")