16718ffe225cdba1bee76203e64786fa0175f4e87Kevin Rocard#!/usr/bin/python2
285d6dd65ad91d04eb847dfbc50b914f3739511e7Kevin Rocard
37d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagner# Copyright (c) 2015, Intel Corporation
4b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner# All rights reserved.
585d6dd65ad91d04eb847dfbc50b914f3739511e7Kevin Rocard#
6b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner# Redistribution and use in source and binary forms, with or without modification,
7b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner# are permitted provided that the following conditions are met:
885d6dd65ad91d04eb847dfbc50b914f3739511e7Kevin Rocard#
9b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner# 1. Redistributions of source code must retain the above copyright notice, this
10b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner# list of conditions and the following disclaimer.
11b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner#
12b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner# 2. Redistributions in binary form must reproduce the above copyright notice,
13b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner# this list of conditions and the following disclaimer in the documentation and/or
14b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner# other materials provided with the distribution.
15b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner#
16b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner# 3. Neither the name of the copyright holder nor the names of its contributors
17b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner# may be used to endorse or promote products derived from this software without
18b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner# specific prior written permission.
19b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner#
20b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
21b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
22b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
24b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
25b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
26b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
27b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner
317d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagnerimport EddParser
327d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagnerfrom PfwBaseTranslator import PfwBaseTranslator
3385d6dd65ad91d04eb847dfbc50b914f3739511e7Kevin Rocard
347d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagnerimport argparse
3585d6dd65ad91d04eb847dfbc50b914f3739511e7Kevin Rocardimport sys
3685d6dd65ad91d04eb847dfbc50b914f3739511e7Kevin Rocard
377d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagnerclass PfwScriptTranslator(PfwBaseTranslator):
3885d6dd65ad91d04eb847dfbc50b914f3739511e7Kevin Rocard
3985d6dd65ad91d04eb847dfbc50b914f3739511e7Kevin Rocard    def __init__(self):
407d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagner        super(PfwScriptTranslator, self).__init__()
417d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagner
427d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagner        self._script = []
437d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagner
447d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagner    def getScript(self):
457d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagner        return self._script
467d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagner
479368eea42a1afb01dd44110582f997115b50e742François Gaffie    def _appendCommand(self, *args):
489368eea42a1afb01dd44110582f997115b50e742François Gaffie        self._script.append(list(args))
499368eea42a1afb01dd44110582f997115b50e742François Gaffie
507d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagner    def _doCreateDomain(self, name):
519368eea42a1afb01dd44110582f997115b50e742François Gaffie        self._appendCommand("createDomain", name)
527d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagner
537d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagner    def _doSetSequenceAware(self):
549368eea42a1afb01dd44110582f997115b50e742François Gaffie        self._appendCommand("setSequenceAwareness", self._ctx_domain, "true")
557d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagner
567d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagner    def _doAddElement(self, path):
579368eea42a1afb01dd44110582f997115b50e742François Gaffie        self._appendCommand("addElement", self._ctx_domain, path)
587d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagner
597d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagner    def _doCreateConfiguration(self, name):
609368eea42a1afb01dd44110582f997115b50e742François Gaffie        self._appendCommand("createConfiguration", self._ctx_domain, name)
617d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagner
627d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagner    def _doSetElementSequence(self, paths):
639368eea42a1afb01dd44110582f997115b50e742François Gaffie        self._appendCommand("setElementSequence", self._ctx_domain, self._ctx_configuration, *paths)
647d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagner
657d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagner    def _doSetRule(self, rule):
669368eea42a1afb01dd44110582f997115b50e742François Gaffie        self._appendCommand("setRule", self._ctx_domain, self._ctx_configuration, rule)
677d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagner
687d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagner    def _doSetParameter(self, path, value):
699368eea42a1afb01dd44110582f997115b50e742François Gaffie        self._appendCommand("setConfigurationParameter", self._ctx_domain, self._ctx_configuration, path, value)
7085d6dd65ad91d04eb847dfbc50b914f3739511e7Kevin Rocard
716718ffe225cdba1bee76203e64786fa0175f4e87Kevin Rocardclass ArgparseArgumentParser(object) :
7285d6dd65ad91d04eb847dfbc50b914f3739511e7Kevin Rocard    """class that parse command line arguments with argparse library
7385d6dd65ad91d04eb847dfbc50b914f3739511e7Kevin Rocard
7485d6dd65ad91d04eb847dfbc50b914f3739511e7Kevin Rocard    result of parsing are the class atributs"""
759368eea42a1afb01dd44110582f997115b50e742François Gaffie    def __init__(self):
7685d6dd65ad91d04eb847dfbc50b914f3739511e7Kevin Rocard
7785d6dd65ad91d04eb847dfbc50b914f3739511e7Kevin Rocard        myArgParser = argparse.ArgumentParser(description='Process domain scripts.')
7885d6dd65ad91d04eb847dfbc50b914f3739511e7Kevin Rocard
797d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagner        myArgParser.add_argument('input', nargs='?',
807d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagner                type=argparse.FileType('r'), default=sys.stdin,
817d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagner                help="the domain script file, default stdin")
8285d6dd65ad91d04eb847dfbc50b914f3739511e7Kevin Rocard
8385d6dd65ad91d04eb847dfbc50b914f3739511e7Kevin Rocard        myArgParser.add_argument('-o', '--output',
847d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagner                type=argparse.FileType('w'), default=sys.stdout,
857d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagner                help="the output file, default stdout")
8685d6dd65ad91d04eb847dfbc50b914f3739511e7Kevin Rocard
8785d6dd65ad91d04eb847dfbc50b914f3739511e7Kevin Rocard        myArgParser.add_argument('-d', '--debug',
887d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagner                action='store_true',
897d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagner                help="print debug warnings")
9085d6dd65ad91d04eb847dfbc50b914f3739511e7Kevin Rocard
917d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagner        myArgParser.add_argument('--output-kind',
927d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagner                choices=['pfw', 'raw'],
937d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagner                default='pfw',
947d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagner                help="output kind; can be either 'raw' (debug only) or 'pfw' (pfw commands; default choice)")
9585d6dd65ad91d04eb847dfbc50b914f3739511e7Kevin Rocard
9685d6dd65ad91d04eb847dfbc50b914f3739511e7Kevin Rocard
9785d6dd65ad91d04eb847dfbc50b914f3739511e7Kevin Rocard        # process command line arguments
9885d6dd65ad91d04eb847dfbc50b914f3739511e7Kevin Rocard        options = myArgParser.parse_args()
9985d6dd65ad91d04eb847dfbc50b914f3739511e7Kevin Rocard
10085d6dd65ad91d04eb847dfbc50b914f3739511e7Kevin Rocard        # maping to atributs
1017d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagner        self.input = options.input
1027d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagner        self.output = options.output
10385d6dd65ad91d04eb847dfbc50b914f3739511e7Kevin Rocard
1047d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagner        self.debug = options.debug
10585d6dd65ad91d04eb847dfbc50b914f3739511e7Kevin Rocard
1067d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagner        self.output_kind = options.output_kind
10785d6dd65ad91d04eb847dfbc50b914f3739511e7Kevin Rocard
10885d6dd65ad91d04eb847dfbc50b914f3739511e7Kevin Rocard
10985d6dd65ad91d04eb847dfbc50b914f3739511e7Kevin Rocard# ==============
11085d6dd65ad91d04eb847dfbc50b914f3739511e7Kevin Rocard# main function
11185d6dd65ad91d04eb847dfbc50b914f3739511e7Kevin Rocard# ==============
11285d6dd65ad91d04eb847dfbc50b914f3739511e7Kevin Rocard
11385d6dd65ad91d04eb847dfbc50b914f3739511e7Kevin Rocarddef printE(s):
11485d6dd65ad91d04eb847dfbc50b914f3739511e7Kevin Rocard    """print in stderr"""
1157d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagner    sys.stderr.write(str(s))
11685d6dd65ad91d04eb847dfbc50b914f3739511e7Kevin Rocard
11785d6dd65ad91d04eb847dfbc50b914f3739511e7Kevin Rocarddef main ():
11885d6dd65ad91d04eb847dfbc50b914f3739511e7Kevin Rocard
1197d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagner    options = ArgparseArgumentParser()
12085d6dd65ad91d04eb847dfbc50b914f3739511e7Kevin Rocard
1217d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagner    myparser = EddParser.Parser()
12285d6dd65ad91d04eb847dfbc50b914f3739511e7Kevin Rocard    try:
1237d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagner        myroot = myparser.parse(options.input, options.debug)
12485d6dd65ad91d04eb847dfbc50b914f3739511e7Kevin Rocard
1257d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagner    except EddParser.MySyntaxError as ex:
12685d6dd65ad91d04eb847dfbc50b914f3739511e7Kevin Rocard        printE(ex)
12785d6dd65ad91d04eb847dfbc50b914f3739511e7Kevin Rocard        printE("EXIT ON FAILURE")
1287d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagner        exit(2)
1297d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagner
1307d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagner    if options.output_kind == 'raw':
1317d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagner        options.output.write(str(myroot))
1327d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagner    else:
1337d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagner        try:
1347d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagner            myroot.propagate()
13585d6dd65ad91d04eb847dfbc50b914f3739511e7Kevin Rocard
1367d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagner        except EddParser.MyPropagationError, ex :
1377d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagner            printE(ex)
1387d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagner            printE("EXIT ON FAILURE")
1397d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagner            exit(1)
14085d6dd65ad91d04eb847dfbc50b914f3739511e7Kevin Rocard
1417d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagner        if options.output_kind == 'pfw':
1427d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagner            translator = PfwScriptTranslator()
1437d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagner            myroot.translate(translator)
1447d996811c0e80b30a40a5add1f01f0314f2ebef4David Wagner            options.output.write("\n".join(translator.getScript()))
14585d6dd65ad91d04eb847dfbc50b914f3739511e7Kevin Rocard
14685d6dd65ad91d04eb847dfbc50b914f3739511e7Kevin Rocard# execute main function if the python interpreter is running this module as the main program
14785d6dd65ad91d04eb847dfbc50b914f3739511e7Kevin Rocardif __name__ == "__main__" :
14885d6dd65ad91d04eb847dfbc50b914f3739511e7Kevin Rocard    main()
14985d6dd65ad91d04eb847dfbc50b914f3739511e7Kevin Rocard
150