configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/xslttransformer.py
changeset 0 2e8eeb919028
child 3 e7e0ae78773e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/xslttransformer.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,168 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+'''
+Configuration flattener
+'''
+
+
+import re
+import os
+import sys
+import codecs
+import logging
+import xml.parsers.expat
+import unittest, os, sys, pkg_resources
+
+pkg_resources.require('lxml')
+
+try:
+    from cElementTree import ElementTree
+except ImportError:
+    try:    
+        from elementtree import ElementTree
+    except ImportError:
+        try:
+            from xml.etree import cElementTree as ElementTree
+        except ImportError:
+            from xml.etree import ElementTree
+
+import __init__
+
+from cone.public import exceptions,plugin,utils,api
+
+class XsltTransformer():
+    """
+    XSLT Transformer
+    """
+    
+    def _init(self,ref,configuration):
+        self.logger = logging.getLogger('cone.gcfml(%s)' % self.ref)
+
+
+    def transform_lxml(self, input, xslt, output, enc, linesep=os.linesep):
+      """
+      XSLT transform with lxml.
+      """
+      from lxml import etree
+      
+      if not enc:
+          enc = sys.getdefaultencoding()
+      try:
+          xslt_doc = etree.parse(xslt)
+          transform = etree.XSLT(xslt_doc)
+          
+          input_doc = etree.parse(input)
+          result = str(transform(input_doc))                   
+          postprocessed_result = post_process_result(result, enc, linesep)
+          
+          if not filter_file_writing(postprocessed_result):
+              write_string_to_file(postprocessed_result, output, enc)
+        
+      except Exception, e:
+          logging.getLogger('cone.gcfml').error('Failed to do XSLT transformation: %s' % e)
+          raise exceptions.ConeException('Failed to do XSLT transformation: %s' % (e))
+
+
+    def transform_4s(self, input, xslt, output, enc, linesep=os.linesep):
+      """
+      XSLT transform with 4Suite
+      """
+      from Ft.Xml.Xslt import Transform
+      from Ft.Xml.Xslt import Processor
+      from Ft.Xml import InputSource
+      from Ft.Lib.Uri import OsPathToUri  
+
+      
+      if not enc:
+          enc = sys.getdefaultencoding()
+      
+      try:
+          processor = Processor.Processor()
+          
+          srcAsUri = OsPathToUri(input)
+          source = InputSource.DefaultFactory.fromUri(srcAsUri)
+
+          ssAsUri = OsPathToUri(xslt)
+          transform = InputSource.DefaultFactory.fromUri(ssAsUri)
+
+          processor.appendStylesheet(transform)
+          result = processor.run(source)
+          
+          postprocessed_result = post_process_result(result, enc, linesep)
+          
+          if not filter_file_writing(postprocessed_result):
+              write_string_to_file(postprocessed_result, output, enc)
+        
+      except Exception, e:
+          logging.getLogger('cone.gcfml').error('Failed to do XSLT transformation: %s' % e)
+          raise exceptions.ConeException('Failed to do XSLT transformation: %s' % (e))
+
+def filter_file_writing(string):
+    """
+    Returns True if writing result file should be ignored.
+    """
+    string = string.rstrip('\n\r')
+    if string == '' or string == '<?xml version="1.0" encoding="UTF-16"?>' or \
+        string == '<?xml version="1.0" encoding="UTF-8"?>':
+        return True
+    
+    return False
+
+
+def post_process_result(string, enc, linesep):
+  """
+  Does post process for result from XSLT transform
+      - encoding
+      - removes extra line separators
+      - changes line separators
+  """
+  output_string = None
+  
+  try:
+      output_string = string.decode(enc)
+      if not output_string.startswith('<'):
+          output_string = '\n' + output_string
+      output_string = output_string.replace('<?xml version="1.0" encoding="UTF-16"?>', '<?xml version="1.0" encoding="UTF-16"?>\n\n')
+      output_string = output_string.replace('<?xml version="1.0" encoding="UTF-8"?>', '<?xml version="1.0" encoding="UTF-8"?>\n\n')
+      output_string = output_string.replace('\n\n','\n')
+      output_string = output_string.replace('\n', linesep)
+      output_string+= linesep
+  except Exception, e:
+      logging.getLogger('cone.gcfml').error('Cannot post process result: %s \nException: %s' % (string, e))
+      raise exceptions.ConeException('Cannot post process result: %s \nException: %s' % (string, e))
+  
+  return output_string
+
+def write_string_to_file(string, output, enc):
+  """
+  Writes string to file
+  """
+  try:
+      outfile = os.path.abspath(output)
+      
+      if not os.path.exists(os.path.dirname(outfile)):
+          os.makedirs(os.path.dirname(outfile))
+          
+      fl = codecs.open(outfile, 'w', enc)
+      fl.write(string)
+      fl.close()
+      
+  except Exception, e:
+      logging.getLogger('cone.gcfml').error('Cannot write Element to file (%s). Exception: %s' % (output, e))
+      raise exceptions.ConeException('Cannot write Element to file (%s). Exception: %s' % (output, e))
+
+
+