001package org.nuxeo.template.processors.xslt;
002
003import java.io.ByteArrayOutputStream;
004import java.io.IOException;
005import java.util.ArrayList;
006import java.util.List;
007
008import javax.xml.transform.ErrorListener;
009import javax.xml.transform.Transformer;
010import javax.xml.transform.TransformerConfigurationException;
011import javax.xml.transform.TransformerException;
012import javax.xml.transform.TransformerFactory;
013import javax.xml.transform.stream.StreamResult;
014import javax.xml.transform.stream.StreamSource;
015
016import org.nuxeo.common.utils.FileUtils;
017import org.nuxeo.ecm.core.api.Blob;
018import org.nuxeo.ecm.core.api.NuxeoException;
019import org.nuxeo.ecm.core.api.blobholder.BlobHolder;
020import org.nuxeo.ecm.core.api.impl.blob.ByteArrayBlob;
021import org.nuxeo.template.api.TemplateInput;
022import org.nuxeo.template.api.TemplateProcessor;
023import org.nuxeo.template.api.adapters.TemplateBasedDocument;
024import org.nuxeo.template.processors.AbstractTemplateProcessor;
025
026public class XSLTProcessor extends AbstractTemplateProcessor implements TemplateProcessor {
027
028    @Override
029    public Blob renderTemplate(TemplateBasedDocument templateBasedDocument, String templateName) {
030
031        BlobHolder bh = templateBasedDocument.getAdaptedDoc().getAdapter(BlobHolder.class);
032        if (bh == null) {
033            return null;
034        }
035
036        Blob xmlContent = bh.getBlob();
037        if (xmlContent == null) {
038            return null;
039        }
040
041        Blob sourceTemplateBlob = getSourceTemplateBlob(templateBasedDocument, templateName);
042
043        TransformerFactory tFactory = TransformerFactory.newInstance();
044        Transformer transformer;
045        try {
046            transformer = tFactory.newTransformer(new StreamSource(sourceTemplateBlob.getStream()));
047        } catch (TransformerConfigurationException | IOException e) {
048            throw new NuxeoException(e);
049        }
050        transformer.setErrorListener(new ErrorListener() {
051
052            @Override
053            public void warning(TransformerException exception) throws TransformerException {
054                log.warn("Problem during transformation", exception);
055            }
056
057            @Override
058            public void fatalError(TransformerException exception) throws TransformerException {
059                log.error("Fatal error during transformation", exception);
060            }
061
062            @Override
063            public void error(TransformerException exception) throws TransformerException {
064                log.error("Error during transformation", exception);
065            }
066        });
067        transformer.setURIResolver(null);
068
069        ByteArrayOutputStream out = new ByteArrayOutputStream();
070
071        try {
072            transformer.transform(new StreamSource(xmlContent.getStream()), new StreamResult(out));
073        } catch (TransformerException | IOException e) {
074            throw new NuxeoException(e);
075        }
076
077        Blob result = new ByteArrayBlob(out.toByteArray(), "text/xml");
078        String targetFileName = FileUtils.getFileNameNoExt(templateBasedDocument.getAdaptedDoc().getTitle());
079        // result.setFilename(targetFileName + ".xml");
080        result.setFilename(targetFileName + ".html");
081
082        return result;
083
084    }
085
086    @Override
087    public List<TemplateInput> getInitialParametersDefinition(Blob blob) {
088        return new ArrayList<TemplateInput>();
089    }
090
091}