--- /dev/null
+package user.jobengine.zk.model;\r
+\r
+import java.text.ParseException;\r
+import java.util.ArrayList;\r
+import java.util.Collections;\r
+import java.util.Date;\r
+import java.util.List;\r
+\r
+import org.apache.commons.lang.StringUtils;\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+import org.quartz.CronExpression;\r
+import org.zkoss.bind.annotation.AfterCompose;\r
+import org.zkoss.bind.annotation.Command;\r
+import org.zkoss.bind.annotation.ContextParam;\r
+import org.zkoss.bind.annotation.ContextType;\r
+import org.zkoss.bind.annotation.Init;\r
+import org.zkoss.bind.annotation.NotifyChange;\r
+import org.zkoss.zk.ui.Component;\r
+import org.zkoss.zk.ui.Executions;\r
+import org.zkoss.zk.ui.select.Selectors;\r
+import org.zkoss.zk.ui.select.annotation.Wire;\r
+import org.zkoss.zk.ui.util.Clients;\r
+import org.zkoss.zul.Button;\r
+import org.zkoss.zul.Checkbox;\r
+import org.zkoss.zul.ListModelList;\r
+import org.zkoss.zul.Messagebox;\r
+import org.zkoss.zul.Textbox;\r
+import org.zkoss.zul.Window;\r
+\r
+import com.ibm.nosql.json.api.BasicDBObject;\r
+\r
+import user.jobengine.gui.ComponentBinder;\r
+import user.jobengine.server.IJobEngine;\r
+import user.jobengine.server.IJobRuntime;\r
+import user.jobengine.server.ast.CallJobStepCommand;\r
+import user.jobengine.server.ast.CommandSequence;\r
+import user.jobengine.server.ast.DeclarationSequence;\r
+import user.jobengine.server.ast.InputParameter;\r
+import user.jobengine.server.ast.InputParameterSequence;\r
+import user.jobengine.server.ast.JobTemplate;\r
+import user.jobengine.server.ast.OutputParameter;\r
+import user.jobengine.server.ast.OutputParameterSequence;\r
+import user.jobengine.server.ast.ParameterDeclaration;\r
+import user.jobengine.server.ast.ParameterExpression;\r
+import user.jobengine.server.ast.VariableDeclaration;\r
+import user.jobengine.server.ast.VariableName;\r
+import user.jobengine.server.scheduler.ScheduledJob;\r
+import user.jobengine.server.scheduler.SchedulerService;\r
+import user.jobengine.zk.validator.ChangeValidator;\r
+\r
+public class JobEditorModel2 extends BaseModel {\r
+ private static final String XML = "xml";\r
+ private static final String NEXT_TIME = "nextTime";\r
+ private static final String TEMPLATE = "template";\r
+ private static final Logger logger = LogManager.getLogger();\r
+ private static final String CRONEXPRESSION = "cronexpression";\r
+ @Wire("#resultWin")\r
+ private Window resultWin;\r
+ @Wire("#SaveButton")\r
+ private Button saveButton;\r
+// @Wire("#nameTextbox")\r
+// private Textbox nameTextbox;\r
+ @Wire("#templateNameTextbox")\r
+ private Textbox templateNameTextbox;\r
+ @Wire("#activeCheckbox")\r
+ private Checkbox activeCheckbox;\r
+ @Wire("#executeImmediateCheckbox")\r
+ private Checkbox executeImmediateCheckbox;\r
+ @Wire("#cronExpressionTextbox")\r
+ private Textbox cronExpressionTextbox;\r
+ @Wire("#parameterNameTextbox")\r
+ private Textbox parameterNameTextbox;\r
+ @Wire("#parameterValueTextbox")\r
+ private Textbox parameterValueTextbox;\r
+ @Wire("#parameterTypeTextbox")\r
+ private Textbox parameterTypeTextbox;\r
+ private boolean processDataChanged = false;\r
+ private IJobEngine jobEngine;\r
+ private ListModelList<BasicDBObject> jobs;\r
+ private BasicDBObject selectedJob;\r
+ private BasicDBObject editingJob;\r
+ private String oldSelectedJob;\r
+ private BasicDBObject selectedJob2;\r
+ private ListModelList<BasicDBObject> selectedJobs;\r
+ private ChangeValidator changeValidator;\r
+\r
+ @AfterCompose\r
+ public void afterCompose(@ContextParam(ContextType.VIEW) Component view) {\r
+ Selectors.wireComponents(view, this, false);\r
+ }\r
+\r
+ @Command\r
+ public void close() {\r
+ if (resultWin != null)\r
+ resultWin.detach();\r
+ }\r
+\r
+ @Command\r
+ public void execute() throws Exception {\r
+ if (selectedJob == null)\r
+ return;\r
+ String template = selectedJob.getString("template");\r
+\r
+ ScheduledJob scheduledJob = jobEngine.getScheduledJob(template);\r
+\r
+ try {\r
+ IJobRuntime runtime = scheduledJob.doManualJob();\r
+ toast(runtime);\r
+ } catch (Exception e) {\r
+ Messagebox.show(e.getMessage());\r
+ }\r
+ close();\r
+ }\r
+\r
+ @Command\r
+ public void saveButtonClicked() {\r
+ if (processDataChanged) {\r
+ saveData();\r
+ }\r
+ processDataChanged = false;\r
+ saveButton.setDisabled(true);\r
+ }\r
+\r
+ private void saveData() {\r
+// selectedJob.remove("name");\r
+// selectedJob.append("name", nameTextbox.getValue());\r
+ selectedJob.remove("template");\r
+ selectedJob.append("template", templateNameTextbox.getValue());\r
+ selectedJob.remove("active");\r
+ selectedJob.append("active", activeCheckbox.isChecked());\r
+ selectedJob.remove("executeimmediate");\r
+ selectedJob.append("executeimmediate", executeImmediateCheckbox.isChecked());\r
+ selectedJob.remove("cronexpression");\r
+ selectedJob.append("cronexpression", cronExpressionTextbox.getValue());\r
+ }\r
+\r
+// @Command\r
+// public void onNameChanged() {\r
+// setProcessDataChanged(true);\r
+// selectedJob.remove("name");\r
+// selectedJob.append("name", nameTextbox.getValue());\r
+// saveButton.setDisabled(false);\r
+// logger.info("onNameChanged()");\r
+// }\r
+\r
+// @Command\r
+// public void onNameTextboxClicked() {\r
+// oldSelectedJob = selectedJob.get("name").toString();\r
+// }\r
+\r
+ @Command\r
+ public void onTemplateNameChanged() {\r
+ setProcessDataChanged(true);\r
+ selectedJob.remove("templateName");\r
+ selectedJob.append("templateName", templateNameTextbox.getValue());\r
+ saveButton.setDisabled(false);\r
+ logger.info("onTemplateNameChanged()");\r
+ }\r
+\r
+ @Command\r
+ public void onActiveChanged() {\r
+ setProcessDataChanged(true);\r
+ selectedJob.remove("active");\r
+ selectedJob.append("active", activeCheckbox.isChecked());\r
+ saveButton.setDisabled(false);\r
+ logger.info("onActiveCheckBoxChanged()");\r
+ }\r
+\r
+ @Command\r
+ public void onExecuteImmediateChanged() {\r
+ setProcessDataChanged(true);\r
+ selectedJob.remove("executeimmediate");\r
+ selectedJob.append("executeimmediate", executeImmediateCheckbox.isChecked());\r
+ saveButton.setDisabled(false);\r
+ logger.info("onExecuteImmediateCheckBoxChanged()");\r
+ }\r
+\r
+ @Command\r
+ public void onCronExpressionChanged() {\r
+ setProcessDataChanged(true);\r
+ selectedJob.remove("cronexpression");\r
+ selectedJob.append("cronexpression", cronExpressionTextbox.getValue());\r
+ saveButton.setDisabled(false);\r
+ logger.info("onCronExpressionChangedChanged()");\r
+ }\r
+\r
+// @Command\r
+// public void onParameterNameChanged() {\r
+// setProcessDataChanged(!isProcessDataChanged());\r
+// BasicDBList parameters = (BasicDBList) selectedJob.get("parameters");\r
+// selectedJob.remove("cronexpression");\r
+// selectedJob.append("cronexpression", parameterNameTextbox.getValue());\r
+// saveButton.setDisabled(false);\r
+// logger.info("onParameterNameChanged()");\r
+// }\r
+//\r
+// @Command\r
+// public void onParameterValueChanged() {\r
+// setProcessDataChanged(!isProcessDataChanged());\r
+// BasicDBList parameters = (BasicDBList) selectedJob.get("parameters");\r
+// selectedJob.remove("cronexpression");\r
+// selectedJob.append("cronexpression", parameterValueTextbox.getValue());\r
+// saveButton.setDisabled(false);\r
+// logger.info("onParameterValueChanged()");\r
+// }\r
+//\r
+// @Command\r
+// public void onParameterTypeChanged() {\r
+// setProcessDataChanged(!isProcessDataChanged());\r
+// BasicDBList parameters = (BasicDBList) selectedJob.get("parameters");\r
+// selectedJob.remove("cronexpression");\r
+// selectedJob.append("cronexpression", parameterTypeTextbox.getValue());\r
+// saveButton.setDisabled(false);\r
+// logger.info("onParameterTypeChanged()");\r
+// }\r
+\r
+ private void toast(IJobRuntime runtime) {\r
+ Clients.evalJavaScript(\r
+ String.format("showToast('<b>%s</b> elindĂtva.</br>ID %d')", runtime.getName(), runtime.getId()));\r
+ }\r
+\r
+ public ListModelList<BasicDBObject> getJobs() {\r
+ return jobs;\r
+ }\r
+\r
+ public BasicDBObject getSelectedJob() {\r
+ return selectedJob;\r
+ }\r
+\r
+ public ListModelList<BasicDBObject> getSelectedJobs() {\r
+ return selectedJobs;\r
+ }\r
+\r
+ private boolean isProcessDataChanged() {\r
+ return processDataChanged;\r
+ }\r
+\r
+ private void setProcessDataChanged(boolean processDataChanged) {\r
+ this.processDataChanged = processDataChanged;\r
+ }\r
+\r
+ @Init\r
+ public void init() {\r
+ jobEngine = (IJobEngine) Executions.getCurrent().getArg().get("jobEngine");\r
+ if (jobEngine == null)\r
+ jobEngine = ComponentBinder.getJobEngine();\r
+\r
+ initJobList();\r
+ }\r
+\r
+ private void initJobList() {\r
+ List<BasicDBObject> jobsCollection = new ArrayList<BasicDBObject>();\r
+ for (int index = 0; index < jobEngine.getJobEngineConfiguration().getSchedules().size(); index++) {\r
+ jobsCollection.add(jobEngine.getJobEngineConfiguration().getSchedules().get(index).getValue());\r
+ }\r
+\r
+ Collections.sort(jobsCollection, (a, b) -> {\r
+ String aName = a.getString("name");\r
+ if (aName == null)\r
+ aName = a.getString("template");\r
+ String bName = b.getString("name");\r
+ if (bName == null)\r
+ bName = b.getString("template");\r
+ return aName.toLowerCase().compareTo(bName.toLowerCase());\r
+ });\r
+ jobs = new ListModelList<>(jobsCollection);\r
+\r
+ }\r
+\r
+ @Command\r
+ @NotifyChange("jobs")\r
+ public void reload() {\r
+ SchedulerService scheduler = jobEngine.getScheduler();\r
+ try {\r
+ scheduler.restart();\r
+ initJobList();\r
+\r
+ } catch (Exception e) {\r
+ logger.info("Scheduler reload error. System message: {}", e.getMessage());\r
+ }\r
+\r
+ }\r
+\r
+ public void setJobs(ListModelList<BasicDBObject> jobs) {\r
+ this.jobs = jobs;\r
+ }\r
+\r
+ public void setSelectedJob(BasicDBObject selectedJob) {\r
+ this.selectedJob = selectedJob;\r
+\r
+ if (selectedJob == null) {\r
+ // reset cron next time display\r
+ // reset editing job\r
+ } else {\r
+ String cronExpression = selectedJob.getString(CRONEXPRESSION);\r
+ if (StringUtils.isBlank(cronExpression))\r
+ return;\r
+\r
+ try {\r
+ CronExpression ce = new CronExpression(cronExpression);\r
+ Date nextTime = ce.getNextValidTimeAfter(new Date());\r
+ selectedJob.put(NEXT_TIME, nextTime);\r
+ } catch (ParseException e) {\r
+ logger.catching(e);\r
+ }\r
+\r
+ // update editingJob, create deep copy from selectedJob: a megoldas a\r
+ // NoSQLUtils-ba keruljon\r
+ // notify editingJob changed\r
+\r
+ }\r
+\r
+ }\r
+\r
+ public void setSelectedJobs(ListModelList<BasicDBObject> selectedJobs) {\r
+ this.selectedJobs = selectedJobs;\r
+ }\r
+\r
+ @Command\r
+ public void saveSchedule() throws Exception {\r
+ if (selectedJob != null && isProcessDataChanged()) {\r
+ BasicDBObject scheduleToSave = collectProcessScheduleSettings();\r
+ jobEngine.getJobEngineConfiguration().saveSchedule(selectedJob);\r
+ }\r
+ }\r
+\r
+ @Command\r
+ public void saveTemplateXml() throws Exception {\r
+ logger.info("saveTemplateXml()");\r
+ if (selectedJob != null && isProcessDataChanged()) {\r
+ JobTemplate jobTemplateToSave2 = collectProcessTemplateSettings();\r
+ jobEngine.getJobEngineConfiguration().saveTemplateXml(oldSelectedJob, jobTemplateToSave2);\r
+ }\r
+ }\r
+\r
+ private JobTemplate createDummyTemplate() {\r
+ JobTemplate dummy = new JobTemplate();\r
+ dummy.setName("default-process");\r
+ dummy.setDescription("ez egy description");\r
+\r
+ DeclarationSequence ds = new DeclarationSequence();\r
+ ds.addDeclaration(new ParameterDeclaration("path1", "java.lang.String"));\r
+ ds.addDeclaration(new VariableDeclaration("path2", "java.lang.String"));\r
+\r
+ CallJobStepCommand cjsc = new CallJobStepCommand();\r
+ cjsc.setType("CreateMissingLowresStep.java");\r
+ cjsc.setWeight(1);\r
+ InputParameterSequence ips = new InputParameterSequence();\r
+ ips.addParameter(new InputParameter(new ParameterExpression("path1")));\r
+ cjsc.setInputParameterSequence(ips);\r
+ OutputParameterSequence ops = new OutputParameterSequence();\r
+ ops.addParameter(new OutputParameter(new VariableName("path2")));\r
+ cjsc.setOutputParameterSequence(ops);\r
+\r
+ CommandSequence cs = new CommandSequence();\r
+ cs.addCommand(cjsc);\r
+\r
+ dummy.setDeclarationSequence(ds);\r
+ dummy.setCommandSequence(cs);\r
+\r
+ return dummy;\r
+ }\r
+\r
+ private JobTemplate collectProcessTemplateSettings() {\r
+ JobTemplate jobTemplate = new JobTemplate();\r
+\r
+// jobTemplate.setName(nameTextbox.getValue());\r
+ jobTemplate.setFileName(templateNameTextbox.getValue());\r
+\r
+ return jobTemplate;\r
+ }\r
+\r
+ private BasicDBObject collectProcessScheduleSettings() {\r
+ return null;\r
+ }\r
+\r
+ @Command\r
+ public void duplicateProcess() {\r
+ if (selectedJob != null) {\r
+ JobTemplate processToDuplicate = collectProcessTemplateSettings();\r
+// jobEngine.getJobEngineConfiguration().duplicateProcess(selectedJob);\r
+ logger.info("duplicateProcess()");\r
+ }\r
+ }\r
+\r
+ @Command\r
+ public void copyProcessEntry() {\r
+ if (selectedJob != null) {\r
+// BasicDBObject scheduleToCopy = collectProcessScheduleSettings();\r
+ jobEngine.getJobEngineConfiguration().copyProcessEntry(selectedJob);\r
+ logger.info("copyScheduleEntry()");\r
+ }\r
+ }\r
+}
\ No newline at end of file