001package org.kuali.rice.krms.tree;
002
003import org.apache.commons.lang.StringEscapeUtils;
004import org.kuali.rice.core.api.util.tree.Node;
005import org.kuali.rice.core.api.util.tree.Tree;
006import org.kuali.rice.krms.api.repository.LogicalOperator;
007import org.kuali.rice.krms.api.repository.proposition.PropositionDefinitionContract;
008import org.kuali.rice.krms.api.repository.proposition.PropositionType;
009import org.kuali.rice.krms.api.repository.rule.RuleDefinitionContract;
010import org.kuali.rice.krms.dto.PropositionEditor;
011import org.kuali.rice.krms.dto.RuleEditor;
012import org.kuali.rice.krms.tree.node.TreeNode;
013import org.kuali.student.enrollment.class1.krms.dto.EnrolPropositionEditor;
014import org.kuali.student.enrollment.class1.krms.dto.EnrolRuleEditor;
015
016import 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 */
025public 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}