configurationengine/source/cone/public/plugin.py
author terytkon
Sat, 06 Nov 2010 16:59:14 +0200
changeset 9 63964d875993
parent 4 0951727b8815
permissions -rw-r--r--
Merge changes to system model generator to SF tip.
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
# @author Teemu Rytkonen
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    18
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    19
import sys
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 logging
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    22
import inspect
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    23
import re
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    24
import codecs
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    25
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    26
from cone.public import exceptions, utils, api, settings, rules, parsecontext
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    27
import _plugin_reader
4
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    28
from cone.public.exceptions import NotFound
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
    29
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    30
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    31
debug = 0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    32
"""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    33
Implementation specific settings can be overriden in the global impl_settings variable
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    34
"""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    35
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    36
AUTOCONFIG_CONFML = "autodata.confml"
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    37
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    38
def get_autoconfig(configuration):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    39
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    40
    Return the "automatic" configuration for storing temporary run-time ConfML
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    41
    features and values.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    42
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    43
    lastconfig = configuration.get_last_configuration()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    44
    if lastconfig.get_path() != AUTOCONFIG_CONFML:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    45
        logging.getLogger('cone').debug('Adding autodata configuration %s' % AUTOCONFIG_CONFML)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    46
        configuration.create_configuration(AUTOCONFIG_CONFML)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    47
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    48
    lastconfig = configuration.get_last_configuration()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    49
    assert lastconfig.get_path() == AUTOCONFIG_CONFML
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    50
    return lastconfig
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    51
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    52
def get_supported_file_extensions():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    53
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    54
    Return a list of all supported ImplML file extension.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    55
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    56
    Implementations are only attempted to be read from files with these
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    57
    extensions.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    58
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    59
    return ImplFactory.get_supported_file_extensions()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    60
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    61
def get_supported_namespaces():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    62
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    63
    Returns a list of all supported ImplML namespaces.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    64
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    65
    return ImplFactory.get_reader_dict().keys()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    66
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    67
def is_temp_feature(feature):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    68
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    69
    Return whether the given feature is a temporary feature.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    70
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    71
    return hasattr(feature, _plugin_reader.TEMP_FEATURE_MARKER_VARNAME)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    72
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    73
def uses_ref(refs, impl_refs):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    74
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    75
    Compare two lists of setting references and return whether any of the
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    76
    references in ``refs`` is used in ``impl_refs``.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    77
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    78
    for ref in refs:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    79
        for impl_ref in impl_refs:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    80
            if ref.startswith(impl_ref):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    81
                if len(ref) == len(impl_ref):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    82
                    return True
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    83
                elif ref[len(impl_ref)] == '.':
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    84
                    return True
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    85
    return False
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    86
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    87
class GenerationContext(rules.DefaultContext):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    88
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    89
    Context object that can be used for passing generation-scope
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    90
    data to implementation instances.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    91
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    92
    
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    93
    def __init__(self, **kwargs):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    94
        #: The tags used in this generation context
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    95
        #: (i.e. the tags passed from command line)
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    96
        self.tags = kwargs.get('tags', {})
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    97
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    98
        #: The tags policy used in this generation context
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    99
        self.tags_policy = kwargs.get('tags_policy', "OR")
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   100
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   101
        #: A dictionary that implementation instances can use to
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   102
        #: pass any data between each other
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   103
        self.impl_data_dict = {}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   104
        
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   105
        #: A string for the phase of the generation.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   106
        #: If None, no filtering based on phase is done when
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   107
        #: running the implementations
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   108
        self.phase = kwargs.get('phase', None)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   109
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   110
        #: a list of rule results
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   111
        self.results = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   112
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   113
        #: a pointer to the configuration 
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   114
        self.configuration = kwargs.get('configuration', None)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   115
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   116
        #: If True, then all implementation filtering done by
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   117
        #: should_run() is disabled, and it always returns True.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   118
        self.filtering_disabled = False
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   119
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   120
        #: if True, then the execution flow should normal except 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   121
        #: no output files are actually generated
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   122
        self.dry_run= kwargs.get('dry_run', None)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   123
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   124
        #: the output folder for generation
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   125
        #: ensure already here that the output exists
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   126
        self.output= kwargs.get('output', 'output')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   127
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   128
        #: List of references of the settings that have been modified in 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   129
        #: listed layers and should trigger an implementation to be executed.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   130
        #: None if ref filtering is not used
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   131
        self.changed_refs = kwargs.get('changed_refs', None)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   132
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   133
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   134
        #: A boolean flag to determine whether to use ref filtering or not
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   135
        self.filter_by_refs = kwargs.get('filter_by_refs', False)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   136
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   137
        #: Temp features
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   138
        self.temp_features = kwargs.get('temp_features', [])
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   139
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   140
        #: Executed implementation objects. This is a set so that a 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   141
        #: implementation would exist only once in it. Even if it executed 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   142
        #: more than once. The generation_output will show the actual 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   143
        #: output several times if a implementation is executed several times.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   144
        self.executed = set()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   145
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   146
        #: Set of all implementation objects in the configuration context 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   147
        self.impl_set = kwargs.get('impl_set', ImplSet())
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   148
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   149
        #: Generation output elements as a list 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   150
        self.generation_output = []
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   151
4
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   152
        #: possible log element 
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   153
        self.log = []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   154
        self.log_file = ""
4
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   155
    
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   156
    def __getstate__(self):
4
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   157
        state = self.__dict__.copy()
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   158
        state['impl_data_dict'] = {}
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   159
        return state
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   160
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   161
    def eval(self, ast, expression, value, **kwargs):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   162
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   163
        eval for rule evaluation against the context
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   164
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   165
        pass
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   166
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   167
    def handle_terminal(self, expression):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   168
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   169
        Handle a terminal object 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   170
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   171
        try:
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   172
            if isinstance(expression, basestring): 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   173
                try:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   174
                    dview = self.configuration.get_default_view()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   175
                    return dview.get_feature(expression).value
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   176
                except Exception, e:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   177
                    logging.getLogger('cone').error("Could not dereference feature %s. Exception %s" % (expression, e))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   178
                    raise e
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   179
        except Exception,e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   180
            logging.getLogger('cone').error("Exception with expression %s: %s" % (expression, e))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   181
            raise e
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   182
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   183
    def convert_value(self, value):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   184
        try:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   185
            # Handle some special literals
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   186
            if value == 'true':     return True
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   187
            if value == 'false':    return False
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   188
            if value == 'none':     return None
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   189
            
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   190
            # Values can be any Python literals, so eval() the string to
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   191
            # get the value
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   192
            return eval(value)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   193
        except Exception:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   194
            ref_regex = re.compile('^[\w\.\*]*$', re.UNICODE) 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   195
            if ref_regex.match(value) is None:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   196
                raise RuntimeError("Could not evaluate '%s'" % value)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   197
            else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   198
                raise RuntimeError("Could not evaluate '%s'. Did you mean a setting reference and forgot to use ${}?" % value)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   199
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   200
    def set(self, expression, value, **kwargs):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   201
        log = logging.getLogger('cone.ruleml')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   202
        try:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   203
            feature = self.configuration.get_default_view().get_feature(expression)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   204
            feature.set_value(value)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   205
            
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   206
            relation = kwargs.get('relation')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   207
            if relation:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   208
                log.info("Set %s = %r from %r" % (expression, value, relation))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   209
            else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   210
                log.info("Set %s = %r" % (expression, value))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   211
            
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   212
            refs = [feature.fqr]
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   213
            if feature.is_sequence():
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   214
                refs = ["%s.%s" % (feature.fqr,subref) for subref in feature.list_features()]
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   215
                
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   216
            self.add_changed_refs(refs, relation)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   217
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   218
            if relation:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   219
                self.generation_output.append(GenerationOutput(expression, 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   220
                                                               relation,
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   221
                                                               type='ref'))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   222
            return True
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   223
        except exceptions.NotFound,e:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   224
            log.error('Set operation for %s failed, because feature with that reference was not found! Exception %s', expression, e) 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   225
            raise e
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   226
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   227
    def should_run(self, impl, log_debug_message=True):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   228
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   229
        Return True if the given implementation should be run (generated).
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   230
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   231
        Also optionally log a message that the implementation is
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   232
        filtered out based on phase, tags or setting references.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   233
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   234
        Calling this method also affects the output of executed_impls. Every
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   235
        implementation for which a call to this method has returned True
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   236
        will also be in that list.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   237
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   238
        @param impl: The implementation to check.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   239
        @param log_debug_message: If True, a debug message will be logged
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   240
            if the implementation is filtered out based on phase, tags
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   241
            or setting references.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   242
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   243
        if self.filtering_disabled:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   244
            return True
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   245
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   246
        if isinstance(impl, ImplContainer):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   247
            # Don't perform any filtering on containers
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   248
            return True
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   249
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   250
        impl_phases = impl.invocation_phase()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   251
        if isinstance(impl_phases, basestring):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   252
            impl_phases = [impl_phases]
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   253
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   254
        if self.phase is not None and self.phase not in impl_phases:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   255
            # Don't log a debug message for phase-based filtering to
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   256
            # avoid unnecessary spamming (uncomment if necessary
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   257
            # during development)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   258
            #logging.getLogger('cone').debug('Filtered out based on phase: %r (%r not in %r)' % (impl, self.phase, impl_phases))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   259
            return False
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   260
        if self.tags and not impl.has_tag(self.tags, self.tags_policy):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   261
            if log_debug_message:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   262
                logging.getLogger('cone').debug('Filtered out based on tags: %r' % impl)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   263
            return False
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   264
        if self.filter_by_refs and self.changed_refs and impl.has_ref(self.changed_refs) == False:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   265
            if log_debug_message:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   266
                logging.getLogger('cone').debug('Filtered out based on refs: %r' % impl)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   267
            return False
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   268
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   269
        # Assumption is that when a implementation should be run it is added to the executed pile
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   270
        self.executed.add(impl)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   271
        return True
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   272
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   273
    def have_run(self, impl):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   274
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   275
        This function will add the given implementation 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   276
        outputs to the list of generation_outputs.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   277
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   278
        # Add outputs only from actual leaf implementations
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   279
        # not from ImplContainers
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   280
        if not isinstance(impl, ImplContainer):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   281
            self.generation_output += impl.get_outputs()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   282
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   283
    def create_file(self, filename, **kwargs):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   284
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   285
        Create a file handle under the output folder. Also adds the output file to the generation outputs list.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   286
        @param filename: the filename with path, that is created under the output folder of the generation context.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   287
        @param **kwargs: the keyword arguments that can provide essential information for the GenerationOutput 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   288
        object creation. They should at least contain the implementation argument for the GenerationObject.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   289
          @param **kwargs implementation: the implementation object that created this output
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   290
          @param **kwargs mode: the mode of the output file created 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   291
          @param **kwargs encoding: the possible encoding of the output file. When this parameter is given the create_file will 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   292
          use codecs.open method to create the file. 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   293
        @return: the filehandle of the new file. 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   294
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   295
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   296
        implml   = kwargs.get('implementation', None)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   297
        mode     = kwargs.get('mode', 'wb')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   298
        encoding = kwargs.get('encoding', None)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   299
        targetfile = os.path.normpath(os.path.join(self.output, filename))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   300
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   301
        if not os.path.exists(os.path.dirname(targetfile)):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   302
            os.makedirs(os.path.dirname(targetfile))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   303
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   304
        if not encoding:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   305
            outfile = open(targetfile, mode)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   306
        else: 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   307
            outfile = codecs.open(targetfile, mode, encoding)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   308
        # Add the generation output
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   309
        self.generation_output.append(GenerationOutput(utils.resourceref.norm(targetfile), 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   310
                                                       implml, 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   311
                                                       phase=self.phase,
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   312
                                                       type='file',
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   313
                                                       output=self.output))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   314
        return outfile
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   315
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   316
    def add_file(self, filename, **kwargs):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   317
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   318
        Add a file to the generation outputs list.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   319
        @param filename: the filename with path, that is added. If the path is a relative path
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   320
        the path is added under the output folder of the generation context. Absolute path is added as such and not manipulated.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   321
        @param **kwargs: the keyword arguments that can provide essential information for the GenerationOutput 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   322
        object creation. They should at least contain the implementation argument for the GenerationObject.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   323
        @return: None 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   324
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   325
        if not os.path.isabs(filename):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   326
            targetfile = os.path.join(self.output, filename)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   327
        else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   328
            targetfile = filename
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   329
        # Add the generation output
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   330
        self.generation_output.append(GenerationOutput(utils.resourceref.norm(targetfile), 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   331
                                                       kwargs.get('implementation'), 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   332
                                                       phase=self.phase,
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   333
                                                       type='file',
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   334
                                                       output=self.output))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   335
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   336
    def get_output(self, **kwargs):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   337
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   338
        Get a output object from the generation_output list.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   339
        @param **kwargs: the keyword arguments. 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   340
            @param implml_type: a filter for generation outputs to filter generation outputs only with given implementation type. 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   341
        @return: list of generation output objects
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   342
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   343
        filters = []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   344
        if kwargs.get('implml_type'):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   345
            filters.append(lambda x: x.implementation and x.implementation.IMPL_TYPE_ID == kwargs.get('implml_type'))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   346
             
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   347
        outputs = []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   348
        # go through all the generation_output items with all provided filters
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   349
        # if the item passes all filters add it to the outputs list 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   350
        for item in self.generation_output:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   351
            passed = True
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   352
            for filter in filters:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   353
                if not filter(item):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   354
                    passed = False
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   355
                    continue
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   356
            if passed:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   357
                outputs.append(item)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   358
        return outputs
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   359
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   360
    def add_changed_refs(self, refs, implml=None):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   361
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   362
        Add changed refs to the current set of changed refs if necessary.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   363
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   364
        If there are new refs and they are added, log also a debug message.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   365
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   366
        if self.changed_refs is None:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   367
            return
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   368
        for ref in refs:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   369
            self.add_changed_ref(ref, implml)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   370
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   371
    def add_changed_ref(self, ref, implml=None):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   372
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   373
        Add changed ref to the current set of changed refs if necessary.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   374
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   375
        If there are new refs and they are added, log also a debug message.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   376
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   377
        if self.changed_refs is None:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   378
            return
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   379
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   380
        if ref not in self.changed_refs:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   381
            self.changed_refs.append(ref)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   382
            logging.getLogger('cone').debug('Added ref %s from implml %s' % (ref, implml))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   383
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   384
    def get_refs_with_no_output(self, refs=None):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   385
        if not refs:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   386
            refs = self.changed_refs
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   387
        if refs:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   388
            # create a set from the changed refs 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   389
            # then remove the refs that have a generation output
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   390
            # and return the remaining refs as a list
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   391
            refsset = set(refs)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   392
            implrefs = set()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   393
            for output in self.generation_output:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   394
                if output.implementation:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   395
                    implrefs |= set(output.implementation.get_refs() or [])
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   396
                    if output.type == 'ref':
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   397
                        implrefs.add(output.name)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   398
            # Add all sequence subfeatures to the list of implementation references
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   399
            dview = self.configuration.get_default_view()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   400
            for fea in dview.get_features(list(implrefs)):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   401
                if fea.is_sequence():
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   402
                    seqfeas = ["%s.%s" % (fea.fqr,fearef) for fearef in fea.get_sequence_parent().list_features()] 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   403
                    implrefs |= set(seqfeas)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   404
            
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   405
            refsset = refsset - implrefs
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   406
            return sorted(list(refsset))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   407
        else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   408
            return []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   409
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   410
    def get_refs_with_no_implementation(self, refs=None):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   411
        if not refs:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   412
            refs = self.changed_refs
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   413
        if refs:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   414
            # create a set from the changed refs 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   415
            # then remove the refs that have a generation output
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   416
            # and return the remaining refs as a list
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   417
            refsset = set(refs)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   418
            implrefs = set(self.impl_set.get_implemented_refs())
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   419
            logging.getLogger('cone').debug("changed_refs: %s" % refsset)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   420
            logging.getLogger('cone').debug("implrefs: %s" % implrefs)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   421
            # Add all sequence subfeatures to the list of implementation references
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   422
            dview = self.configuration.get_default_view()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   423
            for fea in dview.get_features(list(implrefs)):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   424
                if fea.is_sequence():
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   425
                    seqfeas = ["%s.%s" % (fea.fqr,fearef) for fearef in fea.get_sequence_parent().list_features()] 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   426
                    implrefs |= set(seqfeas)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   427
            
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   428
            refsset = refsset - implrefs
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   429
            return sorted(list(refsset))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   430
        else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   431
            return []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   432
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   433
    @property
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   434
    def executed_impls(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   435
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   436
        List of all executed implementations (implementations for which
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   437
        a call to should_run() has returned True).
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   438
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   439
        return list(self.executed)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   440
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   441
    @property
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   442
    def features(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   443
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   444
        return the default view of the context configuration to access all features of the configuration.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   445
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   446
        return self.configuration.get_default_view()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   447
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   448
    def grep_log(self, entry):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   449
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   450
        Grep the self.log entries for given entry and return a list of tuples with line (index, entry) 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   451
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   452
        return utils.grep_tuple(entry, self.log)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   453
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   454
class MergedContext(GenerationContext):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   455
    def __init__(self, contexts):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   456
        self.contexts = contexts
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   457
        self.configuration = None
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   458
        self.changed_refs = []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   459
        self.temp_features = []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   460
        self.executed = set()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   461
        self.impl_set = ImplSet()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   462
        self.impl_dict = {}
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   463
        self.generation_output = []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   464
        self.log = []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   465
        self.log_files = []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   466
        self.outputs = {}
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   467
        for context in contexts:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   468
            self.changed_refs += context.changed_refs
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   469
            self.temp_features += context.temp_features
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   470
            self.configuration = context.configuration
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   471
            self.executed |= context.executed
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   472
            self.generation_output += context.generation_output
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   473
            self.log += context.log
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   474
            self.log_files.append(context.log_file)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   475
            for output in context.generation_output:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   476
                self.outputs[output.name] = output
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   477
            for impl in context.impl_set:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   478
                self.impl_dict[impl.ref] = impl
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   479
        self.impl_set = ImplSet(self.impl_dict.values())
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   480
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   481
    def get_changed_refs(self, **kwargs):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   482
        changed_refs = set()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   483
        operation = kwargs.get('operation', 'union')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   484
        for context in self.contexts:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   485
            if not changed_refs:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   486
                # set the base set from the first context
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   487
                changed_refs = set(context.changed_refs)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   488
            else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   489
                if operation == 'union':
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   490
                    changed_refs |= set(context.changed_refs)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   491
                elif operation == 'intersection':
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   492
                    changed_refs &= set(context.changed_refs)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   493
                elif operation == 'difference':
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   494
                    changed_refs -= set(context.changed_refs)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   495
                elif operation == 'symmetric_difference':
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   496
                    changed_refs ^= set(context.changed_refs)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   497
                else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   498
                    raise exceptions.NotSupportedException('Illegal opration %s for get_changed_refs!' % operation)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   499
        #remove temp features
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   500
        if kwargs.get('ignore_temps'):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   501
            changed_refs = changed_refs - set(self.temp_features)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   502
        return list(changed_refs)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   503
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   504
class GenerationOutput(object):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   505
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   506
    A GenerationOutput object that is intended to be part of GenerationContext.generation_outputs.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   507
    The data should hold information about
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   508
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   509
    TYPES = ['file', 'ref']
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   510
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   511
    def __init__(self, name, implementation, **kwargs):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   512
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   513
        @param name: the name of the output as string
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   514
        @param implementation: the implementation object that generated this output
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   515
        @param type: the type of the output that could be file|ref
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   516
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   517
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   518
        """ The name of the output """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   519
        self.name = name
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   520
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   521
        """ The implementation object that generated the output """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   522
        self.implementation = implementation
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   523
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   524
        """ The type of the output """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   525
        self.type = kwargs.get('type', None)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   526
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   527
        """ phase of the generation """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   528
        self.phase = kwargs.get('phase', None)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   529
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   530
        """ the context output path of the generation """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   531
        self.output = kwargs.get('output', None)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   532
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   533
        """ the possible exception """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   534
        self.exception = kwargs.get('exception', None)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   535
         
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   536
    def __str__(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   537
        return "%s(%s, %s)" % (self.__class__.__name__, self.name, self.implementation)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   538
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   539
    @property
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   540
    def filename(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   541
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   542
        return the filename part of the the output name. Valid only if the output name is a path.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   543
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   544
        return os.path.basename(self.name)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   545
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   546
    @property
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   547
    def relpath(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   548
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   549
        return the relative name part of the the output name, with relation to the context output path. 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   550
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   551
        return utils.relpath(self.name, self.output)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   552
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   553
    @property
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   554
    def abspath(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   555
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   556
        return the relative name part of the the output name, with relation to the context output path. 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   557
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   558
        if os.path.isabs(self.name):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   559
            return os.path.normpath(self.name)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   560
        else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   561
            return os.path.abspath(os.path.normpath(self.name))
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   562
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   563
class FlatComparisonResultEntry(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   564
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   565
    Class representing a result entry for a flat implementation
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   566
    comparison.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   567
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   568
    Contains the following members:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   569
    Member        Description
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   570
    file          Implementation file
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   571
    impl_type     Implementation type (e.g. 'crml', 'gcfml')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   572
    id            Entry ID (e.g. CRML repository UID)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   573
    sub_id        Entry sub-ID if applicable (e.g. CRML key UID)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   574
    value_id      Implementation-specific value identifier
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   575
    source_value  Value in the source implementation
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   576
    target_value  Value in the target implementation
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   577
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   578
    data          Any extra data (implementation-specific)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   579
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   580
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   581
    VARNAMES = ['file', 'impl_type', 'id', 'sub_id', 'value_id', 'source_value', 'target_value']
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   582
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   583
    def __init__(self, **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   584
        for varname in self.VARNAMES:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   585
            setattr(self, varname, kwargs.get(varname))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   586
        self.data = kwargs.get('data')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   587
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   588
    def __repr__(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   589
        var_entries = [] 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   590
        for varname in self.VARNAMES:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   591
            var_entries.append('%s=%r' % (varname, getattr(self, varname)))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   592
        return "FlatComparisonResultEntry(%s)" % ', '.join(var_entries)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   593
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   594
    def __eq__(self, other):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   595
        if type(self) is not type(other):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   596
            return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   597
        for varname in self.VARNAMES:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   598
            if getattr(self, varname) != getattr(other, varname):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   599
                return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   600
        return True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   601
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   602
    def __ne__(self, other):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   603
        return not (self == other)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   604
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   605
    def __lt__(self, other):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   606
        for varname in self.VARNAMES:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   607
            self_val = getattr(self, varname)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   608
            other_val = getattr(other, varname)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   609
            if self_val < other_val:    return True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   610
            elif self_val == other_val: pass
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   611
            else:                       return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   612
        return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   613
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   614
class DuplicateImplementationEntry(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   615
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   616
    Class representing an entry of duplicate implementation instances
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   617
    found in a comparison.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   618
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   619
    VARNAMES = ['impl_type', 'id', 'files_in_source', 'files_in_target']
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   620
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   621
    def __init__(self, **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   622
        self.impl_type       = kwargs.get('impl_type')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   623
        self.id              = kwargs.get('id')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   624
        self.files_in_source = kwargs.get('files_in_source', [])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   625
        self.files_in_target = kwargs.get('files_in_target', [])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   626
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   627
    def __repr__(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   628
        var_entries = [] 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   629
        for varname in self.VARNAMES:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   630
            val = getattr(self, varname)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   631
            if isinstance(val, list): val = sorted(val)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   632
            var_entries.append('%s=%r' % (varname, val))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   633
        return "DuplicateImplementationEntry(%s)" % ', '.join(var_entries)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   634
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   635
    def __eq__(self, other):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   636
        if type(self) is not type(other):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   637
            return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   638
        return self.impl_type == other.impl_type \
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   639
            and self.impl_type == other.impl_type \
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   640
            and sorted(self.files_in_source) == sorted(other.files_in_source) \
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   641
            and sorted(self.files_in_target) == sorted(other.files_in_target)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   642
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   643
    def __ne__(self, other):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   644
        return not (self == other)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   645
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   646
    def __lt__(self, other):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   647
        for varname in self.VARNAMES:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   648
            self_val = getattr(self, varname)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   649
            other_val = getattr(other, varname)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   650
            if isinstance(self_val, list):      self_val = sorted(self_val)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   651
            if isinstance(other_val, list):     other_val = sorted(other_val)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   652
            if self_val < other_val:    return True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   653
            elif self_val == other_val: pass
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   654
            else:                       return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   655
        return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   656
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   657
class FlatComparisonResult(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   658
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   659
    Class representing a flat comparison result.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   660
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   661
    Each member is a list of FlatComparisonResultEntry
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   662
    objects, except for 'duplicate', which contains
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   663
    DuplicateImplementationEntry objects.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   664
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   665
    Note that the entry members 'value_id', 'source_value' and
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   666
    'target_value' are irrelevant in the 'only_in_source' and
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   667
    'only_in_target' lists, and will always be None.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   668
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   669
    def __init__(self, **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   670
        self.only_in_source = kwargs.get('only_in_source', [])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   671
        self.only_in_target = kwargs.get('only_in_target', [])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   672
        self.modified       = kwargs.get('modified', [])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   673
        self.duplicate      = kwargs.get('duplicate', [])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   674
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   675
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   676
    def extend(self, other):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   677
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   678
        Extend this comparison result with another one.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   679
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   680
        if not isinstance(other, FlatComparisonResult):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   681
            raise ValueError("Expected instance of %s" % FlatComparisonResult.__name__)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   682
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   683
        self.only_in_source.extend(other.only_in_source)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   684
        self.only_in_target.extend(other.only_in_target)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   685
        self.modified.extend(other.modified)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   686
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   687
    def __repr__(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   688
        data = ["FlatComparisonResult(\n"]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   689
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   690
        def get_list_data(lst):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   691
            if len(lst) == 0: return '[]'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   692
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   693
            temp = ['[\n']
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   694
            for item in sorted(lst):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   695
                temp.append("    %r\n" % item)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   696
            temp.append('  ]')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   697
            return ''.join(temp)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   698
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   699
        entries = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   700
        for varname in ('only_in_source', 'only_in_target', 'modified', 'duplicate'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   701
            entry_text = '  %s = %s' % (varname, get_list_data(getattr(self, varname)))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   702
            entries.append(entry_text)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   703
        data.append(',\n'.join(entries))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   704
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   705
        data.append('\n)')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   706
        return ''.join(data)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   707
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   708
    def __len__(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   709
        return len(self.only_in_source) + len(self.only_in_target) + len(self.modified)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   710
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   711
    def __eq__(self, other):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   712
        if type(self) is not type(other):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   713
            return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   714
        return sorted(self.only_in_source) == sorted(other.only_in_source) \
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   715
            and sorted(self.only_in_target) == sorted(other.only_in_target) \
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   716
            and sorted(self.modified) == sorted(other.modified) \
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   717
            and sorted(self.duplicate) == sorted(other.duplicate)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   718
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   719
    def __ne__(self, other):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   720
        return not (self == other)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   721
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   722
class ImplBase(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   723
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   724
    Base class for any implementation class. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   725
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   726
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   727
    #: Identifier for the implementation type, used e.g. in .cfg files.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   728
    #: Should be a string like e.g. 'someml'.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   729
    IMPL_TYPE_ID = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   730
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   731
    #: Defines the default invocation phase for the implementation.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   732
    #: The default is used if the phase is not explicitly set in the
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   733
    #: ImplML file or manually overridden by calling set_invocation_phase()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   734
    DEFAULT_INVOCATION_PHASE = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   735
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   736
    def __init__(self, ref, configuration):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   737
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   738
        Create a ImplBase object
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   739
        @param ref : the ref to the Implml file resource.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   740
        @param configuration : the Configuration instance for the
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   741
        configuration data.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   742
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   743
        self._settings = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   744
        self.ref = ref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   745
        self.index = None
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   746
        self.lineno = None
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   747
        self.configuration = configuration
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   748
        self._output_root = self.settings.get('output_root','')
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   749
        self.output_subdir = self.settings.get('output_subdir','')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   750
        self.plugin_output = self.settings.get('plugin_output','')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   751
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   752
        self.generation_context = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   753
        self._tags = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   754
        self._invocation_phase = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   755
        self._tempvar_defs = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   756
        self.condition = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   757
        self._output_root_override = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   758
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   759
    def __reduce_ex__(self, protocol_version):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   760
        config = self.configuration
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   761
        if protocol_version == 2:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   762
            tpl =  (read_impl_from_location,
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   763
                    (self.ref, config, self.lineno),
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   764
                    None,
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   765
                    None,
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   766
                    None)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   767
            return tpl
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   768
        else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   769
            return (read_impl_from_location,
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   770
                    (self.ref, config, self.lineno))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   771
            
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   772
4
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   773
    #def __getstate__(self):
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   774
        #state = self.__dict__
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   775
        #state['configuration'] = self.configuration.path
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   776
        #return state
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   777
    
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   778
    #def __setstate__(self, dict):
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   779
    #    path = dict['configuration']
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   780
    #    configuration = api.ConfigurationProxy(path)
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   781
    #    self.__dict__.update(dict)
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   782
    #    self.configuration = configuration
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   783
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   784
    def _dereference(self, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   785
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   786
        Function for dereferencing a configuration ref to a value in the Implementation configuration context. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   787
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   788
        return self.configuration.get_default_view().get_feature(ref).value
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   789
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   790
    def _compare(self, other, dict_keys=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   791
        """ 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   792
        The plugin instance against another plugin instance
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   793
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   794
        raise exceptions.NotSupportedException()
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   795
    
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   796
    def generate(self, context=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   797
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   798
        Generate the given implementation.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   799
        @param context: The generation context can be given as a parameter. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   800
        The context can contain generation specific parameters for the 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   801
        implementation object itself or the implementation can store data to it 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   802
        which is visible to other implementations. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   803
        @return: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   804
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   805
        raise exceptions.NotSupportedException()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   806
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   807
    def post_generate(self, context=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   808
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   809
        Called when all normal generation has been done.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   810
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   811
        @param context: The generation context can be given as a parameter. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   812
        The context can contain generation specific parameters for the 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   813
        implementation object itself or the implementation can store data to it 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   814
        which is visible to other implementations. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   815
        @attention: This is a temporary method used for implementing cenrep_rfs.txt generation.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   816
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   817
        pass
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   818
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   819
    def list_output_files(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   820
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   821
        Return a list of output files as an array. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   822
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   823
        return []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   824
    
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   825
    def get_outputs(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   826
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   827
        Return a list of GenerationOutput objets as a list. 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   828
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   829
        outputs = []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   830
        phase = None 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   831
        if self.generation_context: phase = self.generation_context.phase
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   832
        for outfile in self.list_output_files():
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   833
            outputs.append(GenerationOutput(outfile,self,type='file', phase=phase) )
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   834
        return outputs
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   835
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   836
    
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   837
    def get_refs(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   838
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   839
        Return a list of all ConfML setting references that affect this
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   840
        implementation. May also return None if references are not relevant
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   841
        for the implementation.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   842
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   843
        return None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   844
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   845
    def has_ref(self, refs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   846
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   847
        @param refs: a list of references to check against.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   848
        @returns True if the implementation uses the given refs as input value, return False if the ref is not found.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   849
        If refs are not relevant for the given plugin returns None. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   850
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   851
        impl_refs = self.get_refs()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   852
        if impl_refs is None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   853
            return None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   854
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   855
        if isinstance(refs, basestring):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   856
            refs = [refs]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   857
        
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   858
        return uses_ref(refs, impl_refs)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   859
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   860
    def flat_compare(self, other):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   861
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   862
        Return a flat comparison result for two implementations.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   863
        @param other: The target implementation to compare against.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   864
        @return: A FlatComparisonResult object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   865
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   866
        @raise exceptions.NotSupportedException(): The implementation class does not support
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   867
            flat comparison.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   868
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   869
        raise exceptions.NotSupportedException()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   870
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   871
    def get_flat_comparison_id(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   872
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   873
        Return the ID used to uniquely identify this implementation instance for flat comparison.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   874
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   875
        @raise exceptions.NotSupportedException() if the implementation class does not support
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   876
            flat comparison.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   877
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   878
        raise exceptions.NotSupportedException()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   879
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   880
    def get_flat_comparison_extra_data(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   881
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   882
        Return the extra data object for a flat comparison entry.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   883
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   884
        This method is called when an implementation container comparison finds an
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   885
        implementation instance that is not in the other container.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   886
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   887
        @raise exceptions.NotSupportedException() if the implementation class does not support
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   888
            flat comparison.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   889
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   890
        raise exceptions.NotSupportedException()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   891
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   892
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   893
    def get_flat_comparison_impl_type_id(cls):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   894
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   895
        Return the type ID used to uniquely identify the current implementation class in flat comparison.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   896
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   897
        @raise exceptions.NotSupportedException() if the implementation class does not support
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   898
            flat comparison.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   899
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   900
        raise exceptions.NotSupportedException()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   901
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   902
    @property
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   903
    def settings(self):
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   904
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   905
        return the plugin specific settings object.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   906
        """
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   907
        if not self._settings:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   908
            parser = settings.SettingsFactory.cone_parser()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   909
            if self.IMPL_TYPE_ID is not None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   910
                section = self.IMPL_TYPE_ID.upper()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   911
            else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   912
                section = settings.DEFAULT_SECTION
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   913
            self._settings = settings.ConeSettings(parser, section)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   914
        return self._settings
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   915
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   916
    @property
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   917
    def output(self):
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   918
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   919
        return the output folder for this plugin instance.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   920
        """
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   921
        vars = {'output_root': self.output_root,'output_subdir': self.output_subdir,'plugin_output': self.plugin_output}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   922
        default_format = '%(output_root)s/%(output_subdir)s/%(plugin_output)s'
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   923
        output = utils.resourceref.remove_begin_slash(utils.resourceref.norm(self.settings.get('output',default_format,vars)))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   924
        if os.path.isabs(self.output_root):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   925
            output = utils.resourceref.insert_begin_slash(output) 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   926
        return output
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   927
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   928
    def _get_output_root(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   929
        if self._output_root_override is not None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   930
            return self._output_root_override
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   931
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   932
            return self._output_root
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   933
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   934
    def _set_output_root(self, value):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   935
        self._output_root = value
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   936
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   937
    output_root = property(_get_output_root, _set_output_root, None,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   938
       """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   939
       The output root directory.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   940
       
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   941
       Note that if set_output_root_override() has been called with a value
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   942
       other than None, reading this property will always return that value.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   943
       Otherwise it works just like any other property.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   944
       """)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   945
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   946
    def get_tags(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   947
        if self._tags is not None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   948
            tags = self._tags
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   949
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   950
            tags = eval(self.settings.get('plugin_tags','{}'))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   951
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   952
        # If we have a configuration, expand setting references in the tags
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   953
        if self.configuration is not None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   954
            dview = self.configuration.get_default_view()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   955
            expanded_tags = {}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   956
            for name, values in tags.iteritems():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   957
                exp_name = utils.expand_refs_by_default_view(name, dview)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   958
                exp_values = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   959
                expanded_tags[exp_name] = exp_values
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   960
                for value in values:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   961
                    exp_value = utils.expand_refs_by_default_view(value, dview)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   962
                    exp_values.append(exp_value)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   963
            return expanded_tags
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   964
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   965
            return tags.copy()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   966
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   967
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   968
    def set_tags(self, tags):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   969
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   970
        Override the default implementation tags.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   971
        @param phase: The tag dictionary to set. If None, the implementation's
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   972
            default tags will be used.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   973
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   974
        self._tags = tags
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   975
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   976
    def has_tag(self, tags, policy=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   977
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   978
        @param tags: a dictionary of context : tags to check agains
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   979
        @returns True if the implementation has a matching tag.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   980
        Otherwise return False.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   981
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   982
        if (tags==None or len(tags)==0) and len(self.get_tags()) == 0:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   983
            return True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   984
        if (tags!=None and len(tags)!=0) and len(self.get_tags()) == 0:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   985
            return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   986
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   987
        items = tags.iteritems()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   988
        self_tags = self.get_tags()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   989
        if policy == 'AND':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   990
            for (key,values) in items:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   991
                tagvals = self_tags.get(key, [])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   992
                for val in values:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   993
                    if val not in tagvals:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   994
                        return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   995
            return True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   996
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   997
            for (key,values) in items:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   998
                tagvals = self_tags.get(key, [])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   999
                for val in values:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1000
                    if val in tagvals:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1001
                        return True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1002
            return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1003
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1004
        return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1005
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1006
    def set_output_root(self,output):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1007
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1008
        Set the root directory for the output files. The output
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1009
        @param output : path to output dir.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1010
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1011
        self.output_root = output
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1012
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1013
    def get_output_root(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1014
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1015
        Return the current output dir.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1016
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1017
        return self.output_root
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1018
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1019
    def set_output_root_override(self, output):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1020
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1021
        Set the output root override.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1022
        @param output: The override value. If None, the normal output root
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1023
            value is used.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1024
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1025
        self._output_root_override = output
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1026
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1027
    def invocation_phase(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1028
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1029
        @return: the phase name in which the plugin wants to be executed. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1030
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1031
        # 1. Check if overridden on implementation instance level
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1032
        if self._invocation_phase is not None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1033
            return self._invocation_phase
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1034
        # 2. Check if overridden on implementation class level
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1035
        elif self.DEFAULT_INVOCATION_PHASE is not None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1036
            return self.DEFAULT_INVOCATION_PHASE
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1037
        # 3. Get from settings (if all else fails fall back to 'normal'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1038
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1039
            return self.settings.get('plugin_phase', 'normal')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1040
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1041
    def set_invocation_phase(self, phase):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1042
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1043
        Override the default invocation phase.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1044
        @param phase: The invocation phase to set. If None, the implementation's
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1045
            default phase will be used.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1046
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1047
        self._invocation_phase = phase
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1048
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1049
    def compare(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1050
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1051
        @return: the phase name in which the plugin wants to be executed. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1052
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1053
        return self.settings.get('plugin_phase','normal')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1054
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1055
    def get_temp_variable_definitions(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1056
        return self._tempvar_defs
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1057
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1058
    def get_relation_container(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1059
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1060
        Return a relation container containing all relations from this
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1061
        implementation instance, or None.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1062
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1063
        return None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1064
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1065
    def get_all_implementations(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1066
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1067
        return a list of all actual implementation which is for ImplBase object self. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1068
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1069
        return [self]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1070
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1071
    def __repr__(self):
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1072
        return "%s(ref=%r, type=%r, lineno=%r)" % (self.__class__.__name__, self.ref, self.IMPL_TYPE_ID, self.lineno)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1073
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1074
    @property
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1075
    def path(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1076
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1077
        return path relative to the Configuration projec root
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1078
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1079
        return self.ref
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1080
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1081
    @property
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1082
    def abspath(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1083
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1084
        return absolute system path to the implementation
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1085
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1086
        return os.path.abspath(os.path.join(self.configuration.storage.path,self.ref))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1087
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1088
    def uses_layers(self, layers, context):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1089
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1090
        Return whether this implementation uses any of the given layers
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1091
        in the given context, i.e., whether the layers contain anything that would
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1092
        affect generation output.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1093
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1094
        # The default implementation checks against refs changed in the layers
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1095
        refs = []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1096
        for l in layers: refs.extend(l.list_leaf_datas())
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1097
        return self.has_ref(refs)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1098
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1099
class ImplContainer(ImplBase):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1100
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1101
    Acts as a container object with list functionality.  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1102
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1103
    def __init__(self, ref, configuration):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1104
        ImplBase.__init__(self, ref, configuration)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1105
        self.impls = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1106
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1107
    # The list functions
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1108
    def __getattr__(self, name):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1109
        if hasattr(self.impls, name):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1110
            return self.impls.__getattribute__(name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1111
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1112
    def __getitem__(self, key):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1113
        return self.impls[key]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1114
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1115
    def __setitem__(self, key, value):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1116
        self.impls[key] = value
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1117
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1118
    def __delitem__(self, key):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1119
        del self.impls[key]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1120
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1121
    def __len__(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1122
        return len(self.impls)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1123
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1124
    def __iter__(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1125
        return iter(self.impls)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1126
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1127
    def generate(self, context=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1128
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1129
        Generate function for container executes generate for all sub implementations.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1130
        @param context: The generation context can be given as a parameter. The container
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1131
        passes the context to its sub implementations.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1132
         
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1133
        @return: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1134
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1135
        log = logging.getLogger('cone')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1136
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1137
        if self.condition and not self.condition.eval(context):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1138
            log.debug('Filtered out based on condition %s: %r' % (self.condition, self))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1139
            return
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1140
        
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1141
        # run generate on sub impls
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1142
        for impl in self.impls:
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1143
            if context:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1144
                # 1. Check should the implementation be run from context
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1145
                # 2. Run ImplContainer if should
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1146
                # 3. run other ImplBase objects if this is not a dry_run                      
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1147
                if context.should_run(impl):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1148
                    if isinstance(impl, ImplContainer) or \
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1149
                        not context.dry_run:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1150
                        impl.generate(context)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1151
                        # context.have_run(impl)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1152
            else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1153
                impl.generate(context)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1154
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1155
    def get_refs(self):
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1156
        # Containers always return None, because the ref-based filtering
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1157
        # happens only on the actual implementations
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1158
        return None
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1159
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1160
    def get_child_refs(self):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1161
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1162
        ImplContainer always None with get_refs so it one wants to get the references from all 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1163
        leaf child objects, one can use this get_child_refs function
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1164
        @return: a list of references.
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1165
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1166
        refs = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1167
        for impl in self.impls:
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1168
            if isinstance(impl, ImplContainer):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1169
                refs += impl.get_child_refs()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1170
            else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1171
                refs += impl.get_refs() or []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1172
        return utils.distinct_array(refs)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1173
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1174
    def has_tag(self, tags, policy=None):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1175
        # Container always returns True
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1176
        return True
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1177
    
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1178
    def get_tags(self):
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1179
        # Containers always return None, because the tag-based filtering
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1180
        # happens only on the actual implementations
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1181
        return None
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1182
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1183
    def get_child_tags(self):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1184
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1185
        ImplContainer always None with get_tags so it one wants to get the teags from all 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1186
        leaf child objects, one can use this get_child_tags function
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1187
        @return: a list of references.
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1188
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1189
        tags = {}
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1190
        for impl in self.impls:
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1191
            if isinstance(impl, ImplContainer):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1192
                utils.update_dict(tags, impl.get_child_tags())
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1193
            else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1194
                utils.update_dict(tags, impl.get_tags())
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1195
        return tags
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1196
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1197
    def list_output_files(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1198
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1199
        Return a list of output files as an array. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1200
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1201
        files = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1202
        for impl in self.impls:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1203
            files += impl.list_output_files()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1204
        return utils.distinct_array(files)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1205
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1206
    def get_outputs(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1207
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1208
        Return a list of GenerationOutput objets as a list. 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1209
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1210
        outputs = []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1211
        for impl in self.impls:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1212
            outputs += impl.get_outputs()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1213
        return outputs
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1214
    
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1215
    def set_output_root(self,output):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1216
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1217
        Set the root directory for the output files. The output
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1218
        @param output : path to output dir.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1219
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1220
        self.output_root = output
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1221
        for impl in self.impls:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1222
            impl.set_output_root(output) 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1223
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1224
    def get_temp_variable_definitions(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1225
        tempvars = self._tempvar_defs[:]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1226
        for impl in self.impls:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1227
            tempvars += impl.get_temp_variable_definitions()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1228
        return tempvars
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1229
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1230
    def get_relation_container(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1231
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1232
        Return a relation container containing all relations from this
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1233
        container object instance, or empty relation container.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1234
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1235
        container = RelationContainer([], '<root>')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1236
        for impl in self.impls:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1237
            c = impl.get_relation_container()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1238
            if isinstance(c, RelationContainer):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1239
                container.entries.append(c)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1240
        return container
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1241
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1242
    def get_all_implementations(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1243
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1244
        return a list of all actual implementation under this container 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1245
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1246
        actual_impls = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1247
        for subimpl in self.impls:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1248
            actual_impls += subimpl.get_all_implementations()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1249
        return actual_impls
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1250
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1251
    def uses_layers(self, layers, context):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1252
        #log = logging.getLogger('uses_layers(%r)' % self)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1253
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1254
        # If no sub-implementation has matching tags, the implementations would
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1255
        # never be run in this context, so there's no need to go further in that case
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1256
        if not self._have_impls_matching_tags(context.tags, context.tags_policy):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1257
            #log.debug("No impls have matching tags, returning False")
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1258
            return False
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1259
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1260
        # If the container has a condition depending on any of the changed refs,
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1261
        # it means that the refs can affect generation output
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1262
        if self.condition:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1263
            refs = []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1264
            for l in layers: refs.extend(l.list_leaf_datas())
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1265
            if uses_ref(refs, self.condition.get_refs()):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1266
                #log.debug("Refs affect condition, returning True")
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1267
                return True
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1268
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1269
        # If the condition evaluates to False (and doesn't depend on the
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1270
        # changed refs), the implementations won't be run, and thus they
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1271
        # don't use the layers in this context
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1272
        if self.condition and not self.condition.eval(context):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1273
            #log.debug("Condition evaluates to False, returning False")
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1274
            return False
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1275
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1276
        for impl in self.impls:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1277
            # Filter out based on tags if the implementation is not
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1278
            # a container (using ImplBase.has_tag() here since RuleML v2
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1279
            # overrides has_tag() to always return True)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1280
            if not isinstance(impl, ImplContainer):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1281
                if not ImplBase.has_tag(impl, context.tags, context.tags_policy):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1282
                    continue
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1283
            
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1284
            if impl.uses_layers(layers, context):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1285
                #log.debug("%r uses layer, returning True" % impl)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1286
                return True
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1287
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1288
        #log.debug("Returning False")
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1289
        return False
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1290
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1291
    def _have_impls_matching_tags(self, tags, tags_policy):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1292
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1293
        Return if any of the container's leaf implementations use the given tags.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1294
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1295
        for impl in self.impls:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1296
            if isinstance(impl, ImplContainer):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1297
                if impl._have_impls_matching_tags(tags, tags_policy):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1298
                    return True
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1299
            elif ImplBase.has_tag(impl, tags, tags_policy):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1300
                return True
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1301
        return False
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1302
        
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1303
class ReaderBase(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1304
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1305
    Base class for implementation readers.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1306
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1307
    Each reader class supports one XML namespace, from which it reads an implementation
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1308
    instance.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1309
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1310
    The method for parsing an implementation (read_impl()) is given an ElementTree
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1311
    XML element as the root from which to parse the implementation. The plug-in
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1312
    machinery handles each XML file so that the correct reader class is used to read
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1313
    the implementations from XML elements based on the namespaces.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1314
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1315
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1316
    #: The XML namespace supported by the implementation reader.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1317
    #: Should be something like "http://www.xyz.org/xml/1".
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1318
    #: Can also be None, in which case the reader will not be used
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1319
    #: (this can be useful for defining base classes for e.g. readers
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1320
    #: for different versions of an implementation).
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1321
    NAMESPACE = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1322
    
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1323
    #: ID for the namespace used in the generated XML schema files.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1324
    #: Must be unique, and something simple like 'someml'. 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1325
    NAMESPACE_ID = None
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1326
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1327
    #: Sub-ID for schema problems for this ImplML namespace.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1328
    #: This is used as part of the problem type for schema validation
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1329
    #: problems. E.g. if the sub-ID is 'someml', then a schema validation
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1330
    #: problem would have the problem type 'schema.implml.someml'.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1331
    #: If this is not given, then the problem type will simply be
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1332
    #: 'schema.implml'.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1333
    SCHEMA_PROBLEM_SUB_ID = None
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1334
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1335
    #: The root element name of the implementation langauge supported by
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1336
    #: the reader. This is also used in the generate XML schema files, and
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1337
    #: must correspond to the root element name specified in the schema data.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1338
    #: If get_schema_data() returns None, then this determines the name of
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1339
    #: the root element in the automatically generated default schema.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1340
    ROOT_ELEMENT_NAME = None
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1341
    
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1342
    #: Any extra XML namespaces that should be ignored by the
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1343
    #: implementation parsing machinery. This is useful for specifying
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1344
    #: namespaces that are not actual ImplML namespaces, but are used
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1345
    #: inside an implementation (e.g. XInclude)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1346
    IGNORED_NAMESPACES = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1347
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1348
    #: Supported implementation file extensions.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1349
    #: Sub-classes can override this to add new supported file extensions
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1350
    #: if necessary. The file extensions simply control whether implementations
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1351
    #: are attempted to be read from a file or not.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1352
    #: Note that the extensions are case-insensitive.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1353
    FILE_EXTENSIONS = ['implml']
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1354
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1355
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1356
    def read_impl(cls, resource_ref, configuration, doc_root):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1357
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1358
        Read an implementation instance from the given element tree.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1359
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1360
        @param resource_ref: Reference to the resource in the configuration in
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1361
            which the given document root resides.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1362
        @param configuration: The configuration used.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1363
        @param doc_root: The document root from which to parse the implementation.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1364
        @return: The read implementation instance, or None.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1365
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1366
        raise exceptions.NotSupportedException()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1367
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1368
    @classmethod
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1369
    def read_impl_from_location(cls, resource_ref, configuration, lineno):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1370
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1371
        Read an implementation instance from the given resource at the given line number.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1372
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1373
        @param resource_ref: Reference to the resource in the configuration in
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1374
            which the given document root resides.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1375
        @param configuration: The configuration used.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1376
        @param lineno: the line number where the root node for this particular element is searched from.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1377
        @return: The read implementation instance, or None.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1378
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1379
        root =  cls._read_xml_doc_from_resource(resource_ref, configuration)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1380
        elemroot = utils.etree.get_elem_from_lineno(root, lineno)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1381
        ns, tag = utils.xml.split_tag_namespace(elemroot.tag)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1382
        reader = cls.get_reader_for_namespace(ns)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1383
        implml = reader.read_impl(resource_ref, configuration, elemroot)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1384
        implml.lineno = lineno
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1385
        return implml
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1386
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1387
    @classmethod
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1388
    def get_reader_for_namespace(cls, namespace):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1389
        return ImplFactory.get_reader_dict().get(namespace, None)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1390
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1391
    @classmethod
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1392
    def get_schema_data(cls):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1393
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1394
        Return the XML schema data used for validating the ImplML supported by this reader.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1395
        @return: The schema data as a string, or None if not available.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1396
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1397
        return None
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1398
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1399
    @classmethod
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1400
    def _read_xml_doc_from_resource(cls, resource_ref, configuration):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1401
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1402
        Parse an ElementTree instance from the given resource.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1403
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1404
        resource = configuration.get_resource(resource_ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1405
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1406
            try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1407
                data = resource.read()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1408
                return utils.etree.fromstring(data)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1409
            except exceptions.XmlParseError, e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1410
                msg = "Invalid XML in implementation file '%s'. Exception: %s" % (resource_ref, e)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1411
                raise e
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1412
        finally:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1413
            resource.close()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1414
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1415
class ImplContainerReader(ReaderBase):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1416
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1417
    Reader class for reading containers inside implementation files. A container 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1418
    is a implementation in it self that can contain a list of actual implementations.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1419
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1420
    NAMESPACE = "http://www.symbianfoundation.org/xml/implml/1"
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1421
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1422
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1423
    # The reader class list loaded using ImplFactory
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1424
    __reader_classes = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1425
    __supported_file_extensions = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1426
    __ignored_namespaces = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1427
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1428
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1429
    def get_reader_classes(cls):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1430
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1431
        Return a dictionary of all possible implementation reader classes.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1432
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1433
        Dictionary key is the XML namespace and the value is the corresponding
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1434
        reader class.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1435
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1436
        cls.__reader_classes = ImplFactory.get_reader_dict()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1437
        return cls.__reader_classes
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1438
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1439
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1440
    def read_impl(cls, resource_ref, configuration, doc_root, read_impl_count=None):
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1441
        on_top_level = read_impl_count == None
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1442
        # The variable read_impl_count is used to keep track of the number of
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1443
        # currently read actual implementations. It is a list so that it can be used
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1444
        # like a pointer, i.e. functions called from here can modify the number
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1445
        # inside it. A more elegant solution is not done here, since this is temporary
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1446
        # and the index variable in implementation instances will be changed to line_number,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1447
        # which specifies the actual line on which the implementation is specified in the file
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1448
        if read_impl_count is None: read_impl_count = [0]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1449
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1450
        ns, tag = utils.xml.split_tag_namespace(doc_root.tag)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1451
        if tag != "container":
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1452
            logging.getLogger('cone').error("Error: The root element must be a container in %s, %s" % (ns, resource_ref))
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1453
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1454
        reader_classes = cls.get_reader_classes()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1455
        namespaces = reader_classes.keys()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1456
        # Read first the root container object with attributes 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1457
        # and then traverse through possible child containers 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1458
        containerobj = ImplContainer(resource_ref, configuration)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1459
        containerobj.condition = cls.get_condition(doc_root)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1460
        
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1461
        containerobj._common_data = _plugin_reader.CommonImplmlDataReader.read_data(doc_root)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1462
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1463
        # traverse through the subelements
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1464
        for elem in doc_root:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1465
            ns, tag = utils.xml.split_tag_namespace(elem.tag)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1466
            if ns == cls.NAMESPACE:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1467
                # Read a sub-container from the common namespace (all other
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1468
                # common namespace elements were handled earlier)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1469
                if tag == "container":
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1470
                    subcontainer = cls.read_impl(resource_ref, configuration, elem, read_impl_count=read_impl_count)
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1471
                    subcontainer.lineno = utils.etree.get_lineno(elem)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1472
                    containerobj.append(subcontainer)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1473
                    subcontainer.index = None # For now all sub-containers have index = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1474
            else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1475
                # Try to read the sub implementation object from some other namespace 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1476
                if ns not in namespaces:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1477
                    logging.getLogger('cone').error("Error: no reader for namespace '%s' in %s" % (ns, resource_ref))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1478
                else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1479
                    reader = reader_classes[ns]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1480
                    subelem = reader.read_impl(resource_ref, configuration, elem)
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1481
                    subelem.lineno = utils.etree.get_lineno(elem)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1482
                    containerobj.append(subelem)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1483
                    subelem.index = read_impl_count[0]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1484
                    read_impl_count[0] = read_impl_count[0] +  1
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1485
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1486
        containerobj._tempvar_defs = containerobj._common_data.tempvar_defs
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1487
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1488
        if on_top_level:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1489
            def inherit_common_data(container):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1490
                for impl in container.impls:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1491
                    if isinstance(impl, ImplContainer):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1492
                        new_common_data = container._common_data.copy()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1493
                        new_common_data.extend(impl._common_data)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1494
                        impl._common_data = new_common_data
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1495
                        inherit_common_data(impl)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1496
            def apply_common_data(container):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1497
                for impl in container.impls:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1498
                    if isinstance(impl, ImplContainer):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1499
                        apply_common_data(impl)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1500
                    else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1501
                        container._common_data.apply(impl)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1502
            inherit_common_data(containerobj)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1503
            apply_common_data(containerobj)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1504
        
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1505
        return containerobj
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1506
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1507
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1508
    def read_implementation(cls, xml_data):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1509
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1510
        Read a container implementation from the given xmlroot element.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1511
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1512
        root = utils.etree.fromstring(xml_data)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1513
        return cls.read_impl("", None,root)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1514
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1515
    @classmethod 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1516
    def get_condition(cls, root):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1517
        if root.get('condition'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1518
            left = root.get('condition')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1519
            right = root.get('value', 'true')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1520
            return rules.SimpleCondition(left, right)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1521
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1522
            return None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1523
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1524
class ImplSet(set):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1525
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1526
    Implementation set class that can hold a set of ImplBase instances. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1527
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1528
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1529
    """ 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1530
    The plugin phases is a list of possible phases in which the plugins are executed. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1531
    Each plugin instance can tell in which phase it needs to be executed. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1532
    """ 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1533
    INVOCATION_PHASES = ['pre','normal','post']
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1534
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1535
    def __init__(self,implementations=None, generation_context=None):
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1536
        super(ImplSet,self).__init__(implementations or [])
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1537
        self.output = 'output'
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1538
        self.generation_context = generation_context
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1539
        self.ref_to_impl = {}
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1540
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1541
    def _create_ref_dict(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1542
        for impl in self:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1543
            for ref in impl.get_refs() or []:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1544
                self.ref_to_impl.setdefault(ref, []).append(impl)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1545
 
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1546
    def invocation_phases(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1547
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1548
        @return: A list of possible invocation phases
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1549
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1550
        return self.INVOCATION_PHASES
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1551
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1552
    def list_output_files(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1553
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1554
        List the output file names from this container.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1555
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1556
        filelist = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1557
        for impl in self:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1558
            files = impl.list_output_files()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1559
            filelist.extend(files)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1560
        return utils.distinct_array(filelist)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1561
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1562
    def generate(self, context=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1563
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1564
        Generate all implementations. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1565
        @return: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1566
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1567
        #for impl in self.impls:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1568
        #    impl.generation_context = self.generation_context
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1569
        if not context:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1570
            context =  self.generation_context
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1571
        else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1572
            self.generation_context = context
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1573
        # Sort by file name so that execution order is always the same
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1574
        # (easier to compare logs)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1575
        sorted_impls = sorted(self, key=lambda impl: impl.ref)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1576
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1577
        for impl in sorted_impls:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1578
            # 1. Check should the implementation be run from context
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1579
            # 2. Run ImplContainer if should  
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1580
            # 3. run other ImplBase objects if this is not a dry_run                      
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1581
            if context.should_run(impl):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1582
                if isinstance(impl, ImplContainer) or \
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1583
                    not context.dry_run:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1584
                    self.execute([impl], 'generate', context)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1585
                    # context.have_run(impl)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1586
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1587
    def post_generate(self, context=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1588
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1589
        @attention: This is a temporary method used for implementing cenrep_rfs.txt generation.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1590
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1591
        if not context:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1592
            context =  self.generation_context
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1593
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1594
        impls = []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1595
        # Sort by file name so that execution order is always the same
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1596
        # (easier to compare logs)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1597
        sorted_impls = sorted(self, key=lambda impl: impl.ref)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1598
        for impl in sorted_impls:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1599
            if context.should_run(impl, log_debug_message=False):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1600
                impls.append(impl)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1601
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1602
        self.execute(impls, 'post_generate', context)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1603
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1604
    def execute(self, implementations, methodname, *args):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1605
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1606
        Internal function for executing a function to a list of implementations.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1607
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1608
        Mutual execution order (for separate implementation instances defined in
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1609
        the same implementation file) is the order the implementations are
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1610
        specified in the file.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1611
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1612
        @param implementations:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1613
        @param methodname: the name of the function to execute  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1614
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1615
        for impl in implementations:
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1616
            try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1617
                if hasattr(impl, methodname): 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1618
                    _member = getattr(impl, methodname)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1619
                    _member(*args)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1620
                else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1621
                    logging.getLogger('cone').error('Impl %r has no method %s' % (impl, methodname))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1622
            except Exception, e:
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1623
                if self.generation_context:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1624
                    self.generation_context.generation_output.append(GenerationOutput('exception from %s' % impl.ref, 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1625
                                                                                      impl, 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1626
                                                                                      phase=self.generation_context.phase,              
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1627
                                                                                      type='exception',
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1628
                                                                                      output=self.generation_context.output,
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1629
                                                                                      exception=e))
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1630
                utils.log_exception(logging.getLogger('cone'), 'Impl %r raised an exception: %s' % (impl, repr(e)))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1631
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1632
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1633
    def add_implementation(self,impl):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1634
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1635
        Add a ImplBase object to this ImplBaseContainer.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1636
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1637
        self.add(impl)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1638
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1639
    def remove_implementation(self,ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1640
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1641
        Remove implementation object by its ref (name of the implml resource). 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1642
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1643
        impls_to_remove = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1644
        for impl in self:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1645
            if impl.ref == ref:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1646
                impls_to_remove.append(impl)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1647
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1648
        for impl in impls_to_remove:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1649
            self.remove(impl)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1650
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1651
    def list_implementation(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1652
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1653
        List all implementation in this container.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1654
        @return: an array of resource references.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1655
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1656
        implrefs = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1657
        for impl in self:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1658
            if impl.ref not in implrefs:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1659
                implrefs.append(impl.ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1660
        return implrefs
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1661
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1662
    def get_implementations_by_file(self, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1663
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1664
        Return a list of implementations read from the given file.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1665
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1666
        return filter(lambda impl: impl.ref == ref, self)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1667
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1668
    def filter_implementations(self,**kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1669
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1670
        Find any implementation with certain parameters.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1671
        All arguments are given as dict, so they must be given with name. E.g. copy(phase='normal')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1672
        @param phase: name of the phase
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1673
        @param refs: A list of refs that are filtered with function has_refs
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1674
        @param tags: A dictionary of tags that are filtered with function has_tags
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1675
        @return: a new ImplSet object with the filtered items.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1676
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1677
        impls = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1678
        """ Create a list of filter functions for each argument """ 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1679
        filters=[]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1680
        filters.append(lambda x: x != None)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1681
        if kwargs.get('phase', None) != None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1682
            filters.append(lambda x: kwargs.get('phase') in x.invocation_phase())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1683
        if kwargs.get('refs',None) != None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1684
            # Changed has_ref usage to allow not supporting refs (meaning that non supported wont be filtered with refs)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1685
            filters.append(lambda x: x.has_ref(kwargs.get('refs')) == True or x.has_ref(kwargs.get('refs')) == None)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1686
        if kwargs.get('tags', None) != None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1687
            filters.append(lambda x: x.has_tag(kwargs.get('tags'),kwargs.get('policy')))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1688
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1689
        """ Go through the implementations and add all to resultset that pass all filters """ 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1690
        for impl in self:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1691
            pass_filters = True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1692
            for filter in filters:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1693
                if not filter(impl):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1694
                    pass_filters = False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1695
                    break
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1696
            if pass_filters:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1697
                impls.append(impl)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1698
        return ImplSet(impls)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1699
    
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1700
    def find_implementations(self,**kwargs):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1701
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1702
        Find any implementation with certain parameters.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1703
        All arguments are given as dict, so they must be given with name. E.g. copy(phase='normal')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1704
        @param phase: name of the phase
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1705
        @param refs: A list of refs that are filtered with function has_refs
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1706
        @param tags: A dictionary of tags that are filtered with function has_tags
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1707
        @return: a new ImplSet object with the filtered items.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1708
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1709
        impls = []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1710
        """ Create a list of filter functions for each argument """ 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1711
        filters=[]
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1712
        filters.append(lambda x: x != None)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1713
        if kwargs.get('phase', None) != None:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1714
            filters.append(lambda x: kwargs.get('phase') in x.invocation_phase())
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1715
        if kwargs.get('refs',None) != None:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1716
            # Changed has_ref usage to allow not supporting refs (meaning that non supported wont be filtered with refs)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1717
            filters.append(lambda x: x.has_ref(kwargs.get('refs')) == True)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1718
        if kwargs.get('tags', None) != None:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1719
            filters.append(lambda x: x.has_tag(kwargs.get('tags'),kwargs.get('policy')))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1720
            
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1721
        """ Go through the implementations and add all to resultset that pass all filters """ 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1722
        for impl in self:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1723
            pass_filters = True
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1724
            for filter in filters:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1725
                if not filter(impl):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1726
                    pass_filters = False
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1727
                    break
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1728
            if pass_filters:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1729
                impls.append(impl)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1730
        return ImplSet(impls)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1731
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1732
    def flat_compare(self, other):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1733
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1734
        Perform a flat comparison between this implementation container and another one.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1735
        @return: @return: A FlatComparisonResult object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1736
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1737
        # Collect dictionaries of all comparable implementation instances
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1738
        # ---------------------------------------------------------------
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1739
        source_impls_by_class, duplicates_in_source = self._get_flat_comparison_impl_by_class_dicts('source')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1740
        target_impls_by_class, duplicates_in_target = other._get_flat_comparison_impl_by_class_dicts('target')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1741
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1742
        # Collect a list containing all implementation classes
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1743
        # ----------------------------------------------------
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1744
        all_impl_classes = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1745
        for impl_class in source_impls_by_class.iterkeys():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1746
            if impl_class not in all_impl_classes:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1747
                all_impl_classes.append(impl_class)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1748
        for impl_class in target_impls_by_class.iterkeys():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1749
            if impl_class not in all_impl_classes:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1750
                all_impl_classes.append(impl_class)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1751
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1752
        # Perform comparison for all classes
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1753
        # ----------------------------------
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1754
        result = FlatComparisonResult()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1755
        for impl_class in all_impl_classes:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1756
            src = source_impls_by_class.get(impl_class, {})
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1757
            tgt = target_impls_by_class.get(impl_class, {})
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1758
            temp_result = self._get_flat_comparison_result(impl_class, src, tgt)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1759
            result.extend(temp_result)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1760
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1761
        # Add duplicates into the comparison result
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1762
        # -----------------------------------------
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1763
        def get_or_add_dup_entry(impl_type_id, impl_id):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1764
            for e in result.duplicate:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1765
                if e.impl_type == impl_type_id and e.id == impl_id:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1766
                    return e
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1767
            e = DuplicateImplementationEntry(impl_type=impl_type_id, id=impl_id)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1768
            result.duplicate.append(e)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1769
            return e
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1770
                    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1771
        for impl_class, impl_type_id, impl_id, file in duplicates_in_source:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1772
            entry = get_or_add_dup_entry(impl_type_id, impl_id)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1773
            entry.files_in_source.append(file)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1774
        for impl_class, impl_type_id, impl_id, file in duplicates_in_target:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1775
            entry = get_or_add_dup_entry(impl_type_id, impl_id)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1776
            entry.files_in_target.append(file)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1777
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1778
        # Sort the files so that the output is easier to compare in unit tests
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1779
        for e in result.duplicate:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1780
            e.files_in_source.sort()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1781
            e.files_in_target.sort()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1782
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1783
        return result
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1784
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1785
    def _get_flat_comparison_impl_by_class_dicts(self, name):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1786
        result = {}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1787
        duplicates = [] # List of (impl_class, impl_type_id, impl_id, file) tuples
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1788
        for impl in self:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1789
            # See if the implementation is flat comparable
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1790
            try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1791
                impl_id = impl.get_flat_comparison_id()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1792
            except exceptions.NotSupportedException:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1793
                continue
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1794
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1795
            # Get the dictionary where implementations of this type are collected
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1796
            impl_class = type(impl)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1797
            if impl_class not in result:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1798
                result[impl_class] = {}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1799
            impls_dict = result[impl_class]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1800
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1801
            # Add to the dictionary
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1802
            if impl_id not in impls_dict:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1803
                impls_dict[impl_id] = impl
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1804
            else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1805
                logging.getLogger('cone').warning("Multiple '%s' implementations with ID %r in %s" % (impl.IMPL_TYPE_ID, impl_id, name))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1806
                duplicates.append((impl_class, impl.IMPL_TYPE_ID, impl_id, impl.ref))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1807
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1808
        # Handle duplicates (add new duplicate entries and
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1809
        # remove from the dictionaries)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1810
        new_duplicates = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1811
        for impl_class, impl_type_id, impl_id, _ in duplicates:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1812
            # Get the corresponding dictionary 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1813
            if impl_class not in result: continue
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1814
            impls_dict = result[impl_class]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1815
            if impl_id not in impls_dict: continue
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1816
            impl = impls_dict[impl_id]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1817
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1818
            # Add a new entry
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1819
            new_duplicates.append((impl_class, impl.IMPL_TYPE_ID, impl_id, impl.ref))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1820
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1821
            # Remove from the dictionary
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1822
            del impls_dict[impl_id]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1823
        duplicates.extend(new_duplicates)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1824
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1825
        return result, duplicates
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1826
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1827
    def _get_flat_comparison_result(self, impl_class, source_impls_dict, target_impls_dict):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1828
        result = FlatComparisonResult()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1829
        impl_type_id = impl_class.get_flat_comparison_impl_type_id()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1830
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1831
        for impl_id, impl in target_impls_dict.iteritems():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1832
            if impl_id not in source_impls_dict:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1833
                result.only_in_target.append(FlatComparisonResultEntry(
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1834
                    file        = impl.ref,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1835
                    impl_type   = impl_type_id,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1836
                    id          = impl_id,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1837
                    data        = impl.get_flat_comparison_extra_data()))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1838
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1839
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1840
        def fill_in_fields(entries, field_values):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1841
            for entry in entries:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1842
                for varname, value in field_values.iteritems():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1843
                    setattr(entry, varname, value)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1844
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1845
        for impl_id, src_impl in source_impls_dict.iteritems():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1846
            if impl_id not in target_impls_dict:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1847
                result.only_in_source.append(FlatComparisonResultEntry(
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1848
                    file        = src_impl.ref,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1849
                    impl_type   = impl_type_id,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1850
                    id          = impl_id,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1851
                    data        = src_impl.get_flat_comparison_extra_data()))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1852
            else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1853
                tgt_impl = target_impls_dict[impl_id]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1854
                
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1855
                temp_result = src_impl.flat_compare(tgt_impl)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1856
                field_values = {'file'      : tgt_impl.ref,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1857
                                'impl_type' : impl_type_id,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1858
                                'id'        : impl_id}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1859
                fill_in_fields(temp_result.only_in_source,  field_values)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1860
                fill_in_fields(temp_result.only_in_target,  field_values)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1861
                fill_in_fields(temp_result.modified,        field_values)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1862
                result.extend(temp_result)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1863
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1864
        return result
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1865
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1866
    def create_temp_features(self, configuration):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1867
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1868
        Create all temporary features for the implementations in this container.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1869
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1870
        @param configuration: The configuration where the temporary features are
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1871
            to be created.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1872
        @return: A list containing the references of all created temporary features.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1873
        
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1874
        @raise exceptions.AlreadyExists: There are duplicate temporary features defined
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1875
            in the configuration. Redefinitions of the temporaty features are only ignored.
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1876
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1877
        # ----------------------------------------------------
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1878
        # Collect a list of all temporary variable definitions
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1879
        # and check for duplicates and already existing
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1880
        # features at the same time
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1881
        # ----------------------------------------------------
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1882
        tempvar_defs = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1883
        files_by_refs = {}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1884
        dview = configuration.get_default_view()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1885
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1886
        for impl in self:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1887
            for fea_def in impl.get_temp_variable_definitions():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1888
                # Check if already exists
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1889
                try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1890
                    dview.get_feature(fea_def.ref)
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1891
                    #raise exceptions.AlreadyExists(
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1892
                    #    "Temporary variable '%s' defined in file '%s' already exists in the configuration!" \
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1893
                    #    % (fea_def.ref, impl.ref))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1894
                    logging.getLogger('cone').warning("Temporary variable '%s' re-definition ignored." % fea_def.ref)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1895
                    continue
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1896
                except exceptions.NotFound:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1897
                    pass
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1898
                
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1899
                # Add to temporary dictionary for duplicate checking
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1900
                if fea_def.ref not in files_by_refs:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1901
                    files_by_refs[fea_def.ref] = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1902
                files_by_refs[fea_def.ref].append(impl.ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1903
                
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1904
                # Add to the list of all temp feature definitions
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1905
                tempvar_defs.append(fea_def)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1906
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1907
        # Check for duplicates
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1908
        for ref, file_list in files_by_refs.iteritems():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1909
            if len(file_list) > 1:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1910
                raise exceptions.AlreadyExists(
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1911
                    "Duplicate temporary variable! '%s' defined in the following files: %r" \
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1912
                    % (ref, file_list))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1913
        del files_by_refs
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1914
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1915
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1916
        # ------------------------------
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1917
        # Create the temporary variables
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1918
        # ------------------------------
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1919
        refs = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1920
        if tempvar_defs:
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1921
            logging.getLogger('cone').debug('Creating %d temporary variable(s) %r' % (len(tempvar_defs), tempvar_defs))
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1922
            autoconfig = get_autoconfig(configuration)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1923
            for fea_def in tempvar_defs:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1924
                fea_def.create_feature(autoconfig)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1925
                refs.append(fea_def.ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1926
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1927
            # The default view needs to be recreated, or the created
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1928
            # features will not be visible there
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1929
            configuration.recreate_default_view()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1930
        return refs
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1931
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1932
    def get_relation_container(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1933
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1934
        Return a relation container containing all rules from this set
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1935
        of implementation instances.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1936
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1937
        container = RelationContainer([], '<root>')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1938
        for impl in self:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1939
            c = impl.get_relation_container()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1940
            if isinstance(c, RelationContainer):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1941
                container.entries.append(c)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1942
        return container
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1943
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1944
    def get_all_implementations(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1945
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1946
        Return a flattened list of all implementation instances in this set.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1947
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1948
        The returned list contains only actual implementation instances, not
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1949
        ImplContainer objects.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1950
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1951
        # Get a list of implementation objects sorted by file name
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1952
        impl_list = list(self)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1953
        impl_list.sort(key=lambda impl: impl.ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1954
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1955
        result = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1956
        for impl in impl_list:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1957
            result += impl.get_all_implementations()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1958
        return result
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1959
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1960
    def get_implemented_refs(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1961
        if not self.ref_to_impl:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1962
            self._create_ref_dict()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1963
        return sorted(self.ref_to_impl.keys())
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1964
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1965
    def get_implementations_with_ref(self, ref):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1966
        if not self.ref_to_impl:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1967
            self._create_ref_dict()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1968
        return sorted(self.ref_to_impl.get(ref, []), lambda a,b: cmp(a.ref, b.ref))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  1969
    
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1970
class RelationExecutionResult(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1971
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1972
    Class representing a result from relation execution.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1973
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1974
    def __init__(self, input_refs, affected_refs, source=None, index=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1975
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1976
        @param input_refs: Input references, i.e. the references on the left side of
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1977
            the relation.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1978
        @param affected_refs: Affected references, i.e. the references of the setting
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1979
            that have been assigned something as a result of the relation execution.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1980
        @param source: The source of the relation. Can be e.g. the path to a RuleML file.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1981
        @param index: The index (number) of the relation in the source. This could be
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1982
            e.g. 1 to denote the first rule in a RuleML file.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1983
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1984
        self.input_refs = input_refs
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1985
        self.affected_refs = affected_refs
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1986
        self.source = source
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1987
        self.index = index
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1988
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1989
    def __repr__(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1990
        return "RelationExecutionResult(input_refs=%r, affected_refs=%r, source=%r, index=%r)" \
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1991
            % (sorted(self.input_refs), sorted(self.affected_refs), self.source, self.index)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1992
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1993
    def __eq__(self, other):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1994
        if type(self) is not type(other):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1995
            return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1996
        return sorted(self.input_refs) == sorted(other.input_refs) \
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1997
            and sorted(self.affected_refs) == sorted(other.affected_refs) \
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1998
            and self.source == other.source \
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  1999
            and self.index == other.index
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2000
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2001
    def __ne__(self, other):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2002
        return not (self == other)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2003
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2004
class RelationContainer(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2005
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2006
    A relation container that may contain relations or other
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2007
    RelationContainer objects.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2008
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2009
    def __init__(self, entries=[], source=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2010
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2011
        @param entries: The relations or relation containers to be added.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2012
        @param source: The source of the relations in this container. Can be
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2013
            e.g. the path to a RuleML file.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2014
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2015
        self.entries = entries
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2016
        self.source = source
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2017
        
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2018
    def execute(self, context=None):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2019
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2020
        Execute all relations inside the container, logging any exceptions thrown
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2021
        during the execution.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2022
        @return: A list of RelationExecutionResult objects.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2023
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2024
        results = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2025
        for i, entry in enumerate(self.entries):
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2026
            
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2027
            if isinstance(entry, rules.RelationBase):
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2028
                result = self._execute_relation_and_log_error(entry, self.source, i + 1, context)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2029
                if isinstance(RelationExecutionResult):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2030
                    results.append(result)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2031
            elif isinstance(entry, RelationContainer):
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2032
                results.extend(self._execute_container_and_log_error(entry, context))
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2033
            else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2034
                logging.getLogger('cone').warning("Invalid RelationContainer entry: type=%s, obj=%r" % (type(entry), entry))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2035
        return results
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2036
    
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2037
    def _execute_relation_and_log_error(self, relation, source, index, context=None):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2038
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2039
        Execute a relation, logging any exceptions that may be thrown.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2040
        @param relation: The relation to execute.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2041
        @param source: The source of the rule.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2042
        @param index: The index of the rule, can be None if the index is not known.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2043
        @return: The return value from the relation execution, or None if an error occurred.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2044
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2045
        try: 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2046
            return relation.execute(context)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2047
        except Exception, e:
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2048
            msg = "Error executing rule %r: %s: %s" % (relation, e.__class__.__name__, e)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2049
            if context:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2050
                gout = GenerationOutput('exception from %s' % source, 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2051
                                        relation, 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2052
                                        phase=context.phase,
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2053
                                        type='exception',
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2054
                                        output=context.output,
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2055
                                        exception=msg)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2056
                context.generation_output.append(gout)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2057
            utils.log_exception(logging.getLogger('cone'), msg)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2058
            return None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2059
    
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2060
    def _execute_container_and_log_error(self, container, context):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2061
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2062
        Execute a relation container, logging any exceptions that may be thrown.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2063
        @param relation: The relation container to execute.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2064
        @return: The results from the relation execution, or an empty list if an error occurred.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2065
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2066
        try:
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2067
            return container.execute(context)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2068
        except Exception, e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2069
            log = logging.getLogger('cone')
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2070
            utils.log_exception(log, "Exception executing rules in '%s': %s" % container.source, e)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2071
            return []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2072
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2073
    def get_relation_count(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2074
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2075
        Return the number of relations in this container.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2076
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2077
        count = 0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2078
        for entry in self.entries:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2079
            if isinstance(entry, RelationContainer):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2080
                count += entry.get_relation_count()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2081
            else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2082
                count += 1
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2083
        return count
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2084
    
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2085
    def get_relations(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2086
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2087
        Return a list of all relations in this container.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2088
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2089
        result = []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2090
        for entry in self.entries:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2091
            if isinstance(entry, RelationContainer):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2092
                result.extend(entry.get_relations())
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2093
            else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2094
                result.append(entry)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2095
        return result
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2096
    
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2097
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2098
class ImplFactory(api.FactoryBase):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2099
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2100
    __registered_reader_classes = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2101
    __registered_reader_classes_override = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2102
    __common_reader_classes = [ImplContainerReader]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2103
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2104
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2105
    def get_reader_classes(cls):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2106
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2107
        return a list of reader classes
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2108
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2109
        reader_classes = cls.__common_reader_classes[:]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2110
        # If the reader class list is overridden, return that
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2111
        if cls.__registered_reader_classes_override is not None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2112
            reader_classes += cls.__registered_reader_classes_override
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2113
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2114
            # Load the classes if not loaded already
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2115
            if cls.__registered_reader_classes is None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2116
                cls.__registered_reader_classes = cls.__load_reader_classes()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2117
            reader_classes += cls.__registered_reader_classes
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2118
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2119
        return reader_classes
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2120
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2121
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2122
    def get_reader_dict(cls):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2123
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2124
        return a dictionary of reader classes, where key is the reader namespace
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2125
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2126
        reader_dict = {}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2127
        for reader in cls.get_reader_classes():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2128
            reader_dict[reader.NAMESPACE] = reader
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2129
        return reader_dict
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2130
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2131
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2132
    def get_supported_file_extensions(cls):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2133
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2134
        return a dictionary of reader classes, where key is the reader namespace
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2135
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2136
        file_extensions = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2137
        for reader in cls.get_reader_classes():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2138
            for fe in reader.FILE_EXTENSIONS:
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2139
                fe = fe.lower()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2140
                if fe not in file_extensions:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2141
                    file_extensions.append(fe)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2142
        return file_extensions
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2143
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2144
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2145
    def set_reader_classes_override(cls, reader_classes):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2146
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2147
        Override the list of registered reader classes.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2148
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2149
        This method is provided for unit tests.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2150
        @param reader_classes: Reader class list to use as override. Pass None to
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2151
            disable overriding.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2152
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2153
        cls.__registered_reader_classes_override = reader_classes
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2154
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2155
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2156
    def force_reload_reader_classes(cls):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2157
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2158
        Force-reload all reader classes.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2159
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2160
        cls.__registered_reader_classes = cls.__load_reader_classes()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2161
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2162
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2163
    def __load_reader_classes(cls):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2164
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2165
        Load all registered ImplML reader classes from plug-ins.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2166
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2167
        log = logging.getLogger('cone')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2168
        log.setLevel(logging.DEBUG)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2169
        reader_classes = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2170
        ENTRY_POINT = 'cone.plugins.implmlreaders'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2171
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2172
        import pkg_resources
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2173
        working_set = pkg_resources.WorkingSet(sys.path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2174
        for entry_point in working_set.iter_entry_points(ENTRY_POINT):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2175
            reader_class = entry_point.load()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2176
            if not inspect.isclass(reader_class):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2177
                log.warn("'%s' entry point '%s' is not a class (%r)" % (ENTRY_POINT, entry_point.name, reader_class))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2178
            elif not issubclass(reader_class, ReaderBase):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2179
                log.warn("'%s' entry point '%s' is not a sub-class of cone.plugin.ReaderBase (%r)" % (ENTRY_POINT, entry_point.name, reader_class))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2180
            else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2181
                msg = "Reader class for XML namespace '%s' loaded from egg '%s' entry point '%s'" % (reader_class.NAMESPACE, ENTRY_POINT, entry_point.name)
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2182
                #log.debug(msg)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2183
                #print msg
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2184
                reader_classes.append(reader_class)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2185
                
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2186
        return reader_classes
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2187
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2188
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2189
    def is_supported_impl_file(cls, file_name):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2190
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2191
        Return whether the given file is a supported implementation file.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2192
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2193
        ext = os.path.splitext(file_name)[1]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2194
        if ext is not None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2195
            return ext[1:].lower() in cls.get_supported_file_extensions()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2196
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2197
            return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2198
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2199
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2200
    def get_impls_from_file(cls, resource_ref, configuration):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2201
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2202
        Get a list of implementation instances from the given file (resource in a configuration).
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2203
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2204
        @param resource_ref: Reference of the resource to read the impls from.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2205
        @param configuration: The configuration to use.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2206
        @return: List of implementation instances parsed and created from the file.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2207
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2208
        @raise NotSupportedException: The file contains an XML namespace that is
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2209
            not registered as an ImplML namespace.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2210
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2211
        context = parsecontext.get_implml_context()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2212
        context.current_file = resource_ref
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2213
        try:
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2214
            resource = configuration.get_resource(resource_ref)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2215
            try:        data = resource.read()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2216
            finally:    resource.close()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2217
            
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2218
            # Schema-validation while parsing disabled for now
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2219
            #cone.validation.schemavalidation.validate_implml_data(data)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2220
            
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2221
            impls = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2222
            reader_dict = cls.get_reader_dict()
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2223
            
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2224
            root =  utils.etree.fromstring(data)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2225
            ns = utils.xml.split_tag_namespace(root.tag)[0]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2226
            if ns not in reader_dict.keys():
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2227
                context.handle_problem(api.Problem("No reader for namespace '%s'" % ns,
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2228
                                                   type="xml.implml",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2229
                                                   file=resource_ref,
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2230
                                                   line=utils.etree.get_lineno(root)))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2231
                #logging.getLogger('cone').error("Error: no reader for namespace '%s' in %s" % (ns, resource_ref))
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2232
                return []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2233
            rc = reader_dict[ns]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2234
            # return the single implementation as a list to maintain 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2235
            # backwards compability
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2236
            impl = rc.read_impl(resource_ref, configuration, root)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2237
            impl.index = 0
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2238
            impl.lineno = utils.etree.get_lineno(root)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2239
            return [impl]
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2240
        except Exception, e:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2241
            if isinstance(e, exceptions.XmlParseError):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2242
                e.problem_type = 'xml.implml'
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2243
            context.handle_exception(e)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2244
            return []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2245
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2246
def get_impl_set(configuration,filter='.*'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2247
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2248
    return a ImplSet object that contains all implementation objects related to the 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2249
    given configuration
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2250
    """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2251
    impls = configuration.layered_implml().flatten().values()
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2252
    impls = pre_filter_impls(impls)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2253
    # filter the resources with a given filter
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2254
    impls = utils.resourceref.filter_resources(impls,filter)
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2255
    impl_set = create_impl_set(impls,configuration)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2256
    return impl_set
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2257
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2258
def filtered_impl_set(configuration,pathfilters=None, reffilters=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2259
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2260
    return a ImplSet object that contains all implementation objects related to the 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2261
    given configuration
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2262
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2263
    if pathfilters: logging.getLogger('cone').info('Filtering impls with %s' % pathfilters)
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2264
    impls = configuration.layered_implml().flatten().values()
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2265
    impls = pre_filter_impls(impls)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2266
    # filter the resources with a given filter
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2267
    if pathfilters:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2268
        newimpls = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2269
        for filter in pathfilters:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2270
            newimpls += utils.resourceref.filter_resources(impls,filter)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2271
        impls = utils.distinct_array(newimpls)
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2272
    impl_set = create_impl_set(impls,configuration,reffilters)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2273
    return impl_set
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2274
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2275
def create_impl_set(impl_filename_list, configuration,reffilters=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2276
    impl_filename_list = pre_filter_impls(impl_filename_list)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2277
    if reffilters: logging.getLogger('cone').info('Filtering with refs %s' % reffilters)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2278
    impl_container = ImplSet()
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2279
    impl_container.generation_context = GenerationContext()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2280
    impl_container.generation_context.configuration = configuration
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2281
    for impl in impl_filename_list:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2282
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2283
            if configuration != None and ImplFactory.is_supported_impl_file(impl):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2284
                plugin_impls = ImplFactory.get_impls_from_file(impl, configuration)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2285
                for plugin_impl in plugin_impls:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2286
                    if not reffilters or plugin_impl.has_ref(reffilters):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2287
                        impl_container.add_implementation(plugin_impl)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2288
        except Exception, e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2289
            utils.log_exception(logging.getLogger('cone'), "Creating impl '%s' failed. Exception: %s" % (impl,e))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2290
            continue
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2291
    return impl_container
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2292
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2293
def pre_filter_impls(impls):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2294
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2295
    Pre-filter implementation file refs so that files and directories
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2296
    beginning with a dot (e.g. '.svn', '.scripts') are ignored.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2297
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2298
    filter = r'(/|^|\\)\..*(/|$|\\)'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
  2299
    return utils.resourceref.neg_filter_resources(impls, filter)
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2300
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2301
def read_impl_from_location(resource_ref, configuration, lineno):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
  2302
    return ReaderBase.read_impl_from_location(resource_ref, configuration, lineno)