sbsv2/raptor/python/raptor_xml.py
author mikek
Fri, 04 Jun 2010 13:09:28 +0100
changeset 18 de5b887c98f7
parent 13 c327db0664bb
child 28 b8fa7dfeeaa1
permissions -rw-r--r--
Upgrading to Raptor 2.14
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
13
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
     1
#
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
     2
# Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies).
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
     3
# All rights reserved.
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
     4
# This component and the accompanying materials are made available
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
     5
# under the terms of the License "Eclipse Public License v1.0"
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
     6
# which accompanies this distribution, and is available
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
     7
# at the URL "http://www.eclipse.org/legal/epl-v10.html".
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
     8
#
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
     9
# Initial Contributors:
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    10
# Nokia Corporation - initial contribution.
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    11
#
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    12
# Contributors:
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    13
#
18
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
    14
# Description:
13
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    15
# raptor_xml module
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    16
#
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    17
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    18
import os
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    19
import raptor_data
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    20
import raptor_utilities
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    21
import xml.dom.minidom
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    22
import re
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    23
import generic_path
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    24
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    25
# raptor_xml module attributes
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    26
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    27
namespace = "http://symbian.com/xml/build"
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    28
xsdVersion = "build/2_0.xsd"
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    29
xsdIgnore = "build/666.xsd"
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    30
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    31
_constructors = {"alias":raptor_data.Alias,
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    32
				 "aliasRef":raptor_data.AliasRef,
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    33
				 "append":raptor_data.Append,
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    34
				 "env":raptor_data.Env,
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    35
				 "group":raptor_data.Group,
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    36
				 "groupRef":raptor_data.GroupRef,
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    37
				 "interface":raptor_data.Interface,
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    38
				 "interfaceRef":raptor_data.InterfaceRef,
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    39
				 "param":raptor_data.Parameter,
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    40
				 "paramgroup":raptor_data.ParameterGroup,
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    41
				 "prepend":raptor_data.Prepend,
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    42
				 "set":raptor_data.Set,
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    43
				 "spec":raptor_data.Specification,
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    44
				 "var":raptor_data.Variant,
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    45
				 "varRef":raptor_data.VariantRef}
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    46
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    47
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    48
# raptor_xml module classes
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    49
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    50
class XMLError(Exception):
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    51
	pass
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    52
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    53
# raptor_xml module functions
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    54
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    55
def Read(Raptor, filename):
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    56
	"Read in a Raptor XML document"
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    57
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    58
	# try to read and parse the XML file
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    59
	try:
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    60
		dom = xml.dom.minidom.parse(filename)
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    61
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    62
	except: # a whole bag of exceptions can be raised here
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    63
		raise XMLError
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    64
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    65
	# <build> is always the root element
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    66
	build = dom.documentElement
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    67
	objects = []
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    68
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    69
	fileVersion = build.getAttribute("xsi:schemaLocation")
18
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
    70
13
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    71
	# ignore the file it matches the "invalid" schema
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    72
	if fileVersion.endswith(xsdIgnore):
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    73
		return objects
18
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
    74
13
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    75
	# check that the file matches the expected schema
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    76
	if not fileVersion.endswith(xsdVersion):
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    77
		Raptor.Warn("file '%s' uses schema '%s' which does not end with the expected version '%s'", filename, fileVersion, xsdVersion)
18
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
    78
13
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    79
	# create a Data Model object from each sub-element
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    80
	for child in build.childNodes:
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    81
		if child.namespaceURI == namespace \
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    82
		and child.nodeType == child.ELEMENT_NODE:
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    83
			try:
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    84
				o = XMLtoDataModel(Raptor, child)
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    85
				if o is not None:
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    86
					objects.append(o)
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    87
			except raptor_data.InvalidChildError:
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    88
				Raptor.Warn("Invalid element %s in %s", child.localName, filename)
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    89
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    90
	# discard the XML
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    91
	dom.unlink()
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    92
	return objects
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    93
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    94
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    95
def XMLtoDataModel(Raptor, node):
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    96
	"Create a data-model object from an XML element"
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    97
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    98
	# look-up a function to create an object from the node name
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
    99
	try:
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   100
		constructor = _constructors[node.localName]
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   101
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   102
	except KeyError:
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   103
		Raptor.Warn("Unknown element %s", node.localName)
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   104
		return
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   105
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   106
	model = constructor()
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   107
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   108
	# deal with the attributes first
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   109
	if node.hasAttributes():
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   110
		for i in range(node.attributes.length):
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   111
			attribute = node.attributes.item(i)
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   112
			try:
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   113
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   114
				model.SetProperty(attribute.localName, attribute.value)
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   115
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   116
			except raptor_data.InvalidPropertyError:
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   117
				Raptor.Warn("Can't set attribute %s for element %s",
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   118
							 attribute.localName, node.localName)
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   119
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   120
	# add the sub-elements
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   121
	for child in node.childNodes:
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   122
		if child.namespaceURI == namespace \
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   123
		and child.nodeType == child.ELEMENT_NODE:
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   124
			try:
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   125
				gc = XMLtoDataModel(Raptor, child)
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   126
				if gc is not None:
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   127
					model.AddChild(gc)
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   128
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   129
			except raptor_data.InvalidChildError:
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   130
				Raptor.Warn("Can't add child %s to element %s",
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   131
							 child.localName, node.localName)
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   132
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   133
	# only return a valid object (or raise error)
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   134
	if model.Valid():
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   135
		if model.IsApplicable():
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   136
			return model
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   137
		else:
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   138
			return None
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   139
	else:
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   140
		raise raptor_data.InvalidChildError
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   141
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   142
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   143
class SystemModelComponent(generic_path.Path):
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   144
	"""Path sub-class that wraps up a component bld.inf file with
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   145
	system_definition.xml context information."""
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   146
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   147
	def __init__(self, aBldInfFile, aLayerName, aContainerNames, aSystemDefinitionFile, aSystemDefinitionBase, aSystemDefinitionVersion):
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   148
		generic_path.Path.__init__(self, aBldInfFile.Absolute().path)
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   149
		self.__ContainerNames = aContainerNames
18
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   150
		self.__LayerName = aLayerName
13
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   151
		self.__SystemDefinitionFile = aSystemDefinitionFile
18
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   152
		self.__SystemDefinitionBase = aSystemDefinitionBase
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   153
		self.__SystemDefinitionVersion = aSystemDefinitionVersion
13
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   154
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   155
	def GetSystemDefinitionFile(self):
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   156
		return self.__SystemDefinitionFile
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   157
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   158
	def GetSystemDefinitionBase(self):
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   159
		return self.__SystemDefinitionBase
18
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   160
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   161
	def GetSystemDefinitionVersion(self):
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   162
		return self.__SystemDefinitionVersion
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   163
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   164
	def GetLayerName(self):
13
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   165
		return self.__LayerName
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   166
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   167
	def GetContainerName(self, aContainerType):
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   168
		if self.__ContainerNames.has_key(aContainerType):
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   169
			return self.__ContainerNames[aContainerType]
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   170
		return ""
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   171
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   172
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   173
class SystemModel(object):
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   174
	"""A representation of the SystemModel section of a Symbian system_definition.xml file."""
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   175
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   176
	def __init__(self, aLogger, aSystemDefinitionFile, aSystemDefinitionBase):
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   177
		self.__Logger = aLogger
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   178
		self.__SystemDefinitionFile = aSystemDefinitionFile.GetLocalString()
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   179
		self.__SystemDefinitionBase = aSystemDefinitionBase.GetLocalString()
18
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   180
		self.__Version = {'MAJOR':0,'MID':0,'MINOR':0}
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   181
		self.__IdAttribute = "name"
13
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   182
		self.__ComponentRoot = ""
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   183
		self.__TotalComponents = 0
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   184
		self.__LayerList = []
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   185
		self.__LayerDetails = {}
18
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   186
		self.__MissingBldInfs = {}
13
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   187
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   188
		self.__DOM = None
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   189
		self.__SystemDefinitionElement = None
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   190
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   191
		if self.__Read():
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   192
			if self.__Validate():
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   193
				self.__Parse()
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   194
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   195
		if self.__DOM:
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   196
			self.__DOM.unlink()
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   197
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   198
	def HasLayer(self, aLayer):
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   199
		return aLayer in self.__LayerList
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   200
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   201
	def GetLayerNames(self):
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   202
		return self.__LayerList
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   203
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   204
	def GetLayerComponents(self, aLayer):
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   205
		if not self.HasLayer(aLayer):
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   206
			self.__Logger.Error("System Definition layer \"%s\" does not exist in %s", aLayer, self.__SystemDefinitionFile)
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   207
			return []
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   208
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   209
		return self.__LayerDetails[aLayer]
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   210
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   211
	def IsLayerBuildable(self, aLayer):
18
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   212
		if aLayer in self.__MissingBldInfs:
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   213
			for missingbldinf in self.__MissingBldInfs[aLayer]:
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   214
				self.__Logger.Error("System Definition layer \"%s\" from system definition file \"%s\" " + \
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   215
								    "refers to non existent bld.inf file %s", aLayer, self.__SystemDefinitionFile, missingbldinf)
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   216
13
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   217
		if len(self.GetLayerComponents(aLayer)):
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   218
			return True
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   219
		return False
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   220
18
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   221
13
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   222
	def GetAllComponents(self):
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   223
		components = []
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   224
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   225
		for layer in self.GetLayerNames():
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   226
			components.extend(self.GetLayerComponents(layer))
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   227
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   228
		return components
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   229
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   230
	def DumpLayerInfo(self, aLayer):
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   231
		if self.HasLayer(aLayer):
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   232
			self.__Logger.Info("Found %d bld.inf references in layer \"%s\"", len(self.GetLayerComponents(aLayer)), aLayer)
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   233
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   234
	def DumpInfo(self):
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   235
		self.__Logger.Info("Found %d bld.inf references in %s within %d layers:", len(self.GetAllComponents()), self.__SystemDefinitionFile, len(self.GetLayerNames()))
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   236
		self.__Logger.Info("\t%s", ", ".join(self.GetLayerNames()))
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   237
		self.__Logger.InfoDiscovery(object_type = "layers",
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   238
				count = len(self.GetLayerNames()))
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   239
		self.__Logger.InfoDiscovery(object_type = "bld.inf references",
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   240
				count = len(self.GetAllComponents()))
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   241
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   242
	def __Read(self):
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   243
		if not os.path.exists(self.__SystemDefinitionFile):
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   244
			self.__Logger.Error("System Definition file %s does not exist", self.__SystemDefinitionFile)
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   245
			return False
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   246
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   247
		self.__Logger.Info("System Definition file %s", self.__SystemDefinitionFile)
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   248
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   249
		# try to read the XML file
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   250
		try:
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   251
			self.__DOM = xml.dom.minidom.parse(self.__SystemDefinitionFile)
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   252
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   253
		except: # a whole bag of exceptions can be raised here
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   254
			self.__Logger.Error("Failed to parse XML file %s", self.__SystemDefinitionFile)
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   255
			return False
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   256
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   257
		# <SystemDefinition> is always the root element
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   258
		self.__SystemDefinitionElement = self.__DOM.documentElement
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   259
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   260
		return True
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   261
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   262
	def __Validate(self):
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   263
		# account for different schema versions in processing
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   264
		# old format : version >= 1.3.0
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   265
		# new format : version >= 2.0.0 (assume later versions are compatible...at least for now)
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   266
		version = re.match(r'(?P<MAJOR>\d)\.(?P<MID>\d)(\.(?P<MINOR>\d))?', self.__SystemDefinitionElement.getAttribute("schema"))
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   267
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   268
		if not version:
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   269
			self.__Logger.Error("Cannot determine schema version of XML file %s", self.__SystemDefinitionFile)
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   270
			return False
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   271
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   272
		self.__Version['MAJOR'] = int(version.group('MAJOR'))
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   273
		self.__Version['MID'] = int(version.group('MID'))
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   274
		self.__Version['MINOR'] = int(version.group('MINOR'))
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   275
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   276
		if self.__Version['MAJOR'] == 1 and self.__Version['MID'] > 2:
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   277
			self.__ComponentRoot = self.__SystemDefinitionBase
18
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   278
		elif self.__Version['MAJOR'] == 2 or self.__Version['MAJOR'] == 3:
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   279
			# 2.0.x and 3.0.0 formats support SOURCEROOT or SRCROOT as an environment specified base - we respect this, unless
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   280
			# explicitly overridden on the command line
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   281
			if os.environ.has_key('SRCROOT'):
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   282
				self.__ComponentRoot = generic_path.Path(os.environ['SRCROOT'])
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   283
			elif os.environ.has_key('SOURCEROOT'):
13
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   284
				self.__ComponentRoot = generic_path.Path(os.environ['SOURCEROOT'])
18
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   285
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   286
			if self.__SystemDefinitionBase and self.__SystemDefinitionBase != ".":
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   287
				self.__ComponentRoot = self.__SystemDefinitionBase
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   288
				if os.environ.has_key('SRCROOT'):
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   289
					self.__Logger.Info("Command line specified System Definition file base \'%s\' overriding environment SRCROOT \'%s\'", self.__SystemDefinitionBase, os.environ['SRCROOT'])
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   290
				elif os.environ.has_key('SOURCEROOT'):
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   291
					self.__Logger.Info("Command line specified System Definition file base \'%s\' overriding environment SOURCEROOT \'%s\'", self.__SystemDefinitionBase, os.environ['SOURCEROOT'])
13
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   292
		else:
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   293
			self.__Logger.Error("Cannot process schema version %s of file %s", version.string, self.__SystemDefinitionFile)
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   294
			return False
18
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   295
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   296
		if self.__Version['MAJOR'] >= 3:
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   297
			# id is the unique identifier for 3.0 and later schema
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   298
			self.__IdAttribute = "id"
13
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   299
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   300
		return True
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   301
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   302
	def __Parse(self):
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   303
		# For 2.0 and earlier: find the <systemModel> element (there can be 0 or 1) and search any <layer> elements for <unit> elements with "bldFile" attributes
18
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   304
		# the <layer> context of captured "bldFile" attributes is recorded as we go
13
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   305
		# For 3.0 and later, process any architectural topmost element, use the topmost element with an id as the "layer"
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   306
		for child in self.__SystemDefinitionElement.childNodes:
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   307
			if child.localName in ["systemModel", "layer", "package", "collection", "component"]:
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   308
				self.__ProcessSystemModelElement(child)
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   309
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   310
	def __CreateComponent(self, aBldInfFile, aUnitElement):
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   311
		# take a resolved bld.inf file and associated <unit/> element and returns a populated Component object
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   312
		containers = {}
18
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   313
		self.__GetElementContainers(aUnitElement, containers)
13
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   314
		layer = self.__GetEffectiveLayer(aUnitElement)
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   315
		component = SystemModelComponent(aBldInfFile, layer, containers, self.__SystemDefinitionFile, self.__SystemDefinitionBase, self.__Version)
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   316
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   317
		return component
18
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   318
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   319
	def __GetEffectiveLayer(self, aElement):
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   320
		#' return the ID of the topmost item which has an ID. For 1.x and 2.x, this will always be layer, for 3.x, it will be the topmost ID'd element in the file
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   321
		# never call this on the root element
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   322
		if aElement.parentNode.hasAttribute(self.__IdAttribute):
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   323
			return self.__GetEffectiveLayer(aElement.parentNode)
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   324
		elif aElement.hasAttribute(self.__IdAttribute):
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   325
			return aElement.getAttribute(self.__IdAttribute)
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   326
		return ""
13
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   327
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   328
	def __GetElementContainers(self, aElement, aContainers):
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   329
		# take a <unit/> element and creates a type->name dictionary of all of its parent containers
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   330
		# We're only interested in parent nodes if they're not the top-most node
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   331
		if aElement.parentNode.parentNode:
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   332
			parent = aElement.parentNode
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   333
			name = parent.getAttribute(self.__IdAttribute)
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   334
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   335
			if name:
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   336
				aContainers[parent.tagName] = name
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   337
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   338
			self.__GetElementContainers(parent, aContainers)
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   339
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   340
	def __ProcessSystemModelElement(self, aElement):
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   341
		"""Search for XML <unit/> elements with 'bldFile' attributes and resolve concrete bld.inf locations
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   342
		with an appreciation of different schema versions."""
18
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   343
13
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   344
		# The effective "layer" is the item whose parent does not have an id (or name in 2.x and earlier)
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   345
		if not aElement.parentNode.hasAttribute(self.__IdAttribute) :
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   346
			currentLayer = aElement.getAttribute(self.__IdAttribute)
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   347
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   348
			if not self.__LayerDetails.has_key(currentLayer):
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   349
				self.__LayerDetails[currentLayer] = []
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   350
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   351
			if not currentLayer in self.__LayerList:
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   352
				self.__LayerList.append(currentLayer)
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   353
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   354
		elif aElement.tagName == "unit" and aElement.hasAttributes():
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   355
			bldFileValue = aElement.getAttribute("bldFile")
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   356
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   357
			if bldFileValue:
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   358
				bldInfRoot = self.__ComponentRoot
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   359
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   360
				if self.__Version['MAJOR'] == 1:
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   361
					# version 1.x schema paths can use DOS slashes
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   362
					bldFileValue = raptor_utilities.convertToUnixSlash(bldFileValue)
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   363
				elif self.__Version['MAJOR'] >= 2:
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   364
					# version 2.x.x schema paths are subject to a "root" attribute off-set, if it exists
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   365
					rootValue = aElement.getAttribute("root")
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   366
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   367
					if rootValue:
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   368
						if os.environ.has_key(rootValue):
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   369
							bldInfRoot = generic_path.Path(os.environ[rootValue])
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   370
						else:
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   371
							# Assume that this is an error i.e. don't attempt to resolve in relation to SOURCEROOT
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   372
							bldInfRoot = None
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   373
							self.__Logger.Error("Cannot resolve \'root\' attribute value \"%s\" in %s", rootValue, self.__SystemDefinitionFile)
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   374
							return
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   375
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   376
				group = generic_path.Path(bldFileValue)
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   377
18
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   378
				if self.__Version['MAJOR'] < 3:
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   379
					# absolute paths are not changed by root var in 1.x and 2.x
13
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   380
					if not group.isAbsolute() and bldInfRoot:
18
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   381
						group = generic_path.Join(bldInfRoot, group)
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   382
				else:
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   383
					# only absolute paths are changed by root var in 3.x
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   384
					if group.isAbsolute() and bldInfRoot:
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   385
						group = generic_path.Join(bldInfRoot, group)
13
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   386
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   387
				bldinf = generic_path.Join(group, "bld.inf").FindCaseless()
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   388
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   389
				if bldinf == None:
18
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   390
					# recording layers containing non existent bld.infs
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   391
					bldinfname = group.GetLocalString()
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   392
					bldinfname = bldinfname + 'bld.inf'
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   393
					layer = self.__GetEffectiveLayer(aElement)
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   394
					if not layer in self.__MissingBldInfs:
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   395
						self.__MissingBldInfs[layer]=[]
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   396
					self.__MissingBldInfs[layer].append(bldinfname)
de5b887c98f7 Upgrading to Raptor 2.14
mikek
parents: 13
diff changeset
   397
13
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   398
				else:
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   399
					component = self.__CreateComponent(bldinf, aElement)
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   400
					layer = component.GetLayerName()
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   401
					if layer:
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   402
						self.__LayerDetails[layer].append(component)
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   403
						self.__TotalComponents += 1
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   404
					else:
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   405
						self.__Logger.Error("No containing layer found for %s in %s", str(bldinf), self.__SystemDefinitionFile)
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   406
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   407
		# search the sub-elements
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   408
		for child in aElement.childNodes:
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   409
			if child.nodeType == child.ELEMENT_NODE:
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   410
				self.__ProcessSystemModelElement(child)
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   411
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   412
c327db0664bb Upgrading Raptor from 2.10 to 2.13
mikek
parents: 2
diff changeset
   413
# end of the raptor_xml module