1
2
3
4
5
6 package pt.digitalis.dif.presentation.views.jsp.entities;
7
8 import java.util.ArrayList;
9 import java.util.HashSet;
10 import java.util.List;
11 import java.util.Set;
12
13 import pt.digitalis.dif.controller.http.HTTPConstants;
14 import pt.digitalis.dif.controller.http.HTTPControllerConfiguration;
15 import pt.digitalis.dif.controller.interfaces.IDIFContext;
16 import pt.digitalis.dif.controller.interfaces.INavigationHistory;
17 import pt.digitalis.dif.controller.objects.Breadcrumb;
18 import pt.digitalis.dif.dem.annotations.parameter.InjectParameterErrors;
19 import pt.digitalis.dif.dem.annotations.stage.Context;
20 import pt.digitalis.dif.dem.annotations.stage.Execute;
21 import pt.digitalis.dif.dem.objects.ViewObject;
22 import pt.digitalis.dif.dem.objects.parameters.errors.ParameterErrors;
23 import pt.digitalis.dif.presentation.views.jsp.taglibs.AbstractDIFTag;
24 import pt.digitalis.dif.presentation.views.jsp.taglibs.layout.Wizard;
25 import pt.digitalis.dif.presentation.views.jsp.taglibs.objects.WizardDefinition;
26 import pt.digitalis.dif.presentation.views.jsp.taglibs.objects.beans.WizardStepItem;
27 import pt.digitalis.utils.common.CollectionUtils;
28 import pt.digitalis.utils.config.IConfigurations;
29
30 import com.google.inject.Inject;
31
32
33
34
35
36
37
38 public abstract class AbstractWizardStage {
39
40
41 @Inject
42 protected IConfigurations config;
43
44
45 @Context
46 protected IDIFContext context;
47
48
49 private WizardDefinition wizardDefinition = null;
50
51
52
53
54
55
56
57
58
59
60 protected ViewObject cancel(IDIFContext context, int currentStep)
61 {
62 INavigationHistory navHistory = context.getSession().getNavigationHistory();
63
64 if (navHistory.isEmpty() || navHistory.getHistory().size() < 2)
65 {
66
67 HTTPControllerConfiguration httpConfig = config.readConfiguration(HTTPControllerConfiguration.class);
68 context.redirectTo(httpConfig.getHomeStageID());
69
70 }
71 else
72 {
73 Set<String> wizardStageIDs = new HashSet<String>();
74
75 for (WizardStepItem item: getWizardDefinition().getItems())
76 if (item.getStageId() != null)
77 wizardStageIDs.add(item.getStageId());
78
79 for (int i = navHistory.getHistory().size() - 1; i >= 0; i--)
80 if (!wizardStageIDs.contains(navHistory.getHistory().get(i).getStageID()))
81 {
82 Breadcrumb crumb = navHistory.getHistory().get(i);
83
84 context.redirectTo(crumb.getStageID(), CollectionUtils.keyValueStringToMapObject(crumb
85 .getParameterPassed()));
86
87
88 return null;
89 }
90 }
91
92 return null;
93 }
94
95
96
97
98
99
100
101 protected boolean canFinish()
102 {
103 return (getWizardDefinition().getActiveStep() == getWizardDefinition().getItems().size());
104 }
105
106
107
108
109
110 protected final boolean isCurrentStepSubmit()
111 {
112 Object stepParameter = context.getRequest().getParameter(WizardDefinition.HTML_STEP_PARAMETER);
113 Object formParameter = context.getRequest().getParameter(HTTPConstants.FORM_SUBMIT_NAME);
114 Object stageParameter = context.getRequest().getParameter(HTTPConstants.FORM_SUBMIT_STAGE);
115
116 return (stepParameter != null && formParameter != null && stageParameter != null
117 && getWizardDefinition().getName().equalsIgnoreCase(formParameter.toString())
118 && context.getStage().equalsIgnoreCase(stageParameter.toString()) && context.getStage()
119 .equalsIgnoreCase(getStep(Integer.parseInt(stepParameter.toString())).getStageId()));
120 }
121
122
123 @InjectParameterErrors
124 protected ParameterErrors errors;
125
126
127
128
129
130
131 @Execute
132 public final ViewObject execute()
133 {
134 int currentStep = WizardDefinition.getWizardActiveStepNumber(context.getRequest(), getWizardDefinition()
135 .getName(), getWizardDefinition().getHasIndexPage(), !errors.hasErrors());
136
137 if (isCurrentStepSubmit() && !errors.hasErrors())
138 {
139
140 Object stepParameter = context.getRequest().getParameter(WizardDefinition.HTML_STEP_PARAMETER);
141
142
143
144 while (currentStep < getTotalSteps() && !isStepEnabled(currentStep))
145 currentStep++;
146
147
148 while (currentStep > 1 && (!isStepEnabled(currentStep) || !isStepAccessible(currentStep)))
149 currentStep--;
150
151 getWizardDefinition().setActiveStep(currentStep);
152 getWizardDefinition().setCanFinish(canFinish());
153
154 Object actionParameter = context.getRequest().getParameter(WizardDefinition.HTML_ACTION_PARAMETER);
155
156 if (actionParameter != null)
157 {
158 if (canFinish()
159 && AbstractDIFTag.getTagMessages(Wizard.class, context.getLanguage()).get("finish")
160 .equalsIgnoreCase(actionParameter.toString()))
161 {
162
163
164 wizardStepSubmit(context, Integer.parseInt(stepParameter.toString()));
165
166
167 return finish(context, currentStep);
168
169 }
170 else if (AbstractDIFTag.getTagMessages(Wizard.class, context.getLanguage()).get("cancel")
171 .equalsIgnoreCase(actionParameter.toString()))
172 {
173
174 return cancel(context, currentStep);
175 }
176 else
177 {
178 WizardStepItem item = getActiveStep();
179
180 if (item.getStageId() != null)
181 context.redirectTo(getActiveStep().getStageId());
182
183
184 return wizardStepSubmit(context, Integer.parseInt(stepParameter.toString()));
185 }
186 }
187 else
188
189 return wizardStepSubmit(context, Integer.parseInt(stepParameter.toString()));
190
191 }
192 else
193 {
194
195 while (currentStep < getTotalSteps() && !isStepEnabled(currentStep))
196 currentStep++;
197
198
199
200 while (currentStep > 1 && (!isStepEnabled(currentStep) || !isStepAccessible(currentStep)))
201 currentStep--;
202
203 getWizardDefinition().setActiveStep(currentStep);
204 getWizardDefinition().setCanFinish(canFinish());
205
206 Object actionParameter = context.getRequest().getParameter(WizardDefinition.HTML_ACTION_PARAMETER);
207
208 if (actionParameter != null)
209 {
210 if (canFinish()
211 && AbstractDIFTag.getTagMessages(Wizard.class, context.getLanguage()).get("finish")
212 .equalsIgnoreCase(actionParameter.toString()))
213 return finish(context, currentStep);
214
215 else if (AbstractDIFTag.getTagMessages(Wizard.class, context.getLanguage()).get("cancel")
216 .equalsIgnoreCase(actionParameter.toString()))
217 return cancel(context, currentStep);
218 }
219
220 return wizardStepEnter(context, currentStep);
221 }
222
223 }
224
225
226
227
228
229
230
231
232
233
234 protected abstract ViewObject finish(IDIFContext context, int currentStep);
235
236
237
238
239 protected final WizardStepItem getActiveStep()
240 {
241 return getStep(getWizardDefinition().getActiveStep());
242 }
243
244
245
246
247
248
249 protected final WizardStepItem getStep(int step)
250 {
251 if (step < 1 || step > getTotalSteps())
252 return null;
253 else
254 return getWizardDefinition().getItems().get(step - 1);
255 }
256
257
258
259
260 protected final int getTotalSteps()
261 {
262 return getWizardDefinition().getItems().size();
263 }
264
265
266
267
268 public final WizardDefinition getWizardDefinition()
269 {
270 if (wizardDefinition == null)
271 {
272 String wizardFormName = context.getStage();
273
274
275
276 WizardDefinition def = new WizardDefinition(wizardFormName, new ArrayList<WizardStepItem>(), 1);
277
278
279 wizardDefinition = initializeWizardDefinition(def);
280
281
282 if (wizardDefinition.getHasIndexPage())
283 {
284 List<WizardStepItem> items = new ArrayList<WizardStepItem>();
285
286 items.add(new WizardStepItem(AbstractDIFTag.getTagMessages(Wizard.class, context.getLanguage()).get(
287 "index"), null, null, true, true, false));
288 items.addAll(wizardDefinition.getItems());
289
290 wizardDefinition.setItems(items);
291 }
292
293 wizardDefinition.setActiveStep(WizardDefinition.getWizardActiveStepNumber(context.getRequest(),
294 wizardDefinition.getName(), getWizardDefinition().getHasIndexPage(), !errors.hasErrors()));
295
296 for (int i = 0; i < getTotalSteps(); i++)
297 {
298 WizardStepItem item = getStep(i + 1);
299
300 item.setEnabled(isStepEnabled(i + 1));
301 item.setAccessible(isStepAccessible(i + 1));
302 }
303
304 wizardDefinition.setCanFinish(canFinish());
305 }
306
307 return wizardDefinition;
308 }
309
310
311
312
313 protected final boolean hasIndexStep()
314 {
315 return getWizardDefinition().getHasIndexPage();
316 }
317
318
319
320
321
322
323 protected abstract WizardDefinition initializeWizardDefinition(WizardDefinition def);
324
325
326
327
328
329
330
331
332 protected boolean isStepAccessible(int stepNumber)
333 {
334 return getStep(stepNumber).isAccessible();
335 }
336
337
338
339
340
341
342
343
344 protected boolean isStepEnabled(int stepNumber)
345 {
346 return getStep(stepNumber).isEnabled();
347 }
348
349
350
351
352
353
354
355
356
357
358
359 protected ViewObject wizardStepEnter(IDIFContext context, int currentStep)
360 {
361 return null;
362 }
363
364
365
366
367
368
369
370
371
372
373
374 protected abstract ViewObject wizardStepSubmit(IDIFContext context, int currentStep);
375 }