From fc30c917e01a7e6302bb7cea994e4216516a85da Mon Sep 17 00:00:00 2001 From: Michael Wiebusch Date: Fri, 28 Jun 2013 12:18:43 +0200 Subject: [PATCH] inheriting working, not yet shown by different color --- xml_spielwiese/cgitest.pl | 79 +++++++++++++++++++++++++++++++++++---- 1 file changed, 72 insertions(+), 7 deletions(-) diff --git a/xml_spielwiese/cgitest.pl b/xml_spielwiese/cgitest.pl index 8b99312..13fa84d 100755 --- a/xml_spielwiese/cgitest.pl +++ b/xml_spielwiese/cgitest.pl @@ -86,9 +86,11 @@ if ( $cgiHash{'print'} eq 'settree' ) { print "
Selected Settings
\n"; parseSetAndSpec( $cgiHash{'configFile'} ); buildAncestry($setfileName); + #only for debug + $settree = $ancestryTree; print "
"; print "inherit settings from:
"; - print join("
",@ancestryList); + print join( "
", @ancestryList ); print "
"; print_registers($setfile); } @@ -151,19 +153,82 @@ sub buildAncestry { # recursive $xmltree = $settree; } else { + # we got an ancestor here $xmltree = $parser->parse_file($xmlfile); + # tag all the fields with an heritage attribute + for my $field ($xmltree->findnodes("//field")){ + $field->setAttribute("isHeritageFrom","$xmlfileName"); + } } - - my $ancestorFileName = $xmltree->findvalue("/MAPS/\@inheritSettingsFrom") || ""; - unless ($ancestorFileName eq ""){ - buildAncestry($ancestorFileName); - push(@ancestryList,$ancestorFileName); + + my $ancestorFileName = $xmltree->findvalue("/MAPS/\@inheritSettingsFrom") + || ""; + unless ( $ancestorFileName eq "" ) { + + # this block is executed when an ancestor is found + buildAncestry($ancestorFileName); # recursion + push( @ancestryList, $ancestorFileName ); + + #integrate the current tree into the ancestryTree, overwrite older settings + mergeTrees( $ancestryTree, $xmltree ); } - + else { + +# this block is called when you are at the root of the ancestry -> you are THE Father +# begin the ancestry tree + + $ancestryTree = $xmltree; + } + } +sub mergeTrees +{ # give me two trees, tree1 overwrites everything in tree0 and will consequently be integrated in tree0 + my $tree0 = $_[0]; + my $tree1 = $_[1]; + + my $maps0 = $tree0->findnodes("/MAPS")->shift(); + my $maps1 = $tree1->findnodes("/MAPS")->shift(); + + my @registers0 = $tree0->findnodes("/MAPS/register"); + my @registers1 = $tree1->findnodes("/MAPS/register"); + + for my $register1 (@registers1) { + my $registerName = $register1->findvalue("./\@name"); + if ( $registerName eq "" ) { + die "registerName in tree1 undefined!"; + } + + # if current register does not exist in tree0, create it + my $register0 = + $maps0->findnodes( "./register[\@name='" . $registerName . "']" ) + ->shift(); + if ( $register0 eq "" ) { + $register0 = $maps0->addNewChild( "", "register" ); + $register0->setAttribute( "name", $registerName ); + } + + my @fields1 = $register1->findnodes("./field"); + for my $field1 (@fields1) { + my $fieldName = $field1->findvalue("./\@name"); + + # if field with same name exists in tree0/register0 delete it! + my $field0 = + $register0->findnodes( "./field[\@name='" . $fieldName . "'" ); + unless ( $field0 eq "" ) { + $register0->removeChild($field0); + } + + # copy current field from tree1/register1 to tree0/register0 + + $register0->addChild($field1); + } + + } +} + sub del { my $registerName = $_[0]; -- 2.43.0