View Javadoc

1   package org.kuali.rice.krms.tree;
2   
3   import org.apache.commons.lang.StringEscapeUtils;
4   import org.apache.commons.lang.StringUtils;
5   import org.kuali.rice.core.api.util.tree.Node;
6   import org.kuali.rice.core.api.util.tree.Tree;
7   import org.kuali.rice.krms.api.repository.language.NaturalLanguageUsage;
8   import org.kuali.rice.krms.api.repository.proposition.PropositionDefinition;
9   import org.kuali.rice.krms.api.repository.proposition.PropositionType;
10  import org.kuali.rice.krms.dto.PropositionEditor;
11  import org.kuali.rice.krms.dto.RuleEditor;
12  import org.kuali.student.enrollment.class1.krms.dto.EnrolPropositionEditor;
13  import org.kuali.student.enrollment.class1.krms.tree.node.KSCompoundOpCodeNode;
14  import org.kuali.student.enrollment.class1.krms.tree.node.KSCompoundPropositionEditNode;
15  import org.kuali.student.enrollment.class1.krms.tree.node.KSSimplePropositionEditNode;
16  import org.kuali.student.enrollment.class1.krms.tree.node.KSSimplePropositionNode;
17  import org.kuali.student.enrollment.class1.krms.dto.EnrolRuleEditor;
18  import org.kuali.rice.krms.tree.node.RuleEditorTreeNode;
19  import org.kuali.student.enrollment.class2.courseoffering.service.decorators.PermissionServiceConstants;
20  import org.kuali.student.krms.naturallanguage.util.KsKrmsConstants;
21  
22  /**
23   * Created with IntelliJ IDEA.
24   * User: Peggy
25   * Date: 2/4/13
26   * Time: 3:26 PM
27   * To change this template use File | Settings | File Templates.
28   */
29  public class RuleEditTreeBuilder extends AbstractTreeBuilder{
30  
31      private static final long serialVersionUID = 1L;
32  
33      public Tree buildTree(RuleEditor rule) {
34  
35          Tree myTree = new Tree<RuleEditorTreeNode, String>();
36  
37          Node<RuleEditorTreeNode, String> rootNode = new Node<RuleEditorTreeNode, String>();
38          myTree.setRootElement(rootNode);
39  
40          PropositionEditor prop = (PropositionEditor) rule.getProposition();
41  
42          if (prop != null){
43  
44              addChildNode(rule, rootNode, prop);
45          }
46  
47          return myTree;
48      }
49  
50      /**
51       * This method builds a propositionTree recursively walking through the children of the proposition.
52       *
53       * @param sprout - parent tree node
54       * @param prop   - PropositionBo for which to make the tree node
55       */
56      private void addChildNode(RuleEditor rule, Node sprout, PropositionEditor prop) {
57          // Depending on the type of proposition (simple/compound), and the editMode,
58          // Create a treeNode of the appropriate type for the node and attach it to the
59          // sprout parameter passed in.
60          // If the prop is a compound proposition, calls itself for each of the compoundComponents
61          if (prop != null) {
62              if (PropositionType.SIMPLE.getCode().equalsIgnoreCase(prop.getPropositionTypeCode())) {
63                  // Simple Proposition
64                  // add a node for the description display with a child proposition node
65                  Node<RuleEditorTreeNode, String> child = new Node<RuleEditorTreeNode, String>();
66  
67                  // Simple Proposition add a node for the description display with a child proposition node
68                  if (prop.isEditMode()) {
69                      child.setNodeType(KSSimplePropositionEditNode.NODE_TYPE);
70                      KSSimplePropositionEditNode pNode = new KSSimplePropositionEditNode(prop);
71                      child.setData(pNode);
72                  } else {
73                      child.setNodeLabel(this.buildNodeLabel(rule, prop));
74                      child.setNodeType(KSSimplePropositionNode.NODE_TYPE);
75                      KSSimplePropositionNode pNode = new KSSimplePropositionNode(prop);
76                      child.setData(pNode);
77                  }
78                  sprout.getChildren().add(child);
79              } else if (PropositionType.COMPOUND.getCode().equalsIgnoreCase(prop.getPropositionTypeCode())) {
80                  // Compound Proposition
81                  Node<RuleEditorTreeNode, String> aNode = new Node<RuleEditorTreeNode, String>();
82  
83                  // editMode has description as an editable field
84                  if (prop.isEditMode()) {
85                      aNode.setNodeLabel("");
86                      aNode.setNodeType(KSCompoundPropositionEditNode.NODE_TYPE);
87                      KSCompoundPropositionEditNode pNode = new KSCompoundPropositionEditNode(prop);
88                      aNode.setData(pNode);
89                  } else {
90                      aNode.setNodeLabel(this.buildNodeLabel(rule, prop));
91                      aNode.setNodeType(RuleEditorTreeNode.COMPOUND_NODE_TYPE);
92                      RuleEditorTreeNode pNode = new RuleEditorTreeNode(prop);
93                      aNode.setData(pNode);
94                  }
95                  sprout.getChildren().add(aNode);
96  
97                  int counter = 0;
98                  for (PropositionEditor child : prop.getCompoundEditors()) {
99                      // add an opcode node in between each of the children.
100                     if (counter > 0) {
101                         addOpCodeNode(aNode, prop, counter);
102                     }
103                     counter++;
104                     // call to build the childs node
105                     addChildNode(rule, aNode, child);
106                 }
107             }
108         }
109     }
110 
111     protected String getDescription(PropositionEditor proposition) {
112 
113         proposition.setDescription(super.getDescription(proposition));
114         return proposition.getDescription();
115     }
116 
117     private String buildNodeLabel(RuleEditor rule, PropositionEditor prop) {
118         //Build the node label.
119         String prefix = this.getPropositionPrefix(rule, prop);
120         return prefix + StringEscapeUtils.escapeHtml(this.getDescription(prop));
121     }
122 
123     /**
124      * This method adds an opCode Node to separate components in a compound proposition.
125      *
126      * @param currentNode
127      * @param prop
128      * @return
129      */
130     private void addOpCodeNode(Node currentNode, PropositionEditor prop, int counter) {
131         //Create the node.
132         Node<KSCompoundOpCodeNode, String> aNode = new Node<KSCompoundOpCodeNode, String>();
133         aNode.setNodeLabel("");
134         aNode.setNodeType("ruleTreeNode compoundOpCodeNode");
135 
136         //Add a dummy editor.
137         PropositionEditor editor = new PropositionEditor();
138         editor.setKey(prop.getKey() + counter);
139         editor.setCompoundOpCode(prop.getCompoundOpCode());
140 
141         aNode.setData(new KSCompoundOpCodeNode(editor));
142         currentNode.getChildren().add(aNode);
143     }
144 
145     public String getNaturalLanguageUsageKey(){
146         return  KsKrmsConstants.KRMS_NL_RULE_EDIT;
147     }
148 }