configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/templatemlplugin.py
author m2lahtel
Wed, 08 Sep 2010 12:20:56 +0300
changeset 4 0951727b8815
parent 3 e7e0ae78773e
permissions -rw-r--r--
Updated to 1.2.13 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
Template plugin for ConE that handles templateml files. Utilizes Jinja template engine.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    18
'''
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    19
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    20
import re
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    21
import os
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    22
import logging
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    23
import codecs
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    24
import pkg_resources
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    25
from jinja2 import Environment, DictLoader
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    26
import traceback
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    27
try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    28
    from cElementTree import ElementTree
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    29
except ImportError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    30
    try:    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    31
        from elementtree import ElementTree
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    32
    except ImportError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    33
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    34
            from xml.etree import cElementTree as ElementTree
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    35
        except ImportError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    36
            from xml.etree import ElementTree
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    37
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    38
try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    39
    from cElementTree import ElementInclude
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    40
except ImportError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    41
    try:    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    42
        from elementtree import ElementInclude
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    43
    except ImportError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    44
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    45
            from xml.etree import cElementInclude as ElementInclude
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    46
        except ImportError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    47
            from xml.etree import ElementInclude
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    48
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    49
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    50
from cone.public import exceptions,plugin,utils 
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    51
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    52
ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    53
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    54
class TemplatemlImpl(plugin.ImplBase):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    55
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    56
    context = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    57
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    58
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    59
    Implementation class of template plugin.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    60
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    61
    
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    62
    IMPL_TYPE_ID = "templateml"
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    63
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    64
    def __init__(self,ref,configuration, reader=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    65
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    66
        Overloading the default constructor
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    67
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    68
        plugin.ImplBase.__init__(self,ref,configuration)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    69
        self.logger = logging.getLogger('cone.templateml(%s)' % self.ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    70
        self.errors = False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    71
        self.reader = reader
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    72
        if self.reader and self.reader.tags:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    73
            self.set_tags(self.reader.tags)
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    74
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    75
    def __getstate__(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    76
        state = super(TemplatemlImpl, self).__getstate__()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    77
        state['reader'] = self.reader
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    78
        return state
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    79
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    80
    def get_context(self, generation_context):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    81
        ddict = generation_context.impl_data_dict 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    82
        if ddict.get('templateml_context', None) is None:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    83
            ddict['templateml_context'] = self.create_dict()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    84
        return ddict['templateml_context']
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    85
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    86
    def generate(self, context=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    87
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    88
        Generate the given implementation.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    89
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    90
        self.context = context
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    91
        self.logger.debug('Generating from %s:%s' % (self.ref, self.lineno))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    92
        self.create_output(context)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    93
        return 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    94
    
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    95
    def create_output(self, generation_context):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    96
        templateml_context = self.get_context(generation_context)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    97
        templateml_context['gen_context'] = generation_context
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    98
        if not generation_context.configuration:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    99
            generation_context.configuration = self.configuration
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   100
        self.reader.expand_output_refs_by_default_view()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   101
        generator = Generator(self.reader.outputs, self.reader.filters, templateml_context, self)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   102
        generator.generate(generation_context, self.ref)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   103
        return
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   104
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   105
    def get_refs(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   106
        refs = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   107
        for output in self.reader.outputs:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   108
            template = output.template.template
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   109
            refs.extend(self._extract_refs_from_template(template))
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   110
            refs_oa = self._extract_refs_from_output_attribs(output)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   111
            for r in refs_oa:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   112
                if refs.count(r) < 1:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   113
                    refs.append(r)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   114
        return refs
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   115
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   116
    def _extract_refs_from_output_attribs(self, output):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   117
        refs = [] 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   118
        pattern = re.compile(r'\$\{(.*)\}', re.UNICODE)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   119
        for key, value in vars(output).iteritems():
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   120
            m = pattern.search(str(value))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   121
            if m:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   122
                ref = m.group(1)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   123
                refs.append(ref)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   124
            if key == 'ref':
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   125
                refs.append(value)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   126
        return refs
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   127
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   128
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   129
    def _extract_refs_from_template(cls, template_text):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   130
        refs = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   131
        pattern = re.compile(r'feat_tree\.((?:\.?\w+)*)', re.UNICODE)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   132
        for m in re.finditer(pattern, template_text):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   133
            ref = m.group(1)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   134
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   135
            # ref may now be e.g. 'MyFeature.MySetting._value', so
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   136
            # remove the last part if it starts with an underscore 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   137
            index = ref.rfind('.')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   138
            if index != -1 and index < len(ref) and ref[index + 1] == '_':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   139
                ref = ref[:index]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   140
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   141
            refs.append(ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   142
        return refs
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   143
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   144
    def has_ref(self, refs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   145
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   146
        @returns True if the implementation uses the given ref as input value.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   147
        Otherwise return False.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   148
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   149
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   150
        # Does not support template inheritance
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   151
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   152
        if not isinstance(refs, list):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   153
            refs = [refs] 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   154
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   155
        for output in self.reader.outputs:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   156
            if re.search("feat_list.*", output.template.template) != None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   157
                return True
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   158
        return plugin.uses_ref(refs, self.get_refs())
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   159
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   160
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   161
    def list_output_files(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   162
        """ Return a list of output files as an array. """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   163
        result = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   164
        for output in self.reader.outputs:
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   165
            filename = ""
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   166
            if output.fearef != None:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   167
                filename = self.configuration.get_default_view().get_feature(output.fearef).value
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   168
            else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   169
                filename = output.filename
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   170
            result.append(os.path.normpath(os.path.join(self.output, output.path, filename)))
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   171
        return result
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   172
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   173
    def create_dict(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   174
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   175
        Creates dict from configuration that can be passed to template engine.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   176
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   177
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   178
        context_dict = {}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   179
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   180
        if self.configuration:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   181
            dview = self.configuration.get_default_view()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   182
            feat_list = []
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   183
            feat_tree = FeatureDictProxy(None)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   184
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   185
            def add_feature(feature, feature_dict):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   186
                fea_dict = FeatureDictProxy(feature)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   187
                feat_list.append(fea_dict)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   188
                feature_dict[feature.ref] = fea_dict
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   189
                
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   190
                # Recursively add sub-features
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   191
                for sfeat in feature.list_features():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   192
                    add_feature(feature.get_feature(sfeat), fea_dict)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   193
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   194
            for fea in dview.list_features():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   195
                add_feature(dview.get_feature(fea), feat_tree)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   196
                
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   197
            context_dict['feat_list'] = feat_list
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   198
            context_dict['feat_tree'] = feat_tree
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   199
            context_dict['configuration'] = self.configuration
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   200
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   201
        return context_dict
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   202
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   203
def _expand_refs(text, config):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   204
    if config is not None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   205
        return utils.expand_refs_by_default_view(text, config.get_default_view())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   206
    else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   207
        return text
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   208
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   209
def _read_relative_file(configuration, relative_path, file_path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   210
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   211
    Read data from a file relative to the given other file path.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   212
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   213
    # Get the actual path (relative to the current file)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   214
    base_path = os.path.dirname(file_path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   215
    tempfile_path = os.path.normpath(os.path.join(base_path, relative_path)).replace('\\', '/')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   216
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   217
    # Read the file
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   218
    resource = configuration.get_resource(tempfile_path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   219
    try:        return resource.read()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   220
    finally:    resource.close()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   221
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   222
class TemplatemlImplReader(plugin.ReaderBase):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   223
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   224
    Parses a single templateml file
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   225
    """ 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   226
    NAMESPACE = 'http://www.s60.com/xml/templateml/1'
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   227
    NAMESPACE_ID = 'templateml'
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   228
    ROOT_ELEMENT_NAME = 'templateml'
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   229
    FILE_EXTENSIONS = ['templateml']
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   230
    NEWLINE_WIN_PARSE_OPTIONS = ['win', 'windows', 'dos', 'symbian', 'symbianos', 'cr+lf', 'crlf']
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   231
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   232
    def __init__(self, resource_ref=None, configuration=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   233
        self.desc = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   234
        self.namespaces = [self.NAMESPACE]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   235
        self.outputs = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   236
        self.filters = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   237
        self.tags = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   238
        self.resource_ref = resource_ref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   239
        self.configuration = 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
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   243
    def read_impl(cls, resource_ref, configuration, etree):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   244
        reader = TemplatemlImplReader(resource_ref, configuration)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   245
        reader.from_elementtree(etree)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   246
        return TemplatemlImpl(resource_ref, configuration, reader)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   247
    
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   248
    @classmethod
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   249
    def get_schema_data(cls):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   250
        return pkg_resources.resource_string('templatemlplugin', 'xsd/templateml.xsd')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   251
    
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   252
    def fromstring(self, xml_string):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   253
        etree = ElementTree.fromstring(xml_string)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   254
        self.from_elementtree(etree)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   255
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   256
    def from_elementtree(self, etree):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   257
        ElementInclude.include(etree)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   258
        self.desc = self.parse_desc(etree)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   259
        self.outputs = self.parse_outputs(etree)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   260
        self.filters = self.parse_filters(etree)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   261
        self.tags = self.parse_tags(etree)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   262
         
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   263
    def parse_desc(self,etree):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   264
        desc = ""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   265
        desc_elem = etree.find("{%s}desc" % self.namespaces[0])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   266
        if desc_elem != None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   267
            desc = desc_elem.text
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   268
        return desc
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   269
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   270
    def parse_filters(self, etree):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   271
        filters = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   272
        filter_elems = etree.findall("{%s}filter" % self.namespaces[0])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   273
        for filter_elem in filter_elems:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   274
            if filter_elem != None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   275
                filter = Filter()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   276
                
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   277
                if filter_elem.get('name') != None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   278
                    name = filter_elem.get('name')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   279
                    if self.configuration != None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   280
                        name = utils.expand_refs_by_default_view(name, self.configuration.get_default_view())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   281
                    filter.set_name(name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   282
                if filter_elem.get('file') != None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   283
                    file = filter_elem.get('file')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   284
                    if self.configuration != None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   285
                        file = utils.expand_refs_by_default_view(file, self.configuration.get_default_view())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   286
                    filter.set_path(file)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   287
                if filter_elem.text != None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   288
                    filter.set_code(filter_elem.text)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   289
                    if filter_elem.get('file') != None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   290
                        logging.getLogger('cone.templateml').warning("In filter element file attribute and text defined. Using filter found from file attribute.")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   291
                filters.append(filter)
4
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   292
        
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   293
        filters_elems = etree.findall("{%s}filters" % self.namespaces[0])
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   294
        for filters_elem in filters_elems:
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   295
            if filters_elem != None:
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   296
                filter = Filter()
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   297
                if filters_elem.get('file') != None:
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   298
                    file = filters_elem.get('file')
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   299
                    if self.configuration != None:
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   300
                        file = utils.expand_refs_by_default_view(file, self.configuration.get_default_view())
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   301
                    filter.set_path(file)
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   302
                if filters_elem.text != None:
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   303
                    filter.set_code(filters_elem.text)
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   304
                    if filters_elem.get('file') != None:
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   305
                        logging.getLogger('cone.templateml'). warning("In filters element file attribute and text defined. Using filters found from file attribute.")
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   306
                filters.append(filter)
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   307
                
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   308
        return filters
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   309
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   310
    def parse_tags(self, etree):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   311
        tags = {}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   312
        for tag in etree.getiterator("{%s}tag" % self.namespaces[0]):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   313
            tagname = tag.get('name','')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   314
            tagvalue = tag.get('value')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   315
            values = tags.get(tagname,[])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   316
            values.append(tagvalue)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   317
            tags[tagname] = values
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   318
        return tags
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   319
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   320
    def parse_template(self, output_elem):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   321
        tempfile = TempFile()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   322
        template_elems = output_elem.findall("{%s}template" % self.namespaces[0])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   323
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   324
        for template_elem in template_elems:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   325
            if template_elem.text != None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   326
                tempfile.set_template(template_elem.text)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   327
            else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   328
                for selem in template_elem:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   329
                    tempfile.set_template(selem.text)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   330
                    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   331
            if template_elem.get('file') != None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   332
                file = template_elem.get('file')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   333
                if template_elem.text != None: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   334
                    logging.getLogger('cone.templateml').warning("In template element file attribute and text defined. Using template found from file attribute.")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   335
                template_text = _read_relative_file(self.configuration, file, self.resource_ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   336
                tempfile.set_template(template_text)
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   337
        
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   338
        return tempfile
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   339
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   340
    def parse_outputs(self, etree):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   341
        outputs = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   342
        output_elems = etree.findall("{%s}output" % self.namespaces[0])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   343
        for output_elem in output_elems:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   344
            if output_elem != None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   345
                outputfile = OutputFile()
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   346
                outputfile.set_output_elem(output_elem)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   347
                if output_elem.get('encoding') != None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   348
                    encoding = output_elem.get('encoding')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   349
                    outputfile.set_encoding(encoding)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   350
                if output_elem.get('file') != None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   351
                    file = output_elem.get('file')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   352
                    outputfile.set_filename(file)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   353
                if output_elem.get('dir') != None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   354
                    dir = output_elem.get('dir')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   355
                    outputfile.set_path(dir)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   356
                if output_elem.get('ref'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   357
                    # Fetch the output value from a configuration reference
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   358
                    outputfile.set_fearef(output_elem.get('ref'))
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   359
                if output_elem.get('bom'):
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   360
                    outputfile.set_bom(output_elem.get('bom'))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   361
                if output_elem.get('newline', ''):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   362
                    outputfile.set_newline(output_elem.get('newline', ''))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   363
                
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   364
                outputfile.set_template(self.parse_template(output_elem))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   365
                outputfile.set_filters(self.parse_filters(output_elem))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   366
                outputs.append(outputfile)
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   367
                            
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   368
        return outputs
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   369
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   370
    def expand_output_refs_by_default_view(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   371
        for output in self.outputs:     
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   372
            if output.encoding:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   373
                if self.configuration != None:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   374
                    output.set_encoding(utils.expand_refs_by_default_view(output.encoding, self.configuration.get_default_view()))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   375
                try:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   376
                    codecs.lookup(output.encoding)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   377
                except LookupError:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   378
                    raise exceptions.ParseError("Invalid output encoding: %s" % output.encoding)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   379
            if output.filename:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   380
                if self.configuration != None:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   381
                    output.set_filename(utils.expand_refs_by_default_view(output.filename, self.configuration.get_default_view()))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   382
            if output.path:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   383
                if self.configuration != None:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   384
                    output.set_path(utils.expand_refs_by_default_view(output.path, self.configuration.get_default_view()))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   385
            if output.newline:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   386
                newline = output.newline
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   387
                if self.configuration != None:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   388
                    newline = utils.expand_refs_by_default_view(output.newline, self.configuration.get_default_view())
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   389
                if newline.lower() in self.NEWLINE_WIN_PARSE_OPTIONS:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   390
                    output.set_newline(OutputFile.NEWLINE_WIN)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   391
            if output.bom:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   392
                bom = output.bom
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   393
                if self.configuration != None:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   394
                    bom = utils.expand_refs_by_default_view(output.bom, self.configuration.get_default_view())
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   395
                output.bom = bom.lower() in ('1', 'true', 't', 'yes', 'y')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   396
            if output.fearef:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   397
                if self.configuration != None:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   398
                    fea = self.configuration.get_default_view().get_feature(output.fearef)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   399
                    output.set_filename(fea.value)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   400
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   401
class Generator(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   402
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   403
    Class that generates
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   404
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   405
    
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   406
    def __init__(self, outputs, filters, context, implementation=None):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   407
        self.outputs = outputs
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   408
        self.filters = filters
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   409
        self.context = context
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   410
        self.implementation = implementation
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   411
    
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   412
    def generate(self, generation_context, ref):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   413
        """ 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   414
        Generates output based on templates 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   415
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   416
        if self.outputs != None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   417
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   418
            for output in self.outputs:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   419
                try:
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   420
                    out_path = output.path
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   421
                    out_filepath = os.path.join(out_path, output.filename)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   422
                    logging.getLogger('cone.templateml').debug("Output file '%s', encoding '%s'" % (out_filepath, output.encoding))
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   423
                    
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   424
                    out_file = generation_context.create_file(out_filepath, implementation=self.implementation)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   425
                    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   426
                    if output.template.path:
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   427
                        output.template.template = _read_relative_file(generation_context.configuration, output.template.path, ref)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   428
                    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   429
                    dict_loader = DictLoader({'template': output.template.template})
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   430
                    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   431
                    if output.newline == OutputFile.NEWLINE_WIN:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   432
                        env = Environment(loader=dict_loader, newline_sequence='\r\n')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   433
                    else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   434
                        env = Environment(loader=dict_loader)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   435
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   436
                    # Common filters
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   437
                    for filter in self.filters:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   438
                        if filter.path:
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   439
                            filter.code = _read_relative_file(generation_context.configuration, filter.path, ref)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   440
                        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   441
                        if not filter.code:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   442
                            logging.getLogger('cone.templateml').warning("Skipping empty filter definition.")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   443
                        else:
4
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   444
                            # filter elements (lambda functions) have names
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   445
                            if filter.name:
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   446
                                env.filters[str(filter.name)] = eval(filter.code.replace('\r', ''))
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   447
                            # filters elements (any python functions) do not have names
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   448
                            else:
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   449
                                funcs = {}
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   450
                                exec(filter.code.strip().replace('\r', ''), funcs)
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   451
                                for k,v in funcs.items():
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   452
                                    env.filters[k] = v
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   453
                    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   454
                    # Output file specific filters
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   455
                    for filter in output.filters:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   456
                        if filter.path:
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   457
                            filter.code = _read_relative_file(generation_context.configuration, filter.path, ref)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   458
                        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   459
                        if not filter.code:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   460
                            logging.getLogger('cone.templateml').warning("Skipping empty filter definition.")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   461
                        else:
4
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   462
                            if filter.name:
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   463
                                env.filters[str(filter.name)] = eval(filter.code.replace('\r', ''))
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   464
                            else:
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   465
                                funcs = {}
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   466
                                exec(filter.code.strip().replace('\r', ''), funcs)
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   467
                                for k,v in funcs.items():
0951727b8815 Updated to 1.2.13 release
m2lahtel
parents: 3
diff changeset
   468
                                    env.filters[k] = v
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   469
                    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   470
                    template = env.get_template('template')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   471
                    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   472
                    file_string = template.render(self.context)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   473
                    out_file.write(self._encode_data(file_string, output.encoding, output.bom))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   474
                    out_file.close()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   475
                    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   476
                except Exception, e:
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   477
                    utils.log_exception(
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   478
                        logging.getLogger('cone.templateml'),
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   479
                        '%r: Failed to generate output: %s: %s' % (self.implementation, type(e).__name__, e))
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   480
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   481
            logging.getLogger('cone.templateml').info('No (valid) templates found.')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   482
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   483
    def _encode_data(self, data, encoding, write_bom):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   484
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   485
        Encode the given data using the given encoding and BOM definition.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   486
        @param data: The data to encode.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   487
        @param encoding: The encoding to use.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   488
        @param write_bom: True or False to define whether the BOM should be written
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   489
            for Unicode encodings, None for default.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   490
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   491
        data = data.encode(encoding)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   492
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   493
        # Check if we need to do special handling for BOM
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   494
        if write_bom is not None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   495
            BOM_MAPPING = {'utf-8'      : codecs.BOM_UTF8,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   496
                           'utf-16'     : codecs.BOM_UTF16,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   497
                           'utf-16-be'  : codecs.BOM_UTF16_BE,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   498
                           'utf-16-le'  : codecs.BOM_UTF16_LE}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   499
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   500
            # Use the name from a CodecInfo object to account for
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   501
            # aliases (e.g. U8 and UTF-8 both map to utf-8)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   502
            codec_info = codecs.lookup(encoding)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   503
            if codec_info.name in BOM_MAPPING:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   504
                # Add or remove as necessary
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   505
                BOM = BOM_MAPPING[codec_info.name]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   506
                if write_bom == True and not data.startswith(BOM):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   507
                    data = BOM + data
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   508
                elif write_bom == False and data.startswith(BOM):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   509
                    data = data[len(BOM):]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   510
        return data
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   511
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   512
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   513
class OutputFile(object):
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   514
    NEWLINE_UNIX = "unix"
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   515
    NEWLINE_WIN = "win" 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   516
    
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   517
    def __init__(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   518
        self.filename = ''
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   519
        self.path = ''
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   520
        self.encoding = "utf-8"
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   521
        self.template = TempFile()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   522
        self.filters = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   523
        self.bom = None
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   524
        self.newline = self.NEWLINE_UNIX
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   525
        self.fearef = None
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   526
        self.output_elem = None
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   527
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   528
    def set_newline(self, newline):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   529
        self.newline = newline
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   530
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   531
    def set_filename(self, filename):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   532
        self.filename = filename
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   533
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   534
    def set_path(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   535
        self.path = path
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   536
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   537
    def set_encoding(self, encoding):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   538
        self.encoding = encoding
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   539
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   540
    def set_template(self, template):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   541
        self.template = template
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   542
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   543
    def add_filter(self, filter):
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   544
        self.filters.append(filter)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   545
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   546
    def set_filters(self, filters):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   547
        self.filters = filters
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   548
    
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   549
    def set_bom(self, bom):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   550
        self.bom = bom
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   551
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   552
    def set_fearef(self, ref):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   553
        self.fearef = ref
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   554
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   555
    def set_output_elem(self, output_elem):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   556
        self.output_elem = output_elem
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   557
    
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   558
    def __eq__(self, other):
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   559
        if other:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   560
            if (self.template == other.template and self.newline == other.newline and self.encoding == other.encoding and self.path == other.path and self.filename == other.filename and self.filters == other.filters):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   561
                return True
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   562
        return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   563
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   564
    def __repr__(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   565
        return "OutputFile(filename=%r, path=%r, encoding=%r, template=%r, filters=%r" % (self.filename, self.path, self.encoding, self.template, self.filters)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   566
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   567
class TempFile(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   568
    def __init__(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   569
        self.template = ""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   570
        self.extensions = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   571
        self.filters = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   572
        self.path = ''
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   573
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   574
    def set_path(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   575
        self.path = path
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   576
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   577
    def set_template(self, template):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   578
        self.template = template
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   579
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   580
    def add_extension(self, extension):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   581
        self.extensions.append(extension)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   582
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   583
    def add_filter(self, filter):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   584
        self.filters.append(filter)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   585
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   586
    def add_filter2(self, name, code):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   587
        self.filters.append(Filter(name, code))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   588
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   589
    def __eq__(self, other):
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   590
        if other:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   591
            if self.template == other.template and self.filters == other.filters and self.extensions == other.extensions and self.path == other.path:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   592
                return True
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   593
        return False
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   594
    
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   595
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   596
class Filter(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   597
    def __init__(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   598
        self.name = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   599
        self.code = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   600
        self.path = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   601
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   602
    def set_path(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   603
        self.path = path
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   604
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   605
    def set_name(self, name):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   606
        self.name = name
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   607
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   608
    def set_code(self, code):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   609
        self.code = code
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   610
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   611
    def __eq__(self, other):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   612
        if self.name == other.name and self.code == other.code and self.path == other.path:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   613
            return True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   614
        return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   615
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   616
class FeatureDictProxy(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   617
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   618
    Proxy class that behaves like a dictionary, but loads attributes from
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   619
    the Feature object it proxies only when they are requested.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   620
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   621
    def __init__(self, feature):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   622
        self._feature = feature
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   623
        self._children = {}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   624
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   625
    def _get_dict(self):
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   626
        result = {}
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   627
        if self._feature is not None:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   628
            result.update({
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   629
                '_name'        : self._feature.name,
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   630
                '_namespace'   : self._feature.namespace,
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   631
                '_value'       : self._feature.get_value(),
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   632
                '_fqr'         : self._feature.fqr,
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   633
                '_type'        : self._feature.type})
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   634
        result.update(self._children)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   635
        return result
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   636
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   637
    def items(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   638
        return self._get_dict().items()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   639
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   640
    def iteritems(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   641
        return self._get_dict().iteritems()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   642
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   643
    def __getitem__(self, name):
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   644
        if self._feature is not None:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   645
            if name == '_name':         return self._feature.name
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   646
            elif name == '_namespace':  return self._feature.namespace
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   647
            elif name == '_value':      return self._feature.get_value()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   648
            elif name == '_fqr':        return self._feature.fqr
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   649
            elif name == '_type':       return self._feature.type
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   650
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   651
        try:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   652
            return self._children[name]
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   653
        except KeyError:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   654
            if self._feature:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   655
                msg = "Feature '%s.%s' not found" % (self._feature.fqr, name)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   656
            else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   657
                msg = "Feature '%s' not found" % name
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   658
            raise exceptions.NotFound(msg)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   659
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   660
    def __setitem__(self, name, value):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   661
        self._children[name] = value
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   662
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   663
    def __len__(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   664
        return len(self._get_dict())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   665
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   666
    def __eq__(self, other):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   667
        if not isinstance(other, dict):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   668
            return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   669
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   670
            return self._get_dict() == other
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   671
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   672
    def __ne__(self, other):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   673
        return not (self == other)