View Javadoc

1   /**
2    * Copyright 2005-2014 The Kuali Foundation
3    *
4    * Licensed under the Educational Community License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    * http://www.opensource.org/licenses/ecl2.php
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package org.kuali.rice.kew.rule;
17  
18  import org.apache.log4j.Logger;
19  import org.kuali.rice.kew.api.exception.WorkflowException;
20  import org.kuali.rice.kew.engine.RouteContext;
21  
22  import javax.script.ScriptEngine;
23  import javax.script.ScriptException;
24  import java.util.ArrayList;
25  import java.util.List;
26  
27  /**
28   * An extension of BSFRuleExpression that makes it easier to accumulate a list of responsibilities
29   * to emit. 
30   * 
31   * @author Kuali Rice Team (rice.collab@kuali.org)
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          // define the standard beans
39          super.declareBeans(engine, rule, context);
40          // define our special rule helper class
41          RuleHelper rh = new RuleHelper(rule, context);
42          engine.put("metarule", rh); // backwards compatibility with existing KRAMetaRuleExpression usage
43          engine.put("rulehelper", rh);
44      }
45  
46      /**
47       * Helper class that is exposed to groovy scripts
48       */
49      private static final class RuleHelper {
50          private Rule rule;
51          private WorkflowRuleAPI workflow;
52          /**
53           * Responsibilities accumulated during the evaluation
54           */
55          private List<org.kuali.rice.kew.api.rule.RuleResponsibility> responsibilities = new ArrayList<org.kuali.rice.kew.api.rule.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           * @return the accumulated responsibilities
65           */
66          public List<org.kuali.rice.kew.api.rule.RuleResponsibility> getResponsibilities() {
67              return responsibilities;
68          }
69  
70          /**
71           * @param success whether the result should be successful
72           * @return the RuleExpressionResult with success flag and accumulated responsibilities
73           */
74          public RuleExpressionResult getResult(boolean success) {
75              return new RuleExpressionResult(rule, success, responsibilities);
76          }
77  
78          /**
79           * Adds the responsibilities in the result to the list of accumulated responsibilities 
80           * @param result a RuleExpressionResult whose responsibilities to accumulate
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 (org.kuali.rice.kew.api.rule.RuleResponsibility responsibility: result.getResponsibilities()) {
87                  org.kuali.rice.kew.api.rule.RuleResponsibility.Builder builder =
88                          org.kuali.rice.kew.api.rule.RuleResponsibility.Builder.create(responsibility);
89                  builder.setPriority(curPriority);
90                  responsibilities.add(builder.build());
91              }
92              // increment responsibilityPriority for next rule expression result responsibilities
93              responsibilityPriority++;
94          }
95  
96          /**
97           * Evaluates a named rule accumulating responsibilities regardless of rule success
98           * @param ruleName the name of the rule to evaluate
99           * @return whether the rule was successful
100          */
101         public boolean evalRule(String ruleName) throws WorkflowException {
102             RuleExpressionResult result = workflow.invokeRule(ruleName);
103             accumulate(result);
104             return result.isSuccess();
105         }
106 
107         /**
108          * Evaluates a named rule and if it is successful accumulates the rule responsibilities
109          * @param ruleName the name of the rule to evaluate
110          * @param accumOnSuccess whether to accumulate the rules responsibilities on success (true), or on failure (false)
111          * @return whether the rule was successful
112          */
113         public boolean evalRule(String ruleName, boolean accumOnSuccess) throws WorkflowException {
114             RuleExpressionResult result = workflow.invokeRule(ruleName);
115             if (accumOnSuccess == result.isSuccess()) {
116                 accumulate(result);
117             }
118             return result.isSuccess();
119         }
120 
121     }
122 }