View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
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                  // no detach
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 }