1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.kuali.rice.krad.workflow;
17
18 import java.util.ArrayList;
19 import java.util.List;
20 import java.util.Map;
21 import java.util.Properties;
22
23 import javax.xml.xpath.XPath;
24 import javax.xml.xpath.XPathExpressionException;
25 import javax.xml.xpath.XPathFactory;
26
27 import org.apache.commons.lang.StringUtils;
28 import org.kuali.rice.kew.engine.RouteContext;
29 import org.kuali.rice.kew.rule.xmlrouting.WorkflowFunctionResolver;
30 import org.kuali.rice.kew.rule.xmlrouting.WorkflowNamespaceContext;
31 import org.kuali.rice.kns.util.FieldUtils;
32 import org.kuali.rice.kns.web.ui.Field;
33 import org.kuali.rice.kns.web.ui.Row;
34 import org.kuali.rice.krad.service.KRADServiceLocatorWeb;
35 import org.kuali.rice.krad.util.KRADConstants;
36 import org.kuali.rice.krad.util.KRADPropertyConstants;
37 import org.kuali.rice.krad.util.UrlFactory;
38 import org.w3c.dom.Document;
39
40
41 public final class WorkflowUtils {
42 private static final String XPATH_ROUTE_CONTEXT_KEY = "_xpathKey";
43 public static final String XSTREAM_SAFE_PREFIX = "wf:xstreamsafe('";
44 public static final String XSTREAM_SAFE_SUFFIX = "')";
45 public static final String XSTREAM_MATCH_ANYWHERE_PREFIX = "//";
46 public static final String XSTREAM_MATCH_RELATIVE_PREFIX = "./";
47
48 private WorkflowUtils() {
49 throw new UnsupportedOperationException("do not call");
50 }
51
52
53
54
55
56
57
58
59
60
61 public final static XPath getXPath(Document document) {
62 XPath xpath = getXPath(RouteContext.getCurrentRouteContext());
63 xpath.setNamespaceContext(new WorkflowNamespaceContext());
64 WorkflowFunctionResolver resolver = new WorkflowFunctionResolver();
65 resolver.setXpath(xpath);
66 resolver.setRootNode(document);
67 xpath.setXPathFunctionResolver(resolver);
68 return xpath;
69 }
70
71 public final static XPath getXPath(RouteContext routeContext) {
72 if (routeContext == null) {
73 return XPathFactory.newInstance().newXPath();
74 }
75 if (!routeContext.getParameters().containsKey(XPATH_ROUTE_CONTEXT_KEY)) {
76 routeContext.getParameters().put(XPATH_ROUTE_CONTEXT_KEY, XPathFactory.newInstance().newXPath());
77 }
78 return (XPath) routeContext.getParameters().get(XPATH_ROUTE_CONTEXT_KEY);
79 }
80
81
82
83
84
85
86
87
88
89
90
91 public static final String xstreamSafeEval(XPath xpath, String xpathExpression, Object item) {
92 String xstreamSafeXPath = xstreamSafeXPath(xpathExpression);
93 String evalResult = "";
94 try {
95 evalResult = xpath.evaluate(xstreamSafeXPath, item);
96 }
97 catch (XPathExpressionException e) {
98 throw new RuntimeException("XPathExpressionException occurred on xpath: " + xstreamSafeXPath, e);
99 }
100 return evalResult;
101 }
102
103
104
105
106
107
108
109
110 public static final String xstreamSafeXPath(String xpathExpression) {
111 return new StringBuilder(XSTREAM_SAFE_PREFIX).append(xpathExpression).append(XSTREAM_SAFE_SUFFIX).toString();
112 }
113
114
115
116
117
118
119
120 public static String getHelpUrl(Field field) {
121 Properties params = new Properties();
122 params.put(KRADConstants.DISPATCH_REQUEST_PARAMETER, "getAttributeHelpText");
123 params.put(KRADConstants.BUSINESS_OBJECT_CLASS_ATTRIBUTE, field.getBusinessObjectClassName());
124 params.put(KRADPropertyConstants.ATTRIBUTE_NAME, field.getPropertyName());
125 String baseUrl = KRADServiceLocatorWeb.getRiceApplicationConfigurationMediationService().getBaseHelpUrl(field.getBusinessObjectClassName());
126 if (baseUrl == null) {
127 return null;
128 }
129 return UrlFactory.parameterizeUrl(baseUrl, params);
130 }
131
132
133
134
135
136
137
138
139 public static final String getBusinessObjectAttributeLabel(Class businessObjectClass, String attributeName) {
140 return KRADServiceLocatorWeb.getDataDictionaryService().getAttributeLabel(businessObjectClass, attributeName);
141 }
142
143
144
145
146
147
148
149
150
151
152
153
154
155 public static Row buildTextRow(Class propertyClass, String boPropertyName, String workflowPropertyKey) {
156 if (propertyClass == null) {
157 throw new IllegalArgumentException("Method parameter 'propertyClass' was passed a NULL value.");
158 }
159 if (StringUtils.isBlank(boPropertyName)) {
160 throw new IllegalArgumentException("Method parameter 'boPropertyName' was passed a NULL or blank value.");
161 }
162 if (StringUtils.isBlank(workflowPropertyKey)) {
163 throw new IllegalArgumentException("Method parameter 'workflowPropertyKey' was passed a NULL or blank value.");
164 }
165 List<Field> fields = new ArrayList<Field>();
166 Field field;
167 field = FieldUtils.getPropertyField(propertyClass, boPropertyName, false);
168 fields.add(field);
169 return new Row(fields);
170 }
171
172
173
174
175
176
177
178
179
180
181
182
183 public static Row buildTextRowWithLookup(Class propertyClass, String boPropertyName, String workflowPropertyKey) {
184 return buildTextRowWithLookup(propertyClass, boPropertyName, workflowPropertyKey, null);
185 }
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200 public static Row buildTextRowWithLookup(Class propertyClass, String boPropertyName, String workflowPropertyKey, Map fieldConversionsByBoPropertyName) {
201 if (propertyClass == null) {
202 throw new IllegalArgumentException("Method parameter 'propertyClass' was passed a NULL value.");
203 }
204 if (StringUtils.isBlank(boPropertyName)) {
205 throw new IllegalArgumentException("Method parameter 'boPropertyName' was passed a NULL or blank value.");
206 }
207 if (StringUtils.isBlank(workflowPropertyKey)) {
208 throw new IllegalArgumentException("Method parameter 'workflowPropertyKey' was passed a NULL or blank value.");
209 }
210 Field field;
211 field = FieldUtils.getPropertyField(propertyClass, boPropertyName, false);
212
213 List<Field> fields = new ArrayList<Field>();
214 fields.add(field);
215 return new Row(fields);
216 }
217
218
219
220
221
222
223
224
225
226
227
228
229
230 public static Row buildDropdownRow(Class propertyClass, String boPropertyName, String workflowPropertyKey, Map<String, String> optionMap, boolean addBlankRow) {
231 if (propertyClass == null) {
232 throw new IllegalArgumentException("Method parameter 'propertyClass' was passed a NULL value.");
233 }
234 if (StringUtils.isBlank(boPropertyName)) {
235 throw new IllegalArgumentException("Method parameter 'boPropertyName' was passed a NULL or blank value.");
236 }
237 if (StringUtils.isBlank(workflowPropertyKey)) {
238 throw new IllegalArgumentException("Method parameter 'workflowPropertyKey' was passed a NULL or blank value.");
239 }
240 if (optionMap == null) {
241 throw new IllegalArgumentException("Method parameter 'optionMap' was passed a NULL value.");
242 }
243 List<Field> fields = new ArrayList<Field>();
244 Field field;
245 field = FieldUtils.getPropertyField(propertyClass, boPropertyName, false);
246 fields.add(field);
247 return new Row(fields);
248 }
249 }