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}