configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/genconfmlplugin.py
author terytkon
Thu, 11 Mar 2010 17:04:37 +0200
changeset 0 2e8eeb919028
child 3 e7e0ae78773e
permissions -rw-r--r--
Adding EPL version of configurationengine.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     1
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     2
# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     3
# All rights reserved.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     4
# This component and the accompanying materials are made available
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     5
# under the terms of "Eclipse Public License v1.0"
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     6
# which accompanies this distribution, and is available
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     7
# at the URL "http://www.eclipse.org/legal/epl-v10.html".
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     8
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     9
# Initial Contributors:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    10
# Nokia Corporation - initial contribution.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    11
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    12
# Contributors:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    13
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    14
# Description: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    15
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    16
'''
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    17
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
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    29
import tempfile
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    30
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    31
try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    32
    from cElementTree import ElementTree
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    33
except ImportError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    34
    try:    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    35
        from elementtree import ElementTree
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    36
    except ImportError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    37
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    38
            from xml.etree import cElementTree as ElementTree
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    39
        except ImportError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    40
            from xml.etree import ElementTree
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    41
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    42
import __init__
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
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    55
    def __init__(self,ref,configuration, output='output', linesep=os.linesep, reader=None):
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
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    66
        self._flatconfig = None
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
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    74
        self.create_output()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    75
        return 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    76
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    77
    def get_refs(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    78
        result = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    79
        for ref in self.reader.settings:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    80
            # Process the reference, so that it will work with has_ref().
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    81
            # E.g. 'MyFeature/MySetting' -> 'MyFeature.MySetting'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    82
            #      'MyFeature/*          -> 'MyFeature'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    83
            ref = ref.replace('/', '.')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    84
            if ref.endswith('.*'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    85
                ref = ref[:-2]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    86
            result.append(ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    87
        return result
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    88
      
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    89
    def list_output_files(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    90
        """ Return a list of output files as an array. """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    91
        return [self.get_output_filename()]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    92
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    93
    def get_output_filename(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    94
        """ Return a output file name. """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    95
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    96
        name = self.reader.name
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    97
        if name == None: name = ""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    98
        target = self.reader.target
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    99
        if target == None: target = ""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   100
        output = self.output
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   101
        if self.output == None: output = ""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   102
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   103
        # Make sure that target file is generated under output
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   104
        target = utils.resourceref.remove_begin_slash(utils.resourceref.norm(target))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   105
        subdir = self.reader.subdir
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   106
        if subdir == None: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   107
            self.output_subdir = subdir
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   108
        output_file = os.path.normpath(os.path.join(output, target, name))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   109
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   110
        return output_file
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   111
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   112
    def create_output(self, layers=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   113
        """ Generate all output """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   114
        resource = self.configuration.get_resource(self.ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   115
        write_element_enc(self.reader.stylesheet_elem, self.xslt_temp_file_name, self.reader.stylesheet_output_enc)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   116
        gen = Generator()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   117
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   118
        target = self.reader.target
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   119
        if target == None: target = ""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   120
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   121
        output_file = self.get_output_filename()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   122
        # Don't create the dirs here, since the output file may be filtered out
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   123
        # if it is empty
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   124
        #if not os.path.exists(os.path.dirname(output_file)):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   125
        #    os.makedirs(os.path.dirname(output_file))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   126
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   127
        self.logger.info('Generating %s' % output_file)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   128
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   129
        flatted_conf_as_element = persistentconfml.ConfmlWriter().dumps(self.flatconfig)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   130
        postprocessed_element = self.post_process_flattening(flatted_conf_as_element)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   131
        write_element_enc(postprocessed_element, self.temp_confml_file, self.reader.stylesheet_output_enc)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   132
        gen.generate(self.configuration, resource, output_file, self.xslt_temp_file_name, self.reader.settings, self.reader.stylesheet_output_enc)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   133
      
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   134
    def post_process_flattening(self, element):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   135
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   136
        Pick just data element and build document out of it
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   137
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   138
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   139
        data_element = element.find("data")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   140
        if data_element == None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   141
            self.logger.warning('No data to generate!!')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   142
            new_doc = "<?xml version=\"1.0\"?><configuration>" + "</configuration>"
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   143
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   144
            new_doc = "<?xml version=\"1.0\"?><configuration>" + ElementTree.tostring(data_element) + "</configuration>"
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   145
        return ElementTree.fromstring(new_doc)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   146
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   147
    @property
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   148
    def flatconfig(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   149
      """ 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   150
      Create a flat configuration from the current configuration with the given setting refs.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   151
      Take the last configuration element, which will contain the data elements
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   152
      """ 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   153
      if not self._flatconfig:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   154
          try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   155
              cf = confflattener.ConfigurationFlattener()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   156
              self._flatconfig = api.Configuration()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   157
              cf.flat(self.configuration, self.reader.settings, self._flatconfig)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   158
          except (exceptions.ConeException, TypeError, Exception), e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   159
              utils.log_exception(self.logger, 'Failed to flat configuration with settings %s. Exception: %s' % (self.reader.settings, e))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   160
              raise exceptions.ConeException('Failed to flat configuration. Exception: %s' % e)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   161
      return self._flatconfig
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   162
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   163
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   164
def write_element(element, output, linesep=os.linesep):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   165
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   166
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   167
    if element != None and ElementTree.iselement(element):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   168
        enc = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   169
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   170
       
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   171
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   172
            out_file = open(output, 'w')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   173
            out_string = ElementTree.tostring(element)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   174
            out_string = out_string.replace('\r\n', linesep)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   175
            out_string = out_string.replace('\n', linesep)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   176
            out_file.write(out_string)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   177
            out_file.close()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   178
        except Exception, e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   179
            raise exceptions.ConeException('Cannot write Element to file (%s). Exception: %s' % (output, e))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   180
    else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   181
        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
   182
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   183
def remove_namespace(doc, namespace):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   184
    """Remove namespace in the passed document in place."""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   185
    ns = u'{%s}' % namespace
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   186
    nsl = len(ns)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   187
    for elem in doc.getiterator():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   188
        if elem.tag.startswith(ns):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   189
            elem.tag = elem.tag[nsl:]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   190
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   191
def write_element_enc(element, output, enc, linesep=os.linesep):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   192
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   193
    Writes element to file
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   194
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   195
    if element != None and ElementTree.iselement(element):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   196
        enc = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   197
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   198
       
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   199
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   200
            remove_namespace(element, 'http://www.s60.com/xml/genconfml/1')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   201
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   202
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   203
            out_file = codecs.open(output, 'w', enc)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   204
            output_string = ElementTree.tostring(element)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   205
            output_string = output_string.replace('\r\n', linesep)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   206
            output_string = output_string.replace('\n', linesep)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   207
            out_file.write(output_string)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   208
            out_file.close()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   209
        except Exception, e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   210
            raise exceptions.ConeException('Cannot write Element to file (%s). Exception: %s' % (output, e))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   211
    else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   212
        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
   213
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   214
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   215
def write_element_tempfile(element, tempfile):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   216
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   217
    Writes element to temp file
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   218
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   219
    if element != None and ElementTree.iselement(element):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   220
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   221
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   222
            tempfile.write(ElementTree.tostring(element))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   223
        except Exception, e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   224
            raise exceptions.ConeException('Cannot write Element to file (%s). Exception: %s' % (output, e))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   225
    else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   226
        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
   227
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   228
class GenconfmlImplReader(plugin.ReaderBase):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   229
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   230
    Parses a single gcfml file
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   231
    """ 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   232
    NAMESPACE = 'http://www.s60.com/xml/genconfml/1'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   233
    IGNORED_NAMESPACES = ['http://www.w3.org/1999/XSL/Transform', 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   234
                          'http://www.w3.org/2001/xinclude']
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   235
    FILE_EXTENSIONS = ['gcfml']
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   236
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   237
    def __init__(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   238
        self.stylesheet = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   239
        self.namespaces = self.IGNORED_NAMESPACES + [self.NAMESPACE]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   240
        self.settings = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   241
        self.name = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   242
        self.subdir = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   243
        self.target = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   244
        self.stylesheet_elem = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   245
        self.stylesheet_output_enc = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   246
        self.nss = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   247
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   248
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   249
    def read_impl(cls, resource_ref, configuration, etree):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   250
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   251
        reader = GenconfmlImplReader()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   252
        reader.from_etree(etree)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   253
        return GenconfmlImpl(resource_ref, configuration, reader=reader)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   254
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   255
    def from_etree(self, etree):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   256
        self.stylesheet = self.parse_stylesheet(etree)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   257
        self.settings = self.parse_settings(etree)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   258
        self.name = self.parse_name(etree)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   259
        self.subdir = self.parse_subdir(etree)        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   260
        self.target = self.parse_target(etree)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   261
        self.stylesheet_elem = self.parse_stylesheet_elem(etree)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   262
        self.stylesheet_output_enc = self.parse_stylesheet_output_enc(etree)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   263
        self.nss = self.parse_stylesheet_nss(etree)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   264
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   265
        return
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   266
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   267
    def parse_target(self, etree):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   268
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   269
        Parses target from etree
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   270
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   271
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   272
        target = ""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   273
        for elem in etree.getiterator("{%s}file" % self.namespaces[2]):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   274
          if elem != None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   275
              target = elem.get('target')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   276
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   277
        return target
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   278
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   279
    def parse_name(self, etree):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   280
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   281
        Parses name from etree
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   282
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   283
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   284
        name = ""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   285
        for elem in etree.getiterator("{%s}file" % self.namespaces[2]):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   286
          if elem != None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   287
              name = elem.get('name')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   288
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   289
        return name
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   290
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   291
    def parse_subdir(self, etree):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   292
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   293
        Parses subdir from etree
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   294
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   295
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   296
        subdir = ""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   297
        for elem in etree.getiterator("{%s}file" % self.namespaces[2]):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   298
          if elem != None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   299
              subdir = elem.get('subdir')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   300
        if subdir == None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   301
            subdir = ""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   302
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   303
        return subdir
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
    def parse_stylesheet(self,etree):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   307
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   308
        Parses stylesheet from getree
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   309
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   310
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   311
        stylesheet = ""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   312
        stylesheet_elem = etree.find("{%s}stylesheet" % self.namespaces[0])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   313
        if stylesheet_elem != None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   314
            stylesheet = ElementTree.tostring(stylesheet_elem)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   315
        return stylesheet
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   316
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   317
    def parse_stylesheet_output_enc(self, etree):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   318
        enc = ""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   319
        ss_elem = etree.find("{%s}stylesheet" % self.namespaces[0])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   320
        if ss_elem != None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   321
            children = ss_elem.getchildren()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   322
            for child in children:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   323
                if child.tag == '{%s}output' % self.namespaces[0]: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   324
                    enc = child.attrib.get('encoding')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   325
        return enc
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   326
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   327
    def parse_stylesheet_nss(self, etree):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   328
        nss = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   329
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   330
        for elem in etree.getiterator():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   331
            name = elem.tag
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   332
            if name[0] == "{":
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   333
                uri, tag = name[1:].split("}")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   334
                if tag == "stylesheet":
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   335
                    nss = uri
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   336
        return nss
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   337
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   338
    def parse_stylesheet_elem(self,etree):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   339
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   340
        Parses stylesheet element from getree
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   341
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   342
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   343
        return etree.find("{%s}stylesheet" % self.namespaces[0])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   344
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   345
    def parse_settings(self,etree):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   346
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   347
        Parses settings from etree
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   348
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   349
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   350
        settings = []
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("{%s}file" % self.namespaces[2]):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   353
          if elem != None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   354
              setting_elems = elem.findall("{%s}setting" % self.namespaces[2])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   355
              for setting_elem in setting_elems:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   356
                  if setting_elem != None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   357
                      settings.append(setting_elem.get('ref'))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   358
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   359
        return settings
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   360
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   361
class Generator(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   362
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   363
    Genconfml generator
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   364
    """ 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   365
    def __init__(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   366
        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
   367
        pass
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   368
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   369
    def post_process_flattening(self, element):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   370
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   371
        Pick just data element and build document out of it
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   372
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   373
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   374
        data_element = element.find("data")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   375
        if data_element == None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   376
            self.logger.warning('No data to generate!!')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   377
            new_doc = "<?xml version=\"1.0\"?><configuration>" + "</configuration>"
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   378
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   379
            new_doc = "<?xml version=\"1.0\"?><configuration>" + ElementTree.tostring(data_element) + "</configuration>"
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   380
        return ElementTree.fromstring(new_doc)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   381
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   382
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   383
    def generate(self, configuration, input, output, xslt, settings, enc=sys.getdefaultencoding()):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   384
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   385
        Generates output
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   386
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   387
        self.logger = logging.getLogger('cone.gcfml{%s}' % input.path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   388
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   389
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   390
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   391
            tf = xslttransformer.XsltTransformer()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   392
            tf.transform_lxml(os.path.abspath(self.temp_confml_file), os.path.abspath(xslt), output, enc)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   393
            #tf.transform_4s(os.path.abspath(self.temp_confml_file), os.path.abspath(xslt), output, enc)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   394
        except (exceptions.ConeException, TypeError, Exception), e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   395
            logging.getLogger('cone.gcfml').warning('Failed to do XSLT tranformation. Exception: %s' % e)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   396
            raise exceptions.ConeException('Failed to do XSLT tranformation. Exception: %s' % e)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   397
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   398
        """ Removes template files """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   399
        if not logging.getLogger('cone').getEffectiveLevel() != 10:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   400
            os.remove(os.path.abspath(self.temp_confml_file))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   401
            os.remove(os.path.abspath(xslt))