package org.akaza.openclinica.control.admin; import org.akaza.openclinica.bean.core.Role; import org.akaza.openclinica.control.SpringServletAccess; import org.akaza.openclinica.control.core.SecureController; import org.akaza.openclinica.control.form.FormProcessor; import org.akaza.openclinica.view.Page; import org.akaza.openclinica.web.InsufficientPermissionException; import org.akaza.openclinica.service.extract.XsltTriggerService; import org.quartz.JobKey; import org.quartz.Trigger; import org.quartz.TriggerKey; import org.quartz.impl.StdScheduler; /** * PauseJobServlet, a small servlet to pause/unpause a trigger in the scehduler. * The basic premise, you provide a name which has been validated by JavaScript * on the JSP side with a simple confirm dialog box. You get here - the job is * either paused or unpaused. Possible complications, if we start using Priority * for other things. * * @author Tom Hickerson, 2009 * */ public class PauseJobServlet extends SecureController { private static String SCHEDULER = "schedulerFactoryBean"; private static String groupName = "DEFAULT"; private static String groupImportName = "importTrigger"; private StdScheduler scheduler; // private SimpleTrigger trigger; @Override protected void mayProceed() throws InsufficientPermissionException { // TODO copied from CreateJobExport - DRY? tbh 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 // above copied from create dataset servlet, needs to be changed to // allow only admin-level users } private StdScheduler getScheduler() { scheduler = this.scheduler != null ? scheduler : (StdScheduler) SpringServletAccess.getApplicationContext(context).getBean(SCHEDULER); return scheduler; }// also perhaps DRY, tbh @Override protected void processRequest() throws Exception { FormProcessor fp = new FormProcessor(request); String triggerName = fp.getString("tname"); // String gName = fp.getString("gname"); String gName= request.getParameter("gname"); String finalGroupName = ""; if ("".equals(gName) || "0".equals(gName)) { finalGroupName = XsltTriggerService.TRIGGER_GROUP_NAME; } else {// should equal 1 finalGroupName = groupImportName; } String deleteMe = fp.getString("del"); scheduler = getScheduler(); Trigger trigger = scheduler.getTrigger(TriggerKey.triggerKey(triggerName, finalGroupName)); try { if (("y".equals(deleteMe)) && (ub.isSysAdmin())) { scheduler.deleteJob(JobKey.jobKey(triggerName, finalGroupName)); // set return message here logger.debug("deleted job: " + triggerName); addPageMessage("The following job " + triggerName + " and its corresponding Trigger have been deleted from the system."); } else { if (scheduler.getTriggerState(TriggerKey.triggerKey(triggerName, finalGroupName)) == Trigger.TriggerState.PAUSED) { scheduler.resumeTrigger(TriggerKey.triggerKey(triggerName, finalGroupName)); // trigger.setPriority(Trigger.DEFAULT_PRIORITY); logger.debug("-- resuming trigger! " + triggerName + " " + finalGroupName); addPageMessage("This trigger " + triggerName + " has been resumed and will continue to run until paused or deleted."); // set message here } else { scheduler.pauseTrigger(TriggerKey.triggerKey(triggerName, finalGroupName)); // trigger.setPriority(Trigger.STATE_PAUSED); logger.debug("-- pausing trigger! " + triggerName + " " + finalGroupName); addPageMessage("This trigger " + triggerName + " has been paused, and will not run again until it is restored."); // set message here } } } catch (NullPointerException e) { // TODO Auto-generated catch block e.printStackTrace(); } // all validation done on JSP side // forward back to view job servlet here // set a message if ("".equals(gName) || "0".equals(gName)) { forwardPage(Page.VIEW_JOB_SERVLET); } else { forwardPage(Page.VIEW_IMPORT_JOB_SERVLET); } } }