Source code for core.backend.config_interpreter

"""
VIKI: more than a GUI for ROS, https://github.com/UT-RAM/viki 
version: 0.2 - Alice
copyright: Robin Hoogervorst, Alex Kamphuis, Cees Trouwborst, 2016 
licensed under the MIT License
"""

"""Provide tools to interpret configuration files and return abstractions of it."""

import xml.dom.minidom
from objects import *
from helpers import *


[docs]def getConfig(configfilename='configuration.xml', config_id_to_use=None): """Read in the configuration file with path *configfilename*. If *config_id_to_use* is set, use a configuration with this specific id. :param configfilename: the xml-file containing configuration(s) (default configuration.xml) :param config_id_to_use: use this specific configuration from within the configuration file (default None) """ if not configfilename: configfilename = 'configuration.xml' print 'Parsing ' + configfilename + ', looking for configurations...' dom = xml.dom.minidom.parse(configfilename) configurations = dom.getElementsByTagName('configurations')[0] domconfig = None if not configurations: print "No configurations found" else: configelements = configurations.getElementsByTagName('configuration') for configuration in configelements: this_id = getOptionalAttribute(configuration, 'id') if this_id == config_id_to_use: domconfig = configuration print 'Found the desired configuration in "' + configfilename +'"' print 'Now interpreting configuration...' break else: pass if not domconfig: raise Exception("Could not found the desired configuration") config = Configuration(config_id_to_use) recursiveGet(domconfig, config) print 'Configuration interpreted succesfully.' return config
[docs]def recursiveGet(domparent, parent): """Get information from dom element *domparent* and place in an abstraction called *parent*. Recursively increase depth, stepping untill the deepest level of *domparent*. use objects from :mod:`core.aero.objects` to create an abstraction. :param domparent: the (current) dom parent :param parent: the parent to which abstractions of the domparent are to be added """ elementsInParent = getElementsOnFirstLevelExceptTag(domparent, 'namespace') if elementsInParent: for dommod in elementsInParent: tagtype = dommod.tagName.lower() if tagtype == 'connect': connection = Connection_to_add( dommod.attributes['publisher'].value, dommod.attributes['listener'].value ) parent.connections_to_add.append(connection) elif tagtype == 'machine': machine = Machine( dommod.attributes['name'].value, dommod.attributes['hostname'].value, dommod.attributes['username'].value, dommod.attributes['password'].value ) parent.machines_to_add.append(machine) else: mod = Module_to_add( dommod.tagName.lower(), dommod.attributes['type'].value, dommod.attributes['id'].value, getOptionalAttribute(dommod, 'supress_warning') ) params = getElementsOnFirstLevel(dommod, 'param') if params: for domparam in params: param = Parameter_to_add( domparam.attributes['name'].value, domparam.attributes['value'].value ) mod.parameters_to_add.append(param) args = getElementsOnFirstLevel(dommod, 'arg') if args: for domarg in args: arg = Cmdline_argument( domarg.attributes['exec_id'].value, domarg.attributes['argument'].value ) print("found a cmd line argument and added it to module to add") mod.add_cmdline_arg(arg) pfs = getElementsOnFirstLevel(dommod, 'launch-prefix') if pfs: for dompf in pfs: pf = Launch_prefix( dompf.attributes['exec_id'].value, dompf.attributes['prefix'].value ) print("Adding prefix") mod.add_prefix(pf) selections = getElementsOnFirstLevel(dommod, 'selected-machine') if selections: for domselection in selections: selection = Selected_machine( domselection.attributes['exec_id'].value, domselection.attributes['machine_name'].value ) print("Adding machine selection") mod.add_machine_selection(selection) parent.modules_to_add.append(mod) namespacesInParent = getElementsOnFirstLevel(domparent, 'namespace') if namespacesInParent: for domNamespace in namespacesInParent: ns = Namespace(domNamespace.attributes['id'].value) recursiveGet(domNamespace, ns) parent.namespaces.append(ns)