1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.kuali.rice.kew.edl.components;
18
19 import javax.xml.xpath.XPath;
20 import javax.xml.xpath.XPathConstants;
21 import javax.xml.xpath.XPathExpressionException;
22
23 import org.apache.commons.lang.StringUtils;
24 import org.kuali.rice.kew.edl.EDLContext;
25 import org.kuali.rice.kew.edl.EDLModelComponent;
26 import org.kuali.rice.kew.rule.xmlrouting.XPathHelper;
27 import org.w3c.dom.Document;
28 import org.w3c.dom.Element;
29 import org.w3c.dom.Node;
30 import org.w3c.dom.NodeList;
31
32
33
34
35
36
37
38
39
40
41
42
43 public class SelectControlEDLComponent implements EDLModelComponent {
44
45 public void updateDOM(Document dom, Element currentDefinitionElement, EDLContext edlContext) {
46 Element currentVersion = VersioningPreprocessor.findCurrentVersion(dom);
47 XPath xPath = XPathHelper.newXPath(dom);
48 try {
49 NodeList selectFieldDefs = (NodeList)xPath.evaluate("//fieldDef[display/type = 'select' and display/valuesGroup] | //fieldDef[display/type = 'select_refresh' and display/valuesGroup]", dom, XPathConstants.NODESET);
50 for (int fIndex = 0; fIndex < selectFieldDefs.getLength(); fIndex++) {
51 Element fieldDef = (Element)selectFieldDefs.item(fIndex);
52 NodeList valuesGroups = (NodeList)xPath.evaluate("./display/valuesGroup", fieldDef, XPathConstants.NODESET);
53 for (int index = 0; index < valuesGroups.getLength(); index++) {
54 Element valuesGroupElem = (Element)valuesGroups.item(index);
55 NodeList dependsOnFields = (NodeList)xPath.evaluate("./dependsOn/field", valuesGroupElem, XPathConstants.NODESET);
56 String fieldEvalExpression = "";
57 for (int dIndex = 0; dIndex < dependsOnFields.getLength(); dIndex++) {
58 if (!StringUtils.isBlank(fieldEvalExpression)) {
59 fieldEvalExpression += " and ";
60 }
61 Element fieldElem = (Element)dependsOnFields.item(dIndex);
62 String name = fieldElem.getAttribute("name");
63 String value = fieldElem.getTextContent();
64 fieldEvalExpression += "./field[@name='" + name + "']/value = '" + value + "'";
65 }
66 if ((Boolean)xPath.evaluate(fieldEvalExpression, currentVersion, XPathConstants.BOOLEAN)) {
67 includeValuesGroup(valuesGroupElem);
68 } else {
69
70 valuesGroupElem.getParentNode().removeChild(valuesGroupElem);
71 }
72 }
73 }
74 } catch (XPathExpressionException e) {
75 throw new RuntimeException("Failed to evaluate xpath expression.", e);
76 }
77 }
78
79 protected void includeValuesGroup(Element valuesGroupElem) {
80 Element valuesGroupParent = (Element)valuesGroupElem.getParentNode();
81 NodeList valuesGroupChildren = valuesGroupElem.getChildNodes();
82
83 for (int index = 0; index < valuesGroupChildren.getLength(); index++) {
84 Node item = valuesGroupChildren.item(index);
85 if (Node.ELEMENT_NODE == item.getNodeType() && item.getNodeName().equals("values")) {
86 valuesGroupParent.insertBefore(item, valuesGroupElem);
87 }
88 }
89 valuesGroupParent.removeChild(valuesGroupElem);
90 }
91
92 }