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

  1. #---------------------------------------------------------------------------
  2. #
  3. #      (c)     Cayenne Software Inc.    1997
  4. #
  5. #      File:           @(#)msumlclass.tcl    /main/hindenburg/11
  6. #      Author:         <generated>
  7. #      Description:
  8. #---------------------------------------------------------------------------
  9. # SccsId = @(#)msumlclass.tcl    /main/hindenburg/11   30 May 1997 Copyright 1997 Cayenne Software Inc.
  10.  
  11. # Start user added include file section
  12. # End user added include file section
  13.  
  14. #require "msumltype.tcl"
  15.  
  16. Class MSUMLClass : {MSUMLType} {
  17.     constructor
  18.     method destructor
  19.     method ms2ot
  20.     method otFeat2Ms
  21.     method ot2ms
  22.     method promoter
  23.     method roleSet
  24.     method addRole
  25.     method removeRole
  26.     method memberSet
  27.     method addMember
  28.     method removeMember
  29.     attribute smClass
  30.     attribute _roleSet
  31.     attribute _memberSet
  32. }
  33.  
  34. constructor MSUMLClass {class this typeName smClass} {
  35.     set this [MSUMLType::constructor $class $this $typeName]
  36.     $this smClass $smClass
  37.     $this _roleSet [List new]
  38.     $this _memberSet [List new]
  39.     # Start constructor user section
  40.     # End constructor user section
  41.     return $this
  42. }
  43.  
  44. method MSUMLClass::destructor {this} {
  45.     foreach ref [[$this _roleSet] contents] {
  46.         $ref _owner ""
  47.     }
  48.     foreach ref [[$this _memberSet] contents] {
  49.         $ref _owner ""
  50.     }
  51.     # Start destructor user section
  52.     [$this memberSet] foreach member {
  53.         $member delete
  54.     }
  55.     # End destructor user section
  56.     $this MSUMLType::destructor
  57. }
  58.  
  59. method MSUMLClass::ms2ot {this diag {find ""}} {
  60.     set className [$this name]
  61.     set myClass [$diag findClass $className]
  62.     if [llength $myClass] {
  63.         return $myClass
  64.     }
  65.     set myClass [$diag addClass $className]
  66.     if [llength $find] {
  67.         return $myClass
  68.     }
  69.     puts "\tClass '$className'"
  70.         [$this memberSet] foreach msMember {
  71.             $msMember ms2ot $myClass
  72.         }
  73.     $this loadFreeTextProp $myClass
  74.     return $myClass
  75. }
  76.  
  77. method MSUMLClass::otFeat2Ms {this} {
  78.     global trans
  79.     set msPackage [$this package] 
  80.     set smModel [$msPackage smModel]
  81.     set smClassType [SMTypeDB::find "Class"]
  82.  
  83.     set confV [[ClientContext::global] currentConfig]
  84.     set smClass [$this smClass]
  85.     set workItem [$smClass getWorkItem]
  86.     if [$workItem isNil] {
  87.         return $umlClass
  88.     }
  89.  
  90.     set item [$smClass getItem]
  91.     set umlClass [$this msUmlObject]
  92.  
  93.     # find related matrix
  94.     set systemV [$workItem owner]
  95.     set matrix [$systemV findFileVersion -byItemAndType $item cdm]
  96.     if [$matrix isNil] {
  97.         return $umlClass
  98.     }
  99.  
  100.     set name [$item name]
  101.     puts "\tClass '$name' Features"
  102.  
  103.     $matrix loadRowData "name_type" rows
  104.  
  105.     # var rows consist of list of features
  106.     # for each feature row|list of items|properties 
  107.  
  108.     set file [$matrix file]
  109.     set classIsAbstract 0
  110.     set operIsAbstract 0
  111.     foreach rowData $rows {
  112.         set typeItem ""
  113.         set nameItem ""
  114.         set rowType ""
  115.         foreach item [lindex $rowData 1] {
  116.         set itemType [$item type]
  117.         set workItem [$systemV findDefinition $item $confV]
  118.             if {$itemType == "cl"} {
  119.             set typeItem $item
  120.             set smTypeClass [$smModel getNamedSMObjects $smClassType $item]
  121.             continue
  122.         }
  123.         set nameItem $workItem
  124.         if {$itemType == "de" } {
  125.             set rowType "Attribute"
  126.             set msumlMember [MSUMLAttribute new UMLAttribute $workItem] 
  127.             set msFeat [$msumlMember ot2ms $umlClass]
  128.         } else {
  129.             set rowType "Operation"
  130.             set msumlMember [MSUMLOperation new UMLOperation $workItem] 
  131.             set msFeat [$msumlMember ot2ms $umlClass [lindex $rowData 3]]
  132.         }
  133.         $this addMember $msumlMember
  134.         }
  135.         $trans begin
  136.         set iFeat [$msFeat getInterface IUmlMember]
  137.         $iFeat property Direction "Provide"
  138.         set IsTypeScope 0
  139.         set InitialValue ""
  140.     
  141.         #properties
  142.         foreach propVal [lindex $rowData 2] {
  143.         set propName [$propVal name]
  144.         if {$propName == "is_class_feature"} {
  145.             set IsTypeScope [$propVal value]
  146.         }
  147.         if {$propName == "is_abstract"} {
  148.             set operIsAbstract [$propVal value]
  149.         }
  150.         if {$propName == "initial_value"} {
  151.             set InitialValue [$propVal value]
  152.         }
  153.         
  154.         }
  155.         $iFeat property IsTypeScope $IsTypeScope
  156.         $iFeat delete
  157.  
  158.         # type expression
  159.         if [llength $typeItem] {
  160.         # a type available
  161.         $msumlMember typeItem $typeItem
  162.         if {$rowType == "Operation"} {
  163.              if {$operIsAbstract == "1"} {
  164.             set classIsAbstract 1
  165.             }
  166.             set iOper [$msFeat getInterface IUmlOperation]
  167.             $iOper property IsAbstract $operIsAbstract
  168.             $iOper delete
  169.             # create UML parameter with kind is return
  170.             set msumlParam [MSUMLParameter new UMLParameter "" $nameItem $msumlMember $typeItem] 
  171.             $msumlParam typeItem $typeItem
  172.             set msParam [$msumlParam ot2ms $msFeat "return"]
  173.         } else {
  174.            set iAttr [$msFeat getInterface IUmlAttribute]
  175.            $iAttr property TypeExpression [$typeItem name]
  176.            $iAttr property InitialValue $InitialValue
  177.            $iAttr delete
  178.         }
  179.         
  180.         }
  181.         $trans commit
  182.     }
  183.  
  184.     $trans begin
  185.     set iGenEl [$umlClass getInterface IUmlGeneralizableElement]
  186.     $iGenEl property IsAbstract $classIsAbstract
  187.     $iGenEl delete
  188.     $trans commit
  189.     return $umlClass
  190. }
  191.  
  192. method MSUMLClass::ot2ms {this package} {
  193.     set smClass [$this smClass]
  194.     set item [$smClass getItem]
  195.     set workItem [$smClass getWorkItem]
  196.     if [$item isNil] { 
  197.         if [$workItem isNil] {
  198.         # emtpy class
  199.         return
  200.         }
  201.     }
  202.     global trans
  203.     $trans begin
  204.     set name [$item name]
  205.     puts "\tClass '$name'"
  206.     set umlClass [$package createClass $name]
  207.     $this msUmlObject $umlClass
  208.     if [$workItem isNil] {
  209.         $trans commit
  210.         return $umlClass
  211.     }
  212.     # class properties
  213.     $this saveFreeTextProp $umlClass [$workItem properties]
  214.     $trans commit
  215.     return $umlClass
  216. }
  217.  
  218. method MSUMLClass::promoter {this} {
  219.     $this MSUMLType::promoter
  220.         set noOfMembers [$this getNoOfMembers]
  221.     $this _roleSet [List new]
  222.     $this _memberSet [List new]
  223.         for {set i 1} {$i <= $noOfMembers} {incr i} {
  224.             set umlMember [$this getMemberAsUML $i]
  225.             MS[$umlMember property objectType] promote $umlMember
  226.             $this addMember $umlMember
  227.         }
  228.  
  229. }
  230.  
  231. # Do not delete this line -- regeneration end marker
  232.  
  233. method MSUMLClass::roleSet {this} {
  234.     return [$this _roleSet]
  235. }
  236.  
  237. method MSUMLClass::addRole {this newRole} {
  238.     [$this _roleSet] append $newRole
  239.     $newRole _owner $this
  240. }
  241.  
  242. method MSUMLClass::removeRole {this oldRole} {
  243.     $oldRole _owner ""
  244.     [$this _roleSet] removeValue $oldRole
  245. }
  246.  
  247. method MSUMLClass::memberSet {this} {
  248.     return [$this _memberSet]
  249. }
  250.  
  251. method MSUMLClass::addMember {this newMember} {
  252.     [$this _memberSet] append $newMember
  253.     $newMember _owner $this
  254. }
  255.  
  256. method MSUMLClass::removeMember {this oldMember} {
  257.     $oldMember _owner ""
  258.     [$this _memberSet] removeValue $oldMember
  259. }
  260.  
  261.