001 package org.kuali.rice.krms.tree;
002
003 import org.apache.commons.lang.StringEscapeUtils;
004 import org.kuali.rice.core.api.util.tree.Node;
005 import org.kuali.rice.core.api.util.tree.Tree;
006 import org.kuali.rice.krms.api.repository.LogicalOperator;
007 import org.kuali.rice.krms.api.repository.proposition.PropositionDefinitionContract;
008 import org.kuali.rice.krms.api.repository.proposition.PropositionType;
009 import org.kuali.rice.krms.api.repository.rule.RuleDefinitionContract;
010 import org.kuali.rice.krms.dto.PropositionEditor;
011 import org.kuali.rice.krms.dto.RuleEditor;
012 import org.kuali.rice.krms.tree.node.TreeNode;
013 import org.kuali.student.enrollment.class1.krms.dto.EnrolPropositionEditor;
014 import org.kuali.student.enrollment.class1.krms.dto.EnrolRuleEditor;
015
016 import java.util.List;
017
018 /**
019 * Created with IntelliJ IDEA.
020 * User: SW
021 * Date: 2013/02/12
022 * Time: 2:31 PM
023 * To change this template use File | Settings | File Templates.
024 */
025 public class RulePreviewTreeBuilder extends AbstractTreeBuilder{
026
027 @Override
028 protected String buildNodeLabel(RuleDefinitionContract rule, PropositionDefinitionContract prop){
029 //Build the node label.
030 String prefix = this.getPropositionPrefix((RuleEditor)rule, (PropositionEditor)prop);
031 return prefix + StringEscapeUtils.escapeHtml(this.getDescription(prop));
032 }
033
034 public Tree<TreeNode, String> buildTree(RuleEditor rule) {
035
036 Tree myTree = new Tree<TreeNode, String>();
037
038 Node<TreeNode, String> rootNode = new Node<TreeNode, String>();
039 rootNode.setNodeLabel("root");
040 rootNode.setNodeType("rootNode");
041 rootNode.setData(new TreeNode("Rule:"));
042 myTree.setRootElement(rootNode);
043
044 if (rule == null) {
045 return myTree;
046 }
047
048 PropositionEditor prop = (PropositionEditor) rule.getProposition();
049 buildPreviewTree(rule, rootNode, prop);
050
051 //Underline the first node in the preview.
052 if ((rootNode.getChildren() != null) && (rootNode.getChildren().size() > 0)) {
053 Node<TreeNode, String> firstNode = rootNode.getChildren().get(0);
054 if ((firstNode.getChildren() != null) && (firstNode.getChildren().size() > 0)) {
055 firstNode.setNodeType("subruleHeader subruleElement");
056 TreeNode treeNode = firstNode.getData();
057 treeNode.setData("<u>" + treeNode.getData() + ":</u>");
058 }
059 }
060
061 return myTree;
062 }
063
064 private void buildPreviewTree(RuleEditor rule, Node<TreeNode, String> currentNode, PropositionEditor prop) {
065 if (prop != null) {
066
067 Node<TreeNode, String> newNode = new Node<TreeNode, String>();
068 newNode.setNodeLabel(null);
069 newNode.setNodeType("subruleElement");
070
071 TreeNode tNode = new TreeNode(this.buildNodeLabel(rule, prop));
072 tNode.setListItems(this.getListItems(prop));
073 newNode.setData(tNode);
074 tNode.setKey(prop.getKey());
075 currentNode.getChildren().add(newNode);
076
077 if (PropositionType.COMPOUND.getCode().equalsIgnoreCase(prop.getPropositionTypeCode())) {
078
079 boolean first = true;
080 for (PropositionEditor child : prop.getCompoundEditors()) {
081 // add an opcode node in between each of the children.
082 if (!first) {
083 //addOpCodeNode(newNode, propositionEditor);
084 Node<TreeNode, String> opNode = new Node<TreeNode, String>();
085 if (LogicalOperator.AND.getCode().equalsIgnoreCase(prop.getCompoundOpCode())) {
086 opNode.setNodeLabel("AND");
087 } else if (LogicalOperator.OR.getCode().equalsIgnoreCase(prop.getCompoundOpCode())) {
088 opNode.setNodeLabel("OR");
089 }
090 opNode.setData(new TreeNode(null));
091 newNode.getChildren().add(opNode);
092
093 }
094 first = false;
095 // call to build the childs node
096 buildPreviewTree(rule, newNode, child);
097 }
098 }
099
100 }
101 }
102
103 public List<String> getListItems(PropositionEditor propositionEditor) {
104 return null;
105 }
106 }