package org.akaza.openclinica.control.admin;
import org.akaza.openclinica.bean.managestudy.StudyBean;
import org.akaza.openclinica.control.SpringServletAccess;
import org.akaza.openclinica.control.core.SecureController;
import org.akaza.openclinica.control.form.FormProcessor;
import org.akaza.openclinica.core.form.StringUtil;
import org.akaza.openclinica.dao.login.UserAccountDAO;
import org.akaza.openclinica.dao.managestudy.StudyDAO;
import org.akaza.openclinica.i18n.core.LocaleResolver;
import org.akaza.openclinica.view.Page;
import org.akaza.openclinica.web.InsufficientPermissionException;
import org.akaza.openclinica.web.SQLInitServlet;
import org.akaza.openclinica.web.job.ImportSpringJob;
import org.akaza.openclinica.web.job.TriggerService;
import org.quartz.*;
import org.quartz.impl.StdScheduler;
import org.quartz.impl.matchers.GroupMatcher;
import org.springframework.scheduling.quartz.JobDetailFactoryBean;
import java.io.File;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Set;
public class UpdateJobImportServlet extends SecureController {
private static String SCHEDULER = "schedulerFactoryBean";
private static String TRIGGER_IMPORT_GROUP = "importTrigger";
private StdScheduler scheduler;
private SimpleTrigger trigger;
private JobDataMap dataMap;
private static final String IMPORT_DIR = SQLInitServlet.getField("filePath") + CreateJobImportServlet.DIR_PATH + File.separator;
@Override
protected void mayProceed() throws InsufficientPermissionException {
if (ub.isSysAdmin() || ub.isTechAdmin()) {
return;
}
// if (currentRole.getRole().equals(Role.STUDYDIRECTOR) || currentRole.getRole().equals(Role.COORDINATOR)) {
// return;
// }
addPageMessage(respage.getString("no_have_correct_privilege_current_study") + respage.getString("change_study_contact_sysadmin"));
throw new InsufficientPermissionException(Page.MENU_SERVLET, resexception.getString("not_allowed_access_extract_data_servlet"), "1");// TODO
}
private StdScheduler getScheduler() {
scheduler = this.scheduler != null ? scheduler : (StdScheduler) SpringServletAccess.getApplicationContext(context).getBean(SCHEDULER);
return scheduler;
}
private void setUpServlet(Trigger trigger) throws Exception {
FormProcessor fp2 = new FormProcessor(request);
request.setAttribute(CreateJobImportServlet.JOB_NAME, trigger.getKey().getName());
request.setAttribute(CreateJobImportServlet.JOB_DESC, trigger.getDescription());
dataMap = trigger.getJobDataMap();
String contactEmail = dataMap.getString(ImportSpringJob.EMAIL);
logger.debug("found email: " + contactEmail);
int userId = dataMap.getInt(ImportSpringJob.USER_ID);
int hours = dataMap.getInt(CreateJobImportServlet.HOURS);
int minutes = dataMap.getInt(CreateJobImportServlet.MINUTES);
String directory = dataMap.getString(ImportSpringJob.DIRECTORY);
String studyName = dataMap.getString(ImportSpringJob.STUDY_NAME);
request.setAttribute(ImportSpringJob.EMAIL, contactEmail);
request.setAttribute(ImportSpringJob.STUDY_NAME, studyName);
request.setAttribute("filePath", directory);
request.setAttribute("firstFilePath", IMPORT_DIR);
request.setAttribute("hours", new Integer(hours).toString());
request.setAttribute("minutes", new Integer(minutes).toString());
Date jobDate = trigger.getNextFireTime();
UserAccountDAO udao = new UserAccountDAO(sm.getDataSource());
StudyDAO sdao = new StudyDAO(sm.getDataSource());
// ArrayList studies = udao.findStudyByUser(ub.getName(), (ArrayList)
// sdao.findAll());
// request.setAttribute("studies", studies);
ArrayList<StudyBean> all = (ArrayList<StudyBean>) sdao.findAll();
ArrayList<StudyBean> finalList = new ArrayList<StudyBean>();
for (StudyBean sb : all) {
if (!(sb.getParentStudyId() > 0)) {
finalList.add(sb);
// System.out.println("found study name: " + sb.getName());
finalList.addAll(sdao.findAllByParent(sb.getId()));
}
}
// System.out.println("found list of studies: " + finalList.toString());
addEntityList("studies", finalList, respage.getString("a_user_cannot_be_created_no_study_as_active"), Page.ADMIN_SYSTEM);
// tbh >>
// HashMap presetValues = new HashMap();
// Calendar calendar = new GregorianCalendar();
// calendar.setTime(jobDate);
// presetValues.put(CreateJobImportServlet.DATE_START_JOB + "Hour",
// calendar.get(Calendar.HOUR_OF_DAY));
// presetValues.put(CreateJobImportServlet.DATE_START_JOB + "Minute",
// calendar.get(Calendar.MINUTE));
// // TODO this will have to match l10n formatting
// presetValues.put(CreateJobImportServlet.DATE_START_JOB + "Date",
// (calendar.get(Calendar.MONTH) + 1) + "/" +
// calendar.get(Calendar.DATE) + "/"
// + calendar.get(Calendar.YEAR));
// fp2.setPresetValues(presetValues);
// setPresetValues(fp2.getPresetValues());
}
@Override
protected void processRequest() throws Exception {
FormProcessor fp = new FormProcessor(request);
TriggerService triggerService = new TriggerService();
String action = fp.getString("action");
String triggerName = fp.getString("tname");
scheduler = getScheduler();
logger.debug("found trigger name " + triggerName);
Trigger trigger = scheduler.getTrigger(new TriggerKey(triggerName, TRIGGER_IMPORT_GROUP));
//System.out.println("found trigger from the other side " + trigger.getFullName());
if (StringUtil.isBlank(action)) {
setUpServlet(trigger);
forwardPage(Page.UPDATE_JOB_IMPORT);
} else if ("confirmall".equalsIgnoreCase(action)) {
Set<TriggerKey> triggerKeys = scheduler.getTriggerKeys(GroupMatcher.triggerGroupEquals("DEFAULT"));
String[] triggerNames = triggerKeys.stream().toArray(String[]::new);
HashMap errors = triggerService.validateImportJobForm(fp, request, triggerNames, trigger.getKey().getName());
if (!errors.isEmpty()) {
// send back
addPageMessage("Your modifications caused an error, please see the messages for more information.");
setUpServlet(trigger);
forwardPage(Page.UPDATE_JOB_IMPORT);
} else {
StudyDAO studyDAO = new StudyDAO(sm.getDataSource());
int studyId = fp.getInt(CreateJobImportServlet.STUDY_ID);
StudyBean study = (StudyBean) studyDAO.findByPK(studyId);
// in the place of a users' current study, tbh
Date startDate = trigger.getStartTime();
trigger = triggerService.generateImportTrigger(fp, sm.getUserBean(), study, startDate, LocaleResolver.getLocale(request).getLanguage());
// scheduler = getScheduler();
JobDetailFactoryBean JobDetailFactoryBean = new JobDetailFactoryBean();
JobDetailFactoryBean.setGroup(TRIGGER_IMPORT_GROUP);
JobDetailFactoryBean.setName(trigger.getKey().getName());
JobDetailFactoryBean.setJobClass(org.akaza.openclinica.web.job.ImportStatefulJob.class);
JobDetailFactoryBean.setJobDataMap(trigger.getJobDataMap());
JobDetailFactoryBean.setDurability(true); // need durability?
try {
scheduler.deleteJob(new JobKey(triggerName, TRIGGER_IMPORT_GROUP));
Date dateStart = scheduler.scheduleJob(JobDetailFactoryBean.getObject(), trigger);
addPageMessage("Your job has been successfully modified.");
forwardPage(Page.VIEW_IMPORT_JOB_SERVLET);
} catch (SchedulerException se) {
se.printStackTrace();
// set a message here with the exception message
setUpServlet(trigger);
addPageMessage("There was an unspecified error with your creation, please contact an administrator.");
forwardPage(Page.UPDATE_JOB_IMPORT);
}
}
}
}
}