1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.syncope.client.console.tasks;
20
21 import java.util.List;
22 import org.apache.commons.lang3.StringUtils;
23 import org.apache.syncope.client.ui.commons.Constants;
24 import org.apache.syncope.client.ui.commons.ajax.form.IndicatorAjaxFormComponentUpdatingBehavior;
25 import org.apache.syncope.client.ui.commons.markup.html.form.AjaxDropDownChoicePanel;
26 import org.apache.syncope.client.ui.commons.markup.html.form.AjaxTextFieldPanel;
27 import org.apache.syncope.client.ui.commons.markup.html.form.SelectChoiceRenderer;
28 import org.apache.syncope.client.ui.commons.markup.html.form.SelectOption;
29 import org.apache.wicket.ajax.AjaxRequestTarget;
30 import org.apache.wicket.markup.html.form.FormComponent;
31 import org.apache.wicket.markup.html.panel.Panel;
32 import org.apache.wicket.model.IModel;
33 import org.apache.wicket.model.Model;
34 import org.apache.wicket.model.PropertyModel;
35
36 public class CrontabPanel extends Panel {
37
38 private static final long serialVersionUID = 7879593326085337650L;
39
40 private final AjaxTextFieldPanel seconds;
41
42 private final AjaxTextFieldPanel minutes;
43
44 private final AjaxTextFieldPanel hours;
45
46 private final AjaxTextFieldPanel daysOfMonth;
47
48 private final AjaxTextFieldPanel months;
49
50 private final AjaxTextFieldPanel daysOfWeek;
51
52 public CrontabPanel(final String id, final PropertyModel<String> cronExpressionModel, final String cronExpression) {
53 super(id);
54 setOutputMarkupId(true);
55
56 final SelectOption[] cronTemplates = {
57 new SelectOption(getString("selOpt1"), "UNSCHEDULE"),
58 new SelectOption(getString("selOpt2"), "0 0/5 * * * ?"),
59 new SelectOption(getString("selOpt3"), "0 0 12 * * ?"),
60 new SelectOption(getString("selOpt4"), "0 0 0 1 * ?"),
61 new SelectOption(getString("selOpt5"), "0 0 0 L * ?"),
62 new SelectOption(getString("selOpt6"), "0 0 0 ? * 2")
63 };
64
65 final AjaxDropDownChoicePanel<SelectOption> cronTemplateChooser = new AjaxDropDownChoicePanel<>(
66 "cronTemplateChooser", "cronTemplateChooser", new Model<>());
67
68 cronTemplateChooser.setNullValid(false);
69 cronTemplateChooser.setPlaceholder("chooseForTemplate");
70
71 cronTemplateChooser.getField().setModel(new IModel<>() {
72
73 private static final long serialVersionUID = 6762568283146531315L;
74
75 @Override
76 public SelectOption getObject() {
77 SelectOption result = null;
78 for (SelectOption so : cronTemplates) {
79 if (so.getKeyValue().equals(cronExpressionModel.getObject())) {
80 result = so;
81 }
82 }
83
84 return result;
85 }
86
87 @Override
88 public void setObject(final SelectOption object) {
89 cronExpressionModel.setObject(object == null || object.equals(cronTemplates[0])
90 ? null
91 : object.toString());
92 }
93
94 @Override
95 public void detach() {
96
97 }
98 });
99 cronTemplateChooser.setChoices(List.of(cronTemplates));
100 cronTemplateChooser.setChoiceRenderer(new SelectChoiceRenderer<>());
101 add(cronTemplateChooser);
102
103 seconds = new AjaxTextFieldPanel("seconds", "seconds", new Model<>(getCronField(cronExpression, 0)));
104 add(seconds.hideLabel());
105
106 minutes = new AjaxTextFieldPanel("minutes", "minutes", new Model<>(getCronField(cronExpression, 1)));
107 add(minutes.hideLabel());
108
109 hours = new AjaxTextFieldPanel("hours", "hours", new Model<>(getCronField(cronExpression, 2)));
110 add(hours.hideLabel());
111
112 daysOfMonth = new AjaxTextFieldPanel(
113 "daysOfMonth", "daysOfMonth", new Model<>(getCronField(cronExpression, 3)));
114 add(daysOfMonth.hideLabel());
115
116 months = new AjaxTextFieldPanel("months", "months", new Model<>(getCronField(cronExpression, 4)));
117 add(months.hideLabel());
118
119 daysOfWeek = new AjaxTextFieldPanel("daysOfWeek", "daysOfWeek", new Model<>(getCronField(cronExpression, 5)));
120 add(daysOfWeek.hideLabel());
121
122 final FormComponent<SelectOption> component = cronTemplateChooser.getField();
123
124 cronTemplateChooser.getField().add(new IndicatorAjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
125
126 private static final long serialVersionUID = -1107858522700306810L;
127
128 @Override
129 protected void onUpdate(final AjaxRequestTarget target) {
130 seconds.setModelObject(getCronField(component, 0));
131 minutes.setModelObject(getCronField(component, 1));
132 hours.setModelObject(getCronField(component, 2));
133 daysOfMonth.setModelObject(getCronField(component, 3));
134 months.setModelObject(getCronField(component, 4));
135 daysOfWeek.setModelObject(getCronField(component, 5));
136 target.add(CrontabPanel.this);
137 }
138 });
139 }
140
141 private static String getCronField(final FormComponent<?> formComponent, final int field) {
142 String cronField = null;
143
144 if (formComponent != null) {
145 cronField = getCronField(formComponent.getInput(), field);
146 }
147
148 return cronField;
149 }
150
151 private static String getCronField(final String cron, final int field) {
152 String cronField = null;
153
154 if (cron != null && !cron.isEmpty() && !"UNSCHEDULE".equals(cron)) {
155 cronField = cron.split(" ")[field].trim();
156 }
157
158 return cronField;
159 }
160
161 public String getCronExpression() {
162 String cronExpression = null;
163
164 if (seconds != null && seconds.getModelObject() != null
165 && minutes != null && minutes.getModelObject() != null
166 && hours != null && hours.getModelObject() != null
167 && daysOfMonth != null && daysOfMonth.getModelObject() != null
168 && months != null && months.getModelObject() != null
169 && daysOfWeek != null && daysOfWeek.getModelObject() != null) {
170
171 cronExpression = new StringBuilder().
172 append(seconds.getModelObject().trim()).append(' ').
173 append(minutes.getModelObject().trim()).append(' ').
174 append(hours.getModelObject().trim()).append(' ').
175 append(daysOfMonth.getModelObject().trim()).append(' ').
176 append(months.getModelObject().trim()).append(' ').
177 append(daysOfWeek.getModelObject().trim()).toString();
178 }
179
180 return StringUtils.isNotBlank(cronExpression) ? cronExpression : null;
181 }
182 }