1 package org.apache.turbine.services.pull;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 import java.util.ArrayList;
25 import java.util.Iterator;
26 import java.util.List;
27
28 import org.apache.commons.configuration2.Configuration;
29 import org.apache.fulcrum.pool.PoolService;
30 import org.apache.fulcrum.security.model.turbine.TurbineUserManager;
31 import org.apache.logging.log4j.LogManager;
32 import org.apache.logging.log4j.Logger;
33 import org.apache.turbine.Turbine;
34 import org.apache.turbine.annotation.AnnotationProcessor;
35 import org.apache.turbine.om.security.User;
36 import org.apache.turbine.pipeline.PipelineData;
37 import org.apache.turbine.services.InitializationException;
38 import org.apache.turbine.services.TurbineBaseService;
39 import org.apache.turbine.services.TurbineServices;
40 import org.apache.turbine.services.velocity.VelocityService;
41 import org.apache.turbine.util.RunData;
42 import org.apache.velocity.context.Context;
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121 public class TurbinePullService
122 extends TurbineBaseService
123 implements PullService
124 {
125
126 private static Logger log = LogManager.getLogger(TurbinePullService.class);
127
128
129 private PoolService pool = null;
130
131
132 private VelocityService velocity = null;
133
134
135
136
137
138
139
140
141
142 private Context globalContext;
143
144
145
146
147
148
149 private static class ToolData
150 {
151 String toolName;
152 String toolClassName;
153 Class<ApplicationTool> toolClass;
154
155 public ToolData(String toolName, String toolClassName, Class<ApplicationTool> toolClass)
156 {
157 this.toolName = toolName;
158 this.toolClassName = toolClassName;
159 this.toolClass = toolClass;
160 }
161 }
162
163
164 private List<ToolData> globalTools;
165
166
167 private List<ToolData> requestTools;
168
169
170 private List<ToolData> sessionTools;
171
172
173 private List<ToolData> authorizedTools;
174
175
176 private List<ToolData> persistentTools;
177
178
179 private String resourcesDirectory;
180
181
182 private boolean refreshToolsPerRequest = false;
183
184
185
186
187 @Override
188 public void init()
189 throws InitializationException
190 {
191 try
192 {
193 pool = (PoolService)TurbineServices.getInstance().getService(PoolService.ROLE);
194
195 if (pool == null)
196 {
197 throw new InitializationException("Pull Service requires"
198 + " configured Pool Service!");
199 }
200
201 initPullService();
202
203
204
205 setInit(true);
206
207
208 velocity = (VelocityService)TurbineServices.getInstance().getService(VelocityService.SERVICE_NAME);
209
210 if (velocity != null)
211 {
212 initPullTools();
213 }
214 else
215 {
216 log.info("Velocity Service not configured, skipping pull tools!");
217 }
218 }
219 catch (Exception e)
220 {
221 throw new InitializationException("TurbinePullService failed to initialize", e);
222 }
223 }
224
225
226
227
228
229
230 private void initPullService()
231 throws Exception
232 {
233
234 Configuration conf = getConfiguration();
235
236
237
238 resourcesDirectory = conf.getString(
239 TOOL_RESOURCES_DIR_KEY,
240 TOOL_RESOURCES_DIR_DEFAULT);
241
242
243
244 refreshToolsPerRequest =
245 conf.getBoolean(
246 TOOLS_PER_REQUEST_REFRESH_KEY,
247 TOOLS_PER_REQUEST_REFRESH_DEFAULT);
248
249
250
251 if (refreshToolsPerRequest)
252 {
253 log.info("Pull Model tools will be refreshed on a per request basis.");
254 }
255 }
256
257
258
259
260
261
262
263
264
265 private void initPullTools()
266 throws Exception
267 {
268
269
270
271
272 Configuration conf = Turbine.getConfiguration();
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288 log.debug("Global Tools:");
289 globalTools = getTools(conf.subset(GLOBAL_TOOL));
290 log.debug("Request Tools:");
291 requestTools = getTools(conf.subset(REQUEST_TOOL));
292 log.debug("Session Tools:");
293 sessionTools = getTools(conf.subset(SESSION_TOOL));
294 log.debug("Authorized Tools:");
295 authorizedTools = getTools(conf.subset(AUTHORIZED_TOOL));
296 log.debug("Persistent Tools:");
297 persistentTools = getTools(conf.subset(PERSISTENT_TOOL));
298
299
300
301
302
303
304 globalContext = velocity.getNewContext();
305
306 populateWithGlobalTools(globalContext);
307 }
308
309
310
311
312
313
314
315 @SuppressWarnings("unchecked")
316 private List<ToolData> getTools(Configuration toolConfig)
317 {
318 List<ToolData> tools = new ArrayList<>();
319
320
321
322 if (toolConfig == null)
323 {
324 return tools;
325 }
326
327 for (Iterator<String> it = toolConfig.getKeys(); it.hasNext();)
328 {
329 String toolName = it.next();
330 String toolClassName = toolConfig.getString(toolName);
331
332 try
333 {
334
335 Class<ApplicationTool> toolClass = (Class<ApplicationTool>) Class.forName(toolClassName);
336
337
338 tools.add(new ToolData(toolName, toolClassName, toolClass));
339
340 log.info("Tool {} to add to the context as '${}'", toolClassName, toolName);
341 }
342 catch (NoClassDefFoundError | ClassNotFoundException e)
343 {
344 log.error("Cannot instantiate tool class {}", toolClassName, e);
345 }
346 }
347
348 return tools;
349 }
350
351
352
353
354
355
356
357 @Override
358 public Context getGlobalContext()
359 {
360 if (refreshToolsPerRequest)
361 {
362 refreshGlobalTools();
363 }
364 return globalContext;
365 }
366
367
368
369
370
371
372
373
374
375
376 @Override
377 public void populateContext(Context context, RunData data)
378 {
379 populateWithRequestTools(context, data);
380
381
382
383
384
385
386
387
388
389
390
391 User user = data.getUser();
392
393
394
395
396
397
398 populateWithSessionTools(sessionTools, context, data, user);
399
400 TurbineUserManager userManager =
401 (TurbineUserManager)TurbineServices
402 .getInstance()
403 .getService(TurbineUserManager.ROLE);
404
405 if (!userManager.isAnonymousUser(user) && user.hasLoggedIn())
406 {
407 populateWithSessionTools(authorizedTools, context, data, user);
408 populateWithPermTools(persistentTools, context, data, user);
409 }
410 }
411
412
413
414
415
416
417
418
419
420
421 @Override
422 public void populateContext(Context context, PipelineData pipelineData)
423 {
424 RunData data = pipelineData.getRunData();
425
426 populateWithRequestTools(context, pipelineData);
427
428
429
430
431
432
433
434
435
436
437 User user = data.getUser();
438
439
440
441
442
443
444 populateWithSessionTools(sessionTools, context, data, user);
445
446 TurbineUserManager userManager =
447 (TurbineUserManager)TurbineServices
448 .getInstance()
449 .getService(TurbineUserManager.ROLE);
450
451 if (!userManager.isAnonymousUser(user) && user.hasLoggedIn())
452 {
453 populateWithSessionTools(authorizedTools, context, data, user);
454 populateWithPermTools(persistentTools, context, pipelineData, user);
455 }
456 }
457
458
459
460
461
462
463 private void populateWithGlobalTools(Context context)
464 {
465 for (ToolData toolData : globalTools)
466 {
467 try
468 {
469 Object tool = toolData.toolClass.getDeclaredConstructor().newInstance();
470
471
472 initTool(tool, null);
473
474
475 context.put(toolData.toolName, tool);
476 }
477 catch (Exception e)
478 {
479 log.error("Could not instantiate global tool {} from a {} object",
480 toolData.toolName, toolData.toolClassName, e);
481 }
482 }
483 }
484
485
486
487
488
489
490
491 private void populateWithRequestTools(Context context, Object data)
492 {
493
494 for (ToolData toolData : requestTools)
495 {
496 try
497 {
498
499 Object tool = pool.getInstance(toolData.toolClass);
500
501
502 initTool(tool, data);
503
504
505 context.put(toolData.toolName, tool);
506 }
507 catch (Exception e)
508 {
509 log.error("Could not instantiate request tool {} from a {} object",
510 toolData.toolName, toolData.toolClassName, e);
511 }
512 }
513 }
514
515
516
517
518
519
520
521
522
523
524 private void populateWithSessionTools(List<ToolData> tools, Context context,
525 RunData data, User user)
526 {
527
528 for (ToolData toolData : tools)
529 {
530 try
531 {
532
533
534 synchronized (data.getSession())
535 {
536
537
538 Object tool = data.getSession().getAttribute(
539 SESSION_TOOLS_ATTRIBUTE_PREFIX
540 + toolData.toolClassName);
541
542 if (tool == null)
543 {
544
545
546 tool = pool.getInstance(toolData.toolClass);
547
548
549 initTool(tool, user);
550 }
551
552
553 if(tool != null)
554 {
555
556 data.getSession().setAttribute(
557 SESSION_TOOLS_ATTRIBUTE_PREFIX
558 + tool.getClass().getName(), tool);
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573 if (refreshToolsPerRequest)
574 {
575 refreshTool(tool, data);
576 }
577
578
579 log.debug("Adding {} to ctx as {}", tool, toolData.toolName);
580 context.put(toolData.toolName, tool);
581 }
582 else
583 {
584 log.info("Tool {} was null, skipping it.", toolData.toolName);
585 }
586 }
587 }
588 catch (Exception e)
589 {
590 log.error("Could not instantiate session tool {} from a {} object",
591 toolData.toolName, toolData.toolClassName, e);
592 }
593 }
594 }
595
596
597
598
599
600
601
602
603
604
605
606 private void populateWithPermTools(List<ToolData> tools, Context context,
607 Object data, User user)
608 {
609
610 for (ToolData toolData : tools)
611 {
612 try
613 {
614
615
616 synchronized (user)
617 {
618
619
620 Object tool = user.getPerm(toolData.toolClassName);
621
622 if (tool == null)
623 {
624
625
626 tool = pool.getInstance(toolData.toolClass);
627
628
629 initTool(tool, user);
630
631
632 user.setPerm(toolData.toolClassName, tool);
633 }
634
635
636 if (tool != null)
637 {
638
639
640
641
642
643
644
645
646
647
648
649
650
651 if (refreshToolsPerRequest)
652 {
653 refreshTool(tool, data);
654 }
655
656
657 log.debug("Adding {} to ctx as {}", tool, toolData.toolName);
658 log.warn("Persistent scope tools are deprecated.");
659 context.put(toolData.toolName, tool);
660 }
661 else
662 {
663 log.info("Tool {} was null, skipping it.", toolData.toolName);
664 }
665 }
666 }
667 catch (Exception e)
668 {
669 log.error("Could not instantiate perm tool {} from a {} object",
670 toolData.toolName, toolData.toolClassName, e);
671 }
672 }
673 }
674
675
676
677
678
679
680
681
682
683 @Override
684 public String getAbsolutePathToResourcesDirectory()
685 {
686 return Turbine.getRealPath(resourcesDirectory);
687 }
688
689
690
691
692
693
694
695 @Override
696 public String getResourcesDirectory()
697 {
698 return resourcesDirectory;
699 }
700
701
702
703
704
705
706
707
708 private void refreshGlobalTools()
709 {
710 if (globalTools != null)
711 {
712 for (ToolData toolData : globalTools)
713 {
714 Object tool = globalContext.get(toolData.toolName);
715 refreshTool(tool, null);
716 }
717 }
718 }
719
720
721
722
723
724
725
726 @Override
727 public void releaseTools(Context context)
728 {
729
730
731 releaseTools(context, requestTools);
732 }
733
734
735
736
737
738
739
740
741 private void releaseTools(Context context, List<ToolData> tools)
742 {
743 if (tools != null)
744 {
745 for (ToolData toolData : tools)
746 {
747 Object tool = context.remove(toolData.toolName);
748
749 if (tool != null)
750 {
751 pool.putInstance(tool);
752 }
753 }
754 }
755 }
756
757
758
759
760
761
762
763
764
765 private void initTool(Object tool, Object param)
766 throws Exception
767 {
768 AnnotationProcessor.process(tool);
769
770 if (param instanceof PipelineData)
771 {
772 if (tool instanceof PipelineDataApplicationTool)
773 {
774 ((PipelineDataApplicationTool) tool).init(param);
775 }
776 else if (tool instanceof RunDataApplicationTool)
777 {
778 RunData data = getRunData((PipelineData)param);
779 ((RunDataApplicationTool) tool).init(data);
780 }
781 else if (tool instanceof ApplicationTool)
782 {
783 RunData data = getRunData((PipelineData)param);
784 ((ApplicationTool) tool).init(data);
785 }
786 }
787 else
788 {
789 if (tool instanceof PipelineDataApplicationTool)
790 {
791 ((PipelineDataApplicationTool) tool).init(param);
792 }
793 else if (tool instanceof RunDataApplicationTool)
794 {
795 ((RunDataApplicationTool) tool).init(param);
796 }
797 else if (tool instanceof ApplicationTool)
798 {
799 ((ApplicationTool) tool).init(param);
800 }
801 }
802 }
803
804
805
806
807
808
809
810 private void refreshTool(Object tool, Object dataObject)
811 {
812 RunData data = null;
813 PipelineData pipelineData = null;
814 if (dataObject instanceof PipelineData)
815 {
816 pipelineData = (PipelineData)dataObject;
817 data = pipelineData.getRunData();
818 if (tool instanceof PipelineDataApplicationTool)
819 {
820 ((PipelineDataApplicationTool) tool).refresh(pipelineData);
821 }
822 }
823 if (tool instanceof ApplicationTool)
824 {
825 ((ApplicationTool) tool).refresh();
826 }
827 else if (tool instanceof RunDataApplicationTool)
828 {
829 ((RunDataApplicationTool) tool).refresh(data);
830 }
831 }
832
833 private RunData getRunData(PipelineData pipelineData)
834 {
835 if (!(pipelineData instanceof RunData))
836 {
837 throw new RuntimeException("Can't cast to rundata from pipeline data.");
838 }
839 return (RunData)pipelineData;
840 }
841 }