From 4ed7466f748579d92a26b99ae8e9be21a7da9573 Mon Sep 17 00:00:00 2001 From: Javier Fernandez Date: Fri, 3 May 2013 14:45:02 +0000 Subject: PyWebWizard: Fixing bugs and implementation of mising features. Generating the TOC index.html from the XSTL templates transformation. Change-Id: If2fbc8bf9b1c754dc0570f2f2c35180342fed736 --- .../sun/star/wizards/ui/event/CommonListener.py | 25 ++++++ wizards/com/sun/star/wizards/web/Process.py | 89 ++++++++++++++++++---- wizards/com/sun/star/wizards/web/data/CGLayout.py | 20 +++-- 3 files changed, 110 insertions(+), 24 deletions(-) (limited to 'wizards') diff --git a/wizards/com/sun/star/wizards/ui/event/CommonListener.py b/wizards/com/sun/star/wizards/ui/event/CommonListener.py index 78c4f2a5bbfa..ad15ac2d6c0f 100644 --- a/wizards/com/sun/star/wizards/ui/event/CommonListener.py +++ b/wizards/com/sun/star/wizards/ui/event/CommonListener.py @@ -150,3 +150,28 @@ class OMouseListenerProcAdapter( unohelper.Base, XMouseListener ): def disposing(self, Event): # TODO: Implement ? pass + +from com.sun.star.io import XStreamListener +class StreamListenerProcAdapter( unohelper.Base, XStreamListener ): + def __init__(self, parent, terminatedCall, startedCall, closedCall, errorCall): + self.parent = parent + self.terminatedCall = terminatedCall + self.startedCall = startedCall + self.closedCall = closedCall + self.errorCall = errorCall + + def terminated(self): + if callable( self. terminatedCall): + self.terminatedCall(self, self.parent) + + def started(self): + if callable( self.startedCall ): + self.startedCall(self, self.parent) + + def closed(self): + if callable( self.closedCall ): + self.closedCall(self, self.parent) + + def error(self, aException): + if callable( self.errorCall ): + self.errorCall(self, aException) diff --git a/wizards/com/sun/star/wizards/web/Process.py b/wizards/com/sun/star/wizards/web/Process.py index 1516cad9fdfd..bfe4286447ff 100644 --- a/wizards/com/sun/star/wizards/web/Process.py +++ b/wizards/com/sun/star/wizards/web/Process.py @@ -21,6 +21,7 @@ from .WebWizardConst import * from ..common.UCB import UCB from ..common.FileAccess import FileAccess from ..ui.event.Task import Task +from ..ui.event.CommonListener import StreamListenerProcAdapter from .ProcessErrors import ProcessErrors from .ExtensionVerifier import ExtensionVerifier from .ErrorHandler import ErrorHandler @@ -36,6 +37,8 @@ from .data.CGSettings import CGSettings from com.sun.star.io import IOException from com.sun.star.uno import SecurityException +from com.sun.star.beans import NamedValue +from com.sun.star.beans import StringPair # This class is used to process a CGSession object # and generate a site.
@@ -345,31 +348,85 @@ class Process(ProcessErrors): @classmethod def generate1(self, xmsf, layout, doc, fileAccess, targetPath, task): # a map that contains xsl templates. the keys are the xsl file names. - #templates = layout.getTemplates(xmsf) - templates = {} + templates = layout.getTemplates(xmsf) + self.node = doc task.advance1(True, TASK_GENERATE_XSL) # each template generates a page. - for key,temp in templates: - transformer = temp.newTransformer() - - doc.normalize() - task.advance(True) + for key in templates: + temp = templates[key] # The target file name is like the xsl template filename # without the .xsl extension. - #fn = fileAccess.getPath(targetPath, key[:key.length() - 4]) - #f = File(fn) - #oStream = FileOutputStream(f) - # Due to a problem occuring when using Xalan-Java 2.6.0 and - # Java 1.5.0, wrap f in a FileOutputStream here (otherwise, the - # StreamResult's getSystemId would return a "file:/..." URL while - # the Xalan code expects a "file:///..." URL): - #transformer.transform(DOMSource(doc), StreamResult(oStream)) - #oStream.close() + fn = fileAccess.getPath(targetPath, key[:len(key) - 4]) + + args = list(range(1)) + nv = NamedValue() + nv.Name = "StylesheetURL" + nv.Value = temp + args[0] = nv + arguments = list(range(1)) + arguments[0] = tuple(args) + + self.tf = Process.createTransformer(xmsf, arguments) + + self.node.normalize() task.advance(True) + # we want to be notfied when the processing is done... + self.tf.addListener(StreamListenerProcAdapter(self, + self.streamTerminatedHandler, + self.streamStartedHandler, + self.streamClosedHandler, + self.streamErrorHandler)) + + # create pipe + pipeout = xmsf.createInstance("com.sun.star.io.Pipe") + pipein = pipeout + + # connect sax writer to pipe + self.xSaxWriter = xmsf.createInstance( "com.sun.star.xml.sax.Writer" ) + self.xSaxWriter.setOutputStream(pipeout) + + # connect pipe to transformer + self.tf.setInputStream(pipein) + + # connect transformer to output + xOutputStream = fileAccess.xInterface.openFileWrite(fn) + self.tf.setOutputStream(xOutputStream) + + self.tf.start() + while (not self.tfCompleted): + pass + task.advance(True) + + + @classmethod + def createTransformer(self, xmsf, args): + tf = xmsf.createInstanceWithArguments("com.sun.star.xml.xslt.XSLT2Transformer", + tuple(args)) + if (tf is None): + # TODO: put a dialog telling about the need to install + # xslt2-transformer extension here + tf = xmsf.createInstanceWithArguments("com.sun.star.xml.xslt.XSLTTransformer", + tuple(args)) + return tf + + def streamTerminatedHandler(self): + parent.isTerminated = True + + def streamStartedHandler(self, parent): + parent.tfCompleted = False + parent.node.serialize(parent.xSaxWriter, tuple([StringPair()])) + + def streamErrorHandler(self, aException): + print ("DEBUG !!! Stream 'error' event handler") + + def streamClosedHandler(self, parent): + parent.tf.terminate() + parent.tfCompleted = True + # I broke the export method to two methods # in a time where a tree with more than one contents was planned. # I left it that way, because it may be used in the future. diff --git a/wizards/com/sun/star/wizards/web/data/CGLayout.py b/wizards/com/sun/star/wizards/web/data/CGLayout.py index 9830664cb98c..5bc919bfb6c6 100644 --- a/wizards/com/sun/star/wizards/web/data/CGLayout.py +++ b/wizards/com/sun/star/wizards/web/data/CGLayout.py @@ -16,6 +16,7 @@ # the License at http://www.apache.org/licenses/LICENSE-2.0 . # from ...common.ConfigGroup import ConfigGroup +from ...common.FileAccess import FileAccess from ...ui.UIConsts import UIConsts class CGLayout(ConfigGroup): @@ -24,20 +25,23 @@ class CGLayout(ConfigGroup): cp_Name = str() cp_FSName = str() + def getSettings(self): + return self.root + def createTemplates(self, xmsf): self.templates = {} - tf = TransformerFactory.newInstance() - workPath = getSettings().workPath + + workPath = self.getSettings().workPath fa = FileAccess(xmsf) stylesheetPath = fa.getURL( - getSettings().workPath, "layouts/" + self.cp_FSName) + self.getSettings().workPath, "layouts/" + self.cp_FSName) files = fa.listFiles(stylesheetPath, False) i = 0 - while i < files.length: - if FileAccess.getExtension(files[i]).equals("xsl"): - self.templates.put( - FileAccess.getFilename(files[i]), - tf.newTemplates(StreamSource (files[i]))) + while i < len(files): + ext = FileAccess.getExtension(files[i]) + fileName = FileAccess.getFilename(files[i]) + if ext == "xsl": + self.templates[fileName] = files[i] i += 1 def getImageUrls(self): -- cgit v1.2.3