001package org.nuxeo.template.processors.jxls;
002
003import java.io.File;
004import java.io.IOException;
005import java.util.ArrayList;
006import java.util.List;
007import java.util.Map;
008
009import net.sf.jxls.exception.ParsePropertyException;
010import net.sf.jxls.transformer.XLSTransformer;
011
012import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
013import org.nuxeo.common.utils.FileUtils;
014import org.nuxeo.ecm.core.api.Blob;
015import org.nuxeo.ecm.core.api.Blobs;
016import org.nuxeo.ecm.core.api.DocumentModel;
017import org.nuxeo.ecm.core.api.NuxeoException;
018import org.nuxeo.runtime.api.Framework;
019import org.nuxeo.template.api.TemplateInput;
020import org.nuxeo.template.api.TemplateProcessor;
021import org.nuxeo.template.api.adapters.TemplateBasedDocument;
022import org.nuxeo.template.context.SimpleContextBuilder;
023import org.nuxeo.template.processors.AbstractTemplateProcessor;
024
025/**
026 * JXLS {@link TemplateProcessor}
027 *
028 * @author <a href="mailto:tdelprat@nuxeo.com">Tiry</a>
029 */
030public class JXLSTemplateProcessor extends AbstractTemplateProcessor {
031
032    public static final String TEMPLATE_TYPE = "JXLS";
033
034    protected SimpleContextBuilder contextBuilder = new SimpleContextBuilder();
035
036    @Override
037    public Blob renderTemplate(TemplateBasedDocument templateBasedDocument, String templateName) throws IOException {
038
039        Blob sourceTemplateBlob = getSourceTemplateBlob(templateBasedDocument, templateName);
040        List<TemplateInput> params = templateBasedDocument.getParams(templateName);
041
042        DocumentModel doc = templateBasedDocument.getAdaptedDoc();
043        Map<String, Object> ctx = contextBuilder.build(doc, templateName);
044
045        JXLSBindingResolver resolver = new JXLSBindingResolver();
046
047        resolver.resolve(params, ctx, templateBasedDocument);
048
049        File workingDir = getWorkingDir();
050        File generated = new File(workingDir, "JXLSresult-" + System.currentTimeMillis());
051        generated.createNewFile();
052
053        File input = new File(workingDir, "JXLSInput-" + System.currentTimeMillis());
054        input.createNewFile();
055
056        sourceTemplateBlob.transferTo(input);
057
058        XLSTransformer transformer = new XLSTransformer();
059        configureTransformer(transformer);
060        try {
061            transformer.transformXLS(input.getAbsolutePath(), ctx, generated.getAbsolutePath());
062        } catch (InvalidFormatException | ParsePropertyException e) {
063            throw new NuxeoException(e);
064        }
065
066        input.delete();
067
068        Blob newBlob = Blobs.createBlob(generated);
069
070        String templateFileName = sourceTemplateBlob.getFilename();
071
072        // set the output file name
073        String targetFileExt = FileUtils.getFileExtension(templateFileName);
074        String targetFileName = FileUtils.getFileNameNoExt(templateBasedDocument.getAdaptedDoc().getTitle());
075        targetFileName = targetFileName + "." + targetFileExt;
076        newBlob.setFilename(targetFileName);
077
078        // mark the file for automatic deletion on GC
079        Framework.trackFile(generated, newBlob);
080        return newBlob;
081
082    }
083
084    protected void configureTransformer(XLSTransformer transformer) {
085        // NOP but subclass may use this to register a CellProcessor or a
086        // RowProcessor
087    }
088
089    @Override
090    public List<TemplateInput> getInitialParametersDefinition(Blob blob) {
091        return new ArrayList<TemplateInput>();
092    }
093
094}