From: Mathieu Baudier Date: Mon, 5 May 2008 13:22:20 +0000 (+0000) Subject: Introduce XSLT report generation X-Git-Tag: argeo-slc-2.1.7~2914 X-Git-Url: http://git.argeo.org/?a=commitdiff_plain;ds=inline;h=1943052bca31f5f1ed41e6ad1dad4490f9058762;p=gpl%2Fargeo-slc.git Introduce XSLT report generation git-svn-id: https://svn.argeo.org/slc/trunk@1126 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- diff --git a/org.argeo.slc.core/pom.xml b/org.argeo.slc.core/pom.xml index 6959e7708..cab5eb90e 100644 --- a/org.argeo.slc.core/pom.xml +++ b/org.argeo.slc.core/pom.xml @@ -137,5 +137,9 @@ hsqldb hsqldb + + xalan + xalan + \ No newline at end of file diff --git a/org.argeo.slc.core/src/main/java/org/argeo/slc/core/test/tree/AsynchronousTreeTestResultListener.java b/org.argeo.slc.core/src/main/java/org/argeo/slc/core/test/tree/AsynchronousTreeTestResultListener.java deleted file mode 100644 index a3dc33f3b..000000000 --- a/org.argeo.slc.core/src/main/java/org/argeo/slc/core/test/tree/AsynchronousTreeTestResultListener.java +++ /dev/null @@ -1,137 +0,0 @@ -package org.argeo.slc.core.test.tree; - -import java.util.Vector; - -import org.argeo.slc.core.structure.tree.TreeSPath; -import org.argeo.slc.core.test.TestResult; -import org.argeo.slc.core.test.TestResultListener; -import org.argeo.slc.core.test.TestResultPart; - -/** - * Abstract asynchronous implementation of a listener listening to a - * TreeTestResult. - * - * @deprecated listeners should be called synchronously - * @see TreeTestResult - */ -public abstract class AsynchronousTreeTestResultListener implements - TestResultListener, Runnable { - private Vector partStructs = new Vector(); - private Thread thread; - - private Boolean synchronous = true; - - protected AsynchronousTreeTestResultListener() { - this(true); - } - - protected AsynchronousTreeTestResultListener(Boolean synchronousByDefault) { - synchronous = synchronousByDefault; - } - - /** Starts the underlying thread. */ - public void init() { - if (!synchronous) { - thread = new Thread(this); - thread.start(); - } - } - - /** Finish the remaining and destroy */ - public void close(TestResult testResult) { - // FIXME: make behavior more robust when multiple results are - // registering this listener. - synchronized (partStructs) { - // TODO: put a timeout - while (partStructs.size() != 0) { - try { - partStructs.wait(500); - } catch (InterruptedException e) { - // silent - } - } - thread = null; - partStructs.notifyAll(); - } - postClose((TreeTestResult) testResult); - } - - public final void resultPartAdded(TestResult testResult, - TestResultPart testResultPart) { - TreeTestResult result = (TreeTestResult) testResult; - PartStruct partStruct = new PartStruct(result.getCurrentPath(), result - .getUuid(), testResultPart, result); - - if (!synchronous) { - synchronized (partStructs) { - partStructs.add(partStruct); - partStructs.notifyAll(); - } - } else { - resultPartAdded(partStruct); - } - } - - /** Called when a result part has been added. */ - protected abstract void resultPartAdded(PartStruct partStruct); - - /** - * Called at the end of close. Default implementation is empty. To be - * overridden. - */ - protected void postClose(TreeTestResult testResult) { - - } - - public void run() { - while (thread != null) { - synchronized (partStructs) { - for (PartStruct partStruct : partStructs) { - resultPartAdded(partStruct); - } - - partStructs.clear(); - partStructs.notifyAll(); - while (partStructs.size() == 0) { - try { - partStructs.wait(); - } catch (InterruptedException e) { - // silent - } - } - } - } - } - - /** Structure used to pass tree specific information to subclasses. */ - protected static class PartStruct { - /** The tree path of this part. */ - public final TreeSPath path; - /** The test result id of the related test result */ - public final String uuid; - /** The part itself */ - public final TestResultPart part; - /** The tree test result itself. */ - public final TreeTestResult result; - - /** Constructor */ - public PartStruct(TreeSPath path, String uuid, TestResultPart part, - TreeTestResult result) { - super(); - this.path = path; - this.uuid = uuid; - this.part = part; - this.result = result; - } - - } - - public Boolean getSynchronous() { - return synchronous; - } - - public void setSynchronous(Boolean synchronous) { - this.synchronous = synchronous; - } - -} diff --git a/org.argeo.slc.core/src/main/java/org/argeo/slc/core/test/tree/TreeTestResultLogger.java b/org.argeo.slc.core/src/main/java/org/argeo/slc/core/test/tree/TreeTestResultLogger.java index e20614f90..2246e18b0 100644 --- a/org.argeo.slc.core/src/main/java/org/argeo/slc/core/test/tree/TreeTestResultLogger.java +++ b/org.argeo.slc.core/src/main/java/org/argeo/slc/core/test/tree/TreeTestResultLogger.java @@ -3,12 +3,9 @@ package org.argeo.slc.core.test.tree; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.argeo.slc.core.test.SimpleResultPart; -import org.argeo.slc.core.test.TestResult; import org.argeo.slc.core.test.TestResultListener; import org.argeo.slc.core.test.TestResultPart; import org.argeo.slc.core.test.TestStatus; -import org.argeo.slc.core.test.tree.AsynchronousTreeTestResultListener.PartStruct; /** * Listener logging tree-based test results to the underlying logging system. diff --git a/org.argeo.slc.core/src/main/java/org/argeo/slc/core/test/tree/XsltReportGenerator.java b/org.argeo.slc.core/src/main/java/org/argeo/slc/core/test/tree/XsltReportGenerator.java new file mode 100644 index 000000000..059c209f1 --- /dev/null +++ b/org.argeo.slc.core/src/main/java/org/argeo/slc/core/test/tree/XsltReportGenerator.java @@ -0,0 +1,156 @@ +package org.argeo.slc.core.test.tree; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.io.OutputStream; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.transform.Templates; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMResult; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; +import javax.xml.transform.stream.StreamSource; + +import org.springframework.core.io.Resource; +import org.springframework.oxm.Marshaller; +import org.springframework.xml.transform.StringResult; +import org.w3c.dom.Document; + +import org.apache.commons.io.IOUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.argeo.slc.core.SlcException; +import org.argeo.slc.core.test.TestResultListener; +import org.argeo.slc.core.test.TestResultPart; + +public class XsltReportGenerator implements TestResultListener { + private Log log = LogFactory.getLog(getClass()); + + private DocumentBuilder documentBuilder = null; + + private Resource xsltStyleSheet; + + private Templates templates; + + private Marshaller marshaller; + + private String outputDir; + private String outputFileExtension = "html"; + + private Boolean logXml = false; + + public void init() { + if (templates != null) + return; + + if (xsltStyleSheet == null) + throw new SlcException("XSLT style sheet not specified."); + + InputStream in = null; + try { + TransformerFactory transformerFactory = TransformerFactory + .newInstance(); + in = xsltStyleSheet.getInputStream(); + StreamSource xsltSource = new StreamSource(in); + templates = transformerFactory.newTemplates(xsltSource); + } catch (Exception e) { + throw new SlcException("Could not initialize templates", e); + } finally { + IOUtils.closeQuietly(in); + } + } + + public void resultPartAdded(TreeTestResult testResult, + TestResultPart testResultPart) { + + } + + public void close(TreeTestResult testResult) { + if (templates == null) + throw new SlcException("XSLT template not initialized"); + + File file = getFile(testResult); + OutputStream out = null; + + try { + Transformer transformer = templates.newTransformer(); + + if (documentBuilder == null) + documentBuilder = DocumentBuilderFactory.newInstance() + .newDocumentBuilder(); + + Document document = documentBuilder.newDocument(); + DOMResult marshallResult = new DOMResult(document); + marshaller.marshal(testResult, marshallResult); + + if (logXml) { + Transformer identityTransformer = TransformerFactory + .newInstance().newTransformer(); + StringResult xmlResult = new StringResult(); + identityTransformer.transform(new DOMSource(marshallResult + .getNode()), xmlResult); + log.info("Marshalled XML:\n" + xmlResult); + } + + DOMSource transfoSource = new DOMSource(marshallResult.getNode()); + + if (outputDir != null) { + File dir = new File(outputDir); + dir.mkdirs(); + out = new FileOutputStream(file); + StreamResult outputResult = new StreamResult(out); + transformer.transform(transfoSource, outputResult); + } else { + // print on console if no output dir + StringResult result = new StringResult(); + transformer.transform(transfoSource, result); + log.info("Generated report:\n" + result); + } + } catch (Exception e) { + throw new SlcException( + "Could not transform test result to " + file, e); + } finally { + IOUtils.closeQuietly(out); + } + } + + public Resource getXsltStyleSheet() { + return xsltStyleSheet; + } + + public void setXsltStyleSheet(Resource xsltStyleSheet) { + this.xsltStyleSheet = xsltStyleSheet; + } + + public void setTemplates(Templates templates) { + this.templates = templates; + } + + public void setMarshaller(Marshaller marshaller) { + this.marshaller = marshaller; + } + + public void setOutputDir(String outputDir) { + this.outputDir = outputDir; + } + + public void setOutputFileExtension(String outputFileExtension) { + this.outputFileExtension = outputFileExtension; + } + + protected File getFile(TreeTestResult result) { + Long time = System.currentTimeMillis(); + return new File(outputDir + File.separator + time + "-" + + result.getUuid() + "." + outputFileExtension); + } + + public void setLogXml(Boolean logXml) { + this.logXml = logXml; + } + +} diff --git a/org.argeo.slc.core/src/main/resources/org/argeo/slc/core/test/tree/basicReport.xslt b/org.argeo.slc.core/src/main/resources/org/argeo/slc/core/test/tree/basicReport.xslt new file mode 100644 index 000000000..947cef0f9 --- /dev/null +++ b/org.argeo.slc.core/src/main/resources/org/argeo/slc/core/test/tree/basicReport.xslt @@ -0,0 +1,50 @@ + + + + + + + + + Result + + +

+ Result + +

+ +

+ +

+ + + + + + + + + + + + + +
+ + + +
+
+ + +
+
\ No newline at end of file diff --git a/org.argeo.slc.core/src/test/resources/org/argeo/slc/ws/result.xml b/org.argeo.slc.core/src/test/resources/org/argeo/slc/ws/result.xml index 36733d18f..f2d660cac 100644 --- a/org.argeo.slc.core/src/test/resources/org/argeo/slc/ws/result.xml +++ b/org.argeo.slc.core/src/test/resources/org/argeo/slc/ws/result.xml @@ -10,8 +10,22 @@ parent="slcDefault.test.basicTreeTestResult"> - + + + + + + + + + \ No newline at end of file