1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.kuali.rice.kew.superuser.web;
18
19 import java.util.Collection;
20 import java.util.Collections;
21 import java.util.Comparator;
22 import java.util.Iterator;
23 import java.util.List;
24
25 import javax.servlet.http.HttpServletRequest;
26 import javax.servlet.http.HttpServletResponse;
27 import javax.xml.namespace.QName;
28
29 import org.apache.commons.lang.ArrayUtils;
30 import org.apache.commons.lang.StringUtils;
31 import org.apache.struts.action.ActionForm;
32 import org.apache.struts.action.ActionForward;
33 import org.apache.struts.action.ActionMapping;
34 import org.kuali.rice.kew.actionrequest.ActionRequestValue;
35 import org.kuali.rice.kew.api.KewApiConstants;
36 import org.kuali.rice.kew.api.KewApiServiceLocator;
37 import org.kuali.rice.kew.api.WorkflowDocumentFactory;
38 import org.kuali.rice.kew.api.action.ActionRequestType;
39 import org.kuali.rice.kew.api.action.AdHocRevoke;
40 import org.kuali.rice.kew.api.action.DocumentActionParameters;
41 import org.kuali.rice.kew.api.action.ReturnPoint;
42 import org.kuali.rice.kew.api.action.WorkflowDocumentActionsService;
43 import org.kuali.rice.kew.doctype.bo.DocumentType;
44 import org.kuali.rice.kew.dto.RouteNodeInstanceDTO;
45 import org.kuali.rice.kew.exception.WorkflowException;
46 import org.kuali.rice.kew.exception.WorkflowServiceErrorException;
47 import org.kuali.rice.kew.exception.WorkflowServiceErrorImpl;
48 import org.kuali.rice.kew.routeheader.DocumentRouteHeaderValue;
49 import org.kuali.rice.kew.service.KEWServiceLocator;
50 import org.kuali.rice.kew.service.WorkflowInfo;
51 import org.kuali.rice.kew.util.KEWConstants;
52 import org.kuali.rice.kew.web.AppSpecificRouteRecipient;
53 import org.kuali.rice.kew.web.KewKualiAction;
54 import org.kuali.rice.kim.api.group.GroupService;
55 import org.kuali.rice.kim.api.identity.principal.Principal;
56 import org.kuali.rice.kim.api.services.KimApiServiceLocator;
57 import org.kuali.rice.krad.UserSession;
58 import org.kuali.rice.krad.exception.ValidationException;
59 import org.kuali.rice.krad.util.GlobalVariables;
60 import org.kuali.rice.krad.util.KRADConstants;
61 import org.kuali.rice.ksb.api.KsbApiServiceLocator;
62
63
64
65
66
67
68 public class SuperUserAction extends KewKualiAction {
69 private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(SuperUserAction.class);
70 public static final String UNAUTHORIZED = "authorizationFailure";
71
72
73
74
75
76 @Override
77 public ActionForward execute(ActionMapping mapping, ActionForm form,
78 HttpServletRequest request, HttpServletResponse response)
79 throws Exception {
80 initForm(request, form);
81 return super.execute(mapping, form, request, response);
82 }
83
84 @Override
85 public ActionForward refresh(ActionMapping mapping, ActionForm form, HttpServletRequest request,
86 HttpServletResponse response) throws Exception {
87 ((SuperUserForm) form).getActionRequests().clear();
88 initForm(request, form);
89 return defaultDispatch(mapping, form, request, response);
90 }
91
92 public ActionForward displaySuperUserDocument(ActionMapping mapping, ActionForm form, HttpServletRequest request,
93 HttpServletResponse response) throws Exception {
94 SuperUserForm superUserForm = (SuperUserForm) form;
95 superUserForm.setDocHandlerUrl(KEWConstants.DOC_HANDLER_REDIRECT_PAGE + "?docId="
96 + superUserForm.getDocumentId() + "&" + KEWConstants.COMMAND_PARAMETER + "="
97 + KEWConstants.SUPERUSER_COMMAND);
98 return defaultDispatch(mapping, form, request, response);
99 }
100
101 public ActionForward routeLevelApprove(ActionMapping mapping, ActionForm form, HttpServletRequest request,
102 HttpServletResponse response) throws Exception {
103 LOG.info("entering routeLevelApprove()...");
104 SuperUserForm superUserForm = (SuperUserForm) form;
105 String documentId = superUserForm.getRouteHeader().getDocumentId();
106 WorkflowDocumentActionsService documentActions = getWorkflowDocumentActionsService(documentId);
107 DocumentActionParameters parameters = DocumentActionParameters.create(documentId, getUserSession(request)
108 .getPrincipalId(), superUserForm.getAnnotation());
109
110 documentActions.superUserNodeApprove(parameters, superUserForm.isRunPostProcessorLogic(),
111 superUserForm.getDestNodeName());
112 saveDocumentMessage("general.routing.superuser.routeLevelApproved", request, superUserForm.getDocumentId(),
113 null);
114 LOG.info("exiting routeLevelApprove()...");
115 superUserForm.getActionRequests().clear();
116 initForm(request, form);
117 return defaultDispatch(mapping, form, request, response);
118 }
119
120 public ActionForward approve(ActionMapping mapping, ActionForm form, HttpServletRequest request,
121 HttpServletResponse response) throws Exception {
122 LOG.info("entering approve() ...");
123 SuperUserForm superUserForm = (SuperUserForm) form;
124 String documentId = superUserForm.getRouteHeader().getDocumentId();
125 WorkflowDocumentActionsService documentActions = getWorkflowDocumentActionsService(documentId);
126 DocumentActionParameters parameters = DocumentActionParameters.create(documentId, getUserSession(request)
127 .getPrincipalId(), superUserForm.getAnnotation());
128 documentActions.superUserBlanketApprove(parameters, superUserForm.isRunPostProcessorLogic());
129 saveDocumentMessage("general.routing.superuser.approved", request, superUserForm.getDocumentId(), null);
130 LOG.info("exiting approve() ...");
131 superUserForm.getActionRequests().clear();
132 initForm(request, form);
133 return defaultDispatch(mapping, form, request, response);
134 }
135
136 public ActionForward disapprove(ActionMapping mapping, ActionForm form, HttpServletRequest request,
137 HttpServletResponse response) throws Exception {
138 LOG.info("entering disapprove() ...");
139 SuperUserForm superUserForm = (SuperUserForm) form;
140 String documentId = superUserForm.getRouteHeader().getDocumentId();
141 WorkflowDocumentActionsService documentActions = getWorkflowDocumentActionsService(documentId);
142 DocumentActionParameters parameters = DocumentActionParameters.create(documentId, getUserSession(request)
143 .getPrincipalId(), superUserForm.getAnnotation());
144 documentActions.superUserDisapprove(parameters, superUserForm.isRunPostProcessorLogic());
145 saveDocumentMessage("general.routing.superuser.disapproved", request, superUserForm.getDocumentId(), null);
146 LOG.info("exiting disapprove() ...");
147 superUserForm.getActionRequests().clear();
148 initForm(request, form);
149 return defaultDispatch(mapping, form, request, response);
150 }
151
152 public ActionForward cancel(ActionMapping mapping, ActionForm form, HttpServletRequest request,
153 HttpServletResponse response) throws Exception {
154 LOG.info("entering cancel() ...");
155 SuperUserForm superUserForm = (SuperUserForm) form;
156 String documentId = superUserForm.getRouteHeader().getDocumentId();
157 WorkflowDocumentActionsService documentActions = getWorkflowDocumentActionsService(documentId);
158 DocumentActionParameters parameters = DocumentActionParameters.create(documentId, getUserSession(request)
159 .getPrincipalId(), superUserForm.getAnnotation());
160 documentActions.superUserCancel(parameters, superUserForm.isRunPostProcessorLogic());
161 saveDocumentMessage("general.routing.superuser.canceled", request, superUserForm.getDocumentId(), null);
162 LOG.info("exiting cancel() ...");
163 superUserForm.getActionRequests().clear();
164 initForm(request, form);
165 return defaultDispatch(mapping, form, request, response);
166 }
167
168 public ActionForward returnToPreviousNode(ActionMapping mapping, ActionForm form, HttpServletRequest request,
169 HttpServletResponse response) throws Exception {
170 LOG.info("entering returnToPreviousNode() ...");
171 SuperUserForm superUserForm = (SuperUserForm) form;
172 String documentId = superUserForm.getRouteHeader().getDocumentId();
173 WorkflowDocumentActionsService documentActions = getWorkflowDocumentActionsService(documentId);
174 DocumentActionParameters parameters = DocumentActionParameters.create(documentId, getUserSession(request)
175 .getPrincipalId(), superUserForm.getAnnotation());
176 documentActions.superUserReturnToPreviousNode(parameters, superUserForm.isRunPostProcessorLogic(),
177 ReturnPoint.create(superUserForm.getReturnDestNodeName()));
178 saveDocumentMessage("general.routing.returnedToPreviousNode", request, "document", superUserForm
179 .getReturnDestNodeName().toString());
180 LOG.info("exiting returnToPreviousRouteLevel() ...");
181 superUserForm.getActionRequests().clear();
182 initForm(request, form);
183 return defaultDispatch(mapping, form, request, response);
184 }
185
186 public ActionForward actionRequestApprove(ActionMapping mapping, ActionForm form, HttpServletRequest request,
187 HttpServletResponse response) throws Exception {
188 LOG.info("entering actionRequestApprove() ...");
189 SuperUserForm superUserForm = (SuperUserForm) form;
190
191
192 String methodToCallAttr = (String) request.getAttribute(KRADConstants.METHOD_TO_CALL_ATTRIBUTE);
193 superUserForm.setActionTakenRecipientCode(StringUtils.substringBetween(methodToCallAttr,
194 KRADConstants.METHOD_TO_CALL_PARM1_LEFT_DEL, KRADConstants.METHOD_TO_CALL_PARM1_RIGHT_DEL));
195 superUserForm.setActionTakenNetworkId(StringUtils.substringBetween(methodToCallAttr,
196 KRADConstants.METHOD_TO_CALL_PARM2_LEFT_DEL, KRADConstants.METHOD_TO_CALL_PARM2_RIGHT_DEL));
197 superUserForm.setActionTakenWorkGroupId(StringUtils.substringBetween(methodToCallAttr,
198 KRADConstants.METHOD_TO_CALL_PARM4_LEFT_DEL, KRADConstants.METHOD_TO_CALL_PARM4_RIGHT_DEL));
199 superUserForm.setActionTakenActionRequestId(StringUtils.substringBetween(methodToCallAttr,
200 KRADConstants.METHOD_TO_CALL_PARM5_LEFT_DEL, KRADConstants.METHOD_TO_CALL_PARM5_RIGHT_DEL));
201
202 LOG.debug("Routing super user action request approve action");
203 boolean runPostProcessorLogic = ArrayUtils.contains(superUserForm.getActionRequestRunPostProcessorCheck(),
204 superUserForm.getActionTakenActionRequestId());
205 String documentId = superUserForm.getRouteHeader().getDocumentId();
206 WorkflowDocumentActionsService documentActions = getWorkflowDocumentActionsService(documentId);
207 DocumentActionParameters parameters = DocumentActionParameters.create(documentId, getUserSession(request)
208 .getPrincipalId(), superUserForm.getAnnotation());
209 documentActions.superUserTakeRequestedAction(parameters, runPostProcessorLogic,
210 superUserForm.getActionTakenActionRequestId());
211 String messageString;
212 String actionReqest = StringUtils.substringBetween(methodToCallAttr,
213 KRADConstants.METHOD_TO_CALL_PARM6_LEFT_DEL, KRADConstants.METHOD_TO_CALL_PARM6_RIGHT_DEL);
214 if (actionReqest.equalsIgnoreCase("acknowledge")) {
215 messageString = "general.routing.superuser.actionRequestAcknowledged";
216 } else if (actionReqest.equalsIgnoreCase("FYI")) {
217 messageString = "general.routing.superuser.actionRequestFYI";
218 } else if (actionReqest.equalsIgnoreCase("complete")) {
219 messageString = "general.routing.superuser.actionRequestCompleted";
220 } else if (actionReqest.equalsIgnoreCase("approved")) {
221 messageString = "general.routing.superuser.actionRequestApproved";
222 } else {
223 messageString = "general.routing.superuser.actionRequestApproved";
224 }
225 saveDocumentMessage(messageString, request, superUserForm.getDocumentId(),
226 superUserForm.getActionTakenActionRequestId());
227 LOG.info("exiting actionRequestApprove() ...");
228 superUserForm.getActionRequests().clear();
229 initForm(request, form);
230
231
232 int removalIndex = findAppSpecificRecipientIndex(superUserForm, superUserForm.getActionTakenActionRequestId());
233
234 if (removalIndex >= 0) {
235 superUserForm.getAppSpecificRouteList().remove(removalIndex);
236 }
237
238 return defaultDispatch(mapping, form, request, response);
239 }
240
241
242
243
244
245
246
247
248
249
250
251 private int findAppSpecificRecipientIndex(SuperUserForm superUserForm, String actionRequestId) {
252 int tempIndex = 0;
253 for (Iterator<?> appRouteIter = superUserForm.getAppSpecificRouteList().iterator(); appRouteIter.hasNext();) {
254 String tempActnReqId = ((AppSpecificRouteRecipient) appRouteIter.next()).getActionRequestId();
255 if (StringUtils.equals(tempActnReqId, actionRequestId)) {
256 return tempIndex;
257 }
258 tempIndex++;
259 }
260 return -1;
261 }
262
263 public ActionForward initForm(HttpServletRequest request, ActionForm form) throws Exception {
264 request.setAttribute("Constants", getServlet().getServletContext().getAttribute("KEWConstants"));
265 SuperUserForm superUserForm = (SuperUserForm) form;
266 DocumentRouteHeaderValue routeHeader = KEWServiceLocator.getRouteHeaderService().getRouteHeader(
267 superUserForm.getDocumentId());
268 superUserForm.setRouteHeader(routeHeader);
269 String principalId = getUserSession(request).getPrincipalId();
270 boolean isAuthorized = KEWServiceLocator.getDocumentTypePermissionService().canAdministerRouting(principalId,
271 routeHeader.getDocumentType());
272 superUserForm.setAuthorized(isAuthorized);
273 if (!isAuthorized) {
274 saveDocumentMessage("general.routing.superuser.notAuthorized", request, superUserForm.getDocumentId(), null);
275 return null;
276 }
277
278 superUserForm.setFutureNodeNames(KEWServiceLocator.getRouteNodeService().findFutureNodeNames(
279 routeHeader.getDocumentId()));
280
281 Collection actionRequests = KEWServiceLocator.getActionRequestService().findPendingByDoc(
282 routeHeader.getDocumentId());
283 Iterator requestIterator = actionRequests.iterator();
284 while (requestIterator.hasNext()) {
285 ActionRequestValue req = (ActionRequestValue) requestIterator.next();
286
287 superUserForm.getActionRequests().add(req);
288
289 }
290
291 superUserForm.setDocId(superUserForm.getDocumentId());
292 if (superUserForm.getDocId() != null) {
293 superUserForm.setWorkflowDocument(WorkflowDocumentFactory.loadDocument(getUserSession(request)
294 .getPrincipalId(), superUserForm.getDocId()));
295 superUserForm.establishVisibleActionRequestCds();
296 }
297
298 return null;
299 }
300
301 private void saveDocumentMessage(String messageKey, HttpServletRequest request, String subVariable1,
302 String subVariable2) {
303 if (subVariable2 == null) {
304 GlobalVariables.getMessageMap().putInfo("document", messageKey, subVariable1);
305 } else {
306 GlobalVariables.getMessageMap().putInfo("document", messageKey, subVariable1, subVariable2);
307 }
308 }
309
310 public ActionForward routeToAppSpecificRecipient(ActionMapping mapping, ActionForm form,
311 HttpServletRequest request, HttpServletResponse response) throws Exception {
312 SuperUserForm superUserForm = (SuperUserForm) form;
313
314
315
316 String routeType = StringUtils.substringBetween(
317 (String) request.getAttribute(KRADConstants.METHOD_TO_CALL_ATTRIBUTE),
318 KRADConstants.METHOD_TO_CALL_PARM1_LEFT_DEL, KRADConstants.METHOD_TO_CALL_PARM1_RIGHT_DEL);
319 AppSpecificRouteRecipient recipient = null;
320 if (KEWConstants.PERSON.equals(routeType)) {
321 recipient = superUserForm.getAppSpecificRouteRecipient();
322 recipient.setActionRequested(superUserForm.getAppSpecificRouteActionRequestCd());
323 superUserForm.setAppSpecificPersonId(recipient.getId());
324 } else {
325 recipient = superUserForm.getAppSpecificRouteRecipient2();
326 recipient.setActionRequested(superUserForm.getAppSpecificRouteActionRequestCd2());
327 superUserForm.setAppSpecificWorkgroupId(recipient.getId());
328 }
329
330 validateAppSpecificRoute(recipient);
331
332
333 superUserForm.establishVisibleActionRequestCds();
334 if (superUserForm.getAppSpecificRouteActionRequestCds().get(recipient.getActionRequested()) == null) {
335 GlobalVariables.getMessageMap().putError("appSpecificRouteRecipient" +
336 ((KEWConstants.WORKGROUP.equals(recipient.getType())) ? "2" : "") + ".id",
337 "appspecificroute.actionrequested.invalid");
338
339 throw new ValidationException("The requested action of '" + recipient.getActionRequested()
340 + "' is no longer available for this document");
341 }
342
343 try {
344 String routeNodeName = getAdHocRouteNodeName(superUserForm.getWorkflowDocument().getDocumentId());
345
346 if (KEWConstants.PERSON.equals(routeType)) {
347 String recipientPrincipalId = KEWServiceLocator.getIdentityHelperService().getIdForPrincipalName(
348 recipient.getId());
349 superUserForm.getWorkflowDocument().adHocToPrincipal(
350 ActionRequestType.fromCode(recipient.getActionRequested()), routeNodeName,
351 superUserForm.getAnnotation(), recipientPrincipalId, "", true);
352 } else {
353 String recipientGroupId = KEWServiceLocator.getIdentityHelperService().getIdForGroupName(
354 recipient.getNamespaceCode(), recipient.getId());
355 superUserForm.getWorkflowDocument().adHocToGroup(
356 ActionRequestType.fromCode(recipient.getActionRequested()), routeNodeName,
357 superUserForm.getAnnotation(), recipientGroupId, "", true);
358 }
359 } catch (Exception e) {
360 LOG.error("Error generating app specific route request", e);
361 throw new WorkflowServiceErrorException("AppSpecific Route Error", new WorkflowServiceErrorImpl(
362 "AppSpecific Route Error", "appspecificroute.systemerror"));
363 }
364
365 superUserForm.getActionRequests().clear();
366 initForm(request, form);
367
368
369 ActionRequestValue latestActnReq = getLatestActionRequest(superUserForm);
370 if (latestActnReq != null) {
371 recipient.setActionRequestId(latestActnReq.getActionRequestId());
372 }
373
374 superUserForm.getAppSpecificRouteList().add(recipient);
375 superUserForm.resetAppSpecificRoute();
376
377 return start(mapping, form, request, response);
378 }
379
380
381
382
383
384
385
386
387 private ActionRequestValue getLatestActionRequest(SuperUserForm superUserForm) {
388 ActionRequestValue latestActnReq = null;
389
390
391
392
393 List<ActionRequestValue> actionRequests = superUserForm.getActionRequests();
394
395 if (actionRequests != null && actionRequests.size() > 0) {
396 Collections.sort(actionRequests, new Comparator<ActionRequestValue>() {
397
398 @Override
399
400 public int compare(ActionRequestValue o1, ActionRequestValue o2) {
401 if (o1 == null && o2 == null)
402 return 0;
403 if (o1 == null)
404 return -1;
405 if (o2 == null)
406 return 1;
407
408 if (o1.getCreateDate() == null && o2.getCreateDate() == null)
409 return 0;
410 if (o1.getCreateDate() == null)
411 return -1;
412 if (o2.getCreateDate() == null)
413 return 1;
414
415 return o2.getCreateDate().compareTo(o1.getCreateDate());
416 }
417
418 });
419
420
421 latestActnReq = actionRequests.get(0);
422 }
423
424
425
426
427
428
429
430
431
432
433 return latestActnReq;
434 }
435
436
437
438
439 public ActionForward removeAppSpecificRecipient(ActionMapping mapping, ActionForm form, HttpServletRequest request,
440 HttpServletResponse response) throws Exception {
441 SuperUserForm superUserForm = (SuperUserForm) form;
442
443 String strIndex = StringUtils.substringBetween(
444 (String) request.getAttribute(KRADConstants.METHOD_TO_CALL_ATTRIBUTE),
445 KRADConstants.METHOD_TO_CALL_PARM1_LEFT_DEL, KRADConstants.METHOD_TO_CALL_PARM1_RIGHT_DEL);
446 if (StringUtils.isBlank(strIndex)) {
447 throw new WorkflowException("No adhoc route recipient index specified");
448 }
449 int removeIndex = Integer.parseInt(strIndex);
450 if (removeIndex < 0 || removeIndex >= superUserForm.getAppSpecificRouteList().size()) {
451 throw new WorkflowException("Invalid adhoc route recipient index specified");
452 }
453
454 AppSpecificRouteRecipient removedRec = (AppSpecificRouteRecipient) superUserForm.getAppSpecificRouteList().get(
455 removeIndex);
456 if (removedRec.getActionRequestId() != null) {
457 superUserForm.getWorkflowDocument().revokeAdHocRequestById(removedRec.getActionRequestId().toString(), "");
458 } else {
459 AdHocRevoke adHocRevoke = null;
460
461 if (KEWConstants.PERSON.equals(removedRec.getType())) {
462 adHocRevoke = AdHocRevoke.createRevokeFromPrincipal(KEWServiceLocator.getIdentityHelperService()
463 .getIdForPrincipalName(removedRec.getId()));
464 } else {
465 adHocRevoke = AdHocRevoke.createRevokeFromGroup(KEWServiceLocator.getIdentityHelperService()
466 .getIdForGroupName(removedRec.getNamespaceCode(), removedRec.getId()));
467 }
468 superUserForm.getWorkflowDocument().revokeAdHocRequests(adHocRevoke, "");
469 }
470 superUserForm.getAppSpecificRouteList().remove(removeIndex);
471
472 superUserForm.getActionRequests().clear();
473 initForm(request, form);
474 return start(mapping, form, request, response);
475 }
476
477 private WorkflowDocumentActionsService getWorkflowDocumentActionsService(String documentId) {
478 DocumentType documentType = KEWServiceLocator.getDocumentTypeService().findByDocumentId(documentId);
479 String applicationId = documentType.getApplicationId();
480 QName serviceName = new QName(KewApiConstants.Namespaces.KEW_NAMESPACE_2_0,
481 KewApiConstants.ServiceNames.WORKFLOW_DOCUMENT_ACTIONS_SERVICE_SOAP);
482 WorkflowDocumentActionsService service = (WorkflowDocumentActionsService) KsbApiServiceLocator.getServiceBus()
483 .getService(serviceName, applicationId);
484 if (service == null) {
485 service = KewApiServiceLocator.getWorkflowDocumentActionsService();
486 }
487 return service;
488 }
489
490 protected void validateAppSpecificRoute(AppSpecificRouteRecipient recipient) {
491 if (recipient.getId() == null || recipient.getId().trim().equals("")) {
492 GlobalVariables.getMessageMap().putError("appSpecificRouteRecipient" +
493 ((KEWConstants.WORKGROUP.equals(recipient.getType())) ? "2" : "") + ".id",
494 "appspecificroute.recipient.required");
495 } else {
496 if (KEWConstants.PERSON.equals(recipient.getType())) {
497 Principal principal = KimApiServiceLocator.getIdentityService().getPrincipalByPrincipalName(
498 recipient.getId());
499 if (principal == null) {
500 LOG.error("App Specific user recipient not found");
501 GlobalVariables.getMessageMap().putError("appSpecificRouteRecipient.id",
502 "appspecificroute.user.invalid");
503 }
504 } else if (KEWConstants.WORKGROUP.equals(recipient.getType())) {
505
506 if (getGroupService().getGroupByName(recipient.getNamespaceCode(), recipient.getId()) == null) {
507 GlobalVariables.getMessageMap().putError("appSpecificRouteRecipient2.id",
508 "appspecificroute.workgroup.invalid");
509 }
510 }
511 }
512 if (GlobalVariables.getMessageMap().hasErrors()) {
513 throw new ValidationException("AppSpecific Route validation Errors");
514 }
515
516 }
517
518 protected String getAdHocRouteNodeName(String documentId) throws WorkflowException {
519 WorkflowInfo info = new WorkflowInfo();
520 RouteNodeInstanceDTO[] nodeInstances = info.getActiveNodeInstances(documentId);
521 if (nodeInstances == null || nodeInstances.length == 0) {
522 nodeInstances = info.getTerminalNodeInstances(documentId);
523 }
524 if (nodeInstances == null || nodeInstances.length == 0) {
525 throw new WorkflowException("Could not locate a node on the document to send the ad hoc request to.");
526 }
527 return nodeInstances[0].getName();
528 }
529
530 private GroupService getGroupService() {
531 return KimApiServiceLocator.getGroupService();
532 }
533
534 public static UserSession getUserSession(HttpServletRequest request) {
535 return GlobalVariables.getUserSession();
536 }
537
538 }