View Javadoc

1   /**
2    * Copyright 2005-2012 The Kuali Foundation
3    *
4    * Licensed under the Educational Community License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    * http://www.opensource.org/licenses/ecl2.php
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package org.kuali.rice.kew.api.action;
17  
18  import java.util.List;
19  import java.util.Set;
20  
21  import javax.jws.WebMethod;
22  import javax.jws.WebParam;
23  import javax.jws.WebResult;
24  import javax.jws.WebService;
25  import javax.jws.soap.SOAPBinding;
26  import javax.xml.bind.annotation.XmlElement;
27  import javax.xml.bind.annotation.XmlElementWrapper;
28  
29  import org.kuali.rice.core.api.exception.RiceIllegalArgumentException;
30  import org.kuali.rice.core.api.uif.RemotableAttributeError;
31  import org.kuali.rice.kew.api.KewApiConstants;
32  import org.kuali.rice.kew.api.WorkflowDocument;
33  import org.kuali.rice.kew.api.doctype.IllegalDocumentTypeException;
34  import org.kuali.rice.kew.api.document.Document;
35  import org.kuali.rice.kew.api.document.DocumentContentUpdate;
36  import org.kuali.rice.kew.api.document.DocumentDetail;
37  import org.kuali.rice.kew.api.document.DocumentStatus;
38  import org.kuali.rice.kew.api.document.DocumentUpdate;
39  import org.kuali.rice.kew.api.document.InvalidDocumentContentException;
40  import org.kuali.rice.kew.api.document.attribute.WorkflowAttributeDefinition;
41  import org.kuali.rice.kew.api.document.WorkflowDocumentService;
42  
43  /**
44   * This service defines various operations which are used to perform actions against a workflow
45   * {@link Document}. These actions include creation, routing, approval, acknowledgment, saving,
46   * updating document data, etc.
47   * 
48   * <p>
49   * It also includes operations that allow for loading of information about which actions a given
50   * principal is permitted to execute against a given document ({@link ValidActions}), as well as
51   * providing information about what actions a particular principal has been requested to execute
52   * against a given document ({@link RequestedActions}).
53   * 
54   * <p>
55   * This service can be used in conjunction with the {@link WorkflowDocumentService} which provides
56   * additional operations that relate to documents (but not document actions).
57   * 
58   * <p>
59   * Unless otherwise specified, all parameters to all methods must not be null. If the argument is a
60   * string value it must also not be "blank" (either the empty string or a string of only
61   * whitespace). In the cases where this is violated, a {@link RiceIllegalArgumentException} will be
62   * thrown. Additionally, unless otherwise specified, all methods will return non-null return values.
63   * In the case of collections, an empty collection will be returned in preference to a null
64   * collection value. All collections which are returned from methods on this service will be
65   * unmodifiable collections.
66   * 
67   * <p>
68   * Many of the actions trigger processing by the workflow engine. Unless otherwise specified, any
69   * method on this service which performs an action against the document will also submit the
70   * document to the workflow engine after performing the action. This may trigger the workflow
71   * document to transition to the next node in the workflow process or activate additional action
72   * requests depending on what the current state of the active node instance(s) is on the document.
73   * 
74   * <p>
75   * Workflow engine processing may happen either asynchronously or synchronously depending on
76   * configuration and capabilities of the back end workflow engine implementation. However,
77   * asynchronous operation is suggested for most use cases. This means that when operating in
78   * asynchronous mode, after an action is submitted against the document there may be a delay in
79   * state changes to the document. For example, if a principal submits an approve against a document
80   * that triggers transition to the next node in the workflow process (generating new action requests
81   * in the process) those new actions requests will not be represented in the information returned in
82   * the {@link DocumentActionResult} result object. Though future invocations of
83   * {@link #determineRequestedActions(String, String)} and similar methods may yield such
84   * information, though it may do so after an non-deterministic amount of time since the workflow
85   * engine makes no guarantees about how quickly it will complete processing. Additionally,
86   * asynchronous workflow processing is scheduled in a work queue and therefore it may not be picked
87   * up for processing immediately depending on system load and other factors.
88   * 
89   * <p>
90   * If there is an error during asynchronous workflow processing then the document will be put into
91   * exception routing (which can be executed in various ways depending on how the document type
92   * defines it's exception policy). Regardless of the exact process that gets triggered during
93   * exception routing, the end result is a set of {@link ActionRequestType#COMPLETE} requests to
94   * those principals who are capable of resolving the exception scenario as well as the document's
95   * status being transitioned to {@link DocumentStatus#EXCEPTION}. Once they have resolved any
96   * barriers to successful processing of the document, they can take the
97   * {@link #complete(DocumentActionParameters)} action against the document in order to satisfy the
98   * outstanding exception request(s) and send the document back through the workflow engine.
99   * 
100  * <p>
101  * In contrast, when operating the workflow engine in synchronous mode, processing will happen
102  * immediately and control will not be returned to the caller until all outstanding processing has
103  * completed. As a result, the information returned in the {@link DocumentActionResult} will always
104  * be in a consistent state after each action is performed. When operating in synchronous mode, the
105  * process of exception routing does not occur when failures are encountered during workflow engine
106  * processing, rather any exceptions that are raised during processing will instead be thrown back
107  * to the calling code.
108  * 
109  * <p>
110  * Implementations of this service are required to be thread-safe and should be able to be invoked
111  * either locally or remotely.
112  * 
113  * @see WorkflowDocumentService
114  * @see WorkflowDocument
115  * 
116  * @author Kuali Rice Team (rice.collab@kuali.org)
117  * 
118  */
119 @WebService(name = "workflowDocumentActionsService", targetNamespace = KewApiConstants.Namespaces.KEW_NAMESPACE_2_0)
120 @SOAPBinding(style = SOAPBinding.Style.DOCUMENT, use = SOAPBinding.Use.LITERAL, parameterStyle = SOAPBinding.ParameterStyle.WRAPPED)
121 public interface WorkflowDocumentActionsService {
122 
123     /**
124      * Creates a new document instance from the given document type. The initiator of the resulting
125      * document will be the same as the initiator that is passed to this method. Optional
126      * {@link DocumentUpdate} and {@link DocumentContentUpdate} parameters can be supplied in order
127      * to create the document with these additional pieces of data already set.
128      * 
129      * <p>
130      * By default, if neither the {@link DocumentUpdate} or {@link DocumentContentUpdate} is passed
131      * to this method, the document that is created and returned from this operation will have the
132      * following initial state:
133      * 
134      * <ul>
135      * <ol>
136      * {@code status} set to {@link DocumentStatus#INITIATED}
137      * </ol>
138      * <ol>
139      * {@code createDate} and {@code dateLastModified} set to the current date and time
140      * </ol>
141      * <ol>
142      * {@code current} set to 'true'
143      * </ol>
144      * <ol>
145      * {@code documentContent} set to the default and empty content
146      * </ol>
147      * </ul>
148      * 
149      * <p>
150      * Additionally, the initial {@link org.kuali.rice.kew.api.document.node.RouteNodeInstance} for the workflow process on the document
151      * will be created and linked to the document as it's initial node. Once the document is
152      * created, the {@link #route(DocumentActionParameters)} operation must be invoked in order to
153      * submit it to the workflow engine for initial processing.
154      * 
155      * <p>
156      * In certain situations, the given principal may not be permitted to initiate documents of the
157      * given type. In these cases an {@link InvalidActionTakenException} will be thrown.
158      * 
159      * @param documentTypeName the name of the document type from which to create this document
160      * @param initiatorPrincipalId the id of the principal who is initiating this document
161      * @param documentUpdate specifies additional document to set on the document upon creation,
162      *        this is optional and if null is passed then the document will be created with the
163      *        default document state
164      * @param documentContentUpdate defines what the initial document content for the document
165      *        should be, this is optional if null is passed then the document will be created with
166      *        the default empty document content
167      * 
168      * @return the document that was created
169      * 
170      * @throws RiceIllegalArgumentException if {@code principalId} is null or blank
171      * @throws RiceIllegalArgumentException if {@code principalId} does not identify a valid
172      *         principal
173      * @throws RiceIllegalArgumentException if {@code documentTypeName} is null or blank
174      * @throws RiceIllegalArgumentException if {@code documentTypeName} does not identify an
175      *         existing document type
176      * @throws IllegalDocumentTypeException if the specified document type is not active
177      * @throws IllegalDocumentTypeException if the specified document type does not support document
178      *         creation (in other words, it's a document type that is only used as a parent)
179      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
180      *         action
181      */
182     @WebMethod(operationName = "create")
183     @WebResult(name = "document")
184     @XmlElement(name = "document", required = true)
185     Document create(
186             @WebParam(name = "documentTypeName") String documentTypeName,
187             @WebParam(name = "initiatorPrincipalId") String initiatorPrincipalId,
188             @WebParam(name = "documentUpdate") DocumentUpdate documentUpdate,
189             @WebParam(name = "documentContentUpdate") DocumentContentUpdate documentContentUpdate)
190             throws RiceIllegalArgumentException, IllegalDocumentTypeException, InvalidActionTakenException;
191 
192     /**
193      * Determines which actions against the document with the given id are valid for the principal
194      * with the given id.
195      * 
196      * @param documentId the id of the document for which to determine valid actions
197      * @param principalId the id of the principal for which to determine valid actions against the
198      *        given document
199      * 
200      * @return a {@link ValidActions} object which contains the valid actions for the given
201      *         principal against the given document
202      * 
203      * @throws RiceIllegalArgumentException if {@code documentId} is null or blank
204      * @throws RiceIllegalArgumentException if document with the given {@code documentId} does not
205      *         exist
206      * @throws RiceIllegalArgumentException if {@code principalId} is null or blank
207      * @throws RiceIllegalArgumentException if principal with the given {@code principalId} does not
208      *         exist
209      */
210     @WebMethod(operationName = "determineValidActions")
211     @WebResult(name = "validActions")
212     @XmlElement(name = "validActions", required = true)
213     ValidActions determineValidActions(
214             @WebParam(name = "documentId") String documentId,
215             @WebParam(name = "principalId") String principalId)
216             throws RiceIllegalArgumentException;
217 
218     /**
219      * Determines which actions are requested against the document with the given id for the
220      * principal with the given id. These are generally derived based on action requests that are
221      * currently pending against the document.
222      * 
223      * <p>
224      * This method is distinguished from {@link #determineValidActions(String, String)} in that fact
225      * that valid actions are the actions that the principal is permitted to take, while requested
226      * actions are those that the principal is specifically being asked to take. Note that the
227      * actions that are requested are used when assembling valid actions but are not necessarily the
228      * only authoritative source for determination of valid actions for the principal, as
229      * permissions and other configuration can also come into play.
230      * 
231      * @param documentId the id of the document for which to determine requested actions
232      * @param principalId the id of the principal for which to determine requested actions against
233      *        the given document
234      * 
235      * @return a {@link RequestedActions} object which contains the actions that are being requested
236      *         from the given principal against the given document
237      * 
238      * @throws RiceIllegalArgumentException if {@code documentId} is null or blank
239      * @throws RiceIllegalArgumentException if document with the given {@code documentId} does not
240      *         exist
241      * @throws RiceIllegalArgumentException if {@code principalId} is null or blank
242      * @throws RiceIllegalArgumentException if principal with the given {@code principalId} does not
243      *         exist
244      */
245     @WebMethod(operationName = "determineRequestedActions")
246     @WebResult(name = "requestedActions")
247     @XmlElement(name = "requestedActions", required = true)
248     RequestedActions determineRequestedActions(
249             @WebParam(name = "documentId") String documentId,
250             @WebParam(name = "principalId") String principalId)
251             throws RiceIllegalArgumentException;
252 
253     /**
254      * Executes an {@link ActionType#ACKNOWLEDGE} action for the given principal and document
255      * specified in the supplied parameters. When a principal acknowledges a document, any of the
256      * principal's pending action requests at or below the acknowledge level (which includes fyi
257      * requests as well) will be satisfied by the principal's action. The principal's action should
258      * be recorded with the document as an {@link ActionTaken}.
259      * 
260      * <p>
261      * Depending on document type policy, a pending action request at or below the acknowledge level
262      * may have to exist on the document in order for the principal to take this action. Otherwise
263      * an {@link InvalidActionTakenException} may be thrown. In order to determine if an acknowledge
264      * action is valid, the {@link ValidActions} or {@link RequestedActions} for the document can be
265      * checked.
266      * 
267      * @param parameters the parameters which indicate which principal is executing the action
268      *        against which document, as well as additional operations to take against the document,
269      *        such as updating document data
270      * 
271      * @return the result of executing the action, including a view on the updated state of the
272      *         document and related actions
273      * 
274      * @throws RiceIllegalArgumentException if {@code parameters} is null
275      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
276      *         {@code parameters} exists
277      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
278      *         in {@code parameters} exists
279      * @throws InvalidDocumentContentException if the document content on the
280      *         {@link DocumentContentUpdate} supplied with the {@code parameters} is invalid.
281      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
282      *         action
283      */
284     @WebMethod(operationName = "acknowledge")
285     @WebResult(name = "documentActionResult")
286     @XmlElement(name = "documentActionResult", required = true)
287     DocumentActionResult acknowledge(@WebParam(name = "parameters") DocumentActionParameters parameters)
288             throws RiceIllegalArgumentException, InvalidDocumentContentException, InvalidActionTakenException;
289 
290     /**
291      * Executes an {@link ActionType#APPROVE} action for the given principal and document specified
292      * in the supplied parameters. When a principal approves a document, any of the principal's
293      * pending action requests at or below the approve level (which includes complete, acknowledge,
294      * and fyi requests as well) will be satisfied by the principal's action. The principal's action
295      * should be recorded with the document as an {@link ActionTaken}.
296      * 
297      * <p>
298      * Depending on document type policy, a pending action request at or below the approve level may
299      * have to exist on the document in order for the principal to take this action. Otherwise an
300      * {@link InvalidActionTakenException} may be thrown. In order to determine if an approve action
301      * is valid, the {@link ValidActions} or {@link RequestedActions} for the document can be
302      * checked.
303      * 
304      * @param parameters the parameters which indicate which principal is executing the action
305      *        against which document, as well as additional operations to take against the document,
306      *        such as updating document data
307      * 
308      * @return the result of executing the action, including a view on the updated state of the
309      *         document and related actions
310      * 
311      * @throws RiceIllegalArgumentException if {@code parameters} is null
312      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
313      *         {@code parameters} exists
314      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
315      *         in {@code parameters} exists
316      * @throws InvalidDocumentContentException if the document content on the
317      *         {@link DocumentContentUpdate} supplied with the {@code parameters} is invalid.
318      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
319      *         action
320      */
321     @WebMethod(operationName = "approve")
322     @WebResult(name = "documentActionResult")
323     @XmlElement(name = "documentActionResult", required = true)
324     DocumentActionResult approve(@WebParam(name = "parameters") DocumentActionParameters parameters)
325             throws RiceIllegalArgumentException, InvalidDocumentContentException, InvalidActionTakenException;
326 
327     /**
328      * Executes an {@link ActionType#ADHOC_REQUEST} action for the given principal and document
329      * specified in the supplied parameters to create an ad hoc action request to the target
330      * principal specified in the {@code AdHocToPrincipal}.
331      * 
332      * <p>
333      * Operates as per {@link #adHocToGroup(DocumentActionParameters, AdHocToGroup)} with the
334      * exception that this method is used to send an adhoc request to principal instead of a group.
335      * 
336      * <p>
337      * Besides this difference, the same rules that are in play for sending ad hoc requests to group
338      * apply for sending ad hoc requests to principals.
339      * 
340      * @param parameters the parameters which indicate which principal is executing the action
341      *        against which document, as well as additional operations to take against the document,
342      *        such as updating document data
343      * @param adHocToPrincipal defines various pieces of information that informs what type of ad
344      *        hoc request should be created
345      * 
346      * @return the result of executing the action, including a view on the updated state of the
347      *         document and related actions
348      * 
349      * @throws RiceIllegalArgumentException if {@code parameters} is null
350      * @throws RiceIllegalArgumentException if {@code adHocToPrincipal} is null
351      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
352      *         {@code parameters} exists
353      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
354      *         in {@code parameters} exists
355      * @throws InvalidDocumentContentException if the document content on the
356      *         {@link DocumentContentUpdate} supplied with the {@code parameters} is invalid.
357      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
358      *         action
359      * @throws InvalidActionTakenException if the target principal is not permitted to receive ad
360      *         hoc requests on documents of this type
361      * @throws InvalidActionTakenException if the specified ad hoc request cannot be generated
362      *         because the current state of the document would result in an illegal request being
363      *         generated
364      * 
365      * @see #adHocToGroup(DocumentActionParameters, AdHocToGroup)
366      */
367     @WebMethod(operationName = "adHocToPrincipal")
368     @WebResult(name = "documentActionResult")
369     @XmlElement(name = "documentActionResult", required = true)
370     DocumentActionResult adHocToPrincipal(
371             @WebParam(name = "parameters") DocumentActionParameters parameters,
372             @WebParam(name = "adHocToPrincipal") AdHocToPrincipal adHocToPrincipal)
373             throws RiceIllegalArgumentException, InvalidDocumentContentException, InvalidActionTakenException;
374 
375     /**
376      * Executes an {@link ActionType#ADHOC_REQUEST} action for the given group and document
377      * specified in the supplied parameters to create an ad hoc action request to the target group
378      * specified in the {@code AdHocToGroup}. The {@code AdHocToGroup} contains additional
379      * information on how the ad hoc action request should be created, including the type of request
380      * to generate, at which node it should generated, etc.
381      * 
382      * <p>
383      * The policy for how ad hoc actions handle request generation and interact with the workflow
384      * engine is different depending on the state of the document when the request to generate the
385      * ad hoc is submitted. There are also different scenarios under which certain types of ad hoc
386      * actions are allowed to be executed (throwing {@link InvalidActionTakenException} in
387      * situations where the actions are not permitted). The rules are defined as follows:
388      * 
389      * <ol>
390      * <li>If the status of the document is {@link DocumentStatus#INITIATED} then the action request
391      * will be generated with a status of {@link ActionRequestStatus#INITIALIZED} and no processing
392      * directives will be submitted to the workflow engine. When the document is routed, these ad
393      * hoc requests will get activated</li>
394      * <li>If the ad hoc request being created is an {@link ActionRequestType#COMPLETE} or
395      * {@link ActionRequestType#APPROVE} and the document is in a "terminal" state (either
396      * {@link DocumentStatus#CANCELED}, {@link DocumentStatus#DISAPPROVED},
397      * {@link DocumentStatus#PROCESSED}, {@link DocumentStatus#FINAL}) or is in
398      * {@link DocumentStatus#EXCEPTION} status, then an {@link InvalidActionTakenException} will be
399      * thrown. This is because submitting such an action with a document in that state would result
400      * in creation of an illegal action request.</li>
401      * <li>If the document is in a "terminal" state (see above for definition) then the request will
402      * be immediately (and synchronously) activated.</li>
403      * <li>Otherwise, after creating the ad hoc request it will be in the
404      * {@link ActionRequestStatus#INITIALIZED} status, and the document will be immediately
405      * forwarded to the workflow engine for processing at which point the ad hoc request will
406      * activated at the appropriate time.</li>
407      * </ol>
408      * 
409      * <p>
410      * Unlink other actions, ad hoc actions don't result in the recording of an {@link ActionTaken}
411      * against the document. Instead, only the requested ad hoc {@link ActionRequest} is created.
412      * 
413      * @param parameters the parameters which indicate which principal is executing the action
414      *        against which document, as well as additional operations to take against the document,
415      *        such as updating document data
416      * @param adHocToGroup defines various pieces of information that informs what type of ad hoc
417      *        request should be created
418      * 
419      * @return the result of executing the action, including a view on the updated state of the
420      *         document and related actions
421      * 
422      * @throws RiceIllegalArgumentException if {@code parameters} is null
423      * @throws RiceIllegalArgumentException if {@code adHocToGroup} is null
424      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
425      *         {@code parameters} exists
426      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
427      *         in {@code parameters} exists
428      * @throws InvalidDocumentContentException if the document content on the
429      *         {@link DocumentContentUpdate} supplied with the {@code parameters} is invalid.
430      * @throws InvalidActionTakenException if the supplied principals i is not allowed to execute
431      *         this action
432      * @throws InvalidActionTakenException if any of the principals in the target group are not
433      *         permitted to receive ad hoc requests on documents of this type
434      * @throws InvalidActionTakenException if the specified ad hoc request cannot be generated
435      *         because the current state of the document would result in an illegal request being
436      *         generated
437      */
438     @WebMethod(operationName = "adHocToGroup")
439     @WebResult(name = "documentActionResult")
440     @XmlElement(name = "documentActionResult", required = true)
441     DocumentActionResult adHocToGroup(
442             @WebParam(name = "parameters") DocumentActionParameters parameters,
443             @WebParam(name = "adHocToGroup") AdHocToGroup adHocToGroup)
444             throws RiceIllegalArgumentException, InvalidDocumentContentException, InvalidActionTakenException;
445 
446     /**
447      * Executes an {@link ActionType#ADHOC_REQUEST_REVOKE} action for the given principal and
448      * document specified in the supplied parameters against the action request with the given id.
449      * The process of revoking an ad hoc request simply deactivates the request associating the
450      * generated {@link ActionTaken} of the revoke action with the deactivated request (this allows
451      * for it to be determined what caused the ad hoc request to be deactivated). As with other
452      * actions, this action taken is then recorded with the document.
453      * 
454      * @param parameters the parameters which indicate which principal is executing the action
455      *        against which document, as well as additional operations to take against the document,
456      *        such as updating document data
457      * @param actionRequestId the id of the action request to revoke
458      * 
459      * @return the result of executing the action, including a view on the updated state of the
460      *         document and related actions
461      * 
462      * @throws RiceIllegalArgumentException if {@code parameters} is null
463      * @throws RiceIllegalArgumentException if {@code actionRequestId} is null or blank
464      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
465      *         {@code parameters} exists
466      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
467      *         in {@code parameters} exists
468      * @throws InvalidDocumentContentException if the document content on the
469      *         {@link DocumentContentUpdate} supplied with the {@code parameters} is invalid.
470      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
471      *         action
472      * @throws InvalidActionTakenException if a pending ad hoc request with the given
473      *         {@code actionRequestId} does not exist on the specified document, this could mean
474      *         that the action request id is invalid, or that the action request has already been
475      *         deactivated and is no longer pending
476      */
477     @WebMethod(operationName = "revokeAdHocRequestById")
478     @WebResult(name = "documentActionResult")
479     @XmlElement(name = "documentActionResult", required = true)
480     DocumentActionResult revokeAdHocRequestById(
481             @WebParam(name = "parameters") DocumentActionParameters parameters,
482             @WebParam(name = "actionRequestId") String actionRequestId)
483             throws RiceIllegalArgumentException, InvalidDocumentContentException, InvalidActionTakenException;
484 
485     /**
486      * Executes an {@link ActionType#ADHOC_REQUEST_REVOKE} action which revokes all pending ad hoc
487      * action requests that match the supplied {@link AdHocRevoke} criteria for the given principal
488      * and document specified in the supplied parameters. The process of revoking an ad hoc requests
489      * simply deactivates all ad hoc requests that match the given {@code AdHocRevoke} criteria,
490      * associating the generated {@link ActionTaken} of the revoke action with the deactivated
491      * requests (this allows for it to be determined what caused the ad hoc request to be
492      * deactivated). As with other actions, this action taken is then recorded with the document.
493      * 
494      * <p>
495      * It's possible that the given ad hoc revoke command will match no action requests on the
496      * document, in which case this method will complete successfully but no requests will be
497      * deactivated.
498      * 
499      * @param parameters the parameters which indicate which principal is executing the action
500      *        against which document, as well as additional operations to take against the document,
501      *        such as updating document data
502      * @param revoke the criteria for matching ad hoc action requests on the specified document that
503      *        should be revoked
504      * 
505      * @return the result of executing the action, including a view on the updated state of the
506      *         document and related actions
507      * 
508      * @throws RiceIllegalArgumentException if {@code parameters} is null
509      * @throws RiceIllegalArgumentException if {@code revoke} is null
510      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
511      *         {@code parameters} exists
512      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
513      *         in {@code parameters} exists
514      * @throws InvalidDocumentContentException if the document content on the
515      *         {@link DocumentContentUpdate} supplied with the {@code parameters} is invalid.
516      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
517      *         action
518      */
519     @WebMethod(operationName = "revokeAdHocRequests")
520     @WebResult(name = "documentActionResult")
521     @XmlElement(name = "documentActionResult", required = true)
522     DocumentActionResult revokeAdHocRequests(
523             @WebParam(name = "parameters") DocumentActionParameters parameters,
524             @WebParam(name = "revoke") AdHocRevoke revoke)
525             throws RiceIllegalArgumentException, InvalidDocumentContentException, InvalidActionTakenException;
526 
527     /**
528      * Executes an {@link ActionType#ADHOC_REQUEST_REVOKE} action which revokes all pending ad hoc
529      * action requests for the given principal and document specified in the supplied parameters.
530      * This process of revoking all ad hoc requests will simply deactivate all ad hoc requests on
531      * the specified document, associating the generated {@link ActionTaken} of the revoke action
532      * with the deactivated requests (this allows for it to be determined what caused the ad hoc
533      * request to be deactivated). As with other actions, this action taken is then recorded with
534      * the document.
535      * 
536      * <p>
537      * It's possible that the specified document will have no pending adhoc requests, in which case
538      * this method will complete successfully but no requests will be deactivated.
539      * 
540      * @param parameters the parameters which indicate which principal is executing the action
541      *        against which document, as well as additional operations to take against the document,
542      *        such as updating document data
543      * 
544      * @return the result of executing the action, including a view on the updated state of the
545      *         document and related actions
546      * 
547      * @throws RiceIllegalArgumentException if {@code parameters} is null
548      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
549      *         {@code parameters} exists
550      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
551      *         in {@code parameters} exists
552      * @throws InvalidDocumentContentException if the document content on the
553      *         {@link DocumentContentUpdate} supplied with the {@code parameters} is invalid.
554      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
555      *         action
556      */
557     @WebMethod(operationName = "revokeAllAdHocRequests")
558     @WebResult(name = "documentActionResult")
559     @XmlElement(name = "documentActionResult", required = true)
560     DocumentActionResult revokeAllAdHocRequests(@WebParam(name = "parameters") DocumentActionParameters parameters)
561             throws RiceIllegalArgumentException, InvalidDocumentContentException, InvalidActionTakenException;
562 
563     /**
564      * Executes a {@link ActionType#CANCEL} action for the given principal and document specified in
565      * the supplied parameters. When a principal cancels a document, all pending action requests on
566      * the document are deactivated and the the principal's action will be recorded on the document
567      * as an {@link ActionTaken}. Additionally, the document will be (synchronously) transitioned to
568      * the {@link DocumentStatus#CANCELED} status.
569      * 
570      * <p>
571      * In order to cancel a document, the principal must have permission to cancel documents of the
572      * appropriate type, and one of the following must hold true:
573      * 
574      * <ol>
575      * <li>The document must have a status of {@link DocumentStatus#INITIATED} <strong>or</strong></li>
576      * <li>The document must have a status of {@link DocumentStatus#SAVED} <strong>or</strong></li>
577      * <li>The principal must have a pending "complete" or "approve" request on the document.
578      * 
579      * @param parameters the parameters which indicate which principal is executing the action
580      *        against which document, as well as additional operations to take against the document,
581      *        such as updating document data
582      * 
583      * @return the result of executing the action, including a view on the updated state of the
584      *         document and related actions
585      * 
586      * @throws RiceIllegalArgumentException if {@code parameters} is null
587      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
588      *         {@code parameters} exists
589      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
590      *         in {@code parameters} exists
591      * @throws InvalidDocumentContentException if the document content on the
592      *         {@link DocumentContentUpdate} supplied with the {@code parameters} is invalid.
593      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
594      *         action
595      */
596     @WebMethod(operationName = "cancel")
597     @WebResult(name = "documentActionResult")
598     @XmlElement(name = "documentActionResult", required = true)
599     DocumentActionResult cancel(@WebParam(name = "parameters") DocumentActionParameters parameters)
600             throws RiceIllegalArgumentException, InvalidDocumentContentException, InvalidActionTakenException;
601 
602     /**
603      * Executes an {@link ActionType#FYI} action for the given principal and document specified in
604      * the supplied parameters. When a principal clears fyis on a document, any of the principal's
605      * pending fyis will be satisfied by the principal's action. The principal's action should be
606      * recorded with the document as an {@link ActionTaken}.
607      * 
608      * <p>
609      * Depending on document type policy, a pending fyi request may have to exist on the document in
610      * order for the principal to take this action. Otherwise an {@link InvalidActionTakenException}
611      * may be thrown. In order to determine if an fyi action is valid, the {@link ValidActions} or
612      * {@link RequestedActions} for the document can be checked.
613      * 
614      * @param parameters the parameters which indicate which principal is executing the action
615      *        against which document, as well as additional operations to take against the document,
616      *        such as updating document data
617      * 
618      * @return the result of executing the action, including a view on the updated state of the
619      *         document and related actions
620      * 
621      * @throws RiceIllegalArgumentException if {@code parameters} is null
622      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
623      *         {@code parameters} exists
624      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
625      *         in {@code parameters} exists
626      * @throws InvalidDocumentContentException if the document content on the
627      *         {@link DocumentContentUpdate} supplied with the {@code parameters} is invalid.
628      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
629      *         action
630      */
631     @WebMethod(operationName = "clearFyi")
632     @WebResult(name = "documentActionResult")
633     @XmlElement(name = "documentActionResult", required = true)
634     DocumentActionResult clearFyi(@WebParam(name = "parameters") DocumentActionParameters parameters)
635             throws RiceIllegalArgumentException, InvalidDocumentContentException, InvalidActionTakenException;
636 
637     /**
638      * Executes an {@link ActionType#COMPLETE} action for the given principal and document specified
639      * in the supplied parameters. When a principal completes a document, any of the principal's
640      * pending action requests at or below the complete level (which includes approve, acknowledge,
641      * and fyi requests as well) will be satisfied by the principal's action. The principal's action
642      * should be recorded with the document as an {@link ActionTaken}.
643      * 
644      * <p>
645      * Depending on document type policy, a pending action request at or below the complete level
646      * may have to exist on the document in order for the principal to take this action. Otherwise
647      * an {@link InvalidActionTakenException} may be thrown. In order to determine if an complete
648      * action is valid, the {@link ValidActions} or {@link RequestedActions} for the document can be
649      * checked.
650      * 
651      * @param parameters the parameters which indicate which principal is executing the action
652      *        against which document, as well as additional operations to take against the document,
653      *        such as updating document data
654      * 
655      * @return the result of executing the action, including a view on the updated state of the
656      *         document and related actions
657      * 
658      * @throws RiceIllegalArgumentException if {@code parameters} is null
659      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
660      *         {@code parameters} exists
661      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
662      *         in {@code parameters} exists
663      * @throws InvalidDocumentContentException if the document content on the
664      *         {@link DocumentContentUpdate} supplied with the {@code parameters} is invalid.
665      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
666      *         action
667      */
668     @WebMethod(operationName = "complete")
669     @WebResult(name = "documentActionResult")
670     @XmlElement(name = "documentActionResult", required = true)
671     DocumentActionResult complete(@WebParam(name = "parameters") DocumentActionParameters parameters)
672             throws RiceIllegalArgumentException, InvalidDocumentContentException, InvalidActionTakenException;
673 
674     /**
675      * Executes a {@link ActionType#DISAPPROVE} action for the given principal and document
676      * specified in the supplied parameters. When a principal disapproves a document, all pending
677      * action requests on the document are deactivated and the the principal's action will be
678      * recorded on the document as an {@link ActionTaken}. Additionally, the document will be
679      * (synchronously) transitioned to the {@link DocumentStatus#DISAPPROVED} status.
680      * 
681      * <p>
682      * Depending on document type policy and configuration, notifications may be sent to past
683      * approvers of the document. By default, an "acknowledge" request will be sent to each
684      * principal who took an "approve" or "complete" action on the document previously.
685      * 
686      * <p>
687      * In order to disapprove a document, the principal must have a pending approve or complete
688      * request on the document.
689      * 
690      * @param parameters the parameters which indicate which principal is executing the action
691      *        against which document, as well as additional operations to take against the document,
692      *        such as updating document data
693      * 
694      * @return the result of executing the action, including a view on the updated state of the
695      *         document and related actions
696      * 
697      * @throws RiceIllegalArgumentException if {@code parameters} is null
698      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
699      *         {@code parameters} exists
700      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
701      *         in {@code parameters} exists
702      * @throws InvalidDocumentContentException if the document content on the
703      *         {@link DocumentContentUpdate} supplied with the {@code parameters} is invalid.
704      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
705      *         action
706      */
707     @WebMethod(operationName = "disapprove")
708     @WebResult(name = "documentActionResult")
709     @XmlElement(name = "documentActionResult", required = true)
710     DocumentActionResult disapprove(@WebParam(name = "parameters") DocumentActionParameters parameters)
711             throws RiceIllegalArgumentException, InvalidDocumentContentException, InvalidActionTakenException;
712 
713     /**
714      * Submits a document that is in either the "initiated" or "saved" state to the workflow engine
715      * for processing. The route action triggers the beginning of the routing process and
716      * (synchronously) switches the status of the document to {@link DocumentStatus#ENROUTE}. It
717      * then queues up a request to the workflow engine to process the document.
718      * 
719      * <p>
720      * When the route action is executed, an {@link ActionType#COMPLETE} action is recorded on the
721      * document for the principal who executed the route action. At this point in time, any action
722      * requests that are currently on the document in an "initialized" state will be activated.
723      * Requests of this nature can commonly exist if ad hoc requests have been attached to the
724      * document prior to execution of the route action.
725      * 
726      * <p>
727      * By default, the principal who initiated the document is the same principal who must submit
728      * the route command. However, a document type policy can be set which will relax this
729      * constraint.
730      * 
731      * <p>
732      * The route action should ideally only ever be executed once for a given document. Depending on
733      * document type policy, attempting to execute a "route" action against a document which is
734      * already enroute or in a terminal state may result in an {@link InvalidActionTakenException}
735      * being thrown.
736      * 
737      * @param parameters the parameters which indicate which principal is executing the action
738      *        against which document, as well as additional operations to take against the document,
739      *        such as updating document data
740      * 
741      * @return the result of executing the action, including a view on the updated state of the
742      *         document and related actions
743      * 
744      * @throws RiceIllegalArgumentException if {@code parameters} is null
745      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
746      *         {@code parameters} exists
747      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
748      *         in {@code parameters} exists
749      * @throws InvalidDocumentContentException if the document content on the
750      *         {@link DocumentContentUpdate} supplied with the {@code parameters} is invalid.
751      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
752      *         action
753      */
754     @WebMethod(operationName = "route")
755     @WebResult(name = "documentActionResult")
756     @XmlElement(name = "documentActionResult", required = true)
757     DocumentActionResult route(@WebParam(name = "parameters") DocumentActionParameters parameters)
758             throws RiceIllegalArgumentException, InvalidDocumentContentException, InvalidActionTakenException;
759 
760     /**
761      * Triggers the execution of a full {@link ActionType#BLANKET_APPROVE} action for the given
762      * principal and document specified in the supplied parameters. Blanket approval will
763      * orchestrate a document from it's current node all the way to the end of the document's
764      * workflow process. During this process, it will automatically act on all "approve" and
765      * "complete" requests, effectively bypassing them. When it does this, it will notify the
766      * original recipients of these requests by routing acknowledge requests to them.
767      * 
768      * <p>
769      * Blanket approve processing is handled by a special mode of the workflow engine which runs the
770      * document through it's full processing lifecycle, ensuring that it makes it's way to the end
771      * of it's route path (by bypassing any steps that would cause the process to halt, such as
772      * approval requests). Because of this nature, blanket approve processing behavior is governed
773      * by the same configuration as the rest of the workflow engine. So depending on whether the
774      * engine is configured or synchronous or asynchronous operation, the blanket approve processing
775      * will behave in the same manner.
776      * 
777      * <p>
778      * In order to execute a blanket approve operation, the principal must have permissions to do
779      * so.
780      * 
781      * @param parameters the parameters which indicate which principal is executing the action
782      *        against which document, as well as additional operations to take against the document,
783      *        such as updating document data
784      * 
785      * @return the result of executing the action, including a view on the updated state of the
786      *         document and related actions
787      * 
788      * @throws RiceIllegalArgumentException if {@code parameters} is null
789      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
790      *         {@code parameters} exists
791      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
792      *         in {@code parameters} exists
793      * @throws InvalidDocumentContentException if the document content on the
794      *         {@link DocumentContentUpdate} supplied with the {@code parameters} is invalid.
795      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
796      *         action
797      */
798     @WebMethod(operationName = "blanketApprove")
799     @WebResult(name = "documentActionResult")
800     @XmlElement(name = "documentActionResult", required = true)
801     DocumentActionResult blanketApprove(@WebParam(name = "parameters") DocumentActionParameters parameters)
802             throws RiceIllegalArgumentException, InvalidDocumentContentException, InvalidActionTakenException;
803 
804     /**
805      * Triggers the execution of a {@link ActionType#BLANKET_APPROVE} action which orchestrates the
806      * document to the given set of node names for the given principal and document specified in the
807      * supplied parameters. This method functions the same as
808      * {@link #blanketApprove(DocumentActionParameters)} with the exception that the blanket approve
809      * process will be halted once all node names in the given set have been reached.
810      * 
811      * <p>
812      * If null or an empty set is passed for {@code nodeNames} on this method, it's behavior will be
813      * equivalent to {@link #blanketApprove(DocumentActionParameters)}.
814      * 
815      * @param parameters the parameters which indicate which principal is executing the action
816      *        against which document, as well as additional operations to take against the document,
817      *        such as updating document data
818      * @param nodeNames a set of node names to which to blanket approve the given document
819      * 
820      * @return the result of executing the action, including a view on the updated state of the
821      *         document and related actions
822      * 
823      * @throws RiceIllegalArgumentException if {@code parameters} is null
824      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
825      *         {@code parameters} exists
826      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
827      *         in {@code parameters} exists
828      * @throws InvalidDocumentContentException if the document content on the
829      *         {@link DocumentContentUpdate} supplied with the {@code parameters} is invalid.
830      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
831      *         action
832      */
833     @WebMethod(operationName = "blanketApproveToNodes")
834     @WebResult(name = "documentActionResult")
835     @XmlElement(name = "documentActionResult", required = true)
836     DocumentActionResult blanketApproveToNodes(
837             @WebParam(name = "parameters") DocumentActionParameters parameters,
838             @WebParam(name = "nodeName") Set<String> nodeNames)
839             throws RiceIllegalArgumentException, InvalidDocumentContentException, InvalidActionTakenException;
840 
841     /**
842      * Triggers the execution of a {@link ActionType#RETURN_TO_PREVIOUS} action for the given
843      * principal and document specified in the supplied parameters. Return a document to a previous
844      * node will allow for the document to be pushed back to an earlier node in the process based on
845      * the criteria present in the {@link ReturnPoint} that is passed to this method.
846      * 
847      * <p>
848      * The document is synchronously returned to the suggested return point (assuming the desired
849      * return point can be identified for the given document), and then the document will be
850      * submitted to the engine for further processing (effectively, re-establishing the flow of the
851      * document from the target return point).
852      * 
853      * <p>
854      * Return the document to the first node in the document is treated as a special case and,
855      * rather then transitioning the document back to the "initiated" status, will route a
856      * "complete" request to the initiator of the document. The effectively enacts a return to the
857      * document initiator in these cases.
858      * 
859      * @param parameters the parameters which indicate which principal is executing the action
860      *        against which document, as well as additional operations to take against the document,
861      *        such as updating document data
862      * 
863      * @return the result of executing the action, including a view on the updated state of the
864      *         document and related actions
865      * 
866      * @throws RiceIllegalArgumentException if {@code parameters} is null
867      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
868      *         {@code parameters} exists
869      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
870      *         in {@code parameters} exists
871      * @throws InvalidDocumentContentException if the document content on the
872      *         {@link DocumentContentUpdate} supplied with the {@code parameters} is invalid.
873      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
874      *         action
875      */
876     @WebMethod(operationName = "returnToPreviousNode")
877     @WebResult(name = "documentActionResult")
878     @XmlElement(name = "documentActionResult", required = true)
879     DocumentActionResult returnToPreviousNode(
880             @WebParam(name = "parameters") DocumentActionParameters parameters,
881             @WebParam(name = "returnPoint") ReturnPoint returnPoint)
882             throws RiceIllegalArgumentException, InvalidDocumentContentException, InvalidActionTakenException;
883 
884 
885     /**
886      * Triggers the execution of a {@link ActionType#MOVE} action for the given
887      * principal and document specified in the supplied parameters. Move a document to a
888      * node will allow for the document to be pushed to a different node in the process based on
889      * the criteria present in the {@link MovePoint} that is passed to this method.
890      *
891      * <p />
892      * The document is synchronously moved to the suggested move point (assuming the desired
893      * move point can be identified for the given document), and then the document will be
894      * submitted to the engine for further processing (effectively, re-establishing the flow of the
895      * document from the target return point).
896      *
897      *
898      * @param parameters the parameters which indicate which principal is executing the action
899      *        against which document, as well as additional operations to take against the document,
900      *        such as updating document data
901      * @param movePoint the point to move the document
902      *
903      * @return the result of executing the action, including a view on the updated state of the
904      *         document and related actions
905      *
906      * @throws RiceIllegalArgumentException if {@code parameters} is null
907      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
908      *         {@code parameters} exists
909      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
910      *         in {@code parameters} exists
911      * @throws InvalidDocumentContentException if the document content on the
912      *         {@link DocumentContentUpdate} supplied with the {@code parameters} is invalid.
913      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
914      *         action
915      */
916     @WebMethod(operationName = "move")
917     @WebResult(name = "documentActionResult")
918     @XmlElement(name = "documentActionResult", required = true)
919     DocumentActionResult move(
920             @WebParam(name = "parameters") DocumentActionParameters parameters,
921             @WebParam(name = "movePoint") MovePoint movePoint)
922             throws RiceIllegalArgumentException, InvalidDocumentContentException, InvalidActionTakenException;
923 
924     /**
925      * Triggers the execution of a {@link ActionType#TAKE_GROUP_AUTHORITY} action for the given
926      * principal and document specified in the supplied parameters. Takes authority of a group by a
927      * member of that group.
928      *
929      * @param parameters the parameters which indicate which principal is executing the action
930      *        against which document, as well as additional operations to take against the document,
931      *        such as updating document data
932      * @param groupId the group id to take authority of
933      *
934      * @return the result of executing the action, including a view on the updated state of the
935      *         document and related actions
936      *
937      * @throws RiceIllegalArgumentException if {@code parameters} is null
938      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
939      *         {@code parameters} exists
940      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
941      *         in {@code parameters} exists
942      * @throws InvalidDocumentContentException if the document content on the
943      *         {@link DocumentContentUpdate} supplied with the {@code parameters} is invalid.
944      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
945      *         action
946      */
947     @WebMethod(operationName = "takeGroupAuthority")
948     @WebResult(name = "documentActionResult")
949     @XmlElement(name = "documentActionResult", required = true)
950     DocumentActionResult takeGroupAuthority(
951             @WebParam(name = "parameters") DocumentActionParameters parameters,
952             @WebParam(name = "groupId") String groupId)
953             throws RiceIllegalArgumentException, InvalidDocumentContentException, InvalidActionTakenException;
954 
955     /**
956      * Triggers the execution of a {@link ActionType#RELEASE_GROUP_AUTHORITY} action for the given
957      * principal and document specified in the supplied parameters. Releases authority of a group by a
958      * member of that group.
959      *
960      * @param parameters the parameters which indicate which principal is executing the action
961      *        against which document, as well as additional operations to take against the document,
962      *        such as updating document data
963      * @param groupId the group id to take authority of
964      *
965      * @return the result of executing the action, including a view on the updated state of the
966      *         document and related actions
967      *
968      * @throws RiceIllegalArgumentException if {@code parameters} is null
969      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
970      *         {@code parameters} exists
971      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
972      *         in {@code parameters} exists
973      * @throws InvalidDocumentContentException if the document content on the
974      *         {@link DocumentContentUpdate} supplied with the {@code parameters} is invalid.
975      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
976      *         action
977      */
978     @WebMethod(operationName = "releaseGroupAuthority")
979     @WebResult(name = "documentActionResult")
980     @XmlElement(name = "documentActionResult", required = true)
981     DocumentActionResult releaseGroupAuthority(
982             @WebParam(name = "parameters") DocumentActionParameters parameters,
983             @WebParam(name = "groupId") String groupId)
984             throws RiceIllegalArgumentException, InvalidDocumentContentException, InvalidActionTakenException;
985 
986     /**
987      * Triggers the execution of a {@link ActionType#SAVE} action for the given
988      * principal and document specified in the supplied parameters. Saves a document to a
989      * at the current point.
990      *
991      * @param parameters the parameters which indicate which principal is executing the action
992      *        against which document, as well as additional operations to take against the document,
993      *        such as updating document data
994      *
995      * @return the result of executing the action, including a view on the updated state of the
996      *         document and related actions
997      *
998      * @throws RiceIllegalArgumentException if {@code parameters} is null
999      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
1000      *         {@code parameters} exists
1001      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
1002      *         in {@code parameters} exists
1003      * @throws InvalidDocumentContentException if the document content on the
1004      *         {@link DocumentContentUpdate} supplied with the {@code parameters} is invalid.
1005      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
1006      *         action
1007      */
1008     @WebMethod(operationName = "save")
1009     @WebResult(name = "documentActionResult")
1010     @XmlElement(name = "documentActionResult", required = true)
1011     DocumentActionResult save(@WebParam(name = "parameters") DocumentActionParameters parameters)
1012             throws RiceIllegalArgumentException, InvalidDocumentContentException, InvalidActionTakenException;
1013 
1014     /**
1015      * Triggers the execution of a {@link ActionType#SAVE} action for the given
1016      * principal and document specified in the supplied parameters. Saves the current document data for
1017      * the document.  Note that passing an annotation to this will have no effect because it is not
1018      * recorded in the route log
1019      *
1020      * @param parameters the parameters which indicate which principal is executing the action
1021      *        against which document, as well as additional operations to take against the document,
1022      *        such as updating document data
1023      *
1024      * @return the result of executing the action, including a view on the updated state of the
1025      *         document and related actions
1026      *
1027      * @throws RiceIllegalArgumentException if {@code parameters} is null
1028      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
1029      *         {@code parameters} exists
1030      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
1031      *         in {@code parameters} exists
1032      * @throws InvalidDocumentContentException if the document content on the
1033      *         {@link DocumentContentUpdate} supplied with the {@code parameters} is invalid.
1034      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
1035      *         action
1036      */
1037     @WebMethod(operationName = "saveDocumentData")
1038     @WebResult(name = "documentActionResult")
1039     @XmlElement(name = "documentActionResult", required = true)
1040     DocumentActionResult saveDocumentData(@WebParam(name = "parameters") DocumentActionParameters parameters)
1041             throws RiceIllegalArgumentException, InvalidDocumentContentException, InvalidActionTakenException;
1042 
1043     /**
1044      * Deletes the document.
1045      *
1046      * @param documentId the unique id of the document to delete
1047      * @param principalId
1048      *
1049      * @return the document that was removed from the system
1050      *
1051      * @throws RiceIllegalArgumentException if {@code documentId} is null
1052      * @throws RiceIllegalArgumentException if {@code principalId} is null
1053      * @throws RiceIllegalArgumentException if no document with the {@code documentId} exists
1054      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
1055      *         action
1056      */
1057     @WebMethod(operationName = "delete")
1058     @WebResult(name = "document")
1059     @XmlElement(name = "document", required = true)
1060     Document delete(
1061             @WebParam(name = "documentId") String documentId,
1062             @WebParam(name = "principalId") String principalId)
1063             throws RiceIllegalArgumentException, InvalidActionTakenException;
1064 
1065     /**
1066      * Records the non-routed document action. - Checks to make sure the document status
1067      * allows the action. Records the action.
1068      *
1069      * @param documentId the unique id of the document to delete
1070      * @param principalId
1071      *
1072      * @return the document that was removed from the system
1073      *
1074      * @throws RiceIllegalArgumentException if {@code documentId} is null
1075      * @throws RiceIllegalArgumentException if {@code principalId} is null
1076      * @throws RiceIllegalArgumentException if {@code annotation} is null
1077      * @throws RiceIllegalArgumentException if no document with the {@code documentId} exists
1078      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
1079      *         action
1080      */
1081     @WebMethod(operationName = "logAnnotation")
1082     void logAnnotation(
1083             @WebParam(name = "documentId") String documentId,
1084             @WebParam(name = "principalId") String principalId,
1085             @WebParam(name = "annotation") String annotation)
1086             throws RiceIllegalArgumentException, InvalidActionTakenException;
1087 
1088     // TODO  finish javadoc
1089     /**
1090      *
1091      *
1092      * @param documentId the unique id of the document to delete
1093      *
1094      * @throws RiceIllegalArgumentException if {@code documentId} is null
1095      */
1096     @WebMethod(operationName = "initiateIndexing")
1097     void initiateIndexing(@WebParam(name = "documentId") String documentId)
1098             throws RiceIllegalArgumentException;
1099 
1100 
1101     /**
1102      * Triggers the execution of a {@link ActionType#SU_BLANKET_APPROVE} action for the given
1103      * principal and document specified in the supplied parameters. Does a blanket approve for a super user
1104      * and runs post-processing depending on {@code executePostProcessor}
1105      *
1106      * @param parameters the parameters which indicate which principal is executing the action
1107      *        against which document, as well as additional operations to take against the document,
1108      *        such as updating document data
1109      * @param executePostProcessor boolean value determining if the post-processor should be run or not
1110      *
1111      * @return the result of executing the action, including a view on the updated state of the
1112      *         document and related actions
1113      *
1114      * @throws RiceIllegalArgumentException if {@code parameters} is null
1115      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
1116      *         {@code parameters} exists
1117      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
1118      *         in {@code parameters} exists
1119      * @throws InvalidDocumentContentException if the document content on the
1120      *         {@link DocumentContentUpdate} supplied with the {@code parameters} is invalid.
1121      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
1122      *         action
1123      */
1124     @WebMethod(operationName = "superUserBlanketApprove")
1125     @WebResult(name = "documentActionResult")
1126     @XmlElement(name = "documentActionResult", required = true)
1127     DocumentActionResult superUserBlanketApprove(
1128             @WebParam(name = "parameters") DocumentActionParameters parameters,
1129             @WebParam(name = "executePostProcessor") boolean executePostProcessor)
1130             throws RiceIllegalArgumentException, InvalidDocumentContentException, InvalidActionTakenException;
1131 
1132     /**
1133      * Triggers the execution of a {@link ActionType#SU_APPROVE} action for the given
1134      * principal and document specified in the supplied parameters. Does an approve for a super user
1135      * on a node and runs post-processing depending on {@code executePostProcessor}
1136      *
1137      * @param parameters the parameters which indicate which principal is executing the action
1138      *        against which document, as well as additional operations to take against the document,
1139      *        such as updating document data
1140      * @param executePostProcessor boolean value determining if the post-processor should be run or not
1141      *
1142      * @return the result of executing the action, including a view on the updated state of the
1143      *         document and related actions
1144      *
1145      * @throws RiceIllegalArgumentException if {@code parameters} is null
1146      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
1147      *         {@code parameters} exists
1148      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
1149      *         in {@code parameters} exists
1150      * @throws InvalidDocumentContentException if the document content on the
1151      *         {@link DocumentContentUpdate} supplied with the {@code parameters} is invalid.
1152      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
1153      *         action
1154      */
1155     @WebMethod(operationName = "superUserNodeApprove")
1156     @WebResult(name = "documentActionResult")
1157     @XmlElement(name = "documentActionResult", required = true)
1158     DocumentActionResult superUserNodeApprove(
1159             @WebParam(name = "parameters") DocumentActionParameters parameters,
1160             @WebParam(name = "executePostProcessor") boolean executePostProcessor,
1161             @WebParam(name = "nodeName") String nodeName)
1162             throws RiceIllegalArgumentException, InvalidDocumentContentException, InvalidActionTakenException;
1163 
1164     /**
1165      * Triggers the execution of a {@link ActionType#SU_APPROVE} action for the given
1166      * actionRequestId and principal and document specified in the supplied parameters. Does an approve for a super user
1167      * on a node and runs post-processing depending on {@code executePostProcessor}
1168      *
1169      * @param parameters the parameters which indicate which principal is executing the action
1170      *        against which document, as well as additional operations to take against the document,
1171      *        such as updating document data
1172      * @param actionRequestId unique Id of an action request to take action on
1173      * @param executePostProcessor boolean value determining if the post-processor should be run or not
1174      *
1175      * @return the result of executing the action, including a view on the updated state of the
1176      *         document and related actions
1177      *
1178      * @throws RiceIllegalArgumentException if {@code parameters} is null
1179      * @throws RiceIllegalArgumentException if (@code actionRequestId}
1180      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
1181      *         {@code parameters} exists
1182      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
1183      *         in {@code parameters} exists
1184      * @throws InvalidDocumentContentException if the document content on the
1185      *         {@link DocumentContentUpdate} supplied with the {@code parameters} is invalid.
1186      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
1187      *         action
1188      */
1189     @WebMethod(operationName = "superUserTakeRequestedAction")
1190     @WebResult(name = "documentActionResult")
1191     @XmlElement(name = "documentActionResult", required = true)
1192     DocumentActionResult superUserTakeRequestedAction(
1193             @WebParam(name = "parameters") DocumentActionParameters parameters,
1194             @WebParam(name = "executePostProcessor") boolean executePostProcessor,
1195             @WebParam(name = "actionRequestId") String actionRequestId)
1196             throws RiceIllegalArgumentException, InvalidDocumentContentException, InvalidActionTakenException;
1197 
1198     /**
1199      * Triggers the execution of a {@link ActionType#SU_DISAPPROVE} action for the given
1200      * principal and document specified in the supplied parameters. Does a disapprove for a super user
1201      * on a node and runs post-processing depending on {@code executePostProcessor}
1202      *
1203      * @param parameters the parameters which indicate which principal is executing the action
1204      *        against which document, as well as additional operations to take against the document,
1205      *        such as updating document data
1206      * @param executePostProcessor boolean value determining if the post-processor should be run or not
1207      *
1208      * @return the result of executing the action, including a view on the updated state of the
1209      *         document and related actions
1210      *
1211      * @throws RiceIllegalArgumentException if {@code parameters} is null
1212      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
1213      *         {@code parameters} exists
1214      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
1215      *         in {@code parameters} exists
1216      * @throws InvalidDocumentContentException if the document content on the
1217      *         {@link DocumentContentUpdate} supplied with the {@code parameters} is invalid.
1218      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
1219      *         action
1220      */
1221     @WebMethod(operationName = "superUserDisapprove")
1222     @WebResult(name = "documentActionResult")
1223     @XmlElement(name = "documentActionResult", required = true)
1224     DocumentActionResult superUserDisapprove(
1225             @WebParam(name = "parameters") DocumentActionParameters parameters,
1226             @WebParam(name = "executePostProcessor") boolean executePostProcessor)
1227             throws RiceIllegalArgumentException, InvalidDocumentContentException, InvalidActionTakenException;
1228 
1229     /**
1230      * Triggers the execution of a {@link ActionType#SU_CANCEL} action for the given
1231      * principal and document specified in the supplied parameters. Does an cancel for a super user
1232      * on a node and runs post-processing depending on {@code executePostProcessor}
1233      *
1234      * @param parameters the parameters which indicate which principal is executing the action
1235      *        against which document, as well as additional operations to take against the document,
1236      *        such as updating document data
1237      * @param executePostProcessor boolean value determining if the post-processor should be run or not
1238      *
1239      * @return the result of executing the action, including a view on the updated state of the
1240      *         document and related actions
1241      *
1242      * @throws RiceIllegalArgumentException if {@code parameters} is null
1243      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
1244      *         {@code parameters} exists
1245      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
1246      *         in {@code parameters} exists
1247      * @throws InvalidDocumentContentException if the document content on the
1248      *         {@link DocumentContentUpdate} supplied with the {@code parameters} is invalid.
1249      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
1250      *         action
1251      */
1252     @WebMethod(operationName = "superUserCancel")
1253     @WebResult(name = "documentActionResult")
1254     @XmlElement(name = "documentActionResult", required = true)
1255     DocumentActionResult superUserCancel(
1256             @WebParam(name = "parameters") DocumentActionParameters parameters,
1257             @WebParam(name = "executePostProcessor") boolean executePostProcessor)
1258             throws RiceIllegalArgumentException, InvalidDocumentContentException, InvalidActionTakenException;
1259 
1260     /**
1261      * Triggers the execution of a {@link ActionType#SU_RETURN_TO_PREVIOUS} action for the given
1262      * principal and document specified in the supplied parameters. Returns the document to the
1263      * previous node for a super user on a node and runs post-processing depending on {@code executePostProcessor}
1264      *
1265      * @param parameters the parameters which indicate which principal is executing the action
1266      *        against which document, as well as additional operations to take against the document,
1267      *        such as updating document data
1268      * @param executePostProcessor boolean value determining if the post-processor should be run or not
1269      * @param returnPoint point to return to
1270      *
1271      * @return the result of executing the action, including a view on the updated state of the
1272      *         document and related actions
1273      *
1274      * @throws RiceIllegalArgumentException if {@code parameters} is null
1275      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
1276      *         {@code parameters} exists
1277      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
1278      *         in {@code parameters} exists
1279      * @throws InvalidDocumentContentException if the document content on the
1280      *         {@link DocumentContentUpdate} supplied with the {@code parameters} is invalid.
1281      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
1282      *         action
1283      */
1284     @WebMethod(operationName = "superUserReturnToPreviousNode")
1285     @WebResult(name = "documentActionResult")
1286     @XmlElement(name = "documentActionResult", required = true)
1287     DocumentActionResult superUserReturnToPreviousNode(
1288             @WebParam(name = "parameters") DocumentActionParameters parameters,
1289             @WebParam(name = "executePostProcessor") boolean executePostProcessor,
1290             @WebParam(name = "returnPoint") ReturnPoint returnPoint)
1291             throws RiceIllegalArgumentException, InvalidDocumentContentException, InvalidActionTakenException;
1292 
1293     /**
1294      * Places a document in exception routing or the given principal and document specified in the supplied parameters.
1295      *
1296      * @param parameters the parameters which indicate which principal is executing the action
1297      *        against which document, as well as additional operations to take against the document,
1298      *        such as updating document data
1299      *
1300      * @return the result of executing the action, including a view on the updated state of the
1301      *         document and related actions
1302      *
1303      * @throws RiceIllegalArgumentException if {@code parameters} is null
1304      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
1305      *         {@code parameters} exists
1306      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
1307      *         in {@code parameters} exists
1308      * @throws InvalidDocumentContentException if the document content on the
1309      *         {@link DocumentContentUpdate} supplied with the {@code parameters} is invalid.
1310      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
1311      *         action
1312      */
1313     @WebMethod(operationName = "placeInExceptionRouting")
1314     @WebResult(name = "documentActionResult")
1315     @XmlElement(name = "documentActionResult", required = true)
1316     DocumentActionResult placeInExceptionRouting(@WebParam(name = "parameters") DocumentActionParameters parameters)
1317             throws RiceIllegalArgumentException, InvalidDocumentContentException, InvalidActionTakenException;
1318 
1319     /**
1320      * Validates a workflow attribute definition and returns a list of validation errors
1321      *
1322      * @param definition WorkflowAttributeDefinition to validate
1323      *
1324      * @return a list of RemotableAttributeErrors caused by validation of the passed in {@code definition}
1325      *
1326      * @throws RiceIllegalArgumentException if {@code parameters} is null
1327      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
1328      *         {@code parameters} exists
1329      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
1330      *         in {@code parameters} exists
1331      * @throws InvalidDocumentContentException if the document content on the
1332      *         {@link DocumentContentUpdate} supplied with the {@code parameters} is invalid.
1333      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
1334      *         action
1335      */
1336     @WebMethod(operationName = "validateWorkflowAttributeDefinition")
1337     @WebResult(name = "validationErrors")
1338     @XmlElementWrapper(name = "validationErrors", required = true)
1339     @XmlElement(name = "validationError", required = true)
1340     List<RemotableAttributeError> validateWorkflowAttributeDefinition(
1341             @WebParam(name = "definition") WorkflowAttributeDefinition definition)
1342             throws RiceIllegalArgumentException;
1343 
1344     // TODO add, annotate, and javadoc the following methods to this service
1345     /**
1346      * Determines if a passed in user exists in a document's route log or future route depending on the passed in
1347      * {@code lookFuture} value
1348      *
1349      * @param documentId unique Id of document
1350      * @param principalId unique Id of Principal to look for in document's route log
1351      * @param lookFuture boolean value determines whether or not to look at the future route log
1352      *
1353      * @return boolean value representing if a principal exists in a Document's route log
1354      *
1355      * @throws RiceIllegalArgumentException if {@code documentId} is null
1356      * @throws RiceIllegalArgumentException if {@code principalId} is null
1357      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
1358      *         {@code parameters} exists
1359      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
1360      *         in {@code parameters} exists
1361      */
1362     @WebMethod(operationName = "isUserInRouteLog")
1363     @WebResult(name = "userInRouteLog")
1364     boolean isUserInRouteLog(
1365             @WebParam(name = "documentId") String documentId,
1366             @WebParam(name = "principalId") String principalId,
1367             @WebParam(name = "lookFuture") boolean lookFuture)
1368             throws RiceIllegalArgumentException;
1369 
1370     /**
1371      * Determines if a passed in user exists in a document's route log or future route depending on the passed in
1372      * {@code lookFuture} value and {@code flattenNodes}
1373      *
1374      * @param documentId unique Id of document
1375      * @param principalId unique Id of Principal to look for in document's route log
1376      * @param lookFuture boolean value determines whether or not to look at the future route log
1377      *
1378      * @return boolean value representing if a principal exists in a Document's route log
1379      *
1380      * @throws RiceIllegalArgumentException if {@code documentId} is null
1381      * @throws RiceIllegalArgumentException if {@code principalId} is null
1382      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
1383      *         {@code parameters} exists
1384      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
1385      *         in {@code parameters} exists
1386      */
1387     @WebMethod(operationName = "isUserInRouteLogWithOptionalFlattening")
1388     @WebResult(name = "userInRouteLogWithOptionalFlattening")
1389     boolean isUserInRouteLogWithOptionalFlattening(
1390             @WebParam(name = "documentId") String documentId,
1391             @WebParam(name = "principalId") String principalId,
1392             @WebParam(name = "lookFuture") boolean lookFuture,
1393             @WebParam(name = "flattenNodes") boolean flattenNodes)
1394             throws RiceIllegalArgumentException;
1395 
1396     /**
1397      * Re-resolves the given role for all documents for the given document type (including children).
1398      *
1399      * @param documentTypeName documentTypeName of DocuemntType for role
1400      * @param roleName name of Role to reresolve
1401      * @param qualifiedRoleNameLabel qualified role name label
1402      *
1403      * @throws RiceIllegalArgumentException if {@code documentTypeName} is null
1404      * @throws RiceIllegalArgumentException if {@code roleName} is null
1405      * @throws RiceIllegalArgumentException if {@code qualifiedRoleNameLable} is null
1406      */
1407     @WebMethod(operationName = "reResolveRoleByDocTypeName")
1408     void reResolveRoleByDocTypeName(
1409             @WebParam(name = "documentTypeName") String documentTypeName,
1410             @WebParam(name = "roleName") String roleName,
1411             @WebParam(name = "qualifiedRoleNameLabel") String qualifiedRoleNameLabel)
1412             throws RiceIllegalArgumentException;
1413 
1414     /**
1415      * Re-resolves the given role for all documents for the given document id (including children).
1416      *
1417      * @param documentId documentId of Docuemnt for role
1418      * @param roleName name of Role to reresolve
1419      * @param qualifiedRoleNameLabel qualified role name label
1420      *
1421      * @throws RiceIllegalArgumentException if {@code documentTypeName} is null
1422      * @throws RiceIllegalArgumentException if {@code roleName} is null
1423      * @throws RiceIllegalArgumentException if {@code qualifiedRoleNameLable} is null
1424      */
1425     @WebMethod(operationName = "reResolveRoleByDocumentId")
1426     void reResolveRoleByDocumentId(
1427             @WebParam(name = "documentId") String documentId,
1428             @WebParam(name = "roleName") String roleName,
1429             @WebParam(name = "qualifiedRoleNameLabel") String qualifiedRoleNameLabel)
1430             throws RiceIllegalArgumentException;
1431 
1432     /**
1433      * Executes a simulation of a document to get all previous and future route information
1434      *
1435      * @param reportCriteria criteria for the simulation to follow
1436      *
1437      * @return DocumentDetail object representing the results of the simulation
1438      *
1439      * @throws RiceIllegalArgumentException if {@code reportCriteria} is null
1440      */
1441     @WebMethod(operationName = "executeSimulation")
1442     @WebResult(name = "documentDetail")
1443     DocumentDetail executeSimulation(
1444             @WebParam(name = "reportCriteria") RoutingReportCriteria reportCriteria)
1445             throws RiceIllegalArgumentException;
1446 
1447     /**
1448      * Determines if a passed in user is the final approver for a document
1449      *
1450      * @param documentId unique Id of the document
1451      * @param principalId unique Id of Principal to look for in document's route log
1452      *
1453      * @return boolean value representing if a principal is the final approver for a document
1454      *
1455      * @throws RiceIllegalArgumentException if {@code documentId} is null
1456      * @throws RiceIllegalArgumentException if {@code principalId} is null
1457      */
1458     @WebMethod(operationName = "isFinalApprover")
1459     @WebResult(name = "finalApprover")
1460     boolean isFinalApprover(
1461             @WebParam(name = "documentId") String documentId,
1462             @WebParam(name = "principalId") String principalId)
1463             throws RiceIllegalArgumentException;
1464 
1465     /**
1466      * Determines if a passed in user is the last approver at a specified route node
1467      *
1468      * @param documentId unique Id of the document
1469      * @param principalId unique Id of Principal to look for in document's route log
1470      * @param nodeName name of route node to determine last approver for
1471      *
1472      * @return boolean value representing if a principal is the last approver at the specified route node
1473      *
1474      * @throws RiceIllegalArgumentException if {@code documentId} is null
1475      * @throws RiceIllegalArgumentException if {@code principalId} is null
1476      * @throws RiceIllegalArgumentException if {@code nodeName} is null
1477      */
1478     @WebMethod(operationName = "isLastApproverAtNode")
1479     @WebResult(name = "lastApproverAtNode")
1480     boolean isLastApproverAtNode(
1481             @WebParam(name = "documentId") String documentId,
1482             @WebParam(name = "principalId") String principalId,
1483             @WebParam(name = "nodeName") String nodeName)
1484             throws RiceIllegalArgumentException;
1485 
1486     /**
1487      * Determines if a route node has an 'approve action' request
1488      *
1489      * @param docType document type of document
1490      * @param docContent string representing content of document
1491      * @param nodeName name of route node to determine if approve action request exists
1492      *
1493      * @return boolean value representing if a route node has an 'approve action' request
1494      *
1495      * @throws RiceIllegalArgumentException if {@code docType} is null
1496      * @throws RiceIllegalArgumentException if {@code docContent} is null
1497      * @throws RiceIllegalArgumentException if {@code nodeName} is null
1498      */
1499     @WebMethod(operationName = "routeNodeHasApproverActionRequest")
1500     @WebResult(name = "routeNodeHasApproverActionRequest")
1501     boolean routeNodeHasApproverActionRequest(
1502             @WebParam(name = "docType") String docType,
1503             @WebParam(name = "docContent") String docContent,
1504             @WebParam(name = "nodeName") String nodeName)
1505             throws RiceIllegalArgumentException;
1506 
1507     /**
1508      * Determines if a document has at least one action request
1509      *
1510      * @param reportCriteria criteria for routing report
1511      * @param actionRequestedCodes list of action request codes to see if they exist for the document
1512      * @param ignoreCurrentActionRequests boolean value to determine if current action requests should be ignored
1513      *
1514      * @return boolean value representing if a document will have at least one action request
1515      *
1516      * @throws RiceIllegalArgumentException if {@code docType} is null
1517      * @throws RiceIllegalArgumentException if {@code docContent} is null
1518      * @throws RiceIllegalArgumentException if {@code nodeName} is null
1519      */
1520     @WebMethod(operationName = "documentWillHaveAtLeastOneActionRequest")
1521     @WebResult(name = "documentWillHaveAtLeastOneActionRequest")
1522     boolean documentWillHaveAtLeastOneActionRequest(
1523             @WebParam(name = "reportCriteria") RoutingReportCriteria reportCriteria,
1524             @WebParam(name = "actionRequestedCodes") List<String> actionRequestedCodes,
1525             @WebParam(name = "ignoreCurrentActionRequests") boolean ignoreCurrentActionRequests)
1526             throws RiceIllegalArgumentException;
1527 
1528     /**
1529      * Returns a list of principal Ids that exist in a route log
1530      *
1531      * @param documentId unique id of the document to get the route log for
1532      * @param lookFuture boolean value that determines if the method should look at future action requests
1533      *
1534      * @return list of principal ids that exist in a route log
1535      *
1536      * @throws RiceIllegalArgumentException if {@code documentId} is null
1537      */
1538     @WebMethod(operationName = "getPrincipalIdsInRouteLog")
1539     @WebResult(name = "principalIds")
1540     @XmlElementWrapper(name = "principalIds", required = true)
1541     @XmlElement(name = "principalId", required = true)
1542     List<String> getPrincipalIdsInRouteLog(
1543             @WebParam(name = "documentId") String documentId,
1544             @WebParam(name = "lookFuture") boolean lookFuture)
1545             throws RiceIllegalArgumentException;
1546 
1547 }