package com.geowebframework.webclient.scheduler; import java.util.Date; import java.util.HashMap; import java.util.List; import org.springframework.scheduling.support.CronTrigger; import com.geowebframework.dataservice.ListService; import com.geowebframework.dataservice.querybuilder.EventTrigger; import com.geowebframework.metadataservice.ClassService; import com.geowebframework.transfer.model.metadataservice.Class; public class GwSchedDefTrigger extends EventTrigger { //issue #565 public final static String PROPERTY_SCHED_DEF_ID = "sched_def_id"; public final static String PROPERTY_SCHED_DEF_NAME = "sched_def_name"; public final static String PROPERTY_ENABLED = "enabled"; public final static String PROPERTY_CRON = "cron"; public final static String PROPERTY_HUMAN_READABLE_CRON = "human_readable_cron"; public final static String PROPERTY_START_TIME = "start_time"; public final static String PROPERTY_PERIOD = "period"; public final static String PROPERTY_DELAY = "delay"; public final static String PROPERTY_LOCK_END_TIME = "lock_end_time"; //issue #1233 public boolean beforeInsert(HashMap valuesMap){ log.info("gwSchedDefTrigger - beforeInsert()"); log.info("valuesMap: "+valuesMap); String cron = (String) valuesMap.get(PROPERTY_CRON); if(cron!=null){ String human_readable_cron = null; if(!cron.trim().isEmpty()) { try { //testing cron expression: it's valid if does not throws exception (6 digit, no year) CronTrigger cronTrigger = new CronTrigger(cron); } catch (Exception e) { log.error(e.getMessage(), e); throw new RuntimeException("Invalid cron expression. "+e.getMessage()); } human_readable_cron = GwScheduler.getHumanReadableCronDescription(cron); } valuesMap.put(PROPERTY_HUMAN_READABLE_CRON, human_readable_cron); log.info("human_readable_cron: "+human_readable_cron); } return true; }; public boolean afterInsert(HashMap valuesMap){ log.info("gwSchedDefTrigger - afterInsert()"); log.info("valuesMap: "+valuesMap); String sched_def_name = (String) valuesMap.get(PROPERTY_SCHED_DEF_NAME); try { ((GwScheduler) services.get("gwScheduler")).activateSchedulation(sched_def_name); } catch (Exception e) { throw new RuntimeException(e.getMessage(), e); } return true; }; public boolean beforeUpdate(HashMap valuesMap,HashMap oldValuesMap){ log.info("gwSchedDefTrigger - beforeUpdate()"); log.info("valuesMap: "+valuesMap); log.info("oldValuesMap: "+oldValuesMap); String cron = (String) valuesMap.get(PROPERTY_CRON); if(cron!=null){ String human_readable_cron = null; if(!cron.trim().isEmpty()) { try { //testing cron expression: it's valid if does not throws exception (6 digit, no year) CronTrigger cronTrigger = new CronTrigger(cron); } catch (Exception e) { log.error(e.getMessage(), e); throw new RuntimeException("Invalid cron expression. "+e.getMessage()); } human_readable_cron = GwScheduler.getHumanReadableCronDescription(cron); } valuesMap.put(PROPERTY_HUMAN_READABLE_CRON, human_readable_cron); log.info("human_readable_cron: "+human_readable_cron); } //issue #1233 //lock_end_time may to be auto-computated too far in time () //---------------------------- String sched_def_name = (String) valuesMap.get(PROPERTY_SCHED_DEF_NAME); Integer enabled = null; Object enabledObj = valuesMap.get(PROPERTY_ENABLED); if(enabledObj!=null) { if(enabledObj instanceof Integer) enabled = (Integer) enabledObj; //It handles Oracle problem that convert it in BigDecimal else if(!enabledObj.toString().trim().isEmpty()) enabled = Integer.parseInt(enabledObj.toString().trim()); } Date start_time = (Date) valuesMap.get(PROPERTY_START_TIME); Object period = valuesMap.get(PROPERTY_PERIOD); //Integer, but only need to know if had changed Object delay = valuesMap.get(PROPERTY_DELAY); //Integer, but only need to know if had changed boolean needToResetLockEndTime = sched_def_name!=null || enabled!=null || cron!=null || start_time!=null || period!=null || delay!=null; if(needToResetLockEndTime==true){ valuesMap.put(PROPERTY_LOCK_END_TIME, null); } //---------------------------- return true; }; public boolean afterUpdate(HashMap valuesMap,HashMap oldValuesMap){ log.info("gwSchedDefTrigger - afterUpdate()"); log.info("valuesMap: "+valuesMap); log.info("oldValuesMap: "+oldValuesMap); String sched_def_name = (String) valuesMap.get(PROPERTY_SCHED_DEF_NAME); String sched_def_name_old = (String) oldValuesMap.get(PROPERTY_SCHED_DEF_NAME); Integer enabled = null; Object enabledObj = valuesMap.get(PROPERTY_ENABLED); if(enabledObj!=null) { if(enabledObj instanceof Integer) enabled = (Integer) enabledObj; //It handles Oracle problem that convert it in BigDecimal else if(!enabledObj.toString().trim().isEmpty()) enabled = Integer.parseInt(enabledObj.toString().trim()); } String cron = (String) valuesMap.get(PROPERTY_CRON); Date start_time = (Date) valuesMap.get(PROPERTY_START_TIME); Object period = valuesMap.get(PROPERTY_PERIOD); //Integer, but only need to know if had changed Object delay = valuesMap.get(PROPERTY_DELAY); //Integer, but only need to know if had changed boolean needToRecompute = sched_def_name!=null || enabled!=null || cron!=null || start_time!=null || period!=null || delay!=null; log.info("needToRecompute: "+needToRecompute); if(needToRecompute==true){ if(sched_def_name==null) sched_def_name = sched_def_name_old; if(enabled!=null && enabled==0) ((GwScheduler) services.get("gwScheduler")).deactivateSchedulation(sched_def_name); else try { ((GwScheduler) services.get("gwScheduler")).activateSchedulation(sched_def_name); } catch (Exception e) { throw new RuntimeException(e.getMessage(), e); } } return true; }; public boolean beforeDelete(HashMap valuesMap){ log.info("gwSchedDefTrigger - beforeDelete()"); log.info("valuesMap: "+valuesMap); Integer sched_def_id = null; Object sched_def_idObj = valuesMap.get(PROPERTY_SCHED_DEF_ID); if(sched_def_idObj!=null) { if(sched_def_idObj instanceof Integer) sched_def_id = (Integer) sched_def_idObj; //It handles Oracle problem that convert it in BigDecimal else if(!sched_def_idObj.toString().trim().isEmpty()) sched_def_id = Integer.parseInt(sched_def_idObj.toString().trim()); } //issue #908 Class gwClass = ((ClassService) services.get("gwm_classService")).selectByClassName(new Class(GwScheduler.GW_SCHED_DEF_CLASSNAME)); List> rec = ((ListService) services.get("queryService")).executeQuery("select * from "+gwClass.getTableNameSchemaPrefixed()+".gw_sched_def where "+PROPERTY_SCHED_DEF_ID+"="+sched_def_id, null); log.info("rec: "+rec); if(rec!=null && !rec.isEmpty()){ String sched_def_name = (String) rec.get(0).get(PROPERTY_SCHED_DEF_NAME); valuesMap.put(PROPERTY_SCHED_DEF_NAME, sched_def_name); } return true; }; public boolean afterDelete(HashMap valuesMap){ log.info("gwSchedDefTrigger - afterDelete()"); log.info("valuesMap: "+valuesMap); String sched_def_name = (String) valuesMap.get(PROPERTY_SCHED_DEF_NAME); //populated in beforeDelete() if(sched_def_name!=null) { ((GwScheduler) services.get("gwScheduler")).deactivateSchedulation(sched_def_name); } return true; }; }