configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/genconfmlplugin.py
author m2lahtel
Tue, 10 Aug 2010 14:29:28 +0300
changeset 3 e7e0ae78773e
parent 0 2e8eeb919028
permissions -rw-r--r--
ConE 1.2.11 release
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     1
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     2
# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     3
# All rights reserved.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     4
# This component and the accompanying materials are made available
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     5
# under the terms of "Eclipse Public License v1.0"
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     6
# which accompanies this distribution, and is available
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     7
# at the URL "http://www.eclipse.org/legal/epl-v10.html".
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     8
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     9
# Initial Contributors:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    10
# Nokia Corporation - initial contribution.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    11
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    12
# Contributors:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    13
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    14
# Description: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    15
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    16
'''
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    17
GenConfml plugin for ConE
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 sys
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    23
import logging
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    24
import xml.parsers.expat
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    25
import confflattener
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    26
import xslttransformer
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    27
import codecs
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    28
import tempfile
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    29
import pkg_resources
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    30
import tempfile
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    31
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    32
try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    33
    from cElementTree import ElementTree
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    34
except ImportError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    35
    try:    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    36
        from elementtree import ElementTree
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    37
    except ImportError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    38
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    39
            from xml.etree import cElementTree as ElementTree
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    40
        except ImportError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    41
            from xml.etree import ElementTree
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    42
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    43
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    44
from cone.public import exceptions,plugin,utils,api
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    45
from cone.confml import persistentconfml
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    46
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    47
class GenconfmlImpl(plugin.ImplBase):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    48
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    49
    GenConfml plugin implementation
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    50
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    51
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    52
    IMPL_TYPE_ID = "gcfml"
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    53
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    54
    
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    55
    def __init__(self,ref,configuration, output='', linesep=os.linesep, reader=None):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    56
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    57
        Overloading the default constructor
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    58
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    59
        plugin.ImplBase.__init__(self,ref,configuration)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    60
        self.logger = logging.getLogger('cone.gcfml(%s)' % self.ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    61
        self.errors = False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    62
        self.xstl_etree = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    63
        self.xslt_temp_file_name = os.path.join(tempfile.gettempdir(), "genconfml_temp_%i.xslt" % os.getpid())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    64
        self.set_output_root(output)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    65
        self.linesep = linesep
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    66
        self.flatconfig = None
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    67
        self.temp_confml_file = os.path.join(tempfile.gettempdir(),'temp_flatted_%i.confml' % os.getpid())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    68
        self.reader = reader
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    69
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    70
    def generate(self, context=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    71
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    72
        Generate the given implementation.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    73
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    74
        self.context = context
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    75
        self.create_output()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    76
        return 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    77
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    78
    def get_refs(self):
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    79
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    80
        Get the list of references used inside this gcfml object.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    81
        """
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    82
        result = []
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    83
        refs = []
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    84
        for ref in self.reader.settings:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    85
            # Process the reference, so that it will work with has_ref().
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    86
            # E.g. 'MyFeature/MySetting' -> 'MyFeature.MySetting'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    87
            #      'MyFeature/*          -> 'MyFeature'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    88
            ref = ref.replace('/', '.')
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    89
            refs.append(ref)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    90
            
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    91
        # Traverse through actual features in the default view, to get a full list 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    92
        # of refs in case of wildcard usage
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    93
        dview = self.configuration.get_default_view()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    94
        for fea in dview.get_features(refs):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    95
            result.append(fea.fqr)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    96
        return result
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    97
      
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    98
    def list_output_files(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    99
        """ Return a list of output files as an array. """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   100
        return [self.get_output_filename()]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   101
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   102
    def get_output_filename(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   103
        """ Return a output file name. """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   104
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   105
        name = self.reader.name
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   106
        if name == None: name = ""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   107
        target = self.reader.target
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   108
        if target == None: target = ""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   109
        output = self.output
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   110
        if self.output == None: output = ""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   111
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   112
        # Make sure that target file is generated under output
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   113
        target = utils.resourceref.remove_begin_slash(utils.resourceref.norm(target))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   114
        subdir = self.reader.subdir
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   115
        if subdir == None: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   116
            self.output_subdir = subdir
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   117
        output_file = os.path.normpath(os.path.join(output, target, name))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   118
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   119
        return output_file
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   120
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   121
    def create_output(self, layers=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   122
        """ Generate all output """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   123
        resource = self.configuration.get_resource(self.ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   124
        write_element_enc(self.reader.stylesheet_elem, self.xslt_temp_file_name, self.reader.stylesheet_output_enc)
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   125
        gen = Generator(self)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   126
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   127
        target = self.reader.target
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   128
        if target == None: target = ""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   129
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   130
        output_file = self.get_output_filename()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   131
        # Don't create the dirs here, since the output file may be filtered out
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   132
        # if it is empty
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   133
        #if not os.path.exists(os.path.dirname(output_file)):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   134
        #    os.makedirs(os.path.dirname(output_file))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   135
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   136
        self.logger.info('Generating %s' % output_file)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   137
        
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   138
        flatted_conf_as_element = persistentconfml.ConfmlWriter().dumps(self.get_flatconfig())
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   139
        postprocessed_element = self.post_process_flattening(flatted_conf_as_element)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   140
        write_element_enc(postprocessed_element, self.temp_confml_file, self.reader.stylesheet_output_enc)
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   141
        gen.generate(self.context, resource, output_file, self.xslt_temp_file_name, self.reader.settings, self.reader.stylesheet_output_enc,
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   142
                     line_ending_style = self.reader.line_ending_style)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   143
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   144
      
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   145
    def post_process_flattening(self, element):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   146
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   147
        Pick just data element and build document out of it
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
        data_element = element.find("data")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   151
        if data_element == None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   152
            self.logger.warning('No data to generate!!')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   153
            new_doc = "<?xml version=\"1.0\"?><configuration>" + "</configuration>"
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   154
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   155
            new_doc = "<?xml version=\"1.0\"?><configuration>" + ElementTree.tostring(data_element) + "</configuration>"
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   156
        return ElementTree.fromstring(new_doc)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   157
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   158
    def get_flatconfig(self):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   159
        """ 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   160
        Create a flat configuration from the current configuration with the given setting refs.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   161
        Take the last configuration element, which will contain the data elements
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   162
        """ 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   163
        if not self.flatconfig:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   164
            try:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   165
                cf = confflattener.ConfigurationFlattener()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   166
                self.flatconfig = api.Configuration()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   167
                cf.flat(self.configuration, self.reader.settings, self.flatconfig)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   168
            except (exceptions.ConeException, TypeError, Exception), e:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   169
                utils.log_exception(self.logger, 'Failed to flat configuration with settings %s. Exception: %s' % (self.reader.settings, e))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   170
                raise exceptions.ConeException('Failed to flat configuration. Exception: %s' % e)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   171
        return self.flatconfig
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   172
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   173
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   174
def write_element(element, output, linesep=os.linesep):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   175
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   176
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   177
    if element != None and ElementTree.iselement(element):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   178
        enc = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   179
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   180
       
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   181
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   182
            out_file = open(output, 'w')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   183
            out_string = ElementTree.tostring(element)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   184
            out_string = out_string.replace('\r\n', linesep)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   185
            out_string = out_string.replace('\n', linesep)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   186
            out_file.write(out_string)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   187
            out_file.close()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   188
        except Exception, e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   189
            raise exceptions.ConeException('Cannot write Element to file (%s). Exception: %s' % (output, e))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   190
    else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   191
        raise exceptions.ConeException('Cannot write element to file, because None element passed or not Element passed.')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   192
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   193
def remove_namespace(doc, namespace):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   194
    """Remove namespace in the passed document in place."""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   195
    ns = u'{%s}' % namespace
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   196
    nsl = len(ns)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   197
    for elem in doc.getiterator():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   198
        if elem.tag.startswith(ns):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   199
            elem.tag = elem.tag[nsl:]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   200
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   201
def write_element_enc(element, output, enc, linesep=os.linesep):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   202
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   203
    Writes element to file
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   204
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   205
    if element != None and ElementTree.iselement(element):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   206
        enc = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   207
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   208
       
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   209
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   210
            remove_namespace(element, 'http://www.s60.com/xml/genconfml/1')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   211
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   212
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   213
            out_file = codecs.open(output, 'w', enc)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   214
            output_string = ElementTree.tostring(element)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   215
            output_string = output_string.replace('\r\n', linesep)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   216
            output_string = output_string.replace('\n', linesep)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   217
            out_file.write(output_string)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   218
            out_file.close()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   219
        except Exception, e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   220
            raise exceptions.ConeException('Cannot write Element to file (%s). Exception: %s' % (output, e))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   221
    else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   222
        raise exceptions.ConeException('Cannot write element to file, because None element passed or not Element passed.')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   223
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   224
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   225
def write_element_tempfile(element, tempfile):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   226
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   227
    Writes element to temp file
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   228
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   229
    if element != None and ElementTree.iselement(element):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   230
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   231
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   232
            tempfile.write(ElementTree.tostring(element))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   233
        except Exception, e:
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   234
            raise exceptions.ConeException('Cannot write Element to file (%s). Exception: %s' % (tempfile, e))
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   235
    else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   236
        raise exceptions.ConeException('Cannot write element to file, because None element passed or not Element passed.')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   237
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   238
class GenconfmlImplReader(plugin.ReaderBase):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   239
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   240
    Parses a single gcfml file
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   241
    """ 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   242
    NAMESPACE = 'http://www.s60.com/xml/genconfml/1'
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   243
    NAMESPACE_ID = 'gcfml'
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   244
    ROOT_ELEMENT_NAME = 'file'
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   245
    IGNORED_NAMESPACES = ['http://www.w3.org/1999/XSL/Transform', 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   246
                          'http://www.w3.org/2001/xinclude']
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   247
    FILE_EXTENSIONS = ['gcfml']
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   248
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   249
    def __init__(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   250
        self.stylesheet = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   251
        self.namespaces = self.IGNORED_NAMESPACES + [self.NAMESPACE]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   252
        self.settings = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   253
        self.name = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   254
        self.subdir = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   255
        self.target = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   256
        self.stylesheet_elem = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   257
        self.stylesheet_output_enc = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   258
        self.nss = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   259
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   260
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   261
    def read_impl(cls, resource_ref, configuration, etree):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   262
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   263
        reader = GenconfmlImplReader()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   264
        reader.from_etree(etree)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   265
        return GenconfmlImpl(resource_ref, configuration, reader=reader)
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   266
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   267
    @classmethod
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   268
    def get_schema_data(cls):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   269
        return pkg_resources.resource_string('genconfmlplugin', 'xsd/gcfml.xsd')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   270
        
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   271
    def from_etree(self, etree):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   272
        self.stylesheet = self.parse_stylesheet(etree)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   273
        self.settings = self.parse_settings(etree)
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   274
        self.target = etree.get('target', '')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   275
        self.name = etree.get('name', '')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   276
        self.subdir = etree.get('subdir', '')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   277
        self.line_ending_style = etree.get('lineEndingStyle')
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   278
        self.stylesheet_elem = self.parse_stylesheet_elem(etree)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   279
        self.stylesheet_output_enc = self.parse_stylesheet_output_enc(etree)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   280
        self.nss = self.parse_stylesheet_nss(etree)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   281
        
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   282
        if self.line_ending_style not in (None, 'CRLF', 'LF'):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   283
            raise exceptions.ImplmlParseError(
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   284
                "Invalid line ending style '%s' (should be omitted or one "
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   285
                "of ['CRLF', 'LF'])" % self.line_ending_style)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   286
        
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   287
        return
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   288
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   289
    def parse_target(self, etree):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   290
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   291
        Parses target from etree
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   292
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   293
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   294
        target = ""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   295
        for elem in etree.getiterator("{%s}file" % self.namespaces[2]):
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   296
            if elem != None:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   297
                target = elem.get('target')
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   298
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   299
        return target
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   300
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   301
    def parse_name(self, etree):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   302
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   303
        Parses name from etree
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   304
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   305
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   306
        name = ""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   307
        for elem in etree.getiterator("{%s}file" % self.namespaces[2]):
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   308
            if elem != None:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   309
                name = elem.get('name')
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   310
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   311
        return name
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   312
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   313
    def parse_subdir(self, etree):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   314
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   315
        Parses subdir from etree
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   316
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   317
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   318
        subdir = ""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   319
        for elem in etree.getiterator("{%s}file" % self.namespaces[2]):
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   320
            if elem != None:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   321
                subdir = elem.get('subdir')
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   322
        if subdir == None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   323
            subdir = ""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   324
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   325
        return subdir
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   326
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   327
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   328
    def parse_stylesheet(self,etree):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   329
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   330
        Parses stylesheet from getree
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   331
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   332
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   333
        stylesheet = ""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   334
        stylesheet_elem = etree.find("{%s}stylesheet" % self.namespaces[0])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   335
        if stylesheet_elem != None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   336
            stylesheet = ElementTree.tostring(stylesheet_elem)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   337
        return stylesheet
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   338
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   339
    def parse_stylesheet_output_enc(self, etree):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   340
        enc = ""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   341
        ss_elem = etree.find("{%s}stylesheet" % self.namespaces[0])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   342
        if ss_elem != None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   343
            children = ss_elem.getchildren()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   344
            for child in children:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   345
                if child.tag == '{%s}output' % self.namespaces[0]: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   346
                    enc = child.attrib.get('encoding')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   347
        return enc
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   348
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   349
    def parse_stylesheet_nss(self, etree):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   350
        nss = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   351
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   352
        for elem in etree.getiterator():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   353
            name = elem.tag
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   354
            if name[0] == "{":
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   355
                uri, tag = name[1:].split("}")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   356
                if tag == "stylesheet":
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   357
                    nss = uri
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   358
        return nss
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   359
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   360
    def parse_stylesheet_elem(self,etree):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   361
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   362
        Parses stylesheet element from getree
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   363
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   364
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   365
        return etree.find("{%s}stylesheet" % self.namespaces[0])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   366
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   367
    def parse_settings(self,etree):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   368
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   369
        Parses settings from etree
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   370
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   371
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   372
        settings = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   373
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   374
        for elem in etree.getiterator("{%s}file" % self.namespaces[2]):
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   375
            if elem != None:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   376
                setting_elems = elem.findall("{%s}setting" % self.namespaces[2])
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   377
                for setting_elem in setting_elems:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   378
                    if setting_elem != None:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   379
                        settings.append(setting_elem.get('ref'))
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   380
        return settings
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   381
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   382
class Generator(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   383
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   384
    Genconfml generator
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   385
    """ 
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   386
    def __init__(self, implml):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   387
        self.temp_confml_file = os.path.join(tempfile.gettempdir(),'temp_flatted_%i.confml' % os.getpid())
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   388
        self.context = None
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   389
        self.implml = implml
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   390
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   391
    def post_process_flattening(self, element):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   392
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   393
        Pick just data element and build document out of it
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   394
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   395
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   396
        data_element = element.find("data")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   397
        if data_element == None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   398
            self.logger.warning('No data to generate!!')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   399
            new_doc = "<?xml version=\"1.0\"?><configuration>" + "</configuration>"
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   400
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   401
            new_doc = "<?xml version=\"1.0\"?><configuration>" + ElementTree.tostring(data_element) + "</configuration>"
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   402
        return ElementTree.fromstring(new_doc)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   403
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   404
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   405
    def generate(self, context, input, output, xslt, settings, enc=sys.getdefaultencoding(),
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   406
                 line_ending_style=None):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   407
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   408
        Generates output
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   409
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   410
        self.context = context
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   411
        self.logger = logging.getLogger('cone.gcfml{%s}' % input.path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   412
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   413
        if line_ending_style == 'LF':
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   414
            linesep = '\n'
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   415
        else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   416
            linesep = '\r\n'
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   417
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   418
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   419
            tf = xslttransformer.XsltTransformer()
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   420
            result = tf.transform_lxml(os.path.abspath(self.temp_confml_file), os.path.abspath(xslt), enc, linesep)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   421
            if not self.filter_file_writing(result):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   422
                self.write_string_to_file(result, output, enc)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   423
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   424
        except (exceptions.ConeException, TypeError, Exception), e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   425
            logging.getLogger('cone.gcfml').warning('Failed to do XSLT tranformation. Exception: %s' % e)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   426
            raise exceptions.ConeException('Failed to do XSLT tranformation. Exception: %s' % e)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   427
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   428
        """ Removes template files """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   429
        if not logging.getLogger('cone').getEffectiveLevel() != 10:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   430
            os.remove(os.path.abspath(self.temp_confml_file))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   431
            os.remove(os.path.abspath(xslt))
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   432
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   433
    def filter_file_writing(self, string):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   434
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   435
        Returns True if writing result file should be ignored.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   436
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   437
        string = string.rstrip('\n\r')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   438
        if string == '' or string == '<?xml version="1.0" encoding="UTF-16"?>' or \
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   439
            string == '<?xml version="1.0" encoding="UTF-8"?>':
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   440
            return True
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   441
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   442
        return False
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   443
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   444
    def write_string_to_file(self, string, output, enc):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   445
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   446
        Writes string to file
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   447
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   448
        try:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   449
            
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   450
            #fl = codecs.open(outfile, 'w', enc)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   451
            fl = self.context.create_file(output, 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   452
                                          implementation=self.implml,
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   453
                                          mode='w',
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   454
                                          encoding=enc)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   455
            fl.write(string)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   456
            fl.close()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   457
            
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   458
        except Exception, e:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   459
            logging.getLogger('cone.gcfml').error('Cannot write Element to file (%s). Exception: %s' % (output, e))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   460
            raise exceptions.ConeException('Cannot write Element to file (%s). Exception: %s' % (output, e))