001 package org.kuali.student.common.messagebuilder.impl; 002 003 import java.util.ArrayList; 004 import java.util.List; 005 006 import org.kuali.student.common.messagebuilder.booleanmessage.ast.BooleanNode; 007 import org.kuali.student.common.messagebuilder.impl.exceptions.MessageBuilderException; 008 009 /** 010 * This class creates failure messages for boolean binary tree nodes. 011 */ 012 public class FailureMessageBuilder { 013 /** Boolean operators to use in creating the failure message */ 014 private BooleanOperators booleanOperators; 015 016 /** 017 * Creates a failure message builder with boolean operators to use in 018 * building the success message. 019 * 020 * @param bo Boolean operators to build success message 021 */ 022 public FailureMessageBuilder(BooleanOperators bo) { 023 this.booleanOperators = bo; 024 } 025 026 /** 027 * Builds and sets the failure message for each of the 028 * boolean nodes (binary tree) in the <code>nodeList</code>. 029 * 030 * @param nodeList List of boolean nodes 031 * @return Complete failure message 032 */ 033 public String buildFailureMessage(List<BooleanNode> nodeList) throws MessageBuilderException { 034 // List must only contain one root node 035 List<BooleanNode> rootNodeList = new ArrayList<BooleanNode>(); 036 for(BooleanNode node : nodeList) { 037 if(node.getParent() == null) { 038 rootNodeList.add(node); 039 } 040 buildFailureMessage(node); 041 } 042 if(rootNodeList.size() > 1) { 043 throw new MessageBuilderException("Node list contains more than one root node: " + rootNodeList); 044 } 045 return rootNodeList.get(0).getNodeMessage(); 046 } 047 048 /** 049 * Builds and sets the failure message for a single 050 * boolean <code>node</code> (b-tree node). 051 * 052 * @param node Boolean node 053 */ 054 public String buildFailureMessage(BooleanNode node) { 055 // OR 056 if(node.getLabel().equals("+")){ 057 buildOrNodeFailureMessage(node); 058 } 059 // AND 060 else if(node.getLabel().equals("*")) { 061 buildAnd1NodeFailureMessage(node); 062 buildAnd2NodeFailureMessage(node); 063 } 064 return node.getNodeMessage(); 065 } 066 067 /** 068 * Builds a failure message for an OR node (b-tree node). 069 * 070 * @param node Boolean node 071 */ 072 private void buildOrNodeFailureMessage(BooleanNode node) { 073 // OR 074 if(node.getLabel().equals("+") && 075 node.getLeftNode() != null && 076 node.getRightNode() != null && 077 node.getLeftNode().getValue() == false && 078 node.getRightNode().getValue() == false && 079 node.getLeftNode().getNodeMessage() != null && 080 node.getRightNode().getNodeMessage() != null) { 081 String logMessage = node.getLeftNode().getNodeMessage() + " " + 082 this.booleanOperators.getOrOperator() + " " + 083 node.getRightNode().getNodeMessage(); 084 085 if(node.getParent() != null && 086 ( (node.getLabel().equals("+") && 087 node.getParent().getLabel().equals("*")) || 088 (node.getLabel().equals("*") && 089 node.getParent().getLabel().equals("+")))) { 090 logMessage = "(" + logMessage + ")"; 091 } 092 node.setNodeMessage(logMessage); 093 } 094 } 095 096 /** 097 * Builds a failure message for an AND node (b-tree node) where 098 * left node is true and right node is false or 099 * left node is false and right node is true. 100 * 101 * @param node Boolean node 102 */ 103 private void buildAnd1NodeFailureMessage(BooleanNode node) { 104 // AND1 105 if(node.getLabel().equals("*") && 106 node.getLeftNode() != null && 107 node.getRightNode() != null && 108 ((node.getLeftNode().getValue() == false && 109 node.getRightNode().getValue() == true && 110 node.getLeftNode().getNodeMessage() != null ) || 111 (node.getLeftNode().getValue() == true && 112 node.getRightNode().getValue() == false && 113 node.getRightNode().getNodeMessage() != null))) { 114 String logMessage = "test"; 115 116 if (node.getLeftNode().getValue() == false) 117 logMessage = node.getLeftNode().getNodeMessage(); 118 else if (node.getRightNode().getValue() == false) 119 logMessage = node.getRightNode().getNodeMessage(); 120 121 node.setNodeMessage(logMessage); 122 } 123 } 124 125 /** 126 * Builds a failure message for an AND node (b-tree node) where 127 * left node and right node are false. 128 * 129 * @param node Boolean node 130 */ 131 private void buildAnd2NodeFailureMessage(BooleanNode node) { 132 // AND2 133 if(node.getLabel().equals("*") && 134 node.getLeftNode() != null && 135 node.getRightNode() != null && 136 node.getLeftNode().getValue() == false && 137 node.getRightNode().getValue() == false && 138 node.getLeftNode().getNodeMessage() != null && 139 node.getRightNode().getNodeMessage() != null) { 140 String logMessage = node.getLeftNode().getNodeMessage() + " " + 141 this.booleanOperators.getAndOperator() + " " + 142 node.getRightNode().getNodeMessage(); 143 144 if(node.getParent() != null && 145 ( (node.getLabel().equals("+") && 146 node.getParent().getLabel().equals("*")) || 147 (node.getLabel().equals("*") && 148 node.getParent().getLabel().equals("+")))) { 149 logMessage = "(" + logMessage + ")"; 150 } 151 node.setNodeMessage(logMessage); 152 } 153 } 154 }