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:
Jürgen Doser 2005-11-11 16:15:47 +00:00
parent 9429803f72
commit af1f1e2844
7 changed files with 82 additions and 29 deletions

View File

@ -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 *)

View File

@ -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

View File

@ -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

View File

@ -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,

View File

@ -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

View File

@ -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 *)

View File

@ -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")