from StringIO import StringIO
from threading import Thread
from lxml import etree

class Renderer(object):
    """A Renderer class"""
    def __init__(self):
        self._stylesheet = None
        
    def stylesheet(self):
        if self._stylesheet is None:
            xslt = """<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">
  

  <xsl:output 
    method="xml" 
    omit-xml-declaration="yes" 
    indent="yes" 
    doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" 
    doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" />
  
  <xsl:template match="/">
     <div id="test">
       <xsl:apply-templates/>
     </div>
  </xsl:template>

</xsl:stylesheet>"""
            parser = etree.XMLParser()

            xslt_doc = etree.parse(StringIO(xslt), parser)

            self._stylesheet = etree.XSLT(xslt_doc)
        return self._stylesheet

    def render(self, source_xml):
        style = self.stylesheet()
        doc = etree.parse(StringIO(source_xml))
        result_tree = style(doc)
        result_string = str(result_tree)
        return result_string


class RenderThread(Thread):
    def __init__(self, threadnr, renderer):
        self.threadnr = threadnr
        self.renderer = renderer
        super(RenderThread, self).__init__()
        
    def run(self):
        source_xml = """<?xml version="1.0" encoding="utf-8"?>
<silva><document id="test_document"><content version_id="0"><doc><p type="normal">This is a test of the XSLT rendering functionality.</p></doc></content></document></silva>
        """
        out = self.renderer.render(source_xml)
        a = unicode(out, 'utf-8')
        print a


renderer = Renderer()
threads = 4

for threadnr in range(threads):
    t = RenderThread(threadnr, renderer)
    t.setDaemon(True)
    t.start()
    

