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

  1. #---------------------------------------------------------------------------
  2. #
  3. # Copyright (c) 1997 by Cayenne Software, Inc.
  4. #
  5. # This software is furnished under a license and may be used only in
  6. # accordance with the terms of such license and with the inclusion of
  7. # the above copyright notice. This software or any other copies thereof
  8. # may not be provided or otherwise made available to any other person.
  9. # No title to and ownership of the software is hereby transferred.
  10. #
  11. # The information in this software is subject to change without notice
  12. # and should not be construed as a commitment by Cadre Technologies Inc.
  13. #
  14. # This file contains generic heuristic methods to recognize
  15. # associations and accessor methods
  16. #
  17. # Heuristics used:
  18. #
  19. # - Association recognition:
  20. #   - is the section "association-attribute-storage"
  21. #     if so: this must be an association, find out with which class
  22. #   - is the section "user-defined-attribute"
  23. #     if so: this is a normal attribute
  24. #   - is the type used a "classType" and it is some sort of pointer
  25. #     if so: assume that this is an association
  26. #   - if all the above fail
  27. #     assume that this is a normal attribute
  28. #
  29. # - Accessor methods:
  30. #   - is the section "user-defined-method" or "default-constructor-destructor"
  31. #     if so: this is a normal method
  32. #   - if the name of the method starts with "set", "get", "remove" or "add" 
  33. #     and the rest of the name matches one of the attributes in this class
  34. #     if so: this is an accessor method
  35. #   - if all of the above fail, assume that this is a normal method
  36. #
  37.  
  38. puts "Reverse engineering associations activated."
  39.  
  40. Class GenRecAttrib : {REAttrib} {
  41.     method drawAssoc
  42.     method isAssocAttr
  43. }
  44.  
  45. method GenRecAttrib::drawAssoc {this} {
  46.     set assocKind "association"
  47.     set multKind "one"
  48.     set className [$this type]
  49.  
  50.     # Try do do some template recognition
  51.     if [regexp {(([^_]*)_)?(.*)} $className fullStr under templ name] {
  52.         if [info exist debug] {
  53.             puts "Template breakdown: type=$className templ=$templ name=$name"
  54.         }
  55.         switch -glob [string tolower $templ] {
  56.             "*set*" -
  57.             "*list*" -
  58.             "*array*" -
  59.             "*collection*" -
  60.             "*bag*" -
  61.             "*vector*" {
  62.                     set multKind "many" 
  63.                     set className $name
  64.                 }
  65.         }
  66.         switch [string tolower $name] {
  67.             "*dict*" {set assocKind "qualif_assoc"}
  68.             "*hash*" {set assocKind "qualif_assoc"}
  69.             "*table*" {set assocKind "qualif_assoc"}
  70.         }
  71.     } else {
  72.         set prop [$this findProp "modifier"]
  73.         if {$prop != ""} {
  74.             if {[$prop value] == "Value"} {
  75.                 return 0
  76.             }
  77.         }
  78.         if {([$this section] != "association-attribute-storage") &&
  79.             ([$this section] != "")} {
  80.             return 0
  81.         }
  82.     }
  83.  
  84.     set roleName [$this name]
  85.     if [regexp -nocase {(.*)(ref|ptr|set|(dict.*))} [$this name] totalname role rest] {
  86.         set roleName $role
  87.     }
  88.  
  89.     if {$roleName == ""} {
  90.         set roleName "x"
  91.     }
  92.  
  93.     set cl [[$this reDiagram] findClass $className]
  94.     if {$cl == ""} {
  95.         set cl [[$this reDiagram] addClass $className]
  96.         $cl setProp is_folded 1 comp
  97.     }
  98.     if [info exist debug] {
  99.         puts "Add $assocKind [[$this reClass] getName] -> $multKind [$cl getName] ($roleName)"
  100.     }
  101.     set conn [[$this reDiagram] addConn $assocKind [$this reClass] $cl]
  102.     set lbl [$conn setLabel "role_end" $roleName]
  103.     $conn setProp mult_kind_start "one"
  104.     $conn setProp mult_kind_end $multKind
  105.     set access_prop [$this findProp "attrib_access" name]
  106.     if {$access_prop != ""} {
  107.         set access [$access_prop value]
  108.         $lbl setProp assoc_access $access name
  109.     }
  110.  
  111.     return 1
  112. }
  113.  
  114. method GenRecAttrib::isAssocAttr {this} {
  115.     if {[$this section] == "user-defined-attribute"} {
  116.         return 0
  117.     }
  118.     if {[$this typeKind] == "classType"} {
  119.         return [$this drawAssoc]
  120.     }
  121.     return 0
  122. }
  123.  
  124. selfPromoter REAttrib {this} {
  125.      GenRecAttrib promote $this
  126. }
  127.  
  128. Class GenRecMethod : {REMethod} {
  129.     method isAccessor
  130. }
  131.  
  132. method GenRecMethod::isAccessor {this} {
  133.     if {[$this section] == "user-defined-method"} {
  134.         return 0
  135.     }
  136.     if {[$this section] == "default-constructor-destructor"} {
  137.         if [info exists debug] {
  138.             puts "Adding default ctor"
  139.         }
  140.         [$this reClass] addMethod "\$create" "user-defined-method"
  141.         return 1
  142.     }
  143.     if [regexp -nocase {(let|set|add|remove|get)(.+)} [$this name] total acc attrN] {
  144.         foreach attr [[$this reClass] reAttribSet] {
  145.             if [regexp -nocase "${attrN}.*" [$attr name]] {
  146.                 set access_prop [$attr findProp "attrib_access" name]
  147.                 if {$access_prop == ""} {
  148.                     set access_prop [$attr setProp "attrib_access" "None-None" name]
  149.                 }
  150.                 set access_rw [split [$access_prop value] "-"]
  151.                 set methd_access "None"
  152.                 set methd_prop [$this findProp "method_access" comp]
  153.                 if {$methd_prop != ""} {
  154.                     set methd_access [$methd_prop value]
  155.                 }
  156.                 switch $acc {
  157.                     let    -
  158.                     set    -
  159.                     add -
  160.                     remove { set access_rw [list [lindex $access_rw 0] $methd_access] }
  161.                     get { set access_rw [list $methd_access [lindex $access_rw 1]] }
  162.                 }
  163.  
  164.                 $access_prop value "[lindex $access_rw 0]-[lindex $access_rw 1]"
  165.                 return 1
  166.             }
  167.         }
  168.     }
  169.     return 0
  170. }
  171.  
  172. selfPromoter REMethod {this} {
  173.      GenRecMethod promote $this
  174. }
  175.