home *** CD-ROM | disk | FTP | other *** search
/ PC World 1997 November / PCWorld_1997-11_cd.bin / software / programy / komix / DATA.Z / usecases.tcl < prev    next >
Text File  |  1997-04-29  |  7KB  |  253 lines

  1. #---------------------------------------------------------------------------
  2. #
  3. #    (c) Cayenne Software, Inc. 1996
  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 1996 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.  
  27.     method doReport
  28.  
  29.     method printLine
  30.     method printProperties
  31.     method printProperty
  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"  17
  62.     $report print "UseCase/ETD" 21
  63.     if [[$this fileV] isNil] {
  64.         $report print "In FileVersion" 41
  65.     }
  66.     $report print "By Event" line
  67.     $report line
  68.     }
  69.  
  70.     # retrieve all etd's and put them in a QueryObject for later use
  71.     if [$this showDecompositions] {
  72.     set allEtds [query "file.type == etd" \
  73.         $this.phaseV.systemVersions.localFileVersions]
  74.     set qoAllEtds [QueryObject new allEtds file.item]
  75.     }
  76.  
  77.     # sort on UseCase name
  78.     set useCasessWithoutName [query "getLabel.isNil == 1" $useCases]
  79.     set useCasessWithName    [query "getLabel.isNil == 0" $useCases]
  80.     set sortedUseCases [concat $useCasessWithoutName \
  81.                 [osort getLabel.value $useCasessWithName]]
  82.  
  83.     foreach useCase $sortedUseCases {
  84.     set useCaseName [$this objName $useCase]
  85.  
  86.     # all incomming and outgoing events
  87.     set events [concat \
  88.         [$useCase getConnectorsIn \
  89.         $OMT_UCD_UndirectedCommunicationAssociation $OMT_UCD_Actor] \
  90.         [$useCase getConnectorsIn \
  91.         $OMT_UCD_DirectedCommunicationAssociation $OMT_UCD_Actor] \
  92.         [$useCase getConnectorsOut \
  93.         $OMT_UCD_UndirectedCommunicationAssociation $OMT_UCD_Actor] \
  94.         [$useCase getConnectorsOut \
  95.         $OMT_UCD_DirectedCommunicationAssociation $OMT_UCD_Actor]]
  96.  
  97.     foreach event $events {
  98.         set actor [$event getFrom $OMT_UCD_Actor]
  99.         set type "incomming"
  100.         if [lempty $actor] {
  101.         set actor [$event getTo $OMT_UCD_Actor]
  102.         set type "outgoing"
  103.         }
  104.  
  105.         set actorName [$this objName $actor]
  106.  
  107.         if { $type == "incomming" } {
  108.         set actorNode [$actor getComponents]
  109.         if { [$actorNode getPropertyValue initiator] == "1" } {
  110.             set nodeText "is initiated by"
  111.         } else {
  112.             set nodeText "receives from"
  113.         }
  114.         } else {
  115.         set nodeText "sends to"
  116.         }
  117.  
  118.         set eventName [$this objName $event]
  119.  
  120.         $this printLine $useCaseName $nodeText $actorName \
  121.                 [$event getDefiningDiagram] $eventName
  122.     }
  123.  
  124.     # get the UseCases this UseCase is included in
  125.     set inInclusions [concat [$useCase getConnectorsIn \
  126.         $OMT_UCD_UseCaseGeneralization $OMT_UCD_UseCase]]
  127.     set outInclusions [concat [$useCase getConnectorsOut \
  128.         $OMT_UCD_UseCaseGeneralization $OMT_UCD_UseCase]]
  129.  
  130.     foreach inclusion $inInclusions {
  131.         set fromUseCase [$inclusion getFrom $OMT_UCD_UseCase]
  132.         set fromUseCaseName [$this objName $fromUseCase]
  133.         $this printLine $useCaseName "is included by" \
  134.                 $fromUseCaseName [$inclusion getDefiningDiagram]
  135.     }
  136.     foreach inclusion $outInclusions {
  137.         set toUseCase [$inclusion getTo $OMT_UCD_UseCase]
  138.         set toUseCaseName [$this objName $toUseCase]
  139.         $this printLine $useCaseName "includes" \
  140.                 $toUseCaseName [$inclusion getDefiningDiagram]
  141.     }
  142.  
  143.     # get decomposition of current UseCase (this is optionally)
  144.     if [$this showDecompositions] {
  145.         set useCaseItem [$useCase getItem]
  146.         set useCaseWorkItem [$useCase getWorkItem]
  147.         if ![$useCaseItem isNil] {
  148.         [$this phaseV] getDecompositions $useCaseItem [$this configV] \
  149.             decompFiles {ucd etd} dummy fileVersions
  150.  
  151.         # add decomposed etd's to fileVersions
  152.         if ![$useCaseWorkItem isNil] {
  153.             foreach wi [$useCaseWorkItem qualifiedDeclarations] {
  154.             set etd [query "file.item == [$wi item]" $qoAllEtds]
  155.             if ![lempty $etd] {
  156.                 lappend fileVersions $etd
  157.             }
  158.             }
  159.         }
  160.  
  161.         foreach fileVersion [osort file.type -decr file.qualifiedName \
  162.                        $fileVersions] {
  163.             $this printLine $useCaseName "is decomposed in" "" \
  164.                     $fileVersion
  165.         }
  166.         }
  167.     }
  168.  
  169.     # print special UseCase properties of current UseCase
  170.     $this printProperties $useCaseName [$useCase getWorkItem]
  171.     $report line
  172.     }
  173.  
  174.     $report page
  175.     $report remove header
  176.  
  177.     return 0
  178. }
  179.  
  180.  
  181. method ReportUseCases::printLine {this useCase does with in {event ""}} {
  182.     set report [$this report]
  183.     $report print $useCase 20
  184.     $report space
  185.     $report print $does 16
  186.     if ![lempty $with] {
  187.     $report space
  188.     $report print $with 20
  189.     }
  190.     # don't print FileVersion if report is executed on file level
  191.     if { [[$this fileV] isNil] || [lempty $with] } {
  192.     if { $does == "is decomposed in" || [lempty $event] } {
  193.         set len "80"
  194.     } else {
  195.         set len 40
  196.     }
  197.     $report space
  198.     if ![lempty $in] {
  199.         $report print [$this fullFileName $in] $len
  200.     } else {
  201.         $report space $len
  202.     }
  203.     }
  204.     if ![lempty $event] {
  205.     $report space
  206.     $report print "$event" 31
  207.     }
  208.     $report line
  209. }
  210.  
  211.  
  212. method ReportUseCases::printProperties {this useCaseName useCaseWI} {
  213.     if ![$this showUseCaseProperties] {
  214.     return
  215.     }
  216.  
  217.     if ![$useCaseWI isNil] {
  218.     set properties [$useCaseWI properties]
  219.     if [$properties isNil] {
  220.         return
  221.     }
  222.  
  223.     foreach propDes {{basicAct     "Basic Course of Action"}
  224.              {alternateAct "Alternative Course of Action"}
  225.              {precond      "Precondition"}
  226.              {postcond     "Postcondition"}
  227.              {freeText     "Free Text"}} {
  228.         set propName [lvarpop propDes]
  229.         set propText [lvarpop propDes]
  230.         $this printProperty $useCaseName $properties $propName $propText
  231.     }
  232.     }
  233. }
  234.  
  235.  
  236. method ReportUseCases::printProperty {this useCaseName properties propName \
  237.                        header} {
  238.     set report [$this report]
  239.     set propVal [$properties getPropertyValue $propName]
  240.  
  241.     if ![lempty $propVal] {
  242.     $report line
  243.     $report print "$header for $useCaseName:" line
  244.     $report space 4
  245.     $report print $propVal 120 line
  246.     }
  247. }
  248.  
  249.  
  250. # ----------------------------------------------------------------------
  251. #
  252. set executeMe [ReportUseCases new]
  253.