001/*
002 *  Copyright 2020 Anyware Services
003 *
004 *  Licensed under the Apache License, Version 2.0 (the "License");
005 *  you may not use this file except in compliance with the License.
006 *  You may obtain a copy of the License at
007 *
008 *      http://www.apache.org/licenses/LICENSE-2.0
009 *
010 *  Unless required by applicable law or agreed to in writing, software
011 *  distributed under the License is distributed on an "AS IS" BASIS,
012 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 *  See the License for the specific language governing permissions and
014 *  limitations under the License.
015 */
016package org.ametys.odf.schedulable;
017
018import java.io.File;
019import java.io.FileInputStream;
020import java.io.IOException;
021import java.io.InputStream;
022import java.time.ZonedDateTime;
023import java.time.format.DateTimeFormatter;
024import java.util.ArrayList;
025import java.util.HashMap;
026import java.util.List;
027import java.util.Map;
028
029import org.quartz.JobDataMap;
030import org.quartz.JobExecutionContext;
031
032import org.ametys.cms.data.Binary;
033import org.ametys.core.schedule.Schedulable;
034import org.ametys.core.util.DateUtils;
035import org.ametys.odf.program.SubProgram;
036import org.ametys.plugins.core.schedule.Scheduler;
037import org.ametys.plugins.repository.data.holder.group.impl.ModifiableModelAwareRepeater;
038import org.ametys.plugins.repository.data.holder.group.impl.ModifiableModelAwareRepeaterEntry;
039import org.ametys.plugins.workflow.AbstractWorkflowComponent;
040import org.ametys.plugins.workflow.component.CheckRightsCondition;
041import org.ametys.runtime.i18n.I18nizableText;
042
043/**
044 * {@link Schedulable} for archive educational booklet.
045 */
046public class ArchiveEducationalBookletSchedulable extends EducationalBookletSchedulable
047{
048    @Override
049    protected void _generateSubProgramsEducationalBooklet(JobExecutionContext context, File bookletDirectory, Map<String, String> pdfParameters)
050    {
051        JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
052        ZonedDateTime archiveDate = (ZonedDateTime) jobDataMap.get(Scheduler.PARAM_VALUES_PREFIX + "archiveDate");
053        pdfParameters.put("archiveDate", DateUtils.zonedDateTimeToString(archiveDate));
054        
055        super._generateSubProgramsEducationalBooklet(context, bookletDirectory, pdfParameters);
056        
057        EducationalBookletReport report = (EducationalBookletReport) context.get(_EDUCATIONAL_BOOKLET_REPORT);
058        
059        List<SubProgram> exportSubPrograms = new ArrayList<>();
060        List<SubProgram> subProgramsInError = report.getSubProgramsWithError();
061        for (SubProgram subProgram : report.getExportSubPrograms())
062        {
063            ModifiableModelAwareRepeater repeater = subProgram.getRepeater("educational-booklets", true);
064            ModifiableModelAwareRepeaterEntry entry = repeater.addEntry();
065            
066            entry.setValue("date", archiveDate);
067
068            File educationalBookletPDF = new File(report.getBookletDirectory(), subProgram.getName() + "/" + subProgram.getLanguage() + "/educational-booklet.pdf");
069            
070            try
071            {
072                Binary binary = _getEducationalBookletAsBinary(educationalBookletPDF, subProgram, archiveDate);
073                entry.setValue("pdf", binary);
074                
075                Map<String, Object> paramsEdit = new HashMap<>();
076                paramsEdit.put(CheckRightsCondition.FORCE, true); // Ignore the right condition
077                paramsEdit.put(AbstractWorkflowComponent.CONTEXT_PARAMETERS_KEY, new HashMap<>());
078                
079                _contentWorkflowHelper.doAction(subProgram, 222, paramsEdit);
080                
081                exportSubPrograms.add(subProgram);
082            }
083            catch (Exception e)
084            {
085                subProgramsInError.add(subProgram);
086                getLogger().error("An error occurred during saving the educational booklet in the subprogram '{} ({})'", subProgram.getTitle(), subProgram.getId(), e);
087            }
088            
089        }
090        
091        report.setExportSubProgram(exportSubPrograms);
092        
093        context.put(_EDUCATIONAL_BOOKLET_REPORT, report);
094    }
095    
096    /**
097     * Build a binary object from the educational booklet file
098     * @param educationalBookletPDF the educational booklet file
099     * @param subProgram the subProgram
100     * @param votedDate the voted date for the educational booklet 
101     * @return the binary
102     * @throws IOException if an error occurred
103     */
104    protected Binary _getEducationalBookletAsBinary(File educationalBookletPDF, SubProgram subProgram, ZonedDateTime votedDate) throws IOException
105    {
106        Binary binary = new Binary();
107        try (InputStream is = new FileInputStream(educationalBookletPDF))
108        {
109            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
110            String dateAsString = votedDate.format(formatter);
111            
112            String prefix = _i18nUtils.translate(new I18nizableText("plugin.odf", "PLUGINS_ODF_EDUCATIONAL_BOOKLET_SUBPROGRAM_PDF_NAME_PREFIX"), subProgram.getLanguage());
113            String fileName = prefix + " " + subProgram.getTitle() + " - " + dateAsString + ".pdf";
114
115            binary.setEncoding("UTF-8");
116            binary.setMimeType("application/pdf");
117            binary.setLastModificationDate(votedDate);
118            binary.setFilename(fileName);
119            binary.setInputStream(is);
120        }
121        return binary;
122    }
123    
124    @Override
125    protected String _getMailSubjectBaseKey()
126    {
127        return "PLUGINS_ODF_EDUCATIONAL_BOOKLET_SUBPROGRAM_MAIL_SUBJECT_ARCHIVE_";
128    }
129
130    @Override
131    protected String _getMailBodyBaseKey()
132    {
133        return "PLUGINS_ODF_EDUCATIONAL_BOOKLET_SUBPROGRAM_MAIL_BODY_ARCHIVE_";
134    }
135}