package org.sigmah.server.autoExport;
/*
* #%L
* Sigmah
* %%
* Copyright (C) 2010 - 2016 URD
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* #L%
*/
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.sigmah.server.dao.GlobalExportDAO;
import org.sigmah.server.dao.impl.GlobalExportHibernateDAO;
import org.sigmah.server.domain.export.GlobalContactExport;
import org.sigmah.server.domain.export.GlobalContactExportSettings;
import org.sigmah.server.domain.export.GlobalExport;
import org.sigmah.server.domain.export.GlobalExportSettings;
import org.sigmah.server.i18n.I18nServer;
import org.sigmah.server.servlet.exporter.data.GlobalExportDataContactProvider;
import org.sigmah.server.servlet.exporter.data.GlobalExportDataProjectProvider;
import org.sigmah.server.servlet.exporter.data.cells.ExportDataCell;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.inject.Injector;
/**
* Scheduled (in link{GlobalExportJobActivator}) job to generate global exports by check export frequency of each
* organization Runs in a separate thread ATTENTION: This job must not run at the same time with link{AutoDeleteJob}
*
* @author sherzod V1.3
* @author Mehdi Benabdeslam (mehdi.benabdeslam@netapsys.fr) v2.0
*/
public class AutoExportJob implements Job {
private static final Logger LOG = LoggerFactory.getLogger(AutoExportJob.class);
@Override
public void execute(JobExecutionContext executionContext) throws JobExecutionException {
final JobDataMap dataMap = executionContext.getJobDetail().getJobDataMap();
final EntityManager em = (EntityManager) dataMap.get("em");
final Injector injector = (Injector) dataMap.get("injector");
EntityTransaction tx = null;
LOG.debug("******************* AUTO CREATE EXPORT ********************");
try {
// Open transaction
/**
* NOTE: it is impossible to use @Transactional for this method The reason is link{TransactionalInterceptor} gets
* EntityManager from the injector which is out of scope
*/
tx = em.getTransaction();
tx.begin();
final GlobalExportDAO exportDAO = injector.getInstance(GlobalExportHibernateDAO.class);
// PROJECTS
final GlobalExportDataProjectProvider dataProvider = injector.getInstance(GlobalExportDataProjectProvider.class);
final List<GlobalExportSettings> settings = exportDAO.getGlobalExportSettings();
for (final GlobalExportSettings setting : settings) {
/**
* Check for auto export schedule
*/
// skip if no export schedule is specified
if (setting.getAutoExportFrequency() == null || setting.getAutoExportFrequency() < 1)
continue;
final Calendar systemCalendar = Calendar.getInstance();
boolean doExport = false;
if ((setting.getAutoExportFrequency() >= 31) && (setting.getAutoExportFrequency() <= 58)) {
// Case of Monthly Auto Export
if ((setting.getAutoExportFrequency() - 30) == systemCalendar.get(Calendar.DAY_OF_MONTH)) {
doExport = true;
}
} else if ((setting.getAutoExportFrequency() >= 61) && (setting.getAutoExportFrequency() <= 67)) {
// Case of Weekly Auto Export
if ((setting.getAutoExportFrequency() - 60) == systemCalendar.get(Calendar.DAY_OF_WEEK)) {
doExport = true;
}
} else {
// Regular Auto-Export every N-days
final Calendar scheduledCalendar = Calendar.getInstance();
Date lastExportDate = setting.getLastExportDate();
if (lastExportDate == null) {
lastExportDate = systemCalendar.getTime();
setting.setLastExportDate(lastExportDate);
em.merge(setting);
} else {
scheduledCalendar.setTime(lastExportDate);
// add scheduled days to the last exported date
scheduledCalendar.add(Calendar.DAY_OF_MONTH, setting.getAutoExportFrequency());
}
final Date systemDate = getZeroTimeDate(systemCalendar.getTime());
final Date scheduledDate = getZeroTimeDate(scheduledCalendar.getTime());
if (systemDate.compareTo(scheduledDate) >= 0) {
doExport = true;
}
}
if (doExport) {
/**
* Start auto export
*/
// persist global export logger
final GlobalExport globalExport = new GlobalExport();
globalExport.setOrganization(setting.getOrganization());
globalExport.setDate(systemCalendar.getTime());
em.persist(globalExport);
em.flush();
// generate export content
final Map<String, List<ExportDataCell[]>> exportData =
dataProvider.generateGlobalExportData(setting.getOrganization().getId(), em, injector.getInstance(I18nServer.class), null, null);
// persist export content
dataProvider.persistGlobalExportDataAsCsv(globalExport, em, exportData);
}
}
// CONTACTS
final GlobalExportDataContactProvider dataContactProvider = injector.getInstance(GlobalExportDataContactProvider.class);
final List<GlobalContactExportSettings> settingsContacts = exportDAO.getGlobalContactExportSettings();
for (final GlobalContactExportSettings settingContacts : settingsContacts) {
/**
* Check for auto export schedule
*/
// skip if no export schedule is specified
if (settingContacts.getAutoExportFrequency() == null || settingContacts.getAutoExportFrequency() < 1)
continue;
final Calendar systemCalendar = Calendar.getInstance();
boolean doExport = false;
if ((settingContacts.getAutoExportFrequency() >= 31) && (settingContacts.getAutoExportFrequency() <= 58)) {
// Case of Monthly Auto Export
if ((settingContacts.getAutoExportFrequency() - 30) == systemCalendar.get(Calendar.DAY_OF_MONTH)) {
doExport = true;
}
} else if ((settingContacts.getAutoExportFrequency() >= 61) && (settingContacts.getAutoExportFrequency() <= 67)) {
// Case of Weekly Auto Export
if ((settingContacts.getAutoExportFrequency() - 60) == systemCalendar.get(Calendar.DAY_OF_WEEK)) {
doExport = true;
}
} else {
// Regular Auto-Export every N-days
final Calendar scheduledCalendar = Calendar.getInstance();
Date lastExportDate = settingContacts.getLastExportDate();
if (lastExportDate == null) {
lastExportDate = systemCalendar.getTime();
settingContacts.setLastExportDate(lastExportDate);
em.merge(settingContacts);
} else {
scheduledCalendar.setTime(lastExportDate);
// add scheduled days to the last exported date
scheduledCalendar.add(Calendar.DAY_OF_MONTH, settingContacts.getAutoExportFrequency());
}
final Date systemDate = getZeroTimeDate(systemCalendar.getTime());
final Date scheduledDate = getZeroTimeDate(scheduledCalendar.getTime());
if (systemDate.compareTo(scheduledDate) >= 0) {
doExport = true;
}
}
if (doExport) {
/**
* Start auto export
*/
// persist global export logger
final GlobalContactExport globalContactExport = new GlobalContactExport();
globalContactExport.setOrganization(settingContacts.getOrganization());
globalContactExport.setDate(systemCalendar.getTime());
em.persist(globalContactExport);
em.flush();
// generate export content
final Map<String, List<ExportDataCell[]>> exportData =
dataProvider.generateGlobalExportData(settingContacts.getOrganization().getId(), em, injector.getInstance(I18nServer.class), null, null);
// persist export content
dataContactProvider.persistGlobalExportDataAsCsv(globalContactExport, em, exportData);
}
}
tx.commit();
LOG.info("Scheduled EXPORT of global exports fired");
} catch (Exception ex) {
if (tx != null && tx.isActive())
tx.rollback();
LOG.error("Scheduled global export job failed : " + ex.getMessage());
ex.printStackTrace();
}
}
public static Date getZeroTimeDate(Date fecha) {
Date res = fecha;
Calendar calendar = Calendar.getInstance();
calendar.setTime(fecha);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
res = calendar.getTime();
return res;
}
}