14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
17
# $Id: XMLCompiler.pm,v 1.2 2005/01/25 13:46:33 ssinyagin Exp $
17
# $Id: XMLCompiler.pm,v 1.6 2007/04/10 14:28:34 ssinyagin Exp $
18
18
# Stanislav Sinyagin <ssinyagin@yahoo.com>
185
sub compile_paramprops
191
foreach my $def ( $node->getChildrenByTagName('prop') )
193
my $param = $def->getAttribute('param');
194
my $prop = $def->getAttribute('prop');
195
my $value = $def->getAttribute('value');
196
if( not $param or not $prop or not defined($value) )
198
Error("Property definition error"); $ok = 0;
202
$self->setParamProperty($param, $prop, $value);
175
210
# Process <param name="name" value="value"/> and put them into DB.
176
211
# Usage: $self->compile_params($node, $name);
323
358
foreach my $alias ( $node->getChildrenByTagName('alias') )
325
360
my $apath = $alias->textContent();
361
$apath =~ s/\s+//mgo;
327
362
$ok = $self->setAlias($token, $apath) ? $ok:0;
330
# Handle file patterns -- we're still in compile_subtrees()
332
foreach my $fp ( $node->getChildrenByTagName('filepattern') )
334
my $type = $fp->getAttribute('type');
335
my $name = $fp->getAttribute('name');
336
my $file_re = $fp->getAttribute('filere');
337
my $dirname = $self->getNodeParam($token, 'data-dir');
339
if($type ne 'subtree' and $type ne 'leaf')
341
Error("Unknown filepattern type: $type at $path"); $ok = 0;
343
elsif( not defined($name) or not defined($file_re) )
345
Error("Filepattern name or RE not defined at $path"); $ok = 0;
347
elsif( not defined($dirname) )
349
Error("data-dir parameter not defined at $path"); $ok = 0;
351
elsif( not -d $dirname )
353
Error("Directory $dirname does not exist at $path"); $ok = 0;
357
$file_re = $self->expand_name($path, $file_re);
359
# Read the directory and match the pattern
361
opendir(DIR, $dirname) or die "can't opendir $dirname: $!";
362
while( (my $fname = readdir(DIR)) )
364
if( $fname =~ /$file_re/ )
366
my $newnodename = eval($name);
367
if( defined $applied{$newnodename} )
369
Error("Filepattern gives non-unique names: " .
370
"name=\"$name\" filere=\"$file_re\" at $path");
375
$applied{$newnodename} = $fname;
380
# Clone the contents of filepattern into the main tree
381
my %detailedmatched = ();
382
foreach my $newnodename (keys %applied)
384
my $newnode = XML::LibXML::Element->new( $type );
385
$newnode->setAttribute('name', $newnodename);
386
$node->parentNode()->appendChild($newnode);
388
my $childname = $newnodename;
389
$childname .= '/' if $type eq 'subtree';
390
my $newnodetoken = $self->addChild($token, $childname);
391
my $newnodepath = $path.$childname;
393
$self->setNodeParam($newnodetoken, 'data-file',
394
$applied{$newnodename});
396
foreach my $fpchild ($fp->childNodes())
398
if( $fpchild->nodeName() eq 'detailed' )
400
my $match = $fpchild->getAttribute('match');
401
if( not defined $match )
403
Error("Detailed should have match at $path");
408
if( not defined $detailedmatched{$match} )
410
$detailedmatched{$match} = 0;
412
if( $match eq $newnodename )
414
$detailedmatched{$match} = 1;
415
foreach my $detnode ( $fpchild->childNodes() )
418
appendChild($detnode->cloneNode(1));
425
$newnode->appendChild($fpchild->cloneNode(1));
429
compile_subtrees( $newnode, $newnodetoken ) ? $ok:0;
432
# Check if any of detailed have not matched
434
foreach my $match (keys %detailedmatched)
436
if( not $detailedmatched{$match} )
438
Warn("Detailed match \"$match\" have not matched any ".
445
365
foreach my $setvar ( $node->getChildrenByTagName('setvar') )
447
367
my $name = $setvar->getAttribute('name');