configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/relations.py
author m2lahtel
Tue, 10 Aug 2010 14:29:28 +0300
changeset 3 e7e0ae78773e
parent 0 2e8eeb919028
permissions -rw-r--r--
ConE 1.2.11 release
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     1
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     2
# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     3
# All rights reserved.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     4
# This component and the accompanying materials are made available
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     5
# under the terms of "Eclipse Public License v1.0"
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     6
# which accompanies this distribution, and is available
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     7
# at the URL "http://www.eclipse.org/legal/epl-v10.html".
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     8
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     9
# Initial Contributors:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    10
# Nokia Corporation - initial contribution.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    11
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    12
# Contributors:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    13
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    14
# Description: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    15
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    16
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    17
'''
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    18
implementation for ruleml relations.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    19
'''
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    20
import os
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    21
import StringIO
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    22
import logging
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    23
import operator as ops
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    24
import re
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    25
import sys, traceback
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    26
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    27
log = logging.getLogger('cone.ruleplugin.relations')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    28
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    29
from cone.public import api, rules, utils, exceptions, plugin
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    30
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    31
class RelationFactory(api.FactoryBase):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    32
    @ classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    33
    def get_relation_by_name(cls, relation_name):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    34
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    35
        Get the class name by file extension.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    36
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    37
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    38
            return rules.RELATIONS.get(relation_name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    39
        except KeyError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    40
            raise exceptions.NotSupportedException("No Relation class found for name %s" % relation_name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    41
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    42
    @ classmethod
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    43
    def get_relations(cls, relation):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    44
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    45
            relations = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    46
            (left_expression,relation_name,right_expression) = parse_rule(relation)
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    47
            relation = cls.get_relation_by_name(relation_name)(left_expression, right_expression)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    48
            relations.append(relation)
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    49
            propagated_relations = cls.get_relations(right_expression)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    50
            if propagated_relations:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    51
                for relation in propagated_relations:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    52
                    relations.append(relation)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    53
            return relations
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    54
        except exceptions.ParseError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    55
            return None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    56
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    57
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    58
class ConfigurationBaseRelation(rules.BaseRelation):
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    59
    def __init__(self, left, right):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    60
        super(ConfigurationBaseRelation, self).__init__(None, left, right)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    61
        self.context = None
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    62
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    63
class RequireRelation(ConfigurationBaseRelation):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    64
    KEY = 'requires'
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    65
    relation_name = 'requires'
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    66
    def __init__(self, left, right):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    67
        super(RequireRelation, self).__init__(left, right)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    68
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    69
class ConfigureRelation(ConfigurationBaseRelation):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    70
    KEY = 'configures'
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    71
    relation_name = 'configures'
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    72
    def __init__(self, left, right):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    73
        super(ConfigureRelation, self).__init__(left, right)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    74
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    75
        # A plugin.RelationExecutionResult object is stored here
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    76
        self._execution_result = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    77
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    78
    
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    79
    def execute(self, context):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    80
        self._execution_result = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    81
        exec_results = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    82
        
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    83
        result = rules.BaseRelation.execute(self, context)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    84
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    85
        if len(exec_results) > 0:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    86
            # There should be only one ConfigureExpression inside a ConfigureRelation
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    87
            if len(exec_results) > 1:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    88
                log.warning("Execution of ConfigureRelation returned more than one result, ignoring all except the first")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    89
            self._execution_result = exec_results[0]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    90
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    91
        return result
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    92
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    93
    def get_execution_result(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    94
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    95
        Return the execution result from the most recent call to execute().
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    96
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    97
        return self._execution_result
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    98
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    99
def handle_configure(self, left, right):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   100
    if left and right:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   101
        return True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   102
    elif not left:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   103
        return True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   104
    return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   105
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   106
def handle_filenamejoin(self, left, right):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   107
    def extract_dirname(path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   108
        """Extract directory name (will always contain a trailing slash or backslash)"""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   109
        pos = max(path.rfind('/'), path.rfind('\\'))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   110
        if pos == -1:   return path + '/'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   111
        else:           return path[:pos + 1]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   112
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   113
    def extract_filename(path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   114
        pos = max(path.rfind('/'), path.rfind('\\'))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   115
        if pos == -1:   return path
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   116
        else:           return path[pos + 1:]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   117
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   118
    return extract_dirname(left) + extract_filename(right)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   119
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   120
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   121
class ConfigureExpression(rules.TwoOperatorExpression):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   122
    PRECEDENCE = rules.PRECEDENCES['RELATION_OPERATORS']
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   123
    KEY = 'configures'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   124
    OP = handle_configure
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   125
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   126
    def eval(self, context, **kwargs):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   127
        input_refs = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   128
        affected_refs = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   129
        
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   130
        # Evaluate the left-hand side expression
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   131
        evaluated_left = self.left.eval(context, **kwargs)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   132
        if evaluated_left:
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   133
            # If left evaluated to True, evaluate the right-hand side
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   134
            self.value = self.right.eval(context, **kwargs)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   135
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   136
            self.value = True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   137
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   138
        if not self.value:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   139
            left_keys = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   140
            for ref in self.ast.extract_refs(str(self.left)):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   141
                for key in context.get_keys(ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   142
                    left_keys.append(key)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   143
            for key in left_keys:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   144
                self.ast.add_error(key, { 'error_string' : 'CONFIGURES right side value is "False"',
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   145
                                          'left_key' : key,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   146
                                          'rule' : self.ast.expression
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   147
                                          })
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   148
        return self.value
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   149
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   150
class EvalExpression(rules.OneParamExpression):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   151
    expression = "__eval__"
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   152
    PRECEDENCE = rules.PRECEDENCES['PREFIX_OPERATORS']
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   153
    KEY = '__eval__'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   154
    
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   155
    def __init__(self, ast, expression): 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   156
        super(EvalExpression, self).__init__(ast, expression)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   157
        self.expression = expression
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   158
        self._str_to_eval = eval(expression.expression)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   159
        #self.default_view = default_view
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   160
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   161
    def extract_refs(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   162
        result = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   163
        result.extend(utils.extract_delimited_tokens(self._str_to_eval, delimiters=('${', '}')))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   164
        result.extend(utils.extract_delimited_tokens(self._str_to_eval, delimiters=('@{', '}')))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   165
        return result
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   166
    
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   167
    def get_refs(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   168
        return self.extract_refs()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   169
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   170
    def eval(self, context, **kwargs):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   171
        # Using the configuration to pass the eval globals dictionary to here,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   172
        # since there isn't any easy way to do this more elegantly
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   173
        globals_and_locals = {}
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   174
        if hasattr(context, '_eval_expression_globals_dict'):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   175
            globals_and_locals = context._eval_expression_globals_dict
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   176
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   177
        str_to_eval = self._str_to_eval
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   178
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   179
        def expand_feature_ref(ref, index):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   180
            var_name = "__fea_%05d" % index
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   181
            globals_and_locals[var_name] = context.configuration.get_default_view().get_feature(ref)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   182
            return var_name
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   183
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   184
        def expand_value_ref(ref, index):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   185
            var_name = "__feaval_%05d" % index
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   186
            globals_and_locals[var_name] = context.configuration.get_default_view().get_feature(ref).get_value()
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   187
            return var_name
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   188
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   189
        str_to_eval = utils.expand_delimited_tokens(str_to_eval, expand_feature_ref, delimiters=('@{', '}'))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   190
        str_to_eval = utils.expand_delimited_tokens(str_to_eval, expand_value_ref, delimiters=('${', '}'))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   191
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   192
        # Strip leading and trailing whitespace to avoid indentation problems
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   193
        str_to_eval = str_to_eval.strip()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   194
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   195
        ret = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   196
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   197
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   198
            ret = eval(str_to_eval, globals_and_locals)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   199
            return ret
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   200
        except SyntaxError, e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   201
            logging.getLogger('cone.ruleml').warning("Invalid syntax in eval: %s" % (str_to_eval) )
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   202
            self.ast.add_error(self.expression, { 'error_string' : 'Invalid syntax in eval', 'str_to_eval' : str_to_eval, 'rule' : self.ast.expression })
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   203
        except Exception, e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   204
            logging.getLogger('cone.ruleml').warning("Execution failed for eval: %s %s: %s" % (str_to_eval, type(e), e) )
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   205
            self.ast.add_error(self.expression, { 'error_string' : 'Execution failed for eval', 'str_to_eval' : str_to_eval, 'rule' : self.ast.expression })
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   206
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   207
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   208
class FilenamejoinExpression(rules.TwoOperatorExpression):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   209
    expression = "filenamejoin"
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   210
    PRECEDENCE = rules.PRECEDENCES['ADDSUB_OPERATORS']
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   211
    KEY = 'filenamejoin'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   212
    OP = handle_filenamejoin
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   213
    
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   214
# Register relations and operators to rules
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   215
rules.RELATIONS[RequireRelation.KEY] = RequireRelation
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   216
rules.RELATIONS[ConfigureRelation.KEY] = ConfigureRelation
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   217
rules.OPERATORS[FilenamejoinExpression.KEY] = FilenamejoinExpression
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   218
rules.OPERATORS[EvalExpression.KEY] = EvalExpression
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   219
rules.OPERATORS[ConfigureExpression.KEY] = ConfigureExpression
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   220
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   221
def parse_rule(rulestring):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   222
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   223
    Divide the given rule string into (left side, relation, right side) components. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   224
    @return: Triple (left side, relation, right side)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   225
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   226
    left_expression = ''
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   227
    relation_name = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   228
    right_expression = ''
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   229
    for token in rules.get_tokens(rulestring):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   230
        if relation_name == None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   231
            if token in rules.RELATIONS.keys():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   232
                relation_name = token
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   233
            else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   234
                left_expression += ' ' + token
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   235
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   236
            right_expression += ' ' + token
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   237
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   238
    if relation_name == None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   239
        raise exceptions.ParseError('invalid rule definition %s' % rulestring)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   240
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   241
    return (left_expression,relation_name,right_expression)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   242