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.SchedulerException;
import org.quartz.SimpleTrigger;
import org.quartz.TriggerKey;
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;
/**
* Create Job Import Servlet, by Tom Hickerson, 2009
*
* @author thickerson Purpose: to create jobs in the 'importTrigger' group,
* which will be meant to run the ImportStatefulJob.
*/
public class CreateJobImportServlet extends SecureController {
private static String SCHEDULER = "schedulerFactoryBean";
private static String IMPORT_TRIGGER = "importTrigger";
public static final String DATE_START_JOB = "job";
public static final String EMAIL = "contactEmail";
public static final String JOB_NAME = "jobName";
public static final String JOB_DESC = "jobDesc";
public static final String USER_ID = "user_id";
public static final String HOURS = "hours";
public static final String MINUTES = "minutes";
public static final String DIRECTORY = "filePathDir";
public static final String DIR_PATH = ImportSpringJob.DIR_PATH;
public static final String STUDY_ID = "studyId";
private StdScheduler scheduler;
// private SimpleTrigger trigger;
// private JobDataMap jobDataMap;
@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
// allow only admin-level users
}
private StdScheduler getScheduler() {
scheduler = this.scheduler != null ? scheduler : (StdScheduler) SpringServletAccess.getApplicationContext(context).getBean(SCHEDULER);
return scheduler;
}
/*
* Find all the form items and re-populate as necessary
*/
private void setUpServlet() throws Exception {
String directory = SQLInitServlet.getField("filePath") + DIR_PATH + File.separator;
logger.debug("found directory: " + directory);
// find all the form items and re-populate them if necessary
FormProcessor fp2 = new FormProcessor(request);
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);
// tbh, replacing the above with another version, 06/2009
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);
// YW >>
// << tbh
request.setAttribute("filePath", directory);
// request.setAttribute("activeStudy", activeStudy);
request.setAttribute(JOB_NAME, fp2.getString(JOB_NAME));
request.setAttribute(JOB_DESC, fp2.getString(JOB_DESC));
request.setAttribute(EMAIL, fp2.getString(EMAIL));
request.setAttribute(HOURS, new Integer(fp2.getInt(HOURS)).toString());
request.setAttribute(MINUTES, new Integer(fp2.getInt(MINUTES)).toString());
}
@Override
protected void processRequest() throws Exception {
// TODO multi stage servlet to generate import jobs
// validate form, create job and return to view jobs servlet
FormProcessor fp = new FormProcessor(request);
TriggerService triggerService = new TriggerService();
scheduler = getScheduler();
String action = fp.getString("action");
if (StringUtil.isBlank(action)) {
// set up list of data sets
// select by ... active study
setUpServlet();
forwardPage(Page.CREATE_JOB_IMPORT);
} else if ("confirmall".equalsIgnoreCase(action)) {
// collect form information
Set<TriggerKey> triggerKeys = scheduler.getTriggerKeys(GroupMatcher.triggerGroupEquals(IMPORT_TRIGGER));
String[] triggerNames = triggerKeys.stream().toArray(String[]::new);
HashMap errors = triggerService.validateImportJobForm(fp, request, triggerNames);
if (!errors.isEmpty()) {
// set errors to request
request.setAttribute("formMessages", errors);
logger.debug("has validation errors in the first section" + errors.toString());
setUpServlet();
forwardPage(Page.CREATE_JOB_IMPORT);
} else {
logger.info("found no validation errors, continuing");
int studyId = fp.getInt(STUDY_ID);
StudyDAO studyDAO = new StudyDAO(sm.getDataSource());
StudyBean studyBean = (StudyBean) studyDAO.findByPK(studyId);
SimpleTrigger trigger = triggerService.generateImportTrigger(fp, sm.getUserBean(), studyBean, LocaleResolver.getLocale(request).getLanguage());
// SimpleTrigger trigger = new SimpleTrigger();
JobDetailFactoryBean JobDetailFactoryBean = new JobDetailFactoryBean();
JobDetailFactoryBean.setGroup(IMPORT_TRIGGER);
JobDetailFactoryBean.setName(trigger.getKey().getName());
JobDetailFactoryBean.setJobClass(org.akaza.openclinica.web.job.ImportStatefulJob.class);
JobDetailFactoryBean.setJobDataMap(trigger.getJobDataMap());
JobDetailFactoryBean.setDurability(true); // need durability?
// set to the scheduler
try {
Date dateStart = scheduler.scheduleJob(JobDetailFactoryBean.getObject(), trigger);
logger.debug("== found job date: " + dateStart.toString());
// set a success message here
addPageMessage("You have successfully created a new job: " + trigger.getKey().getName() + " which is now set to run at the time you specified.");
forwardPage(Page.VIEW_IMPORT_JOB_SERVLET);
} catch (SchedulerException se) {
se.printStackTrace();
// set a message here with the exception message
setUpServlet();
addPageMessage("There was an unspecified error with your creation, please contact an administrator.");
forwardPage(Page.CREATE_JOB_IMPORT);
}
}
} else {
forwardPage(Page.ADMIN_SYSTEM);
// forward to form
// should we even get to this part?
}
}
}