1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.kuali.rice.kew.rule;
17
18 import org.apache.log4j.Logger;
19 import org.kuali.rice.kew.engine.RouteContext;
20 import org.kuali.rice.kew.exception.WorkflowException;
21
22 import javax.script.ScriptEngine;
23 import javax.script.ScriptException;
24 import java.util.ArrayList;
25 import java.util.List;
26
27
28
29
30
31
32
33 public class AccumulatingBSFRuleExpression extends BSFRuleExpression {
34 private static final Logger LOG = Logger.getLogger(AccumulatingBSFRuleExpression.class);
35
36 @Override
37 protected void declareBeans(ScriptEngine engine, Rule rule, RouteContext context) throws ScriptException {
38
39 super.declareBeans(engine, rule, context);
40
41 RuleHelper rh = new RuleHelper(rule, context);
42 engine.put("metarule", rh);
43 engine.put("rulehelper", rh);
44 }
45
46
47
48
49 private static final class RuleHelper {
50 private Rule rule;
51 private WorkflowRuleAPI workflow;
52
53
54
55 private List<RuleResponsibility> responsibilities = new ArrayList<RuleResponsibility>();
56 private int responsibilityPriority = 0;
57
58 private RuleHelper(Rule rule, RouteContext context) {
59 this.workflow = new WorkflowRuleAPI(context);
60 this.rule = rule;
61 }
62
63
64
65
66 public List<RuleResponsibility> getResponsibilities() {
67 return responsibilities;
68 }
69
70
71
72
73
74 public RuleExpressionResult getResult(boolean success) {
75 return new RuleExpressionResult(rule, success, responsibilities);
76 }
77
78
79
80
81
82 public void accumulate(RuleExpressionResult result) {
83 if (result.getResponsibilities() == null || result.getResponsibilities().size() == 0) return;
84
85 Integer curPriority = Integer.valueOf(responsibilityPriority);
86 for (RuleResponsibility responsibility: result.getResponsibilities()) {
87 responsibility.setPriority(curPriority);
88 responsibilities.add(responsibility);
89 }
90
91 responsibilityPriority++;
92 }
93
94
95
96
97
98
99 public boolean evalRule(String ruleName) throws WorkflowException {
100 RuleExpressionResult result = workflow.invokeRule(ruleName);
101 accumulate(result);
102 return result.isSuccess();
103 }
104
105
106
107
108
109
110
111 public boolean evalRule(String ruleName, boolean accumOnSuccess) throws WorkflowException {
112 RuleExpressionResult result = workflow.invokeRule(ruleName);
113 if (accumOnSuccess == result.isSuccess()) {
114 accumulate(result);
115 }
116 return result.isSuccess();
117 }
118
119 }
120 }