home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 December / PCWorld_2000-12_cd.bin / Komunikace / Comanche / plugins / apache / prettyDumper.tcl < prev    next >
Text File  |  2000-11-02  |  6KB  |  255 lines

  1. # apachePrettyDumper --
  2. #   Dumps the XML configuration to httpd.conf, trying its best to
  3. #   preserve coments, etc
  4. # Output algorithm
  5. #    > Read input
  6. #           - If comment, output
  7. #    xmlDirectives List with all the xmlDirectives not yet dumped.
  8. #    httpdDirectives List with all http directives
  9. #    already processed in
  10. #    this section.
  11. #    Case Section {
  12. #    Check if section with that name exists.
  13. #    If not, just skip it
  14. #    If only one,
  15. #    process using new section
  16. #    If more than one may be a serverName problem (same IP,!=servername)
  17. #    Check if serverName is the same if it is dump it
  18. #    if not just
  19. #    ignore
  20. #    }
  21. #    Case directive {
  22. #    If already for this container, do
  23. #    nothing (httpdDirectives)
  24. #    If !specialCase and !notExists
  25. #    check if unknown with the same name, dump all unknown
  26. #    with same name, remove from xmlDirectives
  27. #    add to httpdDirectives
  28. #    }         
  29.  
  30. class apachePrettyDumper {
  31.    variable specialCaseMapping
  32.    variable outputText {}
  33.    variable inputText {}
  34.    variable currentText {}
  35.    variable sectionStack
  36.    constructor {} {
  37.        set sectionStack [stack #auto]
  38.    }
  39.    method init 
  40.    method dump 
  41.    method getLine
  42.    method addLine    
  43.    method beginSection 
  44.    method endSection 
  45.    method processDirective 
  46.    method setSpecialCase
  47.    method endOfText
  48.  
  49.    
  50. }
  51. body apachePrettyDumper::init { text } {
  52.  
  53.     # Take into account here line continuation
  54.  
  55.     set inputText [split $text \n]
  56.     set currentText $inputText
  57.     #puts "$inputText"
  58. }
  59.  
  60. body apachePrettyDumper::endOfText {} {
  61.    return [expr ![llength $currentText]]
  62. }
  63.  
  64. body apachePrettyDumper::dump {xmlConf} {
  65.     set result {}
  66.     while {![endOfText]} {
  67.  
  68.     set line [getLine]
  69.     puts $line
  70.     
  71.     # Leave comments and blank lines as-is
  72.     
  73.     set data [string trim $line]
  74.     if {[regexp "^#+" $data] || ![string length $data]} {
  75.         addLine $line
  76.     } elseif [regexp "^ *</+.*>+$" $data] {
  77.         endSection
  78.     } elseif [regexp "^ *<+.*>+$" $data] {
  79.         regexp {<([^ ]*) (.*)>}  $data dummy class value
  80.     beginSection \
  81.     [string tolower $value] [string tolower $class]
  82.     } else {
  83.         processDirective $data
  84.     }        
  85.     }
  86.     puts kk
  87.     puts $outputText
  88. }
  89.  
  90. body apachePrettyDumper::getLine {} {
  91.  
  92.    # add \n because removed on original split
  93.    
  94.    set result [lindex $currentText 0]
  95.    set currentText [lrange $currentText 1 end]
  96.    return $result
  97. }
  98.  
  99. body apachePrettyDumper::beginSection {args} {
  100.  
  101. }
  102.  
  103. body apachePrettyDumper::endSection {args} {
  104.  
  105. }
  106.  
  107. body apachePrettyDumper::processDirective {data} {
  108.    addLine $data
  109. }
  110.  
  111. body apachePrettyDumper::addLine {data} {
  112.    append outputText $data
  113.    append outputText \n
  114. }
  115.  
  116. body apachePrettyDumper::setSpecialCase { procedure args } {
  117.     foreach directive $args {
  118.     set specialCaseMapping([string tolower $directive]) \
  119.     $procedure
  120.     }
  121. }    
  122.  
  123.  
  124.  
  125.  
  126.  
  127.  
  128.  
  129.  
  130.  
  131.  
  132.  
  133.  
  134.  
  135.  
  136.  
  137.  
  138.  
  139.  
  140.  
  141.  
  142.  
  143.  
  144.  
  145.  
  146.  
  147.  
  148.  
  149.  
  150.  
  151.  
  152.  
  153.  
  154.  
  155.  
  156.  
  157.  
  158.  
  159.  
  160.  
  161.  
  162.  
  163.  
  164.  
  165. set comment {{
  166.     variable specialCaseMapping
  167.     constructor {} {
  168.     array set specialParseCaseMapping  {}
  169.     array set specialCaseMapping  {}
  170.     }
  171.     method setSpecialCase { procedure args }
  172.     method isSpecialCase { dirName }
  173.     method processContainer { xmlConf container }
  174.     method dump { xmlConf }
  175.     method dumpContainer { xmlConf container }
  176. }
  177.  
  178. body apacheDumper::isSpecialCase { dirName } {
  179.     return [info exists specialCaseMapping($dirName)]
  180.  
  181. body apacheDumper::dump { httpdFileText xmlConfDoc } {
  182.    set result [ dumpContainer $xmlConfDoc \
  183.        [set rootC [$xmlConfDoc getRootContainer]]]
  184.    foreach container [$xmlConfDoc getContainers $rootC] {
  185.     append result [ processContainer $xmlConfDoc $container]
  186.    }
  187.    return $result
  188. }
  189.  
  190. body apacheDumper::processContainer { xmlConfDoc container } {
  191.     set result {}
  192.     append result "<[$container getClasses] [$container getName]>\n"
  193.     append result [ dumpContainer $xmlConfDoc $container ]
  194.     foreach childContainer [$xmlConfDoc getContainers $container] {
  195.     append result [ processContainer $xmlConfDoc $childContainer]
  196.     }
  197.     append result "</[$container getClasses]>\n"
  198.     return $result
  199. }
  200.  
  201.  
  202. body apacheDumper::dumpContainer { xmlConfDoc container } {
  203.     set result {}
  204.     foreach directive [$xmlConfDoc getDirectives $container] {
  205.     set dirName [string tolower [$directive getName]]
  206.     if [isSpecialCase $dirName] {
  207.         append result "[$specialCaseMapping($dirName) $directive]\n"
  208.     } else {
  209.         if [$directive doYouBelongTo unknownDirective] {
  210.             append result "[$directive getValue]\n"
  211.         } else {
  212.         switch [$directive getXuiClass] {
  213.         string - number  {
  214.             set value [$directive getValue] 
  215.             if [string compare $value [$directive getDefault]] {
  216.                     set value [$directive getText]
  217.                 if {[$directive doYouBelongTo file] || \
  218.                         [$directive doYouBelongTo directory] } {
  219.                     if [regexp {\ } $value] {
  220.                         set value "\"$value\""
  221.                     }
  222.                 }        
  223.                 append result "$dirName $value\n"
  224.             } 
  225.         } boolean {
  226.             set value [$directive getValue] 
  227.             if [string compare $value [$directive getDefault]] {
  228.                 switch $value {
  229.                 0 {
  230.                     append result "$dirName off\n"
  231.                 } 1 {
  232.                     append result "$dirName on\n"
  233.                 }
  234.             }
  235.             }
  236.         } choice {
  237.             append result \
  238.                    "$dirName [$directive getSelected]\n"
  239.         } default {
  240.            error "No special case and not recognized in dumping\
  241.                    [$directive getXuiClass] [$directive getName]"
  242.         }
  243.         }
  244.        } 
  245.     }
  246.     }
  247.     return $result
  248. }
  249.  
  250.  
  251.  
  252.  
  253. }
  254.