1 16 17 package info.jtrac.domain; 18 19 import info.jtrac.util.XmlUtils; 20 21 import java.io.Serializable ; 22 import java.util.HashSet ; 23 import java.util.List ; 24 import java.util.Map ; 25 import java.util.Set ; 26 import java.util.TreeMap ; 27 import org.dom4j.Document; 28 import org.dom4j.Element; 29 30 34 public class WorkflowRenderer implements Serializable { 35 36 Map <String , Role> rolesMap; 37 Map <String , Set <String >> transitionRoles; 38 Map <Integer , Set <Integer >> stateTransitions; 39 private Map <Integer , String > stateNames; 40 Document document; 41 42 public WorkflowRenderer(Map <String , Role> rolesMap, Map <Integer , String > stateNames) { 43 this.rolesMap = rolesMap; 44 this.stateNames = stateNames; 45 init(); 46 } 47 48 private void init() { 49 transitionRoles = new TreeMap <String , Set <String >>(); 52 stateTransitions = new TreeMap <Integer , Set <Integer >>(); 54 for(Role r : rolesMap.values()) { 55 for(State s: r.getStates().values()) { 56 Set <Integer > transitions = stateTransitions.get(s.getStatus()); 57 if (transitions == null) { 58 transitions = new HashSet <Integer >(); 59 stateTransitions.put(s.getStatus(), transitions); 60 } 61 transitions.addAll(s.getTransitions()); 62 for (int i : s.getTransitions()) { 63 String transitionKey = s.getStatus() + "_" + i; 64 Set <String > roleNames = transitionRoles.get(transitionKey); 65 if (roleNames == null) { 66 roleNames = new HashSet <String >(); 67 transitionRoles.put(transitionKey, roleNames); 68 } 69 roleNames.add(r.getName()); 70 } 71 } 72 } 73 document = XmlUtils.getNewDocument("state"); 74 Element e = document.getRootElement(); 75 e.addAttribute("name", stateNames.get(State.NEW)); 76 e.addAttribute("key", State.NEW + ""); 77 addTransitions(e, State.NEW); 78 } 79 80 81 private boolean stateExists(int key) { 82 return document.selectNodes("//state[@key='" + key + "']").size() > 0; 83 } 84 85 86 private void addTransitions(Element parent, int state) { 87 Set <Integer > transitions = stateTransitions.get(state); 88 if (transitions == null) { 89 return; 90 } 91 for(int i : transitions) { 92 boolean exists = stateExists(i); 93 Element child = parent.addElement("state"); 94 child.addAttribute("name", stateNames.get(i)); 95 child.addAttribute("key", i + ""); 96 if (exists) { 97 child.addAttribute("mirror", "true"); 98 } else { 99 addTransitions(child, i); 100 } 101 } 102 } 103 104 public Document getDocument() { 105 return document; 106 } 107 108 public String getAsString() { 109 return XmlUtils.getAsPrettyXml(document); 110 } 111 112 private String getAsHtml(Element e) { 113 StringBuffer sb = new StringBuffer (); 114 List <Element> childElements = (List <Element>) e.elements(); 115 String stateClass = e.attributeValue("mirror") != null ? "mirror" : "state"; 116 sb.append("<table class='workflow'><tr><td rowspan='" + childElements.size() + "' class='" + stateClass + "'>"); 117 sb.append(e.attributeValue("name")); 118 sb.append("</td>"); 119 boolean first = true; 120 String fromState = e.attributeValue("key"); 121 for(Element child : childElements) { 122 if (!first) { 123 sb.append("<tr>"); 124 } 125 String toState = child.attributeValue("key"); 126 sb.append("<td class='transition'>"); 127 for(String roleKey : transitionRoles.get(fromState + "_" + toState)) { 128 sb.append(roleKey).append("<br/>"); 129 } 130 sb.append("</td><td>"); 131 sb.append(getAsHtml(child)); 132 sb.append("</td></tr>"); 133 if (first) { 134 first = false; 135 } 136 } 137 sb.append("</table>"); 138 return sb.toString(); 139 } 140 141 public String getAsHtml() { 142 return getAsHtml(document.getRootElement()); 143 } 144 } 145 | Popular Tags |