improved support for statemachine
git-svn-id: https://projects.brucker.ch/su4sml/svn/infsec-import/trunk/src/su4sml@3347 3260e6d1-4efc-4170-b0a7-36055960796d
This commit is contained in:
parent
9429803f72
commit
af1f1e2844
|
@ -29,6 +29,7 @@ sig
|
|||
type StateVertex_Id
|
||||
type Transition_Id
|
||||
|
||||
(* Effects are not yet parsed. When we do, we will have to change this type. *)
|
||||
datatype Action = create
|
||||
| call
|
||||
| return
|
||||
|
@ -38,12 +39,14 @@ datatype Action = create
|
|||
| destroy
|
||||
| sequence
|
||||
|
||||
datatype Guard = G_mk of {expression : Rep_OclTerm.OclTerm}
|
||||
(* perhaps this type has to be changes according to what we can expect *)
|
||||
(* from CASE tools *)
|
||||
type Guard = Rep_OclTerm.OclTerm
|
||||
|
||||
type Parameter = Rep_OclType.OclType
|
||||
type Parameter = string * Rep_OclType.OclType
|
||||
|
||||
datatype Event = SignalEvent of Parameter list
|
||||
| CallEvent of Parameter list
|
||||
| CallEvent of Rep_OclType.Path * Parameter list
|
||||
(* | TimeEvent of Parameter list *)
|
||||
(* | ChangeEvent of Parameter list *)
|
||||
|
||||
|
|
|
@ -29,6 +29,8 @@ struct
|
|||
type StateVertex_Id = string
|
||||
type Transition_Id = string
|
||||
|
||||
(* The action datatype should probably be a operation call for our purposes? *)
|
||||
|
||||
datatype Action = create
|
||||
| call
|
||||
| return
|
||||
|
@ -38,12 +40,11 @@ datatype Action = create
|
|||
| destroy
|
||||
| sequence
|
||||
|
||||
datatype Guard = G_mk of {expression : Rep_OclTerm.OclTerm}
|
||||
|
||||
type Parameter = Rep_OclType.OclType
|
||||
type Guard = Rep_OclTerm.OclTerm
|
||||
type Parameter = string * Rep_OclType.OclType
|
||||
|
||||
datatype Event = SignalEvent of Parameter list
|
||||
| CallEvent of Parameter list
|
||||
| CallEvent of Rep_OclType.Path * Parameter list
|
||||
(* | TimeEvent of Parameter list *)
|
||||
(* | ChangeEvent of Parameter list *)
|
||||
|
||||
|
@ -103,7 +104,7 @@ datatype StateVertex =
|
|||
incoming : Transition_Id list}
|
||||
(* | StubState *)
|
||||
and StateMachine = SM_mk of {top : StateVertex,
|
||||
transition : Transition list}
|
||||
transition : Transition list}
|
||||
|
||||
|
||||
end
|
||||
|
|
|
@ -65,7 +65,7 @@ datatype Package = Package of { xmiid : string,
|
|||
tag_definitions: TagDefinition list,
|
||||
stereotype : string list, (* idref to stereotype of this package *)
|
||||
taggedValue : TaggedValue list,
|
||||
events: Event list}
|
||||
events : Event list}
|
||||
|
||||
end
|
||||
|
||||
|
|
|
@ -240,18 +240,39 @@ fun transform_state t (XMI.CompositeState {xmiid,outgoing,incoming,subvertex,
|
|||
incoming = incoming,
|
||||
kind = kind }
|
||||
|
||||
(* a primitive hack: we take the body of the guard g as the name of an *)
|
||||
(* operation to be called in order to check whether the guard is true *)
|
||||
fun transform_guard t (XMI.mk_Guard g) =
|
||||
let val self_type = Rep_OclType.DummyT (* FIX *)
|
||||
val package_path = nil (* FIX *)
|
||||
in
|
||||
Rep_OclTerm.OperationCall ( Rep_OclTerm.Variable ("self",self_type),
|
||||
self_type,
|
||||
List.concat [package_path,[#body g]],nil,
|
||||
Rep_OclType.Boolean )
|
||||
end
|
||||
|
||||
fun transform_event t (XMI.CallEvent ev) =
|
||||
Rep.CallEvent (find_operation t (#operation ev),
|
||||
map (transform_parameter t) (#parameter ev))
|
||||
|
||||
fun transform_transition t (XMI.mk_Transition trans)
|
||||
= Rep.T_mk { trans_id = #xmiid trans ,
|
||||
source = #source trans,
|
||||
target = #target trans,
|
||||
guard = NONE, (* FIX *)
|
||||
trigger = NONE, (* FIX *)
|
||||
guard = Option.map (transform_guard t) (#guard trans),
|
||||
trigger = Option.map ((transform_event t) o (find_event t))
|
||||
(#trigger trans),
|
||||
effect = NONE} (* FIX *)
|
||||
|
||||
fun transform_activitygraph t (XMI.mk_ActivityGraph act) =
|
||||
Rep_StateMachine.SM_mk {top = transform_state t (#top act),
|
||||
transition = map (transform_transition t) (#transitions act) }
|
||||
|
||||
fun transform_statemachine t (XMI.mk_StateMachine st) =
|
||||
Rep_StateMachine.SM_mk {top = transform_state t (#top st),
|
||||
transition = map (transform_transition t) (#transitions st) }
|
||||
|
||||
fun transform_classifier t (XMI.Class {xmiid,name,isActive,visibility,isLeaf,
|
||||
generalizations,attributes,operations,
|
||||
invariant,stereotype,clientDependency,
|
||||
|
@ -274,7 +295,8 @@ fun transform_classifier t (XMI.Class {xmiid,name,isActive,visibility,isLeaf,
|
|||
((filter_named_aends (find_aends t xmiid))),
|
||||
stereotypes = map (find_stereotype t) stereotype,
|
||||
interfaces = nil, (* FIX *)
|
||||
activity_graphs = map (transform_activitygraph t) activity_graphs,
|
||||
activity_graphs = List.concat [map (transform_activitygraph t) activity_graphs,
|
||||
map (transform_statemachine t) state_machines],
|
||||
thyname = NONE}
|
||||
end
|
||||
| transform_classifier t (XMI.AssociationClass {xmiid,name,isActive,visibility,
|
||||
|
|
|
@ -45,7 +45,8 @@ datatype HashTableEntry = Package of Rep_OclType.Path
|
|||
| Dependency of XMI.Dependency
|
||||
| TagDefinition of string
|
||||
| ClassifierInState of string
|
||||
|
||||
| Event of XMI.Event
|
||||
|
||||
fun find_tagdefinition t xmiid =
|
||||
(case valOf (HashTable.find t xmiid)
|
||||
of TagDefinition x => x
|
||||
|
@ -58,6 +59,12 @@ fun find_state t xmiid =
|
|||
| _ => raise Option)
|
||||
handle Option => raise IllFormed ("expected State "^xmiid^" in table")
|
||||
|
||||
fun find_event t xmiid =
|
||||
(case valOf (HashTable.find t xmiid)
|
||||
of Event x => x
|
||||
| _ => raise Option)
|
||||
handle Option => raise IllFormed ("expected Event "^xmiid^" in table")
|
||||
|
||||
fun find_transition t xmiid =
|
||||
(case valOf (HashTable.find t xmiid)
|
||||
of Transition x => x
|
||||
|
@ -234,6 +241,9 @@ fun insert_state table (XMI.CompositeState st) =
|
|||
| insert_state table (st:XMI.StateVertex) =
|
||||
HashTable.insert table (XMI.state_xmiid_of st, State st)
|
||||
|
||||
fun insert_event table (e as XMI.CallEvent ev) =
|
||||
HashTable.insert table (#xmiid ev, Event e)
|
||||
|
||||
fun insert_transition table (XMI.mk_Transition trans) =
|
||||
HashTable.insert table (#xmiid trans, Transition (XMI.mk_Transition trans))
|
||||
|
||||
|
@ -315,6 +325,7 @@ fun insert_package table package_prefix (XMI.Package p) =
|
|||
List.app (insert_activity_graph table) (#activity_graphs p);
|
||||
List.app (insert_dependency table) (#dependencies p);
|
||||
List.app (insert_tagdefinition table) (#tag_definitions p);
|
||||
List.app (insert_event table) (#events p);
|
||||
HashTable.insert table (#xmiid p,Package full_name)
|
||||
end
|
||||
|
||||
|
@ -331,6 +342,7 @@ fun insert_model table (XMI.Package p) =
|
|||
List.app (insert_activity_graph table) (#activity_graphs p);
|
||||
List.app (insert_dependency table) (#dependencies p);
|
||||
List.app (insert_tagdefinition table) (#tag_definitions p);
|
||||
List.app (insert_event table) (#events p);
|
||||
HashTable.insert table (#xmiid p,Package full_name)
|
||||
end
|
||||
|
||||
|
|
|
@ -64,7 +64,11 @@ datatype Guard = mk_Guard of {xmiid : string,
|
|||
expression : string list}
|
||||
|
||||
datatype Event = SignalEvent of Parameter list
|
||||
| CallEvent of Parameter list
|
||||
| CallEvent of { xmiid : string,
|
||||
name: string,
|
||||
operation: string, (* xmi.idref *)
|
||||
parameter: Parameter list
|
||||
}
|
||||
(* | TimeEvent of Parameter list *)
|
||||
(* | ChangeEvent of Parameter list *)
|
||||
|
||||
|
@ -75,7 +79,7 @@ datatype Transition = mk_Transition of
|
|||
source : StateVertex_Id,
|
||||
target : StateVertex_Id,
|
||||
guard : Guard option,
|
||||
trigger : Event option,
|
||||
trigger : string option, (* xmi.idref to Event *)
|
||||
effect : Procedure option,
|
||||
taggedValue : TaggedValue list
|
||||
(* mmm : StateVertexId option *)
|
||||
|
|
|
@ -428,6 +428,7 @@ val filterPackages = fn trees => append (XmlTree.filter "UML:Package" trees
|
|||
(XmlTree.filter "UML:Model" trees)
|
||||
val filterStateMachines = XmlTree.filter "UML:StateMachine"
|
||||
val filterActivityGraphs= XmlTree.filter "UML:ActivityGraph"
|
||||
val filterEvents = XmlTree.filter "UML:CallEvent" (* add SignalEvents? *)
|
||||
|
||||
(* there may be other kinds of dependencies, but we do not parse them atm *)
|
||||
val filterDependencies = XmlTree.filter "UML:Abstraction"
|
||||
|
@ -589,7 +590,7 @@ fun mkGuard tree =
|
|||
XmlTree.node_children_of o (XmlTree.find "UML:Guard.expression")
|
||||
fun f atts trees = XMI.mk_Guard{
|
||||
xmiid = getXmiId atts,
|
||||
name = getName atts,
|
||||
name = getMaybeEmptyName atts,
|
||||
isSpecification = getBoolAtt "isSpecification" atts,
|
||||
visibility = getVisibility atts,
|
||||
language = getLang(getExpr trees),
|
||||
|
@ -604,7 +605,9 @@ fun mkTransition tree =
|
|||
(XmlTree.find "UML:Guard") o
|
||||
XmlTree.node_children_of)) o
|
||||
(XmlTree.find_some "UML:Transition.guard")
|
||||
|
||||
val getTrigger = (Option.map (getXmiIdref o XmlTree.attributes_of o
|
||||
hd o XmlTree.node_children_of)) o
|
||||
(XmlTree.find_some "UML:Transition.trigger")
|
||||
val getTagVal = List.concat o
|
||||
(map ((map mkTaggedValue) o XmlTree.node_children_of)) o
|
||||
(XmlTree.filter "UML:ModelElement.taggedValue")
|
||||
|
@ -621,7 +624,7 @@ fun mkTransition tree =
|
|||
(XmlTree.find "UML:Transition.target"))
|
||||
(trees),
|
||||
guard = getGuard trees,
|
||||
trigger= NONE, (* TO BE DONE *)
|
||||
trigger= getTrigger trees,
|
||||
effect = NONE (* TO BE DONE *),
|
||||
taggedValue = getTagVal trees}
|
||||
in XmlTree.apply_on "UML:Transition" f tree
|
||||
|
@ -1004,17 +1007,25 @@ fun mkGeneralization tree =
|
|||
end
|
||||
|
||||
|
||||
(* TODO:
|
||||
fun mkCallEvent atts trees =
|
||||
XMI.CallEvent {xmiid = getXmiId atts,
|
||||
name = getMaybeEmptyName atts,
|
||||
operation = (getXmiIdref o XmlTree.attributes_of o hd o
|
||||
(XmlTree.follow "UML:CallEvent.operation")) trees,
|
||||
parameter = (map mkParameter
|
||||
(XmlTree.follow "UML:Event.parameter"
|
||||
trees))
|
||||
}
|
||||
|
||||
fun mkSignalEvent
|
||||
|
||||
fun mkCallEvent
|
||||
|
||||
fun mkEvent
|
||||
|
||||
fun filterEvents
|
||||
|
||||
*)
|
||||
(* TODO: mkSignalEvent, etc ? *)
|
||||
fun mkEvent tree =
|
||||
let val elem = XmlTree.tagname_of tree
|
||||
val atts = XmlTree.attributes_of tree
|
||||
val trees = XmlTree.node_children_of tree
|
||||
in
|
||||
case elem of "UML:CallEvent" => mkCallEvent atts trees
|
||||
| _ => raise IllFormed ("in mkEvent: found unexpected element "^elem)
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
@ -1053,7 +1064,7 @@ fun mkPackage tree =
|
|||
taggedValue = (map mkTaggedValue
|
||||
(XmlTree.follow "UML:ModelElement.taggedValue"
|
||||
direct_childs)),
|
||||
events = nil (* map mkEvent (filterEvents trees)*)
|
||||
events = map mkEvent (filterEvents trees)
|
||||
}
|
||||
end
|
||||
else raise IllFormed "did not find a UML:Model or UML: Package")
|
||||
|
|
Loading…
Reference in New Issue