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

  1. #---------------------------------------------------------------------------
  2. #
  3. #    (c) Cayenne Software, Inc. 1997
  4. #
  5. #    File:        %W%
  6. #    Author:        Harm Leijendeckers
  7. #    Description:    Report on UseCases
  8. #    Usage in:    SystemVersion and UCD editor
  9. #    Options:    properties    : show basic, alternative courses of
  10. #                    action, pre- and postconditions and
  11. #                    freeText of each UseCase
  12. #            decompositions: show decomposition information
  13. #
  14. #---------------------------------------------------------------------------
  15. # SccsId = %W%    %G%    Copyright 1997 Cayenne Software, Inc.
  16.  
  17.  
  18. eval [$cc getCustomFileContents semanticbase tcl reports]
  19.  
  20.  
  21. Class ReportUseCases : {SemanticBase} {
  22.     constructor
  23.  
  24.     attribute showUseCaseProperties
  25.     attribute showDecompositions
  26.     attribute prevReportedUseCase
  27.  
  28.     method doReport
  29.  
  30.     method printLine
  31.     method printProperties
  32. }
  33.  
  34.  
  35. constructor ReportUseCases {class this} {
  36.     set this [SemanticBase::constructor $class $this]
  37.     $this reportName "UseCases"
  38.     if { [lsearch $Options "properties"] != -1 } {
  39.     $this showUseCaseProperties 1
  40.     } else {
  41.     $this showUseCaseProperties 0
  42.     }
  43.     if { [lsearch $Options "decompositions"] != -1 } {
  44.     $this showDecompositions 1
  45.     } else {
  46.     $this showDecompositions 0
  47.     }
  48.     return $this
  49. }
  50.  
  51.  
  52. method ReportUseCases::doReport {this model} {
  53.     # get all UseCases
  54.     set useCases [concat [$model getSMObjects $OMT_UCD_UseCase]]
  55.     if [lempty $useCases] { return 0 }
  56.  
  57.     set report [$this report]
  58.     $report header {
  59.     set report [$this report]
  60.     $report print "UseCase" 21
  61.     $report print "Action"  18
  62.     $report print "UseCase/Actor" 21
  63.     $report print "By Event" 26
  64.     if [[$this fileV] isNil] {
  65.         $report print "In FileVersion" 41
  66.     }
  67.     $report line
  68.     $report line
  69.     $report line
  70.     }
  71.  
  72.     # retrieve all etd's and put them in a QueryObject for later use
  73.     if [$this showDecompositions] {
  74.     set allEtds [query "file.type == etd" \
  75.         $this.phaseV.systemVersions.localFileVersions]
  76.     set qoAllEtds [QueryObject new allEtds file.item]
  77.     }
  78.  
  79.     # sort on UseCase name
  80.     set useCasessWithoutName [query "getLabel.isNil == 1" $useCases]
  81.     set useCasessWithName    [query "getLabel.isNil == 0" $useCases]
  82.     set sortedUseCases [concat $useCasessWithoutName \
  83.                 [osort getLabel.value $useCasessWithName]]
  84.  
  85.     foreach useCase $sortedUseCases {
  86.     set useCaseName [$this objName $useCase]
  87.  
  88.     # all incomming and outgoing events
  89.     set events [concat \
  90.         [$useCase getConnectorsIn \
  91.         $OMT_UCD_UndirectedCommunicationAssociation $OMT_UCD_Actor] \
  92.         [$useCase getConnectorsIn \
  93.         $OMT_UCD_DirectedCommunicationAssociation $OMT_UCD_Actor] \
  94.         [$useCase getConnectorsOut \
  95.         $OMT_UCD_UndirectedCommunicationAssociation $OMT_UCD_Actor] \
  96.         [$useCase getConnectorsOut \
  97.         $OMT_UCD_DirectedCommunicationAssociation $OMT_UCD_Actor]]
  98.  
  99.     foreach event $events {
  100.         set actor [$event getFrom $OMT_UCD_Actor]
  101.         set type "incomming"
  102.         if [lempty $actor] {
  103.         set actor [$event getTo $OMT_UCD_Actor]
  104.         set type "outgoing"
  105.         }
  106.  
  107.         set actorName [$this objName $actor]
  108.  
  109.         if { $type == "incomming" } {
  110.         set actorNode [$actor getComponents]
  111.         if { [$actorNode getPropertyValue initiator] == "1" } {
  112.             set nodeText "is initiated by"
  113.         } else {
  114.             set nodeText "receives from"
  115.         }
  116.         } else {
  117.         set nodeText "sends to"
  118.         }
  119.         if { "[[$event getConnector] type]" == "und_com_assoc" } {
  120.         set nodeText "communicates with"
  121.         }
  122.  
  123.         set eventName [$this objName $event]
  124.  
  125.         $this printLine $useCaseName $nodeText $actorName \
  126.                 [$event getDefiningDiagram] $eventName
  127.     }
  128.  
  129.     # get the UseCases this UseCase is included in
  130.     set inInclusions [concat [$useCase getConnectorsIn \
  131.         $OMT_UCD_UseCaseGeneralization $OMT_UCD_UseCase]]
  132.     set outInclusions [concat [$useCase getConnectorsOut \
  133.         $OMT_UCD_UseCaseGeneralization $OMT_UCD_UseCase]]
  134.  
  135.     foreach inclusion $inInclusions {
  136.         set fromUseCase [$inclusion getFrom $OMT_UCD_UseCase]
  137.         set fromUseCaseName [$this objName $fromUseCase]
  138.             set type [query -s getConnector.properties.value $inclusion]
  139.             switch $type {
  140.                "uses"    { set text "is used by" }
  141.                "extends" { set text "is extended by" }
  142.                default   { set text "is inherited by" }
  143.         }
  144.         $this printLine $useCaseName $text \
  145.                 $fromUseCaseName [$inclusion getDefiningDiagram]
  146.     }
  147.     foreach inclusion $outInclusions {
  148.         set toUseCase [$inclusion getTo $OMT_UCD_UseCase]
  149.         set toUseCaseName [$this objName $toUseCase]
  150.             set type [query -s getConnector.properties.value $inclusion]
  151.             switch $type {
  152.                ""         { set text "inherits from" }
  153.                default    { set text $type }
  154.         }
  155.         $this printLine $useCaseName $text \
  156.                 $toUseCaseName [$inclusion getDefiningDiagram]
  157.     }
  158.  
  159.     # get decomposition of current UseCase (this is optionally)
  160.     if [$this showDecompositions] {
  161.         set useCaseItem [$useCase getItem]
  162.         set useCaseWorkItem [$useCase getWorkItem]
  163.         if ![$useCaseItem isNil] {
  164.         [$this phaseV] getDecompositions $useCaseItem [$this configV] \
  165.             decompFiles {ucd etd} dummy fileVersions
  166.  
  167.         # add decomposed etd's to fileVersions
  168.         if ![$useCaseWorkItem isNil] {
  169.             foreach wi [$useCaseWorkItem qualifiedDeclarations] {
  170.             set etd [query "file.item == [$wi item]" $qoAllEtds]
  171.             if ![lempty $etd] {
  172.                 lappend fileVersions $etd
  173.             }
  174.             }
  175.         }
  176.  
  177.         foreach fileVersion [osort file.type -decr file.qualifiedName \
  178.                        $fileVersions] {
  179.             $this printLine $useCaseName "is decomposed in" "" \
  180.                     $fileVersion
  181.         }
  182.         }
  183.     }
  184.  
  185.     # print special UseCase properties of current UseCase
  186.     $this printProperties $useCaseName [$useCase getWorkItem]
  187.     $report line
  188.     }
  189.  
  190.     $report page
  191.     $report remove header
  192.  
  193.     return 0
  194. }
  195.  
  196.  
  197. method ReportUseCases::printLine {this useCase does with in {event ""}} {
  198.     set report [$this report]
  199.     if { "[$this prevReportedUseCase]" != "$useCase" } {
  200.     $report print $useCase 20
  201.         $this prevReportedUseCase $useCase
  202.     } else {
  203.         $report space 20
  204.     }
  205.     $report space
  206.     $report print $does 17
  207.     if ![lempty $with] {
  208.     $report space
  209.     $report print $with 20
  210.     } elseif {"$does" != "is decomposed in"} {
  211.         $report space 21
  212.     }
  213.     if ![lempty $event] {
  214.     $report space
  215.     $report print "$event" 25
  216.     } elseif {"$does" != "is decomposed in"} {
  217.         $report space 26
  218.     }
  219.     # don't print FileVersion if report is executed on file level
  220.     if { [[$this fileV] isNil] || [lempty $with] } {
  221.     $report space
  222.     if ![lempty $in] {
  223.         $report print [$this fullFileName $in] line
  224.     } else {
  225.         $report space line
  226.     }
  227.     } else {
  228.         $report line
  229.     }
  230. }
  231.  
  232.  
  233. method ReportUseCases::printProperties {this useCaseName useCaseWI} {
  234.     if ![$this showUseCaseProperties] {
  235.     return
  236.     }
  237.     if ![$useCaseWI isNil] {
  238.     set properties [$useCaseWI properties]
  239.     if [$properties isNil] {
  240.         return
  241.     }
  242.  
  243.         $this showProperties $properties
  244.     }
  245. }
  246.  
  247. # ----------------------------------------------------------------------
  248. #
  249. set executeMe [ReportUseCases new]
  250.