/*
 * Version 1.1
 * CeCILL Copyright (c) 2006-2007, AtolCD, ADULLACT-projet
 * Initiated by AtolCD S.A. & ADULLACT-projet S.A.
 * Developped by AtolCD
 *
 * contact@atolcd.com
 * contact@adullact-projet.coop
 *
 * Ce logiciel est un programme informatique servant à faire circuler des
 * documents au travers d'un circuit de validation, où chaque acteur vise
 * le dossier, jusqu'à l'étape finale de signature.
 *
 * Ce logiciel est régi par la licence CeCILL soumise au droit français et
 * respectant les principes de diffusion des logiciels libres. Vous pouvez
 * utiliser, modifier et/ou redistribuer ce programme sous les conditions
 * de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
 * sur le site "http://www.cecill.info".
 *
 * En contrepartie de l'accessibilité au code source et des droits de copie,
 * de modification et de redistribution accordés par cette licence, il n'est
 * offert aux utilisateurs qu'une garantie limitée.  Pour les mêmes raisons,
 * seule une responsabilité restreinte pèse sur l'auteur du programme,  le
 * titulaire des droits patrimoniaux et les concédants successifs.
 *
 * A cet égard  l'attention de l'utilisateur est attirée sur les risques
 * associés au chargement,  à l'utilisation,  à la modification et/ou au
 * développement et à la reproduction du logiciel par l'utilisateur étant
 * donné sa spécificité de logiciel libre, qui peut le rendre complexe à
 * manipuler et qui le réserve donc à des développeurs et des professionnels
 * avertis possédant  des  connaissances  informatiques approfondies.  Les
 * utilisateurs sont donc invités à charger  et  tester  l'adéquation  du
 * logiciel à leurs besoins dans des conditions permettant d'assurer la
 * sécurité de leurs systèmes et ou de leurs données et, plus généralement,
 * à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
 *
 * Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
 * pris connaissance de la licence CeCILL, et que vous en avez accepté les
 * termes.
 */
package com.atolcd.parapheur.web.bean;

import com.atolcd.parapheur.model.ParapheurModel;
import javax.faces.context.FacesContext;
import org.alfresco.model.ContentModel;
import org.alfresco.repo.content.MimetypeMap;
import org.alfresco.service.cmr.repository.ContentReader;
import org.alfresco.service.cmr.repository.ContentService;
import org.alfresco.service.cmr.repository.ContentWriter;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.web.bean.coci.CCUpdateFileDialog;

/**
 * Custom JSF bean to update Alfresco documents.
 * 
 * This bean extends the default Alfresco CCUpdateFileDialog for traditional content
 * update.
 * 
 * On document update, the old document name is updated to the new file name.
 *
 * @author Vivien Barousse
 */
public class UpdateDocumentBean extends CCUpdateFileDialog {

    private ContentService contentService;

    @Override
    protected String finishImpl(FacesContext context, String outcome) throws Exception {
        NodeRef document = property.getDocument().getNodeRef();
        NodeRef dossier = getNodeService().getPrimaryParent(document).getParentRef();
        NodeService nodeService = getNodeService();
        String fileName = getFileName();

        String finalOutcome = super.finishImpl(context, outcome);

        if ("S²LOW".equals(nodeService.getProperty(dossier, ParapheurModel.PROP_TDT_NOM))
                && "ACTES".equals(nodeService.getProperty(dossier, ParapheurModel.PROP_TDT_PROTOCOLE))) {
            ContentReader reader = contentService.getReader(document, ContentModel.PROP_CONTENT);
            ContentWriter writer = contentService.getWriter(document, ContentModel.PROP_CONTENT, true);

            writer.setMimetype(MimetypeMap.MIMETYPE_PDF);
            writer.setEncoding(reader.getEncoding());

            contentService.transform(reader, writer);

            if (!fileName.endsWith(".pdf")) {
                fileName += ".pdf";
            }
        }

        nodeService.setProperty(document, ContentModel.PROP_NAME, fileName);

        return finalOutcome;
    }

    public void setContentService(ContentService contentService) {
        this.contentService = contentService;
    }

}
