1 /**
2 * Copyright 2005-2013 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.krms.framework.engine;
17
18 import java.util.List;
19
20 import org.kuali.rice.krms.api.engine.ExecutionEnvironment;
21 import org.kuali.rice.krms.api.engine.ResultEvent;
22 import org.kuali.rice.krms.framework.engine.result.BasicResult;
23
24 /**
25 * A {@link org.kuali.rice.krms.framework.engine.Rule} that executes a {@link org.kuali.rice.krms.framework.engine.Action} when the {@link Proposition} is true.
26 *
27 * @author Kuali Rice Team (rice.collab@kuali.org)
28 */
29 public class BasicRule implements Rule {
30 private static final ResultLogger LOG = ResultLogger.getInstance();
31
32 private String name;
33 private Proposition proposition;
34 private List<Action> actions;
35
36 /**
37 * Constructor
38 * @param name Rule name to set the name to
39 * @param proposition {@link Proposition} to set the proposition to, cannot be null
40 * @param actions Rule Actions to set the actions to
41 * @throws IllegalArgumentException if the {@link Proposition} is null
42 */
43 public BasicRule(String name, Proposition proposition, List<Action> actions) {
44 if (proposition == null) {
45 throw new IllegalArgumentException("Proposition cannot be null.");
46 }
47 this.name = name;
48 this.proposition = proposition;
49 this.actions = actions;
50 }
51
52 /**
53 * Constructor
54 * @param proposition {@link Proposition} to set the proposition to, cannot be null
55 * @param actions Rule Actions to set the actions to
56 * @throws IllegalArgumentException if the {@link Proposition} is null
57 */
58 public BasicRule(Proposition proposition, List<Action> actions) {
59 this(null, proposition, actions);
60 }
61
62 @Override
63 public boolean evaluate(ExecutionEnvironment environment) {
64 boolean result = proposition.evaluate(environment).getResult();
65 if (actions != null) {
66 for (Action action : actions) {
67 if (shouldExecuteAction(result)) {
68 action.execute(environment);
69 }
70 }
71 }
72 if (LOG.isEnabled(environment)){
73 LOG.logResult(new BasicResult(ResultEvent.RULE_EVALUATED, this, environment, result));
74 }
75 return result;
76 }
77
78 /**
79 * Based on the ruleExecutionResult should the {@link Action} be executed? Default behavior is to return the given ruleExecutionResult.
80 * Over-writable by subclasses.
81 * @param ruleExecutionResult the result of the engines evaluation method.
82 * @return boolean should the action execute
83 */
84 protected boolean shouldExecuteAction(boolean ruleExecutionResult) {
85 return ruleExecutionResult;
86 }
87
88 /**
89 * Return the Rule name
90 * @return name Rule name
91 */
92 public String getName() {
93 return name;
94 }
95
96 @Override
97 public String toString(){
98 return name;
99 }
100 }