package user.jobengine.zk.model;\r
\r
import java.text.ParseException;\r
+import java.util.AbstractMap.SimpleEntry;\r
import java.util.ArrayList;\r
import java.util.Collections;\r
import java.util.Date;\r
import java.util.List;\r
\r
+import javax.xml.parsers.ParserConfigurationException;\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.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.BasicDBList;\r
import com.ibm.nosql.json.api.BasicDBObject;\r
\r
+import user.commons.nosql.NoSQLUtils;\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
+import user.jobengine.zk.validator.CronExpressionValidator;\r
+import user.jobengine.zk.validator.NameValidator;\r
+import user.jobengine.zk.validator.ParameterNameValidator;\r
+import user.jobengine.zk.validator.ParameterTypeValidator;\r
+import user.jobengine.zk.validator.ParameterValueValidator;\r
+import user.jobengine.zk.validator.TemplateNameValidator;\r
\r
public class JobEditorModel2 extends BaseModel {\r
private static final String XML = "xml";\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
+ @Wire("#ActiveCheckbox")\r
private Checkbox activeCheckbox;\r
- @Wire("#executeImmediateCheckbox")\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 editedJob = new BasicDBObject();\r
private BasicDBObject editingJob;\r
- private String oldSelectedJob;\r
- private BasicDBObject selectedJob2;\r
private ListModelList<BasicDBObject> selectedJobs;\r
- private ChangeValidator changeValidator;\r
+ private NameValidator nameValidator = new NameValidator(this);\r
+ private TemplateNameValidator templateNameValidator = new TemplateNameValidator(this);\r
+ private CronExpressionValidator cronExpressionValidator = new CronExpressionValidator(this);\r
+ private ParameterNameValidator parameterNameValidator = new ParameterNameValidator(this);\r
+ private ParameterTypeValidator parameterTypeValidator = new ParameterTypeValidator(this);\r
+ private ParameterValueValidator parameterValueValidator = new ParameterValueValidator(this);\r
+ private String originalJobName;\r
+ private String originalTemplateName;\r
+ private boolean changedSinceLastSave = false;\r
+ private boolean parameterTypeChanged = false;\r
+ private boolean parameterNameChanged = false;\r
+ private boolean templateNameChanged = false;\r
+ private boolean jobsListModified;\r
\r
@AfterCompose\r
public void afterCompose(@ContextParam(ContextType.VIEW) Component view) {\r
\r
@Command\r
public void execute() throws Exception {\r
- if (selectedJob == null)\r
+ if (editedJob == null)\r
return;\r
- String template = selectedJob.getString("template");\r
+ String template = editedJob.getString("template");\r
\r
ScheduledJob scheduledJob = jobEngine.getScheduledJob(template);\r
\r
@Command\r
public void saveButtonClicked() {\r
if (processDataChanged) {\r
+ setChangedSinceLastSave(true);\r
+ setJobsListModified(true);\r
saveData();\r
}\r
processDataChanged = false;\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
+ editedJob = NoSQLUtils.deepCopy(editingJob);\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
+ logger.info("saveData()");\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
+ public void onSelectJob() {\r
+ setOriginalJobName(editingJob.getString("name"));\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
+ public void onActiveClicked() {\r
+ activeCheckbox.setDisabled(false);\r
+ logger.info("onActiveClicked()");\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
+ public void onExecuteImmediateClicked() {\r
+ executeImmediateCheckbox.setDisabled(false);\r
+ logger.info("onExecuteImmediateClicked()");\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 BasicDBObject getEditingJob() {\r
+ return editingJob;\r
+ }\r
+\r
+ @NotifyChange("editingJob")\r
+ public void setEditingJob(BasicDBObject editingJob) {\r
+ this.editingJob = editingJob;\r
+\r
+ if (editingJob == null) {\r
+ } else {\r
+ String cronExpression = editingJob.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
+ editingJob.put(NEXT_TIME, nextTime);\r
+ } catch (ParseException e) {\r
+ logger.catching(e);\r
+ }\r
+\r
+ // TODO update editingJob, create deep copy from editedJob: a megoldas a\r
+ // NoSQLUtils-ba keruljon\r
+ // TODO notify editingJob changed\r
+ }\r
+ }\r
+\r
public ListModelList<BasicDBObject> getJobs() {\r
return jobs;\r
}\r
\r
- public BasicDBObject getSelectedJob() {\r
- return selectedJob;\r
+ public BasicDBObject getEditedJob() {\r
+ return editedJob;\r
}\r
\r
public ListModelList<BasicDBObject> getSelectedJobs() {\r
return selectedJobs;\r
}\r
\r
- private boolean isProcessDataChanged() {\r
+ public boolean isProcessDataChanged() {\r
return processDataChanged;\r
}\r
\r
- private void setProcessDataChanged(boolean processDataChanged) {\r
+ public void setProcessDataChanged(boolean processDataChanged) {\r
this.processDataChanged = processDataChanged;\r
}\r
\r
this.jobs = jobs;\r
}\r
\r
- public void setSelectedJob(BasicDBObject selectedJob) {\r
- this.selectedJob = selectedJob;\r
+ @NotifyChange("editedJob")\r
+ public void setEditedJob(BasicDBObject editedJob) {\r
+ this.editedJob = editedJob;\r
\r
- if (selectedJob == null) {\r
+ if (editedJob == null) {\r
// reset cron next time display\r
// reset editing job\r
} else {\r
- String cronExpression = selectedJob.getString(CRONEXPRESSION);\r
+ String cronExpression = editedJob.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
+ editedJob.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
+ // update editingJob\r
// notify editingJob changed\r
-\r
}\r
-\r
}\r
\r
public void setSelectedJobs(ListModelList<BasicDBObject> 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
+ public void saveSchedulesJson() throws Exception {\r
+ logger.info("saveSchedulesJson()");\r
+ if (jobsListModified) {\r
+ jobEngine.getJobEngineConfiguration().saveSchedulesJson();\r
+ setJobsListModified(false);\r
+ }\r
+ }\r
+\r
+ @Command\r
+ public void saveJobTemplate(JobTemplate template) throws Exception {\r
+ logger.info("saveJobTemplate()");\r
+ JobTemplate jt = new JobTemplate();\r
+\r
+ try {\r
+ for (int i = 0; i < jobEngine.getJobEngineConfiguration().getTemplates().size(); i++) {\r
+ JobTemplate currentTemplate = jobEngine.getJobEngineConfiguration().getTemplates().get(i);\r
+ if (currentTemplate.getName() != null) {\r
+ if (currentTemplate.getName().equals(originalJobName)) {\r
+ jt = currentTemplate;\r
+ } else if (currentTemplate.getFileName().equals(originalTemplateName)) {\r
+ jt = currentTemplate;\r
+ }\r
+ } else if (currentTemplate.getFileName() != null) {\r
+ if (currentTemplate.getFileName().equals(originalTemplateName)) {\r
+ jt = currentTemplate;\r
+ }\r
+ }\r
+ }\r
+\r
+ if (changedSinceLastSave) {\r
+ if (parameterNameChanged || parameterTypeChanged) {\r
+ int j = 0;\r
+ for (int i = 0; i < jt.getDeclarationSequence().getDeclarations().size(); i++) {\r
+ String simpleName = jt.getDeclarationSequence().getDeclarations().get(i).getType().getClass()\r
+ .getSimpleName();\r
+ if (simpleName.equals("ParameterDeclaration")) {\r
+ String name = ((BasicDBObject) ((BasicDBList) editedJob.get("parameters")).get(j))\r
+ .getString("name");\r
+ String type = ((BasicDBObject) ((BasicDBList) editedJob.get("parameters")).get(j))\r
+ .getString("type");\r
+ j++;\r
+ jt.getDeclarationSequence().getDeclarations().set(i, new ParameterDeclaration(name, type));\r
+ }\r
+ }\r
+ }\r
+\r
+ if (originalJobName != null) {\r
+ jt.setName(originalJobName);\r
+ }\r
+\r
+ if (templateNameChanged) {\r
+ jt.setFileName(editedJob.getString("template"));\r
+ }\r
+ }\r
+\r
+ jobEngine.getJobEngineConfiguration().saveTemplateXml(jt);\r
+ } catch (ParserConfigurationException e) {\r
+ logger.info("ParserConfigurationException: {}", e.getCause());\r
+ }\r
+ }\r
+\r
+ @Command\r
+ public void duplicateTemplate() {\r
+ if (editingJob != null) {\r
+ if (originalTemplateName == null) {\r
+ originalTemplateName = editingJob.getString("template");\r
+ }\r
+ jobEngine.getJobEngineConfiguration().duplicateTemplate(originalTemplateName);\r
}\r
+// int indexOfTemplate = -1;\r
+// try {\r
+// JobTemplate jt = new JobTemplate();\r
+// if (editingJob != null) {\r
+// for (int i = 0; i < jobEngine.getJobEngineConfiguration().getTemplates().size(); i++) {\r
+// String name = jobEngine.getJobEngineConfiguration().getTemplates().get(i).getName();\r
+// if (name != null) {\r
+// if (name.equals(editingJob.getString("name"))) {\r
+// indexOfTemplate = i;\r
+// }\r
+// }\r
+// }\r
+//\r
+// if (indexOfTemplate > 0) {\r
+// jt = (JobTemplate) SerializationUtils\r
+// .clone(jobEngine.getJobEngineConfiguration().getTemplates().get(indexOfTemplate));\r
+// jt.setFileName(FilenameUtils.getName(jt.getFileName()).concat("-copy.xml"));\r
+// }\r
+// jobEngine.getJobEngineConfiguration().saveTemplateXml(jt);\r
+// }\r
+// } catch (ParserConfigurationException e) {\r
+// logger.info("ParserConfigurationException: {}", e.getCause());\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
+ @NotifyChange("jobs")\r
+ public void copyProcessEntry() {\r
+ if (editingJob != null) {\r
+ String newName = editingJob.getString("name").concat("-copy");\r
+ while (jobEngine.getJobEngineConfiguration().scheduleExists(newName)) {\r
+ newName = newName.concat("-copy");\r
+ }\r
+ BasicDBObject newEntry = new BasicDBObject();\r
+ newEntry = NoSQLUtils.deepCopy(editingJob);\r
+ newEntry.put("name", newName);\r
+\r
+ jobEngine.getJobEngineConfiguration().getSchedules()\r
+ .add(new SimpleEntry<String, BasicDBObject>(newName, newEntry));\r
+ jobs.add(newEntry);\r
+ setJobsListModified(true);\r
+ logger.info("copyScheduleEntry()");\r
}\r
}\r
\r
- private JobTemplate createDummyTemplate() {\r
- JobTemplate dummy = new JobTemplate();\r
- dummy.setName("default-process");\r
- dummy.setDescription("ez egy description");\r
+ public CronExpressionValidator getCronExpressionValidator() {\r
+ return cronExpressionValidator;\r
+ }\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
+ public void setCronExpressionValidator(CronExpressionValidator cronExpressionValidator) {\r
+ this.cronExpressionValidator = cronExpressionValidator;\r
+ }\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
+ public TemplateNameValidator getTemplateNameValidator() {\r
+ return templateNameValidator;\r
+ }\r
\r
- CommandSequence cs = new CommandSequence();\r
- cs.addCommand(cjsc);\r
+ public NameValidator getNameValidator() {\r
+ return nameValidator;\r
+ }\r
\r
- dummy.setDeclarationSequence(ds);\r
- dummy.setCommandSequence(cs);\r
+ public ParameterNameValidator getParameterNameValidator() {\r
+ return parameterNameValidator;\r
+ }\r
\r
- return dummy;\r
+ public void setParameterNameValidator(ParameterNameValidator parameterNameValidator) {\r
+ this.parameterNameValidator = parameterNameValidator;\r
}\r
\r
- private JobTemplate collectProcessTemplateSettings() {\r
- JobTemplate jobTemplate = new JobTemplate();\r
+ public ParameterTypeValidator getParameterTypeValidator() {\r
+ return parameterTypeValidator;\r
+ }\r
\r
-// jobTemplate.setName(nameTextbox.getValue());\r
- jobTemplate.setFileName(templateNameTextbox.getValue());\r
+ public void setParameterTypeValidator(ParameterTypeValidator parameterTypeValidator) {\r
+ this.parameterTypeValidator = parameterTypeValidator;\r
+ }\r
\r
- return jobTemplate;\r
+ public ParameterValueValidator getParameterValueValidator() {\r
+ return parameterValueValidator;\r
}\r
\r
- private BasicDBObject collectProcessScheduleSettings() {\r
- return null;\r
+ public void setParameterValueValidator(ParameterValueValidator parameterValueValidator) {\r
+ this.parameterValueValidator = parameterValueValidator;\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
+ public Button getSaveButton() {\r
+ return saveButton;\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
+ public String getOriginalJobName() {\r
+ return originalJobName;\r
+ }\r
+\r
+ public void setOriginalJobName(String originalJobName) {\r
+ this.originalJobName = originalJobName;\r
+ }\r
+\r
+ public void setParameterTypeChanged(boolean parameterTypeChanged) {\r
+ this.parameterTypeChanged = parameterTypeChanged;\r
+ }\r
+\r
+ public void setParameterNameChanged(boolean parameterNameChanged) {\r
+ this.parameterNameChanged = parameterNameChanged;\r
+ }\r
+\r
+ public void setTemplateNameChanged(boolean templateNameChanged) {\r
+ this.templateNameChanged = templateNameChanged;\r
+ }\r
+\r
+ public boolean isChangedSinceLastSave() {\r
+ return changedSinceLastSave;\r
+ }\r
+\r
+ public void setChangedSinceLastSave(boolean changedSinceLastSave) {\r
+ this.changedSinceLastSave = changedSinceLastSave;\r
+ }\r
+\r
+ public void setOriginalTemplateName(String originalTemplateName) {\r
+ this.originalTemplateName = originalTemplateName;\r
+ }\r
+\r
+ public String getOriginalTemplateName() {\r
+ return originalTemplateName;\r
}\r
+\r
+ public boolean isJobsListModified() {\r
+ return jobsListModified;\r
+ }\r
+\r
+ public void setJobsListModified(boolean jobsListModified) {\r
+ this.jobsListModified = jobsListModified;\r
+ }\r
+\r
}
\ No newline at end of file