home *** CD-ROM | disk | FTP | other *** search
/ PC World 1998 October / PCWorld_1998-10_cd.bin / software / prehled / komix / DATA.Z / events.tcl < prev    next >
Text File  |  1997-09-10  |  7KB  |  301 lines

  1. #---------------------------------------------------------------------------
  2. #
  3. #    (c) Cadre Technologies Inc. 1995
  4. #
  5. #    File:        @(#)events.tcl    /main/titanic/8
  6. #    Author:        Harm Leijendeckers
  7. #    Description:    Report on events
  8. #    Usage in:    SystemVersion, CCD, COD, ETD, STD and UCD editor
  9. #
  10. #---------------------------------------------------------------------------
  11. # SccsId = @(#)events.tcl    /main/titanic/8    10 Sep 1997    Copyright 1995 Cadre Technologies Inc.
  12.  
  13.  
  14. eval [$cc getCustomFileContents semanticbase tcl reports]
  15.  
  16. proc ReportEvents::sort { key1 key2 } {
  17.   # The only way the events are realy sorted. It's a bit dirty.
  18.   set name1 [lindex [ReportEvents::getNameAndType %this $key1] 0]
  19.   set name2 [lindex [ReportEvents::getNameAndType %this $key2] 0]
  20.   # Sort COD Messages on seq nummer without being bothered about
  21.   # a concurrent char
  22.   regsub {(.*)([0-9])([a-z]) (.*)} $name1 {\1\2.0\3 \4} name1
  23.   regsub {(.*)([0-9])([a-z]) (.*)} $name2 {\1\2.0\3 \4} name2
  24.  
  25.   if { "$name1" > "$name2"  } { return 1 }
  26.   if { "$name1" == "$name2" } { return 0 }
  27.   return -1
  28. }
  29.  
  30. Class ReportEvents : {SemanticBase} {
  31.     constructor
  32.     method doReport
  33.     method getNameAndType
  34. }
  35.  
  36.  
  37. constructor ReportEvents {class this} {
  38.     set this [SemanticBase::constructor $class $this]
  39.     $this reportName "Events and Messages"
  40.     return $this
  41. }
  42.  
  43.  
  44. method ReportEvents::doReport {this model} {
  45.     # get all events
  46.     set events [concat \
  47.     [$model getSMObjects $OMT_Event] \
  48.     [$model getSMObjects $OMT_COD_Message] \
  49.     [$model getSMObjects $OMT_STD_ComplexEvent] \
  50.     [$model getSMObjects $OMT_STD_StateEvent] \
  51.     ]
  52.     if [lempty $events] { return 0 }
  53.  
  54.     set report [$this report]
  55.     $report header {
  56.     [$this report] print "From Component" 32
  57.     [$this report] print "Event or Message" 32
  58.     [$this report] print "To Component" 32
  59.     [$this report] print Diagram line
  60.     [$this report] line
  61.     }
  62.  
  63.     set sortedEvents [concat [lsort -command ReportEvents::sort $events]]
  64.  
  65.     foreach event $sortedEvents {
  66.     # From Component
  67.     #
  68.     set swap 0
  69.     switch [[$event getComponents] type] {
  70.         cod_message {
  71.         set conn [$event getSuperiorObjects $OMT_COD_Conn]
  72.         set from [$conn getFrom $OMT_EventSender]
  73.                 set comp [$event getComponents]
  74.                 set dir  [$comp getPropertyValue msg_direction]
  75.                 if { $dir == "backward" } {
  76.                     set swap 1
  77.                 }
  78.         }
  79.  
  80.         ver_compl_trans -
  81.         hor_compl_trans {
  82.         set connsIn  [$event getConnectorsIn $OMT_STD_Transition $ANY]
  83.         set from ""
  84.         foreach conn $connsIn {
  85.             lappend from [$conn getFrom $OMT_EventSender]
  86.         }
  87.         }
  88.  
  89.         event_msg {
  90.         set from [$event getFrom $OMT_STD_Event]
  91.         }
  92.  
  93.         state_action {
  94.         set from [$event getSuperiorObjects $OMT_STD_State]
  95.         }
  96.  
  97.         default {
  98.         set from [$event getFrom $OMT_EventSender]
  99.         }
  100.     }
  101.     set fromText ""
  102.     foreach smObj $from {
  103.         append fromText " [$this getNameAndType $smObj]"
  104.     }
  105.  
  106.     # Event
  107.     #
  108.     set eventText [$this getNameAndType $event]
  109.     if { $eventText == "?" } {
  110.         # skip events with no name
  111.         continue
  112.     }
  113.  
  114.     # To Component
  115.     #
  116.     switch [[$event getComponents] type] {
  117.         cod_message {
  118.         set conn [$event getSuperiorObjects $OMT_COD_Conn]
  119.         set to [$conn getTo $OMT_EventReceiver]
  120.         }
  121.  
  122.         ver_compl_trans -
  123.         hor_compl_trans {
  124.         set connsOut [$event getConnectorsOut $OMT_STD_Transition $ANY]
  125.         set to ""
  126.         foreach conn $connsOut {
  127.             lappend to [$conn getTo $OMT_EventReceiver]
  128.         }
  129.         }
  130.  
  131.         state_action {
  132.         set to [$event getSuperiorObjects $OMT_STD_State]
  133.         }
  134.  
  135.         default {
  136.         set to [$event getTo $OMT_EventReceiver]
  137.         }
  138.     }
  139.     set toText ""
  140.     foreach smObj $to {
  141.         append toText " [$this getNameAndType $smObj]"
  142.     }
  143.  
  144.     # Diagram
  145.     #
  146.     if { $from != "" } {
  147.         set diagText [$this fullFileName [$from getDefiningDiagram]]
  148.     } elseif { $to != "" } {
  149.         set diagText [$this fullFileName [$to getDefiningDiagram]]
  150.     } else {
  151.         set diagText ?
  152.     }
  153.  
  154.         if {$swap == 1} {
  155.             set dummy    $fromText
  156.             set fromText $toText
  157.             set toText   $dummy
  158.         }
  159.  
  160.     foreach fromLab $fromText {
  161.         foreach eventLab $eventText {
  162.         foreach toLab $toText {
  163.             $report print $fromLab 31
  164.             $report space
  165.             $report print $eventLab 31
  166.             $report space
  167.             $report print $toLab 31
  168.             $report space
  169.             $report print $diagText 35
  170.             $report line
  171.         }
  172.         }
  173.     }
  174.     }
  175.  
  176.     $report page
  177.     $report remove header
  178.  
  179.     return 0
  180. }
  181.  
  182.  
  183. method ReportEvents::getNameAndType {this smObject} {
  184.     if { $smObject == "" } {
  185.     return "?"
  186.     }
  187.     set item [$smObject getItem]
  188.     set comp [$smObject getComponents]
  189.     set compType [$comp type]
  190.  
  191.     if { $compType == "cod_message" && ![$item isNil] } {
  192.         # Sort on the integer part of the sequence expression; a sub
  193.         # char is allowed: message1.3a is interpreted as 1.3a and is
  194.         # sorted as 1.3.0a, making it appear before 1.3.1
  195.     set label [$smObject getLabel]
  196.     if ![$label isNil] {
  197.             set seqNr ""
  198.             set ccur  ""
  199.             regsub -all {\[[^][]*\]} [$label value] {} value
  200.         regexp {([0-9.]*)([a-z])?[*]?:.*} $value dummy seqNr ccur
  201.             if ![lempty $seqNr] {
  202.         return [list "$seqNr$ccur [$item name] ([$item type])"]
  203.         }
  204.     }
  205.     }
  206.  
  207.     if ![$item isNil] {
  208.     return [list "[$item name] ([$item type])"]
  209.     }
  210.  
  211.     set qi [ORB::nil]
  212.     switch $compType {
  213.     ccd_actor -
  214.     ccd_class -
  215.     ccd_class_ref -
  216.     ccd_container -
  217.     cod_actor -
  218.     nary_link -
  219.     state_action -
  220.     std_state -
  221.     std_class -
  222.     subject -
  223.     ucd_actor -
  224.     use_case {
  225.         set items [$smObject getItem 0 name cl]
  226.     }
  227.  
  228.     cod_message -
  229.     ver_compl_trans -
  230.     hor_compl_trans -
  231.     etd_event -
  232.     event_msg -
  233.     transition {
  234.         set items [$smObject getItem 0 event pe]
  235.     }
  236.  
  237.     dir_com_assoc -
  238.     final_state -
  239.     und_com_assoc {
  240.         set items [$smObject getItem 0 name pe]
  241.     }
  242.  
  243.     instance -
  244.     etd_initiator -
  245.     etd_object {
  246.         set items [$smObject getItem 0 name_type de]
  247.         set qi [$smObject getItem 0 name_type cl]
  248.     }
  249.  
  250.     state -
  251.     name_state -
  252.     start_state -
  253.     super_state {
  254.         set items [$smObject getItem 0 name st]
  255.     }
  256.  
  257.     com_message {
  258.         set items [query $comp.segments.labels.itemRefs.item]
  259.     }
  260.  
  261.     default    {
  262.         error "assert 'ReportEvents::getNameAndType' $compType"
  263.     }
  264.     }
  265.  
  266.     set result ""
  267.     foreach item $items {
  268.     set text ""
  269.     if ![$item isNil] {
  270.         append text "[$item name] ([$item type])"
  271.         if ![$qi isNil] {
  272.         append text ":"
  273.         }
  274.     }
  275.     if ![$qi isNil] {
  276.         append text "[$qi name] ([$qi type])"
  277.     }
  278.     if {"$text" == ""} {
  279.         set label [$smObject getLabel]
  280.         if ![$label isNil] {
  281.         set label [$label value]
  282.         } else {
  283.         set label ""
  284.         }
  285.         if {"$label" == ""} {
  286.         set text "?"
  287.         } else {
  288.         set text "$label"
  289.         }
  290.     }
  291.     lappend result $text
  292.     }
  293.  
  294.     return $result
  295. }
  296.  
  297.  
  298. # ----------------------------------------------------------------------
  299. #
  300. set executeMe [ReportEvents new]
  301.