configurationengine/source/cone/public/_plugin_reader.py
author m2lahtel
Tue, 10 Aug 2010 14:29:28 +0300
changeset 3 e7e0ae78773e
parent 0 2e8eeb919028
permissions -rw-r--r--
ConE 1.2.11 release
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     1
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     2
# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     3
# All rights reserved.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     4
# This component and the accompanying materials are made available
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     5
# under the terms of "Eclipse Public License v1.0"
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     6
# which accompanies this distribution, and is available
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     7
# at the URL "http://www.eclipse.org/legal/epl-v10.html".
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     8
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     9
# Initial Contributors:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    10
# Nokia Corporation - initial contribution.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    11
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    12
# Contributors:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    13
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    14
# Description:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    15
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    16
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    17
import copy
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    18
import logging
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    19
from cone.public import exceptions, api, utils
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    20
import plugin
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    21
import cone.confml.model
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    22
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    23
log = logging.getLogger('cone')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    24
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    25
# The XML namespace for common ImplML definitions
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    26
COMMON_IMPLML_NAMESPACE = "http://www.symbianfoundation.org/xml/implml/1"
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    27
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    28
# Name of the marker variable used to mark a feature as a temporary
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    29
# feature
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    30
TEMP_FEATURE_MARKER_VARNAME = '__plugin_temp_feature_marker'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    31
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    32
class TempVariableDefinition(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    33
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    34
    Class representing a temporary variable definition in an implementation file.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    35
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    36
    
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    37
    def __init__(self, ref, type, value, lineno=None):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    38
        self.ref = ref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    39
        self.type = type
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    40
        self.value = value
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    41
        self.lineno = lineno
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    42
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    43
    def create_feature(self, config):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    44
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    45
        Add a feature based on this temp feature definition to the given configuration.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    46
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    47
        if '.' in self.ref:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    48
            pos = self.ref.rfind('.')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    49
            ref = self.ref[pos + 1:]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    50
            namespace = self.ref[:pos]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    51
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    52
            ref = self.ref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    53
            namespace = ''
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    54
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    55
        mapping = {'string' : cone.confml.model.ConfmlStringSetting,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    56
                   'int'    : cone.confml.model.ConfmlIntSetting,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    57
                   'real'   : cone.confml.model.ConfmlRealSetting,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    58
                   'boolean': cone.confml.model.ConfmlBooleanSetting}
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    59
        # Create temp variables always name being also the ref
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    60
        feature = mapping[self.type](ref, name=ref)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    61
        setattr(feature, TEMP_FEATURE_MARKER_VARNAME, True)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    62
        config.add_feature(feature, namespace)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    63
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    64
        value = utils.expand_refs_by_default_view(self.value, config.get_default_view())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    65
        config.add_data(api.Data(fqr=self.ref, value=value))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    66
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    67
    def __eq__(self, other):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    68
        if type(self) is type(other):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    69
            for varname in ('ref', 'type', 'value'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    70
                if getattr(self, varname) != getattr(other, varname):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    71
                    return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    72
            return True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    73
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    74
            return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    75
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    76
    def __ne__(self, other):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    77
        return not (self == other)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    78
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    79
    def __repr__(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    80
        return "TempFeatureDefinition(ref=%r, type=%r, value=%r)" % (self.ref, self.type, self.value)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    81
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    82
class TempVariableSequenceDefinition(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    83
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    84
    Class representing a temporary variable sequence definition in an implementation file.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    85
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    86
    
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    87
    def __init__(self, ref, sub_items, lineno=None):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    88
        self.ref = ref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    89
        self.sub_items = sub_items
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    90
        self.lineno = lineno
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    91
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    92
    def create_feature(self, config):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    93
        if '.' in self.ref:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    94
            pos = self.ref.rfind('.')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    95
            ref = self.ref[pos + 1:]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    96
            namespace = self.ref[:pos]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    97
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    98
            ref = self.ref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    99
            namespace = ''
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   100
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   101
        # Creature the sequence feature
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   102
        # Create temp variables always name being also the ref
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   103
        seq_fea = api.FeatureSequence(ref, name=ref)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   104
        setattr(seq_fea, TEMP_FEATURE_MARKER_VARNAME, True)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   105
        config.add_feature(seq_fea, namespace)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   106
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   107
        # Create the sub-features
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   108
        mapping = {'string' : cone.confml.model.ConfmlStringSetting,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   109
                   'int'    : cone.confml.model.ConfmlIntSetting,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   110
                   'real'   : cone.confml.model.ConfmlRealSetting,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   111
                   'boolean': cone.confml.model.ConfmlBooleanSetting}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   112
        sub_features = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   113
        for sub_item in self.sub_items:
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   114
            sub_feature = mapping[sub_item[1]](sub_item[0], name=sub_item[0])
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   115
            seq_fea.add_feature(sub_feature)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   116
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   117
    def __eq__(self, other):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   118
        if type(self) is type(other):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   119
            return self.ref == other.ref and self.sub_items == other.sub_items
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   120
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   121
            return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   122
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   123
    def __ne__(self, other):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   124
        return not (self == other)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   125
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   126
    def __repr__(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   127
        return "TempSeqFeatureDefinition(ref=%r, sub_items=%r)" % (self.ref, self.sub_items)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   128
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   129
class SettingRefsOverride(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   130
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   131
    Class representing a setting reference override for an implementation.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   132
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   133
    def __init__(self, refs=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   134
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   135
        @param refs: The reference overrides, can be a list of references or None.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   136
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   137
        self.refs = refs
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   138
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   139
    def get_refs(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   140
        return self.refs
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   141
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   142
    def __eq__(self, other):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   143
        if type(self) is type(other):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   144
            return self.refs == other.refs
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   145
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   146
            return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   147
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   148
    def __ne__(self, other):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   149
        return not (self == other)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   150
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   151
    def __repr__(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   152
        return "SettingRefsOverride(refs=%r)" % self.refs
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   153
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   154
class CommonImplmlData(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   155
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   156
    Class representing the common ImplML namespace data read from
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   157
    an XML element.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   158
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   159
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   160
    def __init__(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   161
        self.phase = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   162
        self.tags = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   163
        self.tempvar_defs = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   164
        self.setting_refs_override = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   165
        self.output_root_dir = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   166
        self.output_sub_dir = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   167
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   168
    def apply(self, impl):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   169
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   170
        Apply the data on the given implementation instance.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   171
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   172
        if self.phase:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   173
            impl.set_invocation_phase(self.phase)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   174
        if self.tags:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   175
            impl.set_tags(self.tags)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   176
        if self.setting_refs_override:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   177
            # Override the get_refs() method of the implementation
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   178
            impl.get_refs = self.setting_refs_override.get_refs
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   179
            # Override also the has_ref() method in case it is overridden
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   180
            # in the implementation sub-class
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   181
            impl.has_ref = lambda refs: plugin.ImplBase.has_ref(impl, refs)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   182
        if self.output_root_dir:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   183
            impl.set_output_root_override(self.output_root_dir)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   184
        if self.output_sub_dir:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   185
            impl.output_subdir = self.output_sub_dir
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   186
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   187
    def extend(self, other):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   188
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   189
        Extend this object with the contents of another CommonImplmlData object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   190
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   191
        if other is None:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   192
            return
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   193
        
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   194
        if other.phase:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   195
            self.phase = other.phase
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   196
        if other.tags:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   197
            self.tags = other.tags
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   198
        if other.setting_refs_override:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   199
            self.setting_refs_override = other.setting_refs_override
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   200
        if other.output_root_dir:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   201
            self.output_root_dir = other.output_root_dir
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   202
        if other.output_sub_dir:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   203
            self.output_sub_dir = other.output_sub_dir
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   204
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   205
    def copy(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   206
        result = CommonImplmlData()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   207
        result.phase = self.phase
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   208
        if self.tags is not None:
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   209
            result.tags = self.tags.copy()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   210
        result.tempvar_defs = list(self.tempvar_defs)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   211
        result.setting_refs_override = copy.deepcopy(self.setting_refs_override)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   212
        result.output_root_dir = self.output_root_dir
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   213
        result.output_sub_dir = self.output_sub_dir
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   214
        return result
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   215
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   216
    def __eq__(self, other):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   217
        if type(self) is type(other):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   218
            for varname in ('phase', 'tags', 'tempvar_defs', 'setting_refs_override', 'output_root_dir', 'output_sub_dir'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   219
                if getattr(self, varname) != getattr(other, varname):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   220
                    return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   221
            return True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   222
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   223
            return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   224
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   225
    def __ne__(self, other):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   226
        return not (self == other)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   227
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   228
    def __repr__(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   229
        return "CommonImplmlData(phase=%r, tags=%r, tempvar_defs=%r, setting_refs_override=%r, output_root_dir=%r, output_sub_dir=%r)" \
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   230
            % (self.phase,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   231
               self.tags,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   232
               self.tempvar_defs,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   233
               self.setting_refs_override,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   234
               self.output_root_dir,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   235
               self.output_sub_dir)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   236
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   237
class ImplReader(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   238
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   239
    Internal reader class for reading implementations from a file in a configuration.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   240
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   241
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   242
    # The reader class list loaded using ImplFactory
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   243
    __loaded_reader_classes = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   244
    __reader_classes = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   245
    __supported_file_extensions = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   246
    __ignored_namespaces = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   247
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   248
    def __init__(self, resource_ref, configuration):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   249
        self.resource_ref = resource_ref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   250
        self.configuration = configuration
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   251
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   252
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   253
    def _load_data_from_plugins(cls):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   254
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   255
        Load all data needed for implementation parsing from the plug-ins.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   256
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   257
        The actual loading is only done the first time this method is called.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   258
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   259
        # Load the data only if the reader class list has not been loaded
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   260
        # yet or it has changed
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   261
        loaded_reader_classes = plugin.ImplFactory.get_reader_classes()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   262
        if cls.__loaded_reader_classes is loaded_reader_classes:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   263
            return
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   264
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   265
        reader_classes = [plugin.ReaderBase]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   266
        reader_classes.extend(loaded_reader_classes)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   267
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   268
        cls.__reader_classes = {}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   269
        cls.__ignored_namespaces = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   270
        cls.__supported_file_extensions = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   271
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   272
        for rc in reader_classes:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   273
            # Reader class
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   274
            ns = rc.NAMESPACE
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   275
            if ns is not None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   276
                if ns in cls.__reader_classes:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   277
                    raise RuntimeError("Multiple reader classes registered for ImplML namespace '%s': at least %s and %s"\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   278
                                       % (ns, rc, cls.__reader_classes[ns]))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   279
                cls.__reader_classes[ns] = rc
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   280
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   281
            # Ignored namespaces
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   282
            for ns in rc.IGNORED_NAMESPACES:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   283
                if ns not in cls.__ignored_namespaces:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   284
                    cls.__ignored_namespaces.append(ns)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   285
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   286
            # Supported file extensions
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   287
            for fe in rc.FILE_EXTENSIONS:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   288
                fe = fe.lower()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   289
                if fe not in cls.__supported_file_extensions:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   290
                    cls.__supported_file_extensions.append(fe)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   291
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   292
        cls.__loaded_reader_classes = loaded_reader_classes
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   293
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   294
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   295
    def _get_namespaces(cls, etree):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   296
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   297
        Return a list of XML namespaces in the given element tree.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   298
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   299
        namespaces = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   300
        namespaces.append(utils.xml.split_tag_namespace(etree.tag)[0])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   301
        for elem in etree:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   302
            ns = utils.xml.split_tag_namespace(elem.tag)[0]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   303
            if ns not in namespaces:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   304
                namespaces.append(ns)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   305
        return filter(lambda ns: ns is not None, namespaces)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   306
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   307
    def _read_impls_from_file_root_element(self, root, namespaces):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   308
        impls = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   309
        reader_classes = self.get_reader_classes()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   310
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   311
        # Go through the list of XML namespaces encountered in the
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   312
        # file and read an implementation using the corresponding
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   313
        # reader for each namespace
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   314
        impl_count = 0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   315
        common_data = CommonImplmlDataReader.read_data(root)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   316
        for ns in namespaces:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   317
            if ns not in reader_classes: continue
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   318
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   319
            rc = reader_classes[ns]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   320
            impl = self._read_impl(rc, root)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   321
            if impl:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   322
                impl.index = impl_count
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   323
                impl_count += 1
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   324
                if common_data: common_data.apply(impl)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   325
                impls.append(impl)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   326
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   327
        # Add temp feature definitions to the first implementation
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   328
        if common_data and impls:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   329
            impls[0]._tempvar_defs.extend(common_data.tempvar_defs)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   330
        return impls
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   331
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   332
    def _read_impls_from_file_sub_elements(self, root):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   333
        impls = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   334
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   335
        # Collect common ImplML namespace data
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   336
        common_data = CommonImplmlData()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   337
        for elem in root:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   338
            ns = utils.xml.split_tag_namespace(elem.tag)[0]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   339
            if ns == COMMON_IMPLML_NAMESPACE:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   340
                cd = CommonImplmlDataReader.read_data(elem)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   341
                if cd: common_data.extend(cd)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   342
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   343
        # Go through all sub-elements and read an implementation instance
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   344
        # from each if possible
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   345
        impl_count = 0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   346
        reader_classes = self.get_reader_classes()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   347
        for elem in root:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   348
            ns = utils.xml.split_tag_namespace(elem.tag)[0]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   349
            if ns != COMMON_IMPLML_NAMESPACE and ns in reader_classes:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   350
                reader_class = reader_classes[ns]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   351
                impl = self._read_impl(reader_class, elem)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   352
                if impl:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   353
                    cd = CommonImplmlDataReader.read_data(elem)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   354
                    if cd is not None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   355
                        impl._tempvar_defs.extend(cd.tempvar_defs)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   356
                        data = common_data.copy()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   357
                        data.extend(cd)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   358
                        data.apply(impl)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   359
                    else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   360
                        common_data.apply(impl)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   361
                    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   362
                    impl.index = impl_count
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   363
                    impl_count += 1
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   364
                    impls.append(impl)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   365
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   366
        # Add temporary feature definitions to the first implementation instance
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   367
        if impls:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   368
            impls[0]._tempvar_defs = common_data.tempvar_defs + impls[0]._tempvar_defs
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   369
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   370
        return impls
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   371
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   372
    def _read_impl(self, reader_class, elem):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   373
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   374
        Read an implementation with the given reader class from the given element.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   375
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   376
        If an exception is raised during reading, the exception is logged
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   377
        and None returned. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   378
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   379
        @return: The read implementation or None.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   380
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   381
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   382
            return reader_class.read_impl(self.resource_ref, self.configuration, elem)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   383
        except exceptions.ParseError, e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   384
            log.error("Error reading implementation '%s': %s", (self.resource_ref, e))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   385
        except Exception, e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   386
            utils.log_exception(log, e)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   387
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   388
        return None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   389
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   390
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   391
    def get_reader_classes(cls):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   392
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   393
        Return a dictionary of all possible implementation reader classes.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   394
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   395
        Dictionary key is the XML namespace and the value is the corresponding
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   396
        reader class.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   397
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   398
        cls._load_data_from_plugins()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   399
        return cls.__reader_classes
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   400
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   401
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   402
    def get_supported_file_extensions(cls):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   403
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   404
        Return a list of all supported implementation file extensions.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   405
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   406
        cls._load_data_from_plugins()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   407
        return cls.__supported_file_extensions
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   408
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   409
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   410
    def get_ignored_namespaces(cls):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   411
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   412
        Return a list of all ignored XML namespaces.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   413
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   414
        cls._load_data_from_plugins()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   415
        return cls.__ignored_namespaces
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   416
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   417
    def read_implementations(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   418
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   419
            root = plugin.ReaderBase._read_xml_doc_from_resource(self.resource_ref, self.configuration)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   420
            return self.read_implementation(root)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   421
        except exceptions.ParseError, e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   422
            # Invalid XML data in the file
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   423
            log.error(e)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   424
            return []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   425
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   426
    def read_implementation(self, xmlroot):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   427
        root = xmlroot
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   428
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   429
        # Check if the implementations should all be read from the
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   430
        # document root, or each from its own sub-element under the root
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   431
        read_from_root = False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   432
        ns = utils.xml.split_tag_namespace(root.tag)[0]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   433
        if ns: read_from_root = True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   434
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   435
        # Collect namespaces from the file and check that all are supported or ignored
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   436
        namespaces = self._get_namespaces(root)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   437
        for ns in namespaces:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   438
            if ns != COMMON_IMPLML_NAMESPACE \
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   439
                and ns not in self.get_reader_classes() \
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   440
                and ns not in self.get_ignored_namespaces():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   441
                log.error("Unsupported XML namespace '%s' in file '%s'" % (ns, self.resource_ref))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   442
                return []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   443
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   444
        if read_from_root:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   445
            impls = self._read_impls_from_file_root_element(root, namespaces)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   446
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   447
            impls = self._read_impls_from_file_sub_elements(root)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   448
        return impls
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   449
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   450
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   451
class CommonImplmlDataReader(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   452
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   453
    Internal reader class for reading common ImplML namespace data from and element.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   454
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   455
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   456
    VALID_PHASES = ('pre', 'normal', 'post')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   457
    VALID_TYPES = ('string', 'int', 'real', 'boolean')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   458
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   459
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   460
    def read_data(cls, etree):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   461
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   462
        Read common ImplML data from the given XML element.
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   463
        @return: A CommonImplmlData instance.
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   464
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   465
        result = CommonImplmlData()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   466
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   467
        reader_methods = {'phase'                   : cls._read_phase,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   468
                          'tag'                     : cls._read_tag,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   469
                          'tempVariable'            : cls._read_tempvar,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   470
                          'tempVariableSequence'    : cls._read_tempvarseq,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   471
                          'settingRefsOverride'     : cls._read_setting_refs_override,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   472
                          'outputRootDir'           : cls._read_output_root_dir,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   473
                          'outputSubDir'            : cls._read_output_sub_dir}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   474
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   475
        for elem in etree:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   476
            ns, tag = utils.xml.split_tag_namespace(elem.tag)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   477
            if ns != COMMON_IMPLML_NAMESPACE:   continue
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   478
            if tag not in reader_methods:       continue
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   479
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   480
            reader_methods[tag](elem, result)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   481
        
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   482
        return result
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   483
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   484
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   485
    def _read_phase(cls, elem, result):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   486
        phase = elem.get('name')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   487
        if phase is None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   488
            cls._raise_missing_attr(elem, 'name')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   489
        if phase not in cls.VALID_PHASES:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   490
            raise exceptions.ParseError("Invalid invocation phase '%s' defined." % phase)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   491
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   492
        result.phase = phase
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   493
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   494
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   495
    def _read_tag(cls, elem, result):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   496
        name = elem.get('name')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   497
        value = elem.get('value')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   498
        if name is not None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   499
            if result.tags is None:     result.tags = {}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   500
            if name not in result.tags: result.tags[name] = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   501
            result.tags[name].append(value)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   502
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   503
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   504
    def _read_tempvar(cls, elem, result):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   505
        ref = elem.get('ref')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   506
        type = elem.get('type', 'string')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   507
        value = elem.get('value', '')
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   508
        lineno = utils.etree.get_lineno(elem)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   509
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   510
        if ref is None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   511
            cls._raise_missing_attr(elem, 'ref')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   512
        if type not in cls.VALID_TYPES:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   513
            cls._raise_invalid_type(ref, type)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   514
        
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   515
        result.tempvar_defs.append(TempVariableDefinition(ref, type, value, lineno))
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   516
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   517
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   518
    def _read_tempvarseq(cls, elem, result):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   519
        ref = elem.get('ref')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   520
        if ref is None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   521
            cls._raise_missing_attr(elem, 'ref')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   522
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   523
        sub_items = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   524
        for sub_elem in elem.findall('{%s}tempVariable' % COMMON_IMPLML_NAMESPACE):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   525
            sub_ref = sub_elem.get('ref')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   526
            sub_type = sub_elem.get('type', 'string')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   527
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   528
            if sub_ref is None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   529
                cls._raise_missing_attr(sub_elem, 'ref')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   530
            if sub_type not in cls.VALID_TYPES:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   531
                cls._raise_invalid_type(sub_ref, sub_type)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   532
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   533
            sub_items.append((sub_ref, sub_type))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   534
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   535
        if not sub_items:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   536
            raise exceptions.ParseError("Temporary variable sequence '%s' does not have any sub-items" % ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   537
        
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   538
        lineno = utils.etree.get_lineno(elem)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   539
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   540
        result.tempvar_defs.append(TempVariableSequenceDefinition(ref, sub_items, lineno))
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   541
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   542
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   543
    def _read_setting_refs_override(cls, elem, result):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   544
        if elem.get('refsIrrelevant', 'false').lower() in ('1', 'true'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   545
            refs = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   546
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   547
            refs = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   548
            for sub_elem in elem.findall('{%s}settingRef' % COMMON_IMPLML_NAMESPACE):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   549
                ref = sub_elem.get('value')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   550
                
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   551
                if ref is None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   552
                    cls._raise_missing_attr(sub_elem, 'value')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   553
                
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   554
                refs.append(ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   555
                
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   556
        result.setting_refs_override = SettingRefsOverride(refs)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   557
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   558
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   559
    def _read_output_root_dir(cls, elem, result):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   560
        value = elem.get('value')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   561
        if value: result.output_root_dir = value
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   562
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   563
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   564
    def _read_output_sub_dir(cls, elem, result):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   565
        value = elem.get('value')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   566
        if value: result.output_sub_dir = value
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   567
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   568
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   569
    def _raise_missing_attr(cls, elem, attrname):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   570
        raise exceptions.ParseError("XML element %s does not contain the mandatory '%s' attribute." % (elem.tag, attrname))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   571
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   572
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   573
    def _raise_invalid_type(cls, ref, type):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   574
        raise exceptions.ParseError("Invalid feature type '%s' specified for temporary ConfML feature '%s'." % (type, ref))