home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World 2000 December
/
PCWorld_2000-12_cd.bin
/
Komunikace
/
Comanche
/
plugins
/
apache
/
apacheParser.tcl
< prev
next >
Wrap
Text File
|
2000-11-02
|
4KB
|
181 lines
class apacheParser {
inherit genericParser
#Need to know which modules are enabled
public variable moduleManager
# Include root. Apache uses serverroot by default
public variable includeroot
constructor { dirDef confDoc } {
genericParser::constructor $dirDef $confDoc
} {
}
method parseLine { data }
method beginSection {value class}
method endSection {}
method processDirective { text }
method loadValue {xuiObj text}
method isSpecialCase
method processSpecialCase
}
body apacheParser::parseLine { data } {
set data [string trim $data]
if {[regexp "^ *#+" $data] || [regexp "^ *$" $data]} {
return
}
if [regexp "^ *</+.*>+$" $data] {
endSection
return
}
if [regexp "^ *<+.*>+$" $data] {
regexp {<([^ ]*) (.*)>} $data dummy class value
beginSection \
$value [string tolower $class]
} else {
if [catch {processDirective $data} kk] {
error "Error configuring directive $data\n$kk"
}
}
}
body apacheParser::beginSection { value class } {
$stack push $currentContainer
set currentContainer \
[$xmlConf addContainer $currentContainer $value $class]
}
body apacheParser::endSection {} {
set currentContainer [$stack pop]
}
body apacheParser::processDirective { text } {
set elements [::apacheparserutils::getElements $text ]
set dirName [string tolower [lindex $elements 0]]
# Vary includeroot depending on the serverroot directive
if [string match serverroot $dirName] {
# join is necessary to handle spaces on Windows
set includeroot [join [lindex $elements 1]]
}
# include directives
if [string match include $dirName] {
# Need to handle full and relative paths
set includeFile [join [lindex $elements 1]]
switch [file pathtype $includeFile] {
absolute {
# Do nothing, we can open it
$this parseFile $includeFile
} relative {
# Ok, we need to prepend the conf directives dir
set includeFile [file join $includeroot $includeFile]
if ![file exists $includeFile] {
puts "Include file $includeFile could not be processed. \
Check that it exists"
} else {
$this parseFile $includeFile
}
} volumerelative {
# Um, unsure about what volume relative is.
puts "Include path was volume relative"
}
}
}
# If module is not enabled, directive is treated as unknown
# (we can this way disable modules that could mistreat info)
if ![$moduleManager isDirectiveEnabled $dirName] {
set xuiUnknown [ xuiString ::#auto ]
$xuiUnknown setName $dirName
$xuiUnknown setValue $text
$xuiUnknown addClass unknownDirective
$xmlConf addDirective $xuiUnknown $currentContainer
return
}
if [ isSpecialCase $dirName ] {
processSpecialCase $dirName $text
return
}
# If error here is that the directive is unknown to us
if ![catch {set xuiObj [apacheparserutils::getOrCreateIfNotExists \
$dirName $dirDefinition $xmlConf $currentContainer]} kk] {
switch [$xuiObj getXuiClass] {
string - choice - boolean - number {
::apacheparserutils::loadValue $xuiObj [lindex $elements 1]
return
} structure {
error "Structure cannot be done (order issues) for [$xuiObj getName]"
}
}
} else {
set xuiUnknown [ xuiString ::#auto ]
$xuiUnknown setName $dirName
$xuiUnknown setValue $text
$xuiUnknown addClass unknownDirective
$xmlConf addDirective $xuiUnknown $currentContainer
return
}
}
body apacheParser::loadValue { dirObject value } {
switch [$dirObject getXuiClass] {
string - number {
$dirObject setValue [string trim $value]
} choice {
$dirObject selectItem [string trim $value]
} boolean {
switch [string tolower [string trim $value]] {
on - yes - true - 1{
$dirObject setValue
} off - false - no - 0{
$dirObject clearValue
} default {
error "Boolean with value different from on/off"
}
}
}
}
}
body apacheParser::isSpecialCase { dirName } {
return [info exists specialCaseMapping($dirName)]
}
body apacheParser::processSpecialCase \
{dirName elements} {
$specialCaseMapping($dirName) $elements $this\
$dirDefinition $xmlConf $currentContainer
}