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

  1. #---------------------------------------------------------------------------
  2. #
  3. #    (c) Cadre Technologies Inc. 1995
  4. #
  5. #    File:        @(#)communications.tcl    /main/titanic/7
  6. #    Author:        Harm Leijendeckers
  7. #    Description:    Report on communications
  8. #    Usage in:    SystemVersion, CCD and COD editor
  9. #
  10. #---------------------------------------------------------------------------
  11. # SccsId = @(#)communications.tcl    /main/titanic/7    10 Sep 1997    Copyright 1995 Cadre Technologies Inc.
  12.  
  13.  
  14. eval [$cc getCustomFileContents semanticbase tcl reports]
  15.  
  16.  
  17. Class ReportCommunications : {SemanticBase} {
  18.     constructor
  19.  
  20.     method doReport
  21.  
  22.     method getClasses
  23.     method getEvents
  24.     method objName
  25.     method printEvent
  26.     method printConnector
  27. }
  28.  
  29.  
  30. constructor ReportCommunications {class this} {
  31.     set this [SemanticBase::constructor $class $this]
  32.     $this reportName Communications
  33.     return $this
  34. }
  35.  
  36.  
  37. method ReportCommunications::getClasses {this model} {
  38.  
  39.     if [[$this fileV] isNil] {
  40.         if { [lsearch $Options "ccd"] != -1 } {
  41.         set classes "[concat [$model getSMObjects $OMT_CCD_Node]]"
  42.         $this reportName "CCD Communications"
  43.     } else {
  44.         set classes "[concat [$model getSMObjects $OMT_COD_Node]]"
  45.     }
  46.     } else {
  47.     switch [[[$this fileV] file] type] { 
  48.             ccd { 
  49.         set classes [concat [$model getSMObjects $OMT_CCD_Node]]
  50.         $this reportName "CCD Communications"
  51.         }
  52.         cod { 
  53.         set classes [concat [$model getSMObjects $OMT_COD_Node]]
  54.         }
  55.     }
  56.     }
  57.     return $classes
  58. }
  59.  
  60.  
  61. method ReportCommunications::getEvents {this class} {
  62.     set eventsSent {}
  63.     set eventsRcvd {}
  64.  
  65.     switch [[$class getSemType] getFileType] {
  66.     ccd {
  67.         foreach conn [$class getConnectorsOut $OMT_CCD_Message $ANY] {
  68.         lappend eventsSent "$conn 0"
  69.         }
  70.         foreach conn [$class getConnectorsIn  $OMT_CCD_Message $ANY] {
  71.         lappend eventsRcvd "$conn 0"
  72.         }
  73.     }
  74.     cod {
  75.         ## Report the messages sent between objects and actors
  76.         foreach conn [$class getConnectorsIn $OMT_COD_Conn $ANY] {
  77.         set events [$conn getSubordinateObjects \
  78.                         $OMT_COD_Message]
  79.         foreach event $events {
  80.             set comp [lindex [$event getComponents] 0]
  81.             set dir  [$comp getPropertyValue msg_direction]
  82.             if { $dir == "forward" } {
  83.             lappend eventsRcvd "$event 0"
  84.             } else {
  85.             lappend eventsSent "$event 1"
  86.             }
  87.         }
  88.         }
  89.         foreach conn [$class getConnectorsOut $OMT_COD_Conn $ANY] {
  90.         set events [$conn getSubordinateObjects \
  91.                         $OMT_COD_Message]
  92.         foreach event $events {
  93.             set comp [lindex [$event getComponents] 0]
  94.             set dir  [$comp getPropertyValue msg_direction]
  95.             if { $dir == "forward" } {
  96.             lappend eventsSent "$event 0"
  97.             } else {
  98.             lappend eventsRcvd "$event 1"
  99.             }
  100.         }
  101.         }
  102.     }
  103.         default {
  104.         }
  105.     }
  106.     return "[list $eventsSent] [list $eventsRcvd]"
  107. }
  108.  
  109.  
  110. method ReportCommunications::doReport {this model} {
  111.  
  112.     set report [$this report]
  113.     set classes [$this getClasses $model]
  114.     if [lempty $classes] { return 0 }
  115.  
  116.     # strange sorting because some 'classes' don't have an item (instances).
  117.     set sortedClasses [concat \
  118.     [query "getItem.isNil == 1" $classes] \
  119.     [osort getItem.name [query "getItem.isNil == 0" $classes]]]
  120.  
  121.     foreach class $sortedClasses {
  122.         set allEvents [$this getEvents $class]
  123.         set eventsSent [lindex $allEvents 0]
  124.         set eventsRcvd [lindex $allEvents 1]
  125.  
  126.     $report print "[$this objName $class]" line
  127.  
  128.     if { [lempty $eventsSent] && [lempty $eventsRcvd] } {
  129.             $report print "  ** No communication **" line
  130.             $report line
  131.         continue
  132.     }
  133.  
  134.     # all events sent
  135.     if ![lempty $eventsSent] {
  136.         $report space 2
  137.         $report print Sends 40
  138.         $report print To 38
  139.         $report print In line
  140.         foreach sentEvent $eventsSent {
  141.                 if { [lindex $sentEvent 1] == 1 } { 
  142.                     # Swap
  143.             $this printEvent [lindex $sentEvent 0] in
  144.         } else {
  145.             $this printEvent [lindex $sentEvent 0] out
  146.         }
  147.         }
  148.     }
  149.  
  150.     # all events received
  151.     if ![lempty $eventsRcvd] {
  152.         $report space 2
  153.         $report print Receives 40
  154.         $report print From 38
  155.         $report print In line
  156.         foreach rcvdEvent $eventsRcvd {
  157.                 if { [lindex $rcvdEvent 1] == 1 } { 
  158.                     # Swap
  159.             $this printEvent [lindex $rcvdEvent 0] out
  160.         } else {
  161.             $this printEvent [lindex $rcvdEvent 0] in
  162.         }
  163.         }
  164.     }
  165.  
  166.     $report line
  167.     }
  168.  
  169.     $report page
  170.  
  171.     return 0
  172. }
  173.  
  174.  
  175. method ReportCommunications::objName {this smObj} {
  176.     set type [query -s type $smObj.getComponents]
  177.  
  178.     set objName ""
  179.     set item [$smObj getItem]
  180.     set qi [ORB::nil]
  181.     if [$item isNil] {
  182.     case $type in {
  183.         instance {
  184.         set item [$smObj getItem 0 name_type de]
  185.         set qi [$smObj getItem 0 name_type cl]
  186.         }
  187.     }
  188.     }
  189.  
  190.     if ![$item isNil] {
  191.     append objName [$item name]
  192.     if ![$qi isNil] {
  193.         append objName ":"
  194.     }
  195.     }
  196.     if ![$qi isNil] {
  197.     append objName [$qi name]
  198.     }
  199.     if {"$objName" == ""} {
  200.     set objName ?
  201.     }
  202.  
  203.     return "$objName ($type)"
  204. }
  205.  
  206.  
  207. method ReportCommunications::printEvent {this event io} {
  208.     if [$event isA SMConnector] {
  209.     set conn [$event getConnector]
  210.     set items [query $conn.segments.labels.itemRefs.item]
  211.     if [lempty $items] {
  212.         set items [ORB::nil]
  213.     }
  214.     foreach item $items {
  215.         $this printConnector $event $item {} $io
  216.     }
  217.     return
  218.     }
  219.  
  220.     if [$event isA SMNode] {
  221.     set conn [$event getSuperiorObjects $OMT_COD_Conn]
  222.     $this printConnector $conn [$event getItem] $event $io
  223.     }
  224. }
  225.  
  226.  
  227. method ReportCommunications::printConnector {this smConn item event io} {
  228.     set report [$this report]
  229.  
  230.     set objName ?
  231.     if ![$item isNil] {
  232.     set objName [$item name]
  233.     } elseif ![lempty $event] {
  234.         # No ':' in a messageflow name gives no item!
  235.         set label [$event getLabel]
  236.     if ![$label isNil] { set objName [$label value] }
  237.     }
  238.  
  239.     set type ""
  240.     if ![lempty $event] {
  241.     set comp [lindex [$event getComponents] 0]
  242.     set type [$comp getPropertyValue msg_type]
  243.         if ![lempty $type] {
  244.              set objName "($type) $objName"
  245.         }
  246.     }
  247.  
  248.     $report space 4
  249.     $report print $objName 39
  250.     $report space
  251.  
  252.     case [[$smConn getSemType] getFileType] in {
  253.     ccd {
  254.         if { $io == "in" } {
  255.         set toComp [$smConn getFrom $OMT_CCD_Node]
  256.         } else {
  257.         set toComp [$smConn getTo   $OMT_CCD_Node]
  258.         }
  259.     }
  260.     cod {
  261.         if { $io == "in" } {
  262.         set toComp [$smConn getFrom $OMT_COD_Node]
  263.         } else {
  264.         set toComp [$smConn getTo   $OMT_COD_Node]
  265.         }
  266.     }
  267.     }
  268.  
  269.     $report print "[$this objName $toComp]" 37
  270.     $report space
  271.     $report print [$this fullFileName [$smConn getDefiningDiagram]] line
  272. }
  273.  
  274.  
  275. # ----------------------------------------------------------------------
  276. #
  277. set executeMe [ReportCommunications new]
  278.