/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package fr.itldev.koya.action; import java.io.Serializable; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import org.alfresco.model.ContentModel; import org.alfresco.model.RenditionModel; import org.alfresco.repo.action.executer.ActionExecuterAbstractBase; import org.alfresco.repo.content.MimetypeMap; import org.alfresco.repo.rendition.executer.AbstractRenderingEngine; import org.alfresco.repo.rendition.executer.ReformatRenderingEngine; import org.alfresco.service.cmr.action.Action; import org.alfresco.service.cmr.action.ParameterDefinition; import org.alfresco.service.cmr.model.FileFolderService; import org.alfresco.service.cmr.model.FileInfo; import org.alfresco.service.cmr.rendition.RenditionDefinition; import org.alfresco.service.cmr.rendition.RenditionService; import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.QName; import org.apache.log4j.Logger; /** * * @author nico */ public class PdfRenderActionExecuter extends ActionExecuterAbstractBase { private final Logger logger = Logger.getLogger(PdfRenderActionExecuter.class); public static final String NAME = "pdfRender"; private RenditionService renditionService; private FileFolderService fileFolderService; private NodeService nodeService; public static final String RESULT_PARAM_NODEREF = "nodeRef"; public static final String RESULT_PARAM_SUCCESS = "sucess"; public static final String RESULT_PARAM_NAME = "name"; public static final String RESULT_PARAM_TITLE = "title"; public static QName QNAME_RENDTION = QName.createQName( NamespaceService.CONTENT_MODEL_1_0_URI, "pdfrendition"); private RenditionDefinition renditionDef; public RenditionService getRenditionService() { return renditionService; } public void setRenditionService(RenditionService renditionService) { this.renditionService = renditionService; } public FileFolderService getFileFolderService() { return fileFolderService; } public void setFileFolderService(FileFolderService fileFolderService) { this.fileFolderService = fileFolderService; } public NodeService getNodeService() { return nodeService; } public void setNodeService(NodeService nodeService) { this.nodeService = nodeService; } @Override protected void executeImpl(Action action, NodeRef actionedUponNodeRef) { Map<String, Serializable> result = new HashMap<>(); FileInfo fi = fileFolderService.getFileInfo(actionedUponNodeRef); result.put(RESULT_PARAM_NODEREF, fi.getNodeRef().toString()); result.put(RESULT_PARAM_NAME, fi.getName()); result.put(RESULT_PARAM_TITLE, nodeService.getProperty(actionedUponNodeRef, ContentModel.PROP_TITLE)); result.put(RESULT_PARAM_SUCCESS, Boolean.FALSE); if (!fi.isFolder()) { // Check for an already existing PDF rendition ChildAssociationRef car = renditionService.getRenditionByName( actionedUponNodeRef, renditionDef.getRenditionName()); NodeRef pdfRendition = null; if (car != null) { pdfRendition = car.getChildRef(); // Check if rendition is up to date Date docModified = (Date) nodeService.getProperty( actionedUponNodeRef, ContentModel.PROP_MODIFIED); Date rentionCreated = (Date) nodeService.getProperty( pdfRendition, ContentModel.PROP_CREATED); if (docModified.after(rentionCreated)) { car = null; } } try { if (car == null) { car = renditionService.render(actionedUponNodeRef, renditionDef); pdfRendition = car.getChildRef(); // Add the aspect to hide the rendition from searches nodeService.setType(pdfRendition, ContentModel.TYPE_THUMBNAIL); nodeService.addAspect(pdfRendition, RenditionModel.ASPECT_HIDDEN_RENDITION, null); } String name = (String) nodeService.getProperty(actionedUponNodeRef, ContentModel.PROP_NAME); name = name.replaceFirst("(. *)\\.[^.]+$", "$1.pdf"); String title = (String) nodeService.getProperty(actionedUponNodeRef, ContentModel.PROP_TITLE); title = title.replaceFirst("(. *)\\.[^.]+$", "$1.pdf"); result.put(RESULT_PARAM_NODEREF, pdfRendition.toString()); result.put(RESULT_PARAM_NAME, name); result.put(RESULT_PARAM_TITLE, title); result.put(RESULT_PARAM_SUCCESS, Boolean.TRUE); } catch (Exception ex) { logger.warn("Exception Occured during pdf rendtion : "+ex.getMessage()); logger.trace(ex.getMessage(), ex); } } action.setParameterValue(PARAM_RESULT, (Serializable) result); } @Override protected void addParameterDefinitions(List<ParameterDefinition> paramList) { } public void init() { // Names must be provided for the rendition definition and the rendering // engine to use. String renderingEngineName = ReformatRenderingEngine.NAME; // Create the Rendition Definition object. renditionDef = renditionService .createRenditionDefinition(QNAME_RENDTION, renderingEngineName); // Set parameters on the rendition definition. renditionDef.setParameterValue(AbstractRenderingEngine.PARAM_MIME_TYPE, MimetypeMap.MIMETYPE_PDF); } }