Classes in this File | Line Coverage | Branch Coverage | Complexity | ||||
StageCGTemplate |
|
| 1.3414634146341464;1,341 |
1 | /** | |
2 | * - Digitalis Internal Framework v2.0 - (C) 2007, Digitalis Informatica. Distribuicao e Gestao de Informatica, Lda. | |
3 | * Estrada de Paco de Arcos num.9 - Piso -1 2780-666 Paco de Arcos Telefone: (351) 21 4408990 Fax: (351) 21 4408999 | |
4 | * http://www.digitalis.pt | |
5 | */ | |
6 | package pt.digitalis.dif.codegen.templates; | |
7 | ||
8 | import java.util.ArrayList; | |
9 | import java.util.HashMap; | |
10 | import java.util.List; | |
11 | import java.util.Map; | |
12 | ||
13 | import pt.digitalis.dif.codegen.CGAncillaries; | |
14 | import pt.digitalis.dif.dem.CallbackType; | |
15 | import pt.digitalis.dif.dem.interfaces.IService; | |
16 | import pt.digitalis.dif.dem.interfaces.IStage; | |
17 | import pt.digitalis.dif.dem.interfaces.IStageInstance; | |
18 | import pt.digitalis.dif.dem.objects.EventType; | |
19 | import pt.digitalis.dif.dem.objects.LicenseEditionType; | |
20 | import pt.digitalis.dif.dem.objects.ViewObject; | |
21 | import pt.digitalis.dif.dem.objects.ViewType; | |
22 | import pt.digitalis.dif.dem.objects.parameters.IParameters; | |
23 | import pt.digitalis.dif.exception.manager.RegistrationManagerException; | |
24 | import pt.digitalis.dif.utils.logging.DIFLogger; | |
25 | import pt.digitalis.utils.inspection.ReflectionUtils; | |
26 | import pt.digitalis.utils.inspection.exception.AuxiliaryOperationException; | |
27 | ||
28 | /** | |
29 | * This class is a template for the IStage interface method implementations. The CodeGen will copy these methods to a | |
30 | * new Proxy class for each stage. Some methods will be copied "as is", other will be tweaked. These Proxy classes are | |
31 | * intended to be Singletons kept by the {@link pt.digitalis.dif.dem.interfaces.IDEMRegistry} | |
32 | * | |
33 | * @author Pedro Viegas <a href="mailto:pviegas@digitalis.pt">pviegas@digitalis.pt</a> | |
34 | * @author Rodrigo Gonçalves <a href="mailto:rgoncalves@digitalis.pt">rgoncalves@digitalis.pt</a> | |
35 | * @created 2007/07/12 | |
36 | */ | |
37 | 0 | public class StageCGTemplate implements IStage { |
38 | ||
39 | /** | |
40 | * Relates the exception types with the stages for redirection purposes upon an exception raising. <K = Exception | |
41 | * FQN, V = stage id> | |
42 | */ | |
43 | static private Map<String, String> errorStages; | |
44 | ||
45 | /** | |
46 | * Relates the exception types with the views for redirection purposes upon an exception raising. <K = Exception | |
47 | * FQN, V = Error view objects> | |
48 | */ | |
49 | static public Map<String, ViewObject> errorViews; | |
50 | ||
51 | /** The list of registered event handlers */ | |
52 | static private Map<EventType, List<String>> eventHandlers; | |
53 | ||
54 | /** The list of injected stages */ | |
55 | static private List<String> injectedStages; | |
56 | ||
57 | /** The list of injected views */ | |
58 | static private List<ViewObject> injectedViews; | |
59 | ||
60 | /** Controls the lazy initializations of this stage proxy... */ | |
61 | 0 | static protected boolean isInitialized = false; |
62 | ||
63 | /** The parameters object */ | |
64 | private IParameters parameters; | |
65 | ||
66 | /** | |
67 | * Adds a new event id to the known handlers | |
68 | * | |
69 | * @param type | |
70 | * the event type to add | |
71 | * @param id | |
72 | * the id of the event | |
73 | */ | |
74 | protected void addEvent(EventType type, String id) | |
75 | { | |
76 | 0 | eventHandlers.get(type).add(id); |
77 | 0 | } |
78 | ||
79 | /** | |
80 | * Creates a new view object. For usage of the CG methods | |
81 | * | |
82 | * @param engine | |
83 | * the engine of the view | |
84 | * @param type | |
85 | * the type of the view | |
86 | * @param target | |
87 | * the target resource/template of the view | |
88 | * @param isDefault | |
89 | * T if the view is the default view | |
90 | * @return the created view object | |
91 | */ | |
92 | protected ViewObject createView(String engine, String type, String target, boolean isDefault) | |
93 | { | |
94 | 0 | return new ViewObject(engine, ViewType.valueOf(type), target, isDefault); |
95 | } | |
96 | ||
97 | /** event handlers builder. Will be overridden in the CG if they exist */ | |
98 | private void eventHandlersBuilder() | |
99 | { | |
100 | // By default do nothing | |
101 | 0 | } |
102 | ||
103 | /** | |
104 | * @see pt.digitalis.dif.dem.interfaces.ICallback#getCallbackType() | |
105 | */ | |
106 | public CallbackType getCallbackType() | |
107 | { | |
108 | 0 | return CallbackType.OFF; |
109 | } | |
110 | ||
111 | /** | |
112 | * @see pt.digitalis.dif.dem.interfaces.IStage#getDefaultErrorStage() | |
113 | */ | |
114 | public IStage getDefaultErrorStage() | |
115 | { | |
116 | 0 | return CGAncillaries.CG_TO_BE_IMPLEMENTED_STAGE; |
117 | } | |
118 | ||
119 | /** | |
120 | * @see pt.digitalis.dif.dem.interfaces.IStage#getDefaultErrorView() | |
121 | */ | |
122 | public ViewObject getDefaultErrorView() | |
123 | { | |
124 | 0 | return CGAncillaries.CG_TO_BE_IMPLEMENTED_VIEW; |
125 | } | |
126 | ||
127 | /** | |
128 | * @see pt.digitalis.dif.dem.interfaces.IStage#getDefaultView() | |
129 | */ | |
130 | public ViewObject getDefaultView() | |
131 | { | |
132 | 0 | return CGAncillaries.CG_TO_BE_IMPLEMENTED_VIEW; |
133 | } | |
134 | ||
135 | /** | |
136 | * @see pt.digitalis.dif.dem.interfaces.IStage#getEventHandlers() | |
137 | */ | |
138 | synchronized public Map<EventType, List<String>> getEventHandlers() | |
139 | { | |
140 | 0 | if (eventHandlers == null) |
141 | { | |
142 | // Lazy loading. On first call will create the list using the CG generated builder | |
143 | 0 | eventHandlers = new HashMap<EventType, List<String>>(); |
144 | ||
145 | 0 | eventHandlers.put(EventType.FORM_SUBMIT, new ArrayList<String>()); |
146 | 0 | eventHandlers.put(EventType.FORM_SUBMIT_AJAX_REQUEST, new ArrayList<String>()); |
147 | 0 | eventHandlers.put(EventType.FORM_SUBMIT_SAVE_ACTION, new ArrayList<String>()); |
148 | 0 | eventHandlers.put(EventType.FORM_VALIDATION, new ArrayList<String>()); |
149 | 0 | eventHandlers.put(EventType.AJAX_REQUEST, new ArrayList<String>()); |
150 | 0 | eventHandlers.put(EventType.DOCUMENT_TYPE, new ArrayList<String>()); |
151 | ||
152 | 0 | eventHandlersBuilder(); |
153 | } | |
154 | ||
155 | 0 | return eventHandlers; |
156 | } | |
157 | ||
158 | /** | |
159 | * @see pt.digitalis.dif.dem.interfaces.IEntity#getID() | |
160 | */ | |
161 | public String getID() | |
162 | { | |
163 | 0 | return CGAncillaries.CG_TO_BE_IMPLEMENTED_MESSAGE; |
164 | } | |
165 | ||
166 | /** | |
167 | * @see pt.digitalis.dif.dem.interfaces.IStage#getInjectedErrorStages() | |
168 | */ | |
169 | synchronized public Map<String, String> getInjectedErrorStages() | |
170 | { | |
171 | 0 | if (errorStages == null) |
172 | { | |
173 | // Lazy loading. On first call will create the list using the CG generated builder | |
174 | 0 | errorStages = new HashMap<String, String>(); |
175 | 0 | injectedErrorStagesBuilder(); |
176 | } | |
177 | ||
178 | 0 | return errorStages; |
179 | } | |
180 | ||
181 | /** | |
182 | * @see pt.digitalis.dif.dem.interfaces.IStage#getInjectedErrorViews() | |
183 | */ | |
184 | synchronized public Map<String, ViewObject> getInjectedErrorViews() | |
185 | { | |
186 | 0 | if (errorViews == null) |
187 | { | |
188 | 0 | errorViews = new HashMap<String, ViewObject>(); |
189 | 0 | injectedErrorViewsBuilder(); |
190 | } | |
191 | ||
192 | 0 | return errorViews; |
193 | } | |
194 | ||
195 | /** | |
196 | * @see pt.digitalis.dif.dem.interfaces.IStage#getInjectedStages() | |
197 | */ | |
198 | synchronized public List<String> getInjectedStages() | |
199 | { | |
200 | ||
201 | 0 | if (injectedStages == null) |
202 | { | |
203 | // Lazy loading. On first call will create the list using the CG generated builder | |
204 | 0 | injectedStages = new ArrayList<String>(); |
205 | 0 | injectedStagesBuilder(); |
206 | } | |
207 | ||
208 | 0 | return injectedStages; |
209 | } | |
210 | ||
211 | /** | |
212 | * @see pt.digitalis.dif.dem.interfaces.IStage#getInjectedViews() | |
213 | */ | |
214 | synchronized public List<ViewObject> getInjectedViews() | |
215 | { | |
216 | 0 | if (injectedViews == null) |
217 | { | |
218 | 0 | injectedViews = new ArrayList<ViewObject>(); |
219 | 0 | injectedViewsBuilder(); |
220 | } | |
221 | ||
222 | 0 | return injectedViews; |
223 | } | |
224 | ||
225 | /** | |
226 | * @see pt.digitalis.dif.dem.interfaces.IStage#getInstance() | |
227 | */ | |
228 | synchronized public IStageInstance getInstance() | |
229 | { | |
230 | IStageInstance instance; | |
231 | ||
232 | try | |
233 | { | |
234 | 0 | Class<?> clazz = Class.forName(getStageInstanceClassName()); |
235 | 0 | instance = (IStageInstance) ReflectionUtils.instantiateObjectFromClass(clazz); |
236 | } | |
237 | 0 | catch (AuxiliaryOperationException e) |
238 | { | |
239 | // This should never happen. If it does DIF will show the exception. Here we return null. | |
240 | 0 | return null; |
241 | } | |
242 | 0 | catch (ClassNotFoundException e) |
243 | { | |
244 | // This should never happen. If it does DIF will show the exception. Here we return null. | |
245 | 0 | return null; |
246 | } | |
247 | ||
248 | 0 | instance.setProxy(this); |
249 | ||
250 | 0 | if (!isInitialized) |
251 | 0 | lazyStageProxyInitialization(instance); |
252 | ||
253 | 0 | return instance; |
254 | } | |
255 | ||
256 | /** | |
257 | * @see pt.digitalis.dif.dem.interfaces.IRegistrable#getLicenseEdition() | |
258 | */ | |
259 | public LicenseEditionType getLicenseEdition() | |
260 | { | |
261 | 0 | return TemplateResources.getRegistrationManager().getStageEdition(this.getID()); |
262 | } | |
263 | ||
264 | /** | |
265 | * @see pt.digitalis.dif.dem.interfaces.IStage#getMessageForLanguage(java.lang.String, java.lang.String) | |
266 | */ | |
267 | public String getMessageForLanguage(String language, String messageID) | |
268 | { | |
269 | 0 | return getMessagesForLanguage(language).get(messageID); |
270 | } | |
271 | ||
272 | /** | |
273 | * @see pt.digitalis.dif.dem.interfaces.IStage#getMessagesForLanguage(java.lang.String) | |
274 | */ | |
275 | ||
276 | public Map<String, String> getMessagesForLanguage(String language) | |
277 | { | |
278 | 0 | return TemplateResources.getMessageManager().getMessages(this, language); |
279 | } | |
280 | ||
281 | /** | |
282 | * @see pt.digitalis.dif.dem.interfaces.IEntity#getName() | |
283 | */ | |
284 | public String getName() | |
285 | { | |
286 | 0 | return CGAncillaries.CG_TO_BE_IMPLEMENTED_MESSAGE; |
287 | } | |
288 | ||
289 | /** | |
290 | * @see pt.digitalis.dif.dem.interfaces.IEntity#getOriginalClassName() | |
291 | */ | |
292 | public String getOriginalClassName() | |
293 | { | |
294 | 0 | return CGAncillaries.CG_TO_BE_IMPLEMENTED_MESSAGE; |
295 | } | |
296 | ||
297 | /** | |
298 | * @see pt.digitalis.dif.dem.interfaces.IStage#getOverridesStageID() | |
299 | */ | |
300 | public String getOverridesStageID() | |
301 | { | |
302 | 0 | return null; |
303 | } | |
304 | ||
305 | /** | |
306 | * @see pt.digitalis.dif.dem.interfaces.IStage#getParameters() | |
307 | */ | |
308 | @SuppressWarnings("static-access") | |
309 | synchronized public IParameters getParameters() | |
310 | { | |
311 | 0 | if (parameters == null) |
312 | { | |
313 | 0 | parameters = getTemplateResources().getParametersInstance(getInstance()); |
314 | // TODO: Refactor the IParameterImpl so that we can access the parameter list with initializing a | |
315 | // StageInstance parameters.initialize(this); | |
316 | } | |
317 | ||
318 | 0 | return parameters; |
319 | } | |
320 | ||
321 | /** | |
322 | * @see pt.digitalis.dif.dem.interfaces.IStage#getService() | |
323 | */ | |
324 | public IService getService() | |
325 | { | |
326 | 0 | return TemplateResources.getDEMManager().getService(CGAncillaries.CG_TO_BE_IMPLEMENTED_MESSAGE); |
327 | } | |
328 | ||
329 | /** | |
330 | * @see pt.digitalis.dif.dem.interfaces.IStage#getStageInstanceClassName() | |
331 | */ | |
332 | public String getStageInstanceClassName() | |
333 | { | |
334 | 0 | return CGAncillaries.CG_TO_BE_IMPLEMENTED_MESSAGE; |
335 | } | |
336 | ||
337 | /** | |
338 | * For usage of the CG methods | |
339 | * | |
340 | * @return an instance of template resources | |
341 | */ | |
342 | protected TemplateResources getTemplateResources() | |
343 | { | |
344 | 0 | return TemplateResources.getInstance(); |
345 | } | |
346 | ||
347 | /** | |
348 | * @see pt.digitalis.dif.dem.interfaces.IEntity#getUID() | |
349 | */ | |
350 | public String getUID() | |
351 | { | |
352 | 0 | return "STAGE:" + this.getID(); |
353 | } | |
354 | ||
355 | /** | |
356 | * @see pt.digitalis.dif.dem.interfaces.IStage#hasAuthentication() | |
357 | */ | |
358 | public boolean hasAuthentication() | |
359 | { | |
360 | 0 | return true; |
361 | } | |
362 | ||
363 | /** | |
364 | * @see pt.digitalis.dif.dem.interfaces.IStage#hasAuthenticationErrorInjection() | |
365 | */ | |
366 | public boolean hasAuthenticationErrorInjection() | |
367 | { | |
368 | 0 | return false; |
369 | } | |
370 | ||
371 | /** | |
372 | * @see pt.digitalis.dif.dem.interfaces.IStage#hasAuthorization() | |
373 | */ | |
374 | public boolean hasAuthorization() | |
375 | { | |
376 | 0 | return true; |
377 | } | |
378 | ||
379 | /** | |
380 | * @see pt.digitalis.dif.dem.interfaces.ICallback#hasCallbackEnabled() | |
381 | */ | |
382 | public boolean hasCallbackEnabled() | |
383 | { | |
384 | 0 | return false; |
385 | } | |
386 | ||
387 | /** | |
388 | * @see pt.digitalis.dif.dem.interfaces.IStage#hasInjectedContributions() | |
389 | */ | |
390 | public boolean hasInjectedContributions() | |
391 | { | |
392 | 0 | return false; |
393 | } | |
394 | ||
395 | /** | |
396 | * @see pt.digitalis.dif.dem.interfaces.IStage#hasParameterErrorInjection() | |
397 | */ | |
398 | public boolean hasParameterErrorInjection() | |
399 | { | |
400 | // By default returns false. If the stage implementation injects the parameter errors, that this is overwritten | |
401 | // with 'true' | |
402 | 0 | return false; |
403 | } | |
404 | ||
405 | /** | |
406 | * @see pt.digitalis.dif.dem.interfaces.IStage#hasValidationLogicForForm(java.lang.String) | |
407 | */ | |
408 | public boolean hasValidationLogicForForm(String formName) | |
409 | { | |
410 | 0 | return this.getEventHandlers().get(EventType.FORM_VALIDATION).contains(formName); |
411 | } | |
412 | ||
413 | /** Injected Error Stages builder. Will be overridden in the CG if stages are injected */ | |
414 | private void injectedErrorStagesBuilder() | |
415 | 0 | {} |
416 | ||
417 | /** Injected Views builder. Will be overridden in the CG if stages are injected */ | |
418 | private void injectedErrorViewsBuilder() | |
419 | 0 | {} |
420 | ||
421 | /** Injected Stages builder. Will be overridden in the CG if stages are injected */ | |
422 | private void injectedStagesBuilder() | |
423 | 0 | {} |
424 | ||
425 | /** Injected Views builder. Will be overridden in the CG if stages are injected */ | |
426 | private void injectedViewsBuilder() | |
427 | 0 | {} |
428 | ||
429 | /** | |
430 | * @see pt.digitalis.dif.dem.interfaces.IRegistrable#isRegistered() | |
431 | */ | |
432 | public boolean isRegistered() | |
433 | { | |
434 | 0 | boolean result = this.getService().isRegistered(); |
435 | ||
436 | 0 | if (this.isRegistrable()) |
437 | 0 | result = TemplateResources.getRegistrationManager().isStageRegistered(getID()); |
438 | ||
439 | 0 | return result; |
440 | } | |
441 | ||
442 | /** | |
443 | * @see pt.digitalis.dif.dem.interfaces.IRegistrable#isRegistrable() | |
444 | */ | |
445 | public boolean isRegistrable() | |
446 | { | |
447 | 0 | return TemplateResources.getRegistrationManager().isStageRegistrable(getID()); |
448 | } | |
449 | ||
450 | /** | |
451 | * The lazy initializations for all stages. Things that require all DEM entities to be previously initialized | |
452 | * | |
453 | * @param stage | |
454 | * the stage instance for accessing some stage properties in the initialization process | |
455 | */ | |
456 | protected void lazyStageProxyInitialization(IStageInstance stage) | |
457 | { // FIXME: lazyStageProxyInitialization is generating errors | |
458 | /* | |
459 | * try { for (IParameter<?> parameter: | |
460 | * stage.getParameters().getAllAvailableParameters().getParameters().values()) if (parameter.getRules() != null | |
461 | * && parameter.getRules().size() > 0) for (IParameterRule<?> rule: parameter.getRules()) { | |
462 | * AbstractParameterRule<?> ruleInstance = (AbstractParameterRule<?>) rule; for (String linkedParameterID: | |
463 | * ruleInstance.getParameters()) getParameters().getAllAvailableParameters().getParameter(linkedParameterID) | |
464 | * .setReferencedInARuleFromAnotherParameter(true); } } catch (ParameterException e) { | |
465 | * DIFLogger.getLogger().info("Could not initialize stage parameters: " + e.getMessage()); } | |
466 | */ | |
467 | 0 | isInitialized = true; |
468 | 0 | } |
469 | ||
470 | /** | |
471 | * @see pt.digitalis.dif.dem.interfaces.IRegistrable#register(java.lang.String, java.lang.String) | |
472 | */ | |
473 | public boolean register(String name, String key) | |
474 | { | |
475 | try | |
476 | { | |
477 | 0 | return TemplateResources.getRegistrationManager().registerStage(getID(), name, key); |
478 | } | |
479 | 0 | catch (RegistrationManagerException e) |
480 | { | |
481 | 0 | DIFLogger.getLogger().debug(e); |
482 | 0 | return false; |
483 | } | |
484 | } | |
485 | ||
486 | /** | |
487 | * @see pt.digitalis.dif.dem.interfaces.IRegistrable#unregister() | |
488 | */ | |
489 | public void unregister() | |
490 | { | |
491 | 0 | TemplateResources.getRegistrationManager().unregisterStage(getID()); |
492 | 0 | } |
493 | } |