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