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