source: vlo/branches/vlo-2.18/vlo_web_app/src/main/java/eu/clarin/cmdi/vlo/pages/CmdiXsltModel.java @ 4311

Last change on this file since 4311 was 4311, checked in by twagoo, 10 years ago

Merged changes, amongst which a fix for #481 and most likely the fix for the heap space issues from trunk to 2.18 branch.

File size: 2.9 KB
Line 
1/*
2 * To change this license header, choose License Headers in Project Properties.
3 * To change this template file, choose Tools | Templates
4 * and open the template in the editor.
5 */
6package eu.clarin.cmdi.vlo.pages;
7
8import java.io.IOException;
9import java.io.InputStreamReader;
10import java.io.StringWriter;
11import java.net.URL;
12import javax.xml.transform.stream.StreamSource;
13import net.sf.saxon.s9api.Processor;
14import net.sf.saxon.s9api.SaxonApiException;
15import net.sf.saxon.s9api.Serializer;
16import net.sf.saxon.s9api.XdmNode;
17import net.sf.saxon.s9api.XsltCompiler;
18import net.sf.saxon.s9api.XsltExecutable;
19import net.sf.saxon.s9api.XsltTransformer;
20import org.apache.wicket.model.LoadableDetachableModel;
21import org.slf4j.Logger;
22import org.slf4j.LoggerFactory;
23
24/**
25 * Model that renders a CMDI in XHMTL by means of a stylesheet. This model
26 * discards the result of the transformation on detach to prevent large XHTML
27 * content from being cached.
28 *
29 * @author twagoo
30 */
31public class CmdiXsltModel extends LoadableDetachableModel<String> {
32
33    private final static Logger LOG = LoggerFactory.getLogger(CmdiXsltModel.class);
34
35    private final URL xslFile = getClass().getResource("/eu/clarin/cmdi/vlo/pages/cmdi2xhtml.xsl");
36    private final URL metadataUrl;
37
38    /**
39     *
40     * @param metadataUrl URL of the metadata file to be presented
41     */
42    public CmdiXsltModel(URL metadataUrl) {
43        this.metadataUrl = metadataUrl;
44    }
45
46    /**
47     * Creates the XHTML representation to be shown
48     *
49     * @return
50     */
51    @Override
52    protected String load() {
53        final Processor proc = new Processor(false);
54        final XsltCompiler comp = proc.newXsltCompiler();
55
56        final StringWriter strWriter = new StringWriter();
57        try {
58            final XsltExecutable exp = comp.compile(new StreamSource(xslFile.getFile()));
59            final XdmNode source = proc.newDocumentBuilder().build(
60                    new StreamSource(new InputStreamReader(metadataUrl.openStream())));
61            final Serializer out = new Serializer();
62            out.setOutputProperty(Serializer.Property.METHOD, "html");
63            out.setOutputProperty(Serializer.Property.INDENT, "yes");
64            out.setOutputProperty(Serializer.Property.ENCODING, "UTF-8");
65            out.setOutputWriter(strWriter);
66            final XsltTransformer trans = exp.load();
67
68            trans.setInitialContextNode(source);
69            trans.setDestination(out);
70            trans.transform();
71            return (strWriter.toString());
72        } catch (SaxonApiException e) {
73            LOG.error("Couldn't transform CMDI metadata at {}: ", metadataUrl, e);
74            return ("<b>Could not load complete CMDI metadata</b>");
75        } catch (IOException e) {
76            LOG.error("Couldn't read CMDI metadata at {}: ", metadataUrl, e);
77            return ("<b>Could not load complete CMDI metadata</b>");
78        }
79
80    }
81
82}
Note: See TracBrowser for help on using the repository browser.