deprecated/buildtools/buildsystemtools/validate_sch12_model.pl
changeset 664 44b0e894b7ab
parent 655 3f65fd25dfd4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/validate_sch12_model.pl	Wed Oct 27 19:35:19 2010 +0800
@@ -0,0 +1,333 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#! perl
+
+# Read a Schedule12 file and check the system_model items
+# against a supplied System_Definition.xml
+
+use strict;
+
+use FindBin;
+use lib ".";
+use lib "./lib";
+use lib "$FindBin::Bin";
+use lib "$FindBin::Bin/lib";
+use XML::DOM;
+use XML::DOM::ValParser;
+
+# produces the "Use of uninitialized value in concatenation (.) or string" warning
+use XML::XQL;
+use XML::XQL::DOM;
+
+# Read the command line to get the filenames
+
+sub Usage($)
+	{
+	my ($reason) = @_;
+
+	print "Usage: $reason\n" if ($reason);
+	print <<USAGE_EOF;
+
+Usage: validate_sch12_model.pl <params> [options]
+
+params:
+-s <schedule12>     XML version of Schedule 12
+-m <system_model>   XML version of System Model
+
+options:
+-o <whats_left>     XML file showing unreferenced
+                       parts of the System Model
+-r                  Remove matched objects from -o output
+-c <cbr_mapping>    Tab separated file showing the Schedule 12
+                       component for each MRP file
+
+USAGE_EOF
+	exit(1);
+	}
+	
+use Getopt::Long;
+
+my $schedule12file = "Symbian_OS_v9.1_Schedule12.xml";
+my $systemmodelfile = "System_Definition.xml";
+my $whatsleftfile = "";
+my $remove = 0;
+my $cbrmappingfile = "";
+
+Usage("Bad arguments") unless GetOptions(
+  	's=s' => \$schedule12file, 
+  	'm=s' => \$systemmodelfile,
+  	'o=s' => \$whatsleftfile,
+  	'r'   => \$remove,
+  	'c=s' => \$cbrmappingfile);
+
+Usage("Too many arguments") if (scalar @ARGV > 0);
+Usage("Cannot find $schedule12file") if (!-f $schedule12file);
+Usage("Cannot find $systemmodelfile") if (!-f $systemmodelfile);
+
+
+# Don't print info messages
+sub my_fail
+	{
+	my $code = shift;
+	if ($code < 300)
+		{
+		XML::Checker::print_error ($code, @_);
+		}
+	}
+$XML::Checker::FAIL = \&my_fail;
+
+# Load the XML documents
+my %expat_options = 
+	(
+	KeepCDATA => 1, 
+    Handlers => [],
+    );
+
+my $xmlParser = new XML::DOM::ValParser(%expat_options); 
+XML::DOM::ignoreReadOnly(1);
+
+my $sch12path = ".";
+my $modelpath = ".";
+$sch12path = $1 if ($schedule12file  =~ /^(.+)\\[^\\]+$/);
+$modelpath = $1 if ($systemmodelfile =~ /^(.+)\\[^\\]+$/);
+$xmlParser->set_sgml_search_path($sch12path, $modelpath);
+
+my $modelXML = $xmlParser->parsefile ($systemmodelfile);
+my $sch12XML = $xmlParser->parsefile ($schedule12file);
+
+# Collect the Schedule12 entries, checking for duplicates
+
+my %sch12refs;
+my %componenttype;
+my ($sch12) = $sch12XML->getElementsByTagName("Schedule12");
+Usage("No <Schedule12> in $schedule12file ?") if (!defined $sch12);
+
+my @children = $sch12->getChildNodes;
+foreach my $child (@children)
+	{
+	next if ($child->getNodeTypeName ne "ELEMENT_NODE");
+	my $tagname = $child->getTagName;
+	next if ($tagname eq "footnote");
+	my $component = $child->getAttribute("name");
+	$componenttype{$component} = $tagname;
+	
+	my @entries = $child->getElementsByTagName("system_model");
+	if (scalar @entries == 0)
+		{
+		print STDERR "No system_model entries in $component\n";
+		next;
+		}
+		
+	foreach my $entry (@entries)
+		{
+		my $name = $entry->getAttribute("entry");
+		if (defined $sch12refs{$name})
+			{
+			print STDERR "$name occurs in $sch12refs{$name} and $component\n";
+			}
+		else
+			{
+			$sch12refs{$name} = $component;
+			}
+		}
+	}
+
+# Find the Schedule12 entries in the XML file
+
+my %modelnames;
+sub match_names($);		# declare the prototype for recursive call
+sub match_names($)
+	{
+	my ($node) = @_;
+
+	my @children = $node->getChildNodes;
+	foreach my $child (@children)
+		{
+		if ($child->getNodeTypeName ne "ELEMENT_NODE")
+			{
+			# text and comments don't count
+			next;
+			}
+		my $tagname = $child->getTagName;
+		if ($tagname eq "unit")
+			{
+			# units are detail inside the model, so they don't count
+			next;
+			}
+		my $name = $child->getAttribute("name");
+		if ($name)
+			{
+			if (defined $modelnames{$name})
+				{
+				print STDERR "Name $name occurs more than once in the System Model\n";
+				}
+			$modelnames{$name} = $tagname;
+			
+			if (defined $sch12refs{$name})
+				{
+				$child->setAttribute("MATCHED", $sch12refs{$name});
+				$modelnames{$name} = "1";
+				}
+			}
+		match_names($child);
+		}
+	}
+
+my ($model) = $modelXML->getElementsByTagName("systemModel");
+
+match_names($model);
+
+# Report on the accuracy of Schedule 12
+print STDERR "\n";
+my @allnames = ();
+my $unmatched = 0;
+foreach my $name (sort keys %sch12refs)
+	{
+	next if (defined $modelnames{$name});
+	push @allnames, "$name\t(Sch12 $sch12refs{$name})\n";
+	print STDERR "No match for $name (associated with $sch12refs{$name})\n";
+	$unmatched += 1;
+	}
+if ($unmatched == 0)
+	{
+	print STDERR "All Schedule 12 entries matched in System Model\n";
+	}
+else
+	{
+	printf STDERR "%d Schedule 12 entry references not matched (from a total of %d)\n", $unmatched, scalar keys %sch12refs; 
+	}
+
+# Remove the matched elements to leave the unmatched parts,
+# and accumulate the MRP files for each Sch12 component
+
+my %sch12bymrp;
+my %locationbymrp;
+
+sub list_mrps($$$);		# declare the prototype for recursive call
+sub list_mrps($$$)
+	{
+	my ($node,$location,$sch12name) = @_;
+	my @children = $node->getChildNodes;
+	my $nodename = $node->getAttribute("name");
+
+	my $sublocation = $nodename;
+	$sublocation = "$location/$nodename" if ($location ne "");
+	
+	foreach my $child (@children)
+		{
+		if ($child->getNodeTypeName ne "ELEMENT_NODE")
+			{
+			# text and comments don't count
+			next;
+			}
+		my $tagname = $child->getTagName;
+		if ($tagname eq "unit" || $tagname eq "package" || $tagname eq "prebuilt")
+			{
+			# these elements have the mrp information, but no substructure
+			my $mrp = $child->getAttribute("mrp");
+			$mrp = $1 if ($mrp =~ /\\([^\\]+)\.mrp$/i);
+			$sch12bymrp{$mrp} = $sch12name;
+			$locationbymrp{$mrp} = "$location\t$nodename";
+			next;
+			}
+		my $submatch = $child->getAttribute("MATCHED");
+		if ($submatch)
+			{
+			list_mrps($child,$sublocation,$submatch);
+			}
+		else
+			{
+			list_mrps($child,$sublocation,$sch12name);
+			}
+		}
+	}
+
+sub delete_matched($$);		# declare the prototype for recursive call
+sub delete_matched($$)
+	{
+	my ($node, $location) = @_;
+	my $nodename = $node->getAttribute("name");
+
+	my $sublocation = $nodename;
+	$sublocation = "$location/$nodename" if ($location ne "");
+
+	my @children = $node->getChildNodes;
+	return 0 if (scalar @children == 0);
+	my $now_empty = 1;
+	foreach my $child (@children)
+		{
+		if ($child->getNodeTypeName ne "ELEMENT_NODE")
+			{
+			# text and comments don't count
+			next;
+			}
+		my $sch12name = $child->getAttribute("MATCHED");
+		if ($sch12name)
+			{
+			list_mrps($child, $sublocation, $sch12name);
+			$node->removeChild($child) if ($remove);
+			}
+		else
+			{
+			if (delete_matched($child,$sublocation) == 1)
+				{
+				# Child was empty and can be removed
+				$node->removeChild($child) if ($remove);
+				}
+			else
+				{
+				list_mrps($child, $sublocation, "*UNREFERENCED*");
+				$now_empty = 0;		# something left in due to this child
+				}
+			}
+		}
+	return $now_empty;
+	}
+
+# scan the tagged model, recording various details as a side-effect
+
+my $allgone = delete_matched($model,"");
+
+if ($whatsleftfile ne "")
+	{
+	if ($allgone)
+		{
+		print STDERR "System Model is completely covered by Schedule 12\n";
+		}
+	else
+		{
+		$modelXML->normalize;
+		$modelXML->printToFile($whatsleftfile);
+		print STDERR "Remains of System Model written to $whatsleftfile\n";
+		}
+	}
+
+if ($cbrmappingfile ne "")
+	{
+	$componenttype{"*UNREFERENCED*"} = "??";
+	open CBRMAP, ">$cbrmappingfile" or die("Unable to write to $cbrmappingfile: $!\n");
+	foreach my $mrp (sort keys %sch12bymrp)
+		{
+		my $component = $sch12bymrp{$mrp};
+		my $comptype = $componenttype{$component};
+		my $location = $locationbymrp{$mrp};
+		print CBRMAP "$mrp\t$location\t$component\t$comptype\n";
+		}
+	close CBRMAP;
+	print STDERR "MRP -> Schedule 12 mapping written to $cbrmappingfile\n";
+	}
+
+exit 0;