View Javadoc

1   /**
2    * Copyright 2005-2013 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_v2_1_3")
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     /**
377      * Executes an {@link ActionType#ADHOC_REQUEST} action for the given principal and document
378      * specified in the supplied parameters to create an ad hoc action request to the target
379      * principal specified in the {@code AdHocToPrincipal}.
380      *
381      * <p>
382      * Operates as per {@link #adHocToGroup(DocumentActionParameters, AdHocToGroup)} with the
383      * exception that this method is used to send an adhoc request to principal instead of a group.
384      *
385      * <p>
386      * Besides this difference, the same rules that are in play for sending ad hoc requests to group
387      * apply for sending ad hoc requests to principals.
388      *
389      * @param parameters the parameters which indicate which principal is executing the action
390      *        against which document, as well as additional operations to take against the document,
391      *        such as updating document data
392      * @param adHocToPrincipal defines various pieces of information that informs what type of ad
393      *        hoc request should be created
394      *
395      * @return the result of executing the action, including a view on the updated state of the
396      *         document and related actions
397      *
398      * @throws RiceIllegalArgumentException if {@code parameters} is null
399      * @throws RiceIllegalArgumentException if {@code adHocToPrincipal} is null
400      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
401      *         {@code parameters} exists
402      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
403      *         in {@code parameters} exists
404      * @throws InvalidDocumentContentException if the document content on the
405      *         {@link DocumentContentUpdate} supplied with the {@code parameters} is invalid.
406      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
407      *         action
408      * @throws InvalidActionTakenException if the target principal is not permitted to receive ad
409      *         hoc requests on documents of this type
410      * @throws InvalidActionTakenException if the specified ad hoc request cannot be generated
411      *         because the current state of the document would result in an illegal request being
412      *         generated
413      *
414      * @see #adHocToGroup(DocumentActionParameters, AdHocToGroup)
415      * @since 2.1.3
416      */
417     @Deprecated
418     @WebMethod(operationName = "adHocToPrincipal")
419     @WebResult(name = "documentActionResult")
420     @XmlElement(name = "documentActionResult", required = true)
421     DocumentActionResult adHocToPrincipal(
422             @WebParam(name = "parameters") DocumentActionParameters parameters,
423             @WebParam(name = "adHocToPrincipal") AdHocToPrincipal_v2_1_2 adHocToPrincipal)
424             throws RiceIllegalArgumentException, InvalidDocumentContentException, InvalidActionTakenException;
425 
426     /**
427      * Executes an {@link ActionType#ADHOC_REQUEST} action for the given group and document
428      * specified in the supplied parameters to create an ad hoc action request to the target group
429      * specified in the {@code AdHocToGroup}. The {@code AdHocToGroup} contains additional
430      * information on how the ad hoc action request should be created, including the type of request
431      * to generate, at which node it should generated, etc.
432      * 
433      * <p>
434      * The policy for how ad hoc actions handle request generation and interact with the workflow
435      * engine is different depending on the state of the document when the request to generate the
436      * ad hoc is submitted. There are also different scenarios under which certain types of ad hoc
437      * actions are allowed to be executed (throwing {@link InvalidActionTakenException} in
438      * situations where the actions are not permitted). The rules are defined as follows:
439      * 
440      * <ol>
441      * <li>If the status of the document is {@link DocumentStatus#INITIATED} then the action request
442      * will be generated with a status of {@link ActionRequestStatus#INITIALIZED} and no processing
443      * directives will be submitted to the workflow engine. When the document is routed, these ad
444      * hoc requests will get activated</li>
445      * <li>If the ad hoc request being created is an {@link ActionRequestType#COMPLETE} or
446      * {@link ActionRequestType#APPROVE} and the document is in a "terminal" state (either
447      * {@link DocumentStatus#CANCELED}, {@link DocumentStatus#DISAPPROVED},
448      * {@link DocumentStatus#PROCESSED}, {@link DocumentStatus#FINAL}) or is in
449      * {@link DocumentStatus#EXCEPTION} status, then an {@link InvalidActionTakenException} will be
450      * thrown. This is because submitting such an action with a document in that state would result
451      * in creation of an illegal action request.</li>
452      * <li>If the document is in a "terminal" state (see above for definition) then the request will
453      * be immediately (and synchronously) activated.</li>
454      * <li>Otherwise, after creating the ad hoc request it will be in the
455      * {@link ActionRequestStatus#INITIALIZED} status, and the document will be immediately
456      * forwarded to the workflow engine for processing at which point the ad hoc request will
457      * activated at the appropriate time.</li>
458      * </ol>
459      * 
460      * <p>
461      * Unlink other actions, ad hoc actions don't result in the recording of an {@link ActionTaken}
462      * against the document. Instead, only the requested ad hoc {@link ActionRequest} is created.
463      * 
464      * @param parameters the parameters which indicate which principal is executing the action
465      *        against which document, as well as additional operations to take against the document,
466      *        such as updating document data
467      * @param adHocToGroup defines various pieces of information that informs what type of ad hoc
468      *        request should be created
469      * 
470      * @return the result of executing the action, including a view on the updated state of the
471      *         document and related actions
472      * 
473      * @throws RiceIllegalArgumentException if {@code parameters} is null
474      * @throws RiceIllegalArgumentException if {@code adHocToGroup} is null
475      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
476      *         {@code parameters} exists
477      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
478      *         in {@code parameters} exists
479      * @throws InvalidDocumentContentException if the document content on the
480      *         {@link DocumentContentUpdate} supplied with the {@code parameters} is invalid.
481      * @throws InvalidActionTakenException if the supplied principals i is not allowed to execute
482      *         this action
483      * @throws InvalidActionTakenException if any of the principals in the target group are not
484      *         permitted to receive ad hoc requests on documents of this type
485      * @throws InvalidActionTakenException if the specified ad hoc request cannot be generated
486      *         because the current state of the document would result in an illegal request being
487      *         generated
488      */
489     @WebMethod(operationName = "adHocToGroup_v2_1_3")
490     @WebResult(name = "documentActionResult")
491     @XmlElement(name = "documentActionResult", required = true)
492     DocumentActionResult adHocToGroup(
493             @WebParam(name = "parameters") DocumentActionParameters parameters,
494             @WebParam(name = "adHocToGroup") AdHocToGroup adHocToGroup)
495             throws RiceIllegalArgumentException, InvalidDocumentContentException, InvalidActionTakenException;
496 
497     /**
498      * Executes an {@link ActionType#ADHOC_REQUEST} action for the given group and document
499      * specified in the supplied parameters to create an ad hoc action request to the target group
500      * specified in the {@code AdHocToGroup}. The {@code AdHocToGroup} contains additional
501      * information on how the ad hoc action request should be created, including the type of request
502      * to generate, at which node it should generated, etc.
503      *
504      * <p>
505      * The policy for how ad hoc actions handle request generation and interact with the workflow
506      * engine is different depending on the state of the document when the request to generate the
507      * ad hoc is submitted. There are also different scenarios under which certain types of ad hoc
508      * actions are allowed to be executed (throwing {@link InvalidActionTakenException} in
509      * situations where the actions are not permitted). The rules are defined as follows:
510      *
511      * <ol>
512      * <li>If the status of the document is {@link DocumentStatus#INITIATED} then the action request
513      * will be generated with a status of {@link ActionRequestStatus#INITIALIZED} and no processing
514      * directives will be submitted to the workflow engine. When the document is routed, these ad
515      * hoc requests will get activated</li>
516      * <li>If the ad hoc request being created is an {@link ActionRequestType#COMPLETE} or
517      * {@link ActionRequestType#APPROVE} and the document is in a "terminal" state (either
518      * {@link DocumentStatus#CANCELED}, {@link DocumentStatus#DISAPPROVED},
519      * {@link DocumentStatus#PROCESSED}, {@link DocumentStatus#FINAL}) or is in
520      * {@link DocumentStatus#EXCEPTION} status, then an {@link InvalidActionTakenException} will be
521      * thrown. This is because submitting such an action with a document in that state would result
522      * in creation of an illegal action request.</li>
523      * <li>If the document is in a "terminal" state (see above for definition) then the request will
524      * be immediately (and synchronously) activated.</li>
525      * <li>Otherwise, after creating the ad hoc request it will be in the
526      * {@link ActionRequestStatus#INITIALIZED} status, and the document will be immediately
527      * forwarded to the workflow engine for processing at which point the ad hoc request will
528      * activated at the appropriate time.</li>
529      * </ol>
530      *
531      * <p>
532      * Unlink other actions, ad hoc actions don't result in the recording of an {@link ActionTaken}
533      * against the document. Instead, only the requested ad hoc {@link ActionRequest} is created.
534      *
535      * @param parameters the parameters which indicate which principal is executing the action
536      *        against which document, as well as additional operations to take against the document,
537      *        such as updating document data
538      * @param adHocToGroup defines various pieces of information that informs what type of ad hoc
539      *        request should be created
540      *
541      * @return the result of executing the action, including a view on the updated state of the
542      *         document and related actions
543      *
544      * @throws RiceIllegalArgumentException if {@code parameters} is null
545      * @throws RiceIllegalArgumentException if {@code adHocToGroup} is null
546      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
547      *         {@code parameters} exists
548      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
549      *         in {@code parameters} exists
550      * @throws InvalidDocumentContentException if the document content on the
551      *         {@link DocumentContentUpdate} supplied with the {@code parameters} is invalid.
552      * @throws InvalidActionTakenException if the supplied principals i is not allowed to execute
553      *         this action
554      * @throws InvalidActionTakenException if any of the principals in the target group are not
555      *         permitted to receive ad hoc requests on documents of this type
556      * @throws InvalidActionTakenException if the specified ad hoc request cannot be generated
557      *         because the current state of the document would result in an illegal request being
558      *         generated
559      * @since 2.1.3
560      */
561     @Deprecated
562     @WebMethod(operationName = "adHocToGroup")
563     @WebResult(name = "documentActionResult")
564     @XmlElement(name = "documentActionResult", required = true)
565     DocumentActionResult adHocToGroup(@WebParam(name = "parameters") DocumentActionParameters parameters,
566             @WebParam(name = "adHocToGroup") AdHocToGroup_v2_1_2 adHocToGroup)
567             throws RiceIllegalArgumentException, InvalidDocumentContentException, InvalidActionTakenException;
568 
569     /**
570      * Executes an {@link ActionType#ADHOC_REQUEST_REVOKE} action for the given principal and
571      * document specified in the supplied parameters against the action request with the given id.
572      * The process of revoking an ad hoc request simply deactivates the request associating the
573      * generated {@link ActionTaken} of the revoke action with the deactivated request (this allows
574      * for it to be determined what caused the ad hoc request to be deactivated). As with other
575      * actions, this action taken is then recorded with the document.
576      * 
577      * @param parameters the parameters which indicate which principal is executing the action
578      *        against which document, as well as additional operations to take against the document,
579      *        such as updating document data
580      * @param actionRequestId the id of the action request to revoke
581      * 
582      * @return the result of executing the action, including a view on the updated state of the
583      *         document and related actions
584      * 
585      * @throws RiceIllegalArgumentException if {@code parameters} is null
586      * @throws RiceIllegalArgumentException if {@code actionRequestId} is null or blank
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      * @throws InvalidActionTakenException if a pending ad hoc request with the given
596      *         {@code actionRequestId} does not exist on the specified document, this could mean
597      *         that the action request id is invalid, or that the action request has already been
598      *         deactivated and is no longer pending
599      */
600     @WebMethod(operationName = "revokeAdHocRequestById")
601     @WebResult(name = "documentActionResult")
602     @XmlElement(name = "documentActionResult", required = true)
603     DocumentActionResult revokeAdHocRequestById(
604             @WebParam(name = "parameters") DocumentActionParameters parameters,
605             @WebParam(name = "actionRequestId") String actionRequestId)
606             throws RiceIllegalArgumentException, InvalidDocumentContentException, InvalidActionTakenException;
607 
608     /**
609      * Executes an {@link ActionType#ADHOC_REQUEST_REVOKE} action which revokes all pending ad hoc
610      * action requests that match the supplied {@link AdHocRevoke} criteria for the given principal
611      * and document specified in the supplied parameters. The process of revoking an ad hoc requests
612      * simply deactivates all ad hoc requests that match the given {@code AdHocRevoke} criteria,
613      * associating the generated {@link ActionTaken} of the revoke action with the deactivated
614      * requests (this allows for it to be determined what caused the ad hoc request to be
615      * deactivated). As with other actions, this action taken is then recorded with the document.
616      * 
617      * <p>
618      * It's possible that the given ad hoc revoke command will match no action requests on the
619      * document, in which case this method will complete successfully but no requests will be
620      * deactivated.
621      * 
622      * @param parameters the parameters which indicate which principal is executing the action
623      *        against which document, as well as additional operations to take against the document,
624      *        such as updating document data
625      * @param revoke the criteria for matching ad hoc action requests on the specified document that
626      *        should be revoked
627      * 
628      * @return the result of executing the action, including a view on the updated state of the
629      *         document and related actions
630      * 
631      * @throws RiceIllegalArgumentException if {@code parameters} is null
632      * @throws RiceIllegalArgumentException if {@code revoke} is null
633      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
634      *         {@code parameters} exists
635      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
636      *         in {@code parameters} exists
637      * @throws InvalidDocumentContentException if the document content on the
638      *         {@link DocumentContentUpdate} supplied with the {@code parameters} is invalid.
639      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
640      *         action
641      */
642     @WebMethod(operationName = "revokeAdHocRequests")
643     @WebResult(name = "documentActionResult")
644     @XmlElement(name = "documentActionResult", required = true)
645     DocumentActionResult revokeAdHocRequests(
646             @WebParam(name = "parameters") DocumentActionParameters parameters,
647             @WebParam(name = "revoke") AdHocRevoke revoke)
648             throws RiceIllegalArgumentException, InvalidDocumentContentException, InvalidActionTakenException;
649 
650     /**
651      * Executes an {@link ActionType#ADHOC_REQUEST_REVOKE} action which revokes all pending ad hoc
652      * action requests for the given principal and document specified in the supplied parameters.
653      * This process of revoking all ad hoc requests will simply deactivate all ad hoc requests on
654      * the specified document, associating the generated {@link ActionTaken} of the revoke action
655      * with the deactivated requests (this allows for it to be determined what caused the ad hoc
656      * request to be deactivated). As with other actions, this action taken is then recorded with
657      * the document.
658      * 
659      * <p>
660      * It's possible that the specified document will have no pending adhoc requests, in which case
661      * this method will complete successfully but no requests will be deactivated.
662      * 
663      * @param parameters the parameters which indicate which principal is executing the action
664      *        against which document, as well as additional operations to take against the document,
665      *        such as updating document data
666      * 
667      * @return the result of executing the action, including a view on the updated state of the
668      *         document and related actions
669      * 
670      * @throws RiceIllegalArgumentException if {@code parameters} is null
671      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
672      *         {@code parameters} exists
673      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
674      *         in {@code parameters} exists
675      * @throws InvalidDocumentContentException if the document content on the
676      *         {@link DocumentContentUpdate} supplied with the {@code parameters} is invalid.
677      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
678      *         action
679      */
680     @WebMethod(operationName = "revokeAllAdHocRequests")
681     @WebResult(name = "documentActionResult")
682     @XmlElement(name = "documentActionResult", required = true)
683     DocumentActionResult revokeAllAdHocRequests(@WebParam(name = "parameters") DocumentActionParameters parameters)
684             throws RiceIllegalArgumentException, InvalidDocumentContentException, InvalidActionTakenException;
685 
686     /**
687      * Executes a {@link ActionType#CANCEL} action for the given principal and document specified in
688      * the supplied parameters. When a principal cancels a document, all pending action requests on
689      * the document are deactivated and the the principal's action will be recorded on the document
690      * as an {@link ActionTaken}. Additionally, the document will be (synchronously) transitioned to
691      * the {@link DocumentStatus#CANCELED} status.
692      * 
693      * <p>
694      * In order to cancel a document, the principal must have permission to cancel documents of the
695      * appropriate type, and one of the following must hold true:
696      * 
697      * <ol>
698      * <li>The document must have a status of {@link DocumentStatus#INITIATED} <strong>or</strong></li>
699      * <li>The document must have a status of {@link DocumentStatus#SAVED} <strong>or</strong></li>
700      * <li>The principal must have a pending "complete" or "approve" request on the document.
701      * 
702      * @param parameters the parameters which indicate which principal is executing the action
703      *        against which document, as well as additional operations to take against the document,
704      *        such as updating document data
705      * 
706      * @return the result of executing the action, including a view on the updated state of the
707      *         document and related actions
708      * 
709      * @throws RiceIllegalArgumentException if {@code parameters} is null
710      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
711      *         {@code parameters} exists
712      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
713      *         in {@code parameters} exists
714      * @throws InvalidDocumentContentException if the document content on the
715      *         {@link DocumentContentUpdate} supplied with the {@code parameters} is invalid.
716      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
717      *         action
718      */
719     @WebMethod(operationName = "cancel")
720     @WebResult(name = "documentActionResult")
721     @XmlElement(name = "documentActionResult", required = true)
722     DocumentActionResult cancel(@WebParam(name = "parameters") DocumentActionParameters parameters)
723             throws RiceIllegalArgumentException, InvalidDocumentContentException, InvalidActionTakenException;
724 
725     /**
726      * Executes a {@link ActionType#RECALL} action for the given principal and document specified in
727      * the supplied parameters. When a principal cancels a document, all pending action requests on
728      * the document are deactivated and the the principal's action will be recorded on the document
729      * as an {@link ActionTaken}. Additionally, the document will be (synchronously) transitioned to
730      * the {@link DocumentStatus#RECALLED} status.
731      *
732      * TODO: FILL IN DOCS FOR RECALL ACTION
733      * <p>
734      * In order to cancel a document, the principal must have permission to cancel documents of the
735      * appropriate type, and one of the following must hold true:
736      *
737      * <ol>
738      * <li>The document must have a status of {@link DocumentStatus#INITIATED} <strong>or</strong></li>
739      * <li>The document must have a status of {@link DocumentStatus#SAVED} <strong>or</strong></li>
740      * <li>The principal must have a pending "complete" or "approve" request on the document.
741      *
742      * @since 2.1
743      * @param parameters the parameters which indicate which principal is executing the action
744      *        against which document, as well as additional operations to take against the document,
745      *        such as updating document data
746      * @param cancel whether to recall & cancel or recall & return to action list
747      *
748      * @return the result of executing the action, including a view on the updated state of the
749      *         document and related actions
750      *
751      * @throws RiceIllegalArgumentException if {@code parameters} is null
752      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
753      *         {@code parameters} exists
754      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
755      *         in {@code parameters} exists
756      * @throws InvalidDocumentContentException if the document content on the
757      *         {@link DocumentContentUpdate} supplied with the {@code parameters} is invalid.
758      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
759      *         action
760      */
761     @WebMethod(operationName = "recall")
762     @WebResult(name = "documentActionResult")
763     @XmlElement(name = "documentActionResult", required = true)
764     DocumentActionResult recall(@WebParam(name = "parameters") DocumentActionParameters parameters,
765                                 @WebParam(name = "cancel") boolean cancel)
766             throws RiceIllegalArgumentException, InvalidDocumentContentException, InvalidActionTakenException;
767 
768     /**
769      * Executes an {@link ActionType#FYI} action for the given principal and document specified in
770      * the supplied parameters. When a principal clears fyis on a document, any of the principal's
771      * pending fyis will be satisfied by the principal's action. The principal's action should be
772      * recorded with the document as an {@link ActionTaken}.
773      * 
774      * <p>
775      * Depending on document type policy, a pending fyi request may have to exist on the document in
776      * order for the principal to take this action. Otherwise an {@link InvalidActionTakenException}
777      * may be thrown. In order to determine if an fyi action is valid, the {@link ValidActions} or
778      * {@link RequestedActions} for the document can be checked.
779      * 
780      * @param parameters the parameters which indicate which principal is executing the action
781      *        against which document, as well as additional operations to take against the document,
782      *        such as updating document data
783      * 
784      * @return the result of executing the action, including a view on the updated state of the
785      *         document and related actions
786      * 
787      * @throws RiceIllegalArgumentException if {@code parameters} is null
788      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
789      *         {@code parameters} exists
790      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
791      *         in {@code parameters} exists
792      * @throws InvalidDocumentContentException if the document content on the
793      *         {@link DocumentContentUpdate} supplied with the {@code parameters} is invalid.
794      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
795      *         action
796      */
797     @WebMethod(operationName = "clearFyi")
798     @WebResult(name = "documentActionResult")
799     @XmlElement(name = "documentActionResult", required = true)
800     DocumentActionResult clearFyi(@WebParam(name = "parameters") DocumentActionParameters parameters)
801             throws RiceIllegalArgumentException, InvalidDocumentContentException, InvalidActionTakenException;
802 
803     /**
804      * Executes an {@link ActionType#COMPLETE} action for the given principal and document specified
805      * in the supplied parameters. When a principal completes a document, any of the principal's
806      * pending action requests at or below the complete level (which includes approve, acknowledge,
807      * and fyi requests as well) will be satisfied by the principal's action. The principal's action
808      * should be recorded with the document as an {@link ActionTaken}.
809      * 
810      * <p>
811      * Depending on document type policy, a pending action request at or below the complete level
812      * may have to exist on the document in order for the principal to take this action. Otherwise
813      * an {@link InvalidActionTakenException} may be thrown. In order to determine if an complete
814      * action is valid, the {@link ValidActions} or {@link RequestedActions} for the document can be
815      * checked.
816      * 
817      * @param parameters the parameters which indicate which principal is executing the action
818      *        against which document, as well as additional operations to take against the document,
819      *        such as updating document data
820      * 
821      * @return the result of executing the action, including a view on the updated state of the
822      *         document and related actions
823      * 
824      * @throws RiceIllegalArgumentException if {@code parameters} is null
825      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
826      *         {@code parameters} exists
827      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
828      *         in {@code parameters} exists
829      * @throws InvalidDocumentContentException if the document content on the
830      *         {@link DocumentContentUpdate} supplied with the {@code parameters} is invalid.
831      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
832      *         action
833      */
834     @WebMethod(operationName = "complete")
835     @WebResult(name = "documentActionResult")
836     @XmlElement(name = "documentActionResult", required = true)
837     DocumentActionResult complete(@WebParam(name = "parameters") DocumentActionParameters parameters)
838             throws RiceIllegalArgumentException, InvalidDocumentContentException, InvalidActionTakenException;
839 
840     /**
841      * Executes a {@link ActionType#DISAPPROVE} action for the given principal and document
842      * specified in the supplied parameters. When a principal disapproves a document, all pending
843      * action requests on the document are deactivated and the the principal's action will be
844      * recorded on the document as an {@link ActionTaken}. Additionally, the document will be
845      * (synchronously) transitioned to the {@link DocumentStatus#DISAPPROVED} status.
846      * 
847      * <p>
848      * Depending on document type policy and configuration, notifications may be sent to past
849      * approvers of the document. By default, an "acknowledge" request will be sent to each
850      * principal who took an "approve" or "complete" action on the document previously.
851      * 
852      * <p>
853      * In order to disapprove a document, the principal must have a pending approve or complete
854      * request on the document.
855      * 
856      * @param parameters the parameters which indicate which principal is executing the action
857      *        against which document, as well as additional operations to take against the document,
858      *        such as updating document data
859      * 
860      * @return the result of executing the action, including a view on the updated state of the
861      *         document and related actions
862      * 
863      * @throws RiceIllegalArgumentException if {@code parameters} is null
864      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
865      *         {@code parameters} exists
866      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
867      *         in {@code parameters} exists
868      * @throws InvalidDocumentContentException if the document content on the
869      *         {@link DocumentContentUpdate} supplied with the {@code parameters} is invalid.
870      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
871      *         action
872      */
873     @WebMethod(operationName = "disapprove")
874     @WebResult(name = "documentActionResult")
875     @XmlElement(name = "documentActionResult", required = true)
876     DocumentActionResult disapprove(@WebParam(name = "parameters") DocumentActionParameters parameters)
877             throws RiceIllegalArgumentException, InvalidDocumentContentException, InvalidActionTakenException;
878 
879     /**
880      * Submits a document that is in either the "initiated" or "saved" state to the workflow engine
881      * for processing. The route action triggers the beginning of the routing process and
882      * (synchronously) switches the status of the document to {@link DocumentStatus#ENROUTE}. It
883      * then queues up a request to the workflow engine to process the document.
884      * 
885      * <p>
886      * When the route action is executed, an {@link ActionType#COMPLETE} action is recorded on the
887      * document for the principal who executed the route action. At this point in time, any action
888      * requests that are currently on the document in an "initialized" state will be activated.
889      * Requests of this nature can commonly exist if ad hoc requests have been attached to the
890      * document prior to execution of the route action.
891      * 
892      * <p>
893      * By default, the principal who initiated the document is the same principal who must submit
894      * the route command. However, a document type policy can be set which will relax this
895      * constraint.
896      * 
897      * <p>
898      * The route action should ideally only ever be executed once for a given document. Depending on
899      * document type policy, attempting to execute a "route" action against a document which is
900      * already enroute or in a terminal state may result in an {@link InvalidActionTakenException}
901      * being thrown.
902      * 
903      * @param parameters the parameters which indicate which principal is executing the action
904      *        against which document, as well as additional operations to take against the document,
905      *        such as updating document data
906      * 
907      * @return the result of executing the action, including a view on the updated state of the
908      *         document and related actions
909      * 
910      * @throws RiceIllegalArgumentException if {@code parameters} is null
911      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
912      *         {@code parameters} exists
913      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
914      *         in {@code parameters} exists
915      * @throws InvalidDocumentContentException if the document content on the
916      *         {@link DocumentContentUpdate} supplied with the {@code parameters} is invalid.
917      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
918      *         action
919      */
920     @WebMethod(operationName = "route")
921     @WebResult(name = "documentActionResult")
922     @XmlElement(name = "documentActionResult", required = true)
923     DocumentActionResult route(@WebParam(name = "parameters") DocumentActionParameters parameters)
924             throws RiceIllegalArgumentException, InvalidDocumentContentException, InvalidActionTakenException;
925 
926     /**
927      * Triggers the execution of a full {@link ActionType#BLANKET_APPROVE} action for the given
928      * principal and document specified in the supplied parameters. Blanket approval will
929      * orchestrate a document from it's current node all the way to the end of the document's
930      * workflow process. During this process, it will automatically act on all "approve" and
931      * "complete" requests, effectively bypassing them. When it does this, it will notify the
932      * original recipients of these requests by routing acknowledge requests to them.
933      * 
934      * <p>
935      * Blanket approve processing is handled by a special mode of the workflow engine which runs the
936      * document through it's full processing lifecycle, ensuring that it makes it's way to the end
937      * of it's route path (by bypassing any steps that would cause the process to halt, such as
938      * approval requests). Because of this nature, blanket approve processing behavior is governed
939      * by the same configuration as the rest of the workflow engine. So depending on whether the
940      * engine is configured or synchronous or asynchronous operation, the blanket approve processing
941      * will behave in the same manner.
942      * 
943      * <p>
944      * In order to execute a blanket approve operation, the principal must have permissions to do
945      * so.
946      * 
947      * @param parameters the parameters which indicate which principal is executing the action
948      *        against which document, as well as additional operations to take against the document,
949      *        such as updating document data
950      * 
951      * @return the result of executing the action, including a view on the updated state of the
952      *         document and related actions
953      * 
954      * @throws RiceIllegalArgumentException if {@code parameters} is null
955      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
956      *         {@code parameters} exists
957      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
958      *         in {@code parameters} exists
959      * @throws InvalidDocumentContentException if the document content on the
960      *         {@link DocumentContentUpdate} supplied with the {@code parameters} is invalid.
961      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
962      *         action
963      */
964     @WebMethod(operationName = "blanketApprove")
965     @WebResult(name = "documentActionResult")
966     @XmlElement(name = "documentActionResult", required = true)
967     DocumentActionResult blanketApprove(@WebParam(name = "parameters") DocumentActionParameters parameters)
968             throws RiceIllegalArgumentException, InvalidDocumentContentException, InvalidActionTakenException;
969 
970     /**
971      * Triggers the execution of a {@link ActionType#BLANKET_APPROVE} action which orchestrates the
972      * document to the given set of node names for the given principal and document specified in the
973      * supplied parameters. This method functions the same as
974      * {@link #blanketApprove(DocumentActionParameters)} with the exception that the blanket approve
975      * process will be halted once all node names in the given set have been reached.
976      * 
977      * <p>
978      * If null or an empty set is passed for {@code nodeNames} on this method, it's behavior will be
979      * equivalent to {@link #blanketApprove(DocumentActionParameters)}.
980      * 
981      * @param parameters the parameters which indicate which principal is executing the action
982      *        against which document, as well as additional operations to take against the document,
983      *        such as updating document data
984      * @param nodeNames a set of node names to which to blanket approve the given document
985      * 
986      * @return the result of executing the action, including a view on the updated state of the
987      *         document and related actions
988      * 
989      * @throws RiceIllegalArgumentException if {@code parameters} is null
990      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
991      *         {@code parameters} exists
992      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
993      *         in {@code parameters} exists
994      * @throws InvalidDocumentContentException if the document content on the
995      *         {@link DocumentContentUpdate} supplied with the {@code parameters} is invalid.
996      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
997      *         action
998      */
999     @WebMethod(operationName = "blanketApproveToNodes")
1000     @WebResult(name = "documentActionResult")
1001     @XmlElement(name = "documentActionResult", required = true)
1002     DocumentActionResult blanketApproveToNodes(
1003             @WebParam(name = "parameters") DocumentActionParameters parameters,
1004             @WebParam(name = "nodeName") Set<String> nodeNames)
1005             throws RiceIllegalArgumentException, InvalidDocumentContentException, InvalidActionTakenException;
1006 
1007     /**
1008      * Triggers the execution of a {@link ActionType#RETURN_TO_PREVIOUS} action for the given
1009      * principal and document specified in the supplied parameters. Return a document to a previous
1010      * node will allow for the document to be pushed back to an earlier node in the process based on
1011      * the criteria present in the {@link ReturnPoint} that is passed to this method.
1012      * 
1013      * <p>
1014      * The document is synchronously returned to the suggested return point (assuming the desired
1015      * return point can be identified for the given document), and then the document will be
1016      * submitted to the engine for further processing (effectively, re-establishing the flow of the
1017      * document from the target return point).
1018      * 
1019      * <p>
1020      * Return the document to the first node in the document is treated as a special case and,
1021      * rather then transitioning the document back to the "initiated" status, will route a
1022      * "complete" request to the initiator of the document. The effectively enacts a return to the
1023      * document initiator in these cases.
1024      * 
1025      * @param parameters the parameters which indicate which principal is executing the action
1026      *        against which document, as well as additional operations to take against the document,
1027      *        such as updating document data
1028      * 
1029      * @return the result of executing the action, including a view on the updated state of the
1030      *         document and related actions
1031      * 
1032      * @throws RiceIllegalArgumentException if {@code parameters} is null
1033      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
1034      *         {@code parameters} exists
1035      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
1036      *         in {@code parameters} exists
1037      * @throws InvalidDocumentContentException if the document content on the
1038      *         {@link DocumentContentUpdate} supplied with the {@code parameters} is invalid.
1039      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
1040      *         action
1041      */
1042     @WebMethod(operationName = "returnToPreviousNode")
1043     @WebResult(name = "documentActionResult")
1044     @XmlElement(name = "documentActionResult", required = true)
1045     DocumentActionResult returnToPreviousNode(
1046             @WebParam(name = "parameters") DocumentActionParameters parameters,
1047             @WebParam(name = "returnPoint") ReturnPoint returnPoint)
1048             throws RiceIllegalArgumentException, InvalidDocumentContentException, InvalidActionTakenException;
1049 
1050 
1051     /**
1052      * Triggers the execution of a {@link ActionType#MOVE} action for the given
1053      * principal and document specified in the supplied parameters. Move a document to a
1054      * node will allow for the document to be pushed to a different node in the process based on
1055      * the criteria present in the {@link MovePoint} that is passed to this method.
1056      *
1057      * <p />
1058      * The document is synchronously moved to the suggested move point (assuming the desired
1059      * move point can be identified for the given document), and then the document will be
1060      * submitted to the engine for further processing (effectively, re-establishing the flow of the
1061      * document from the target return point).
1062      *
1063      *
1064      * @param parameters the parameters which indicate which principal is executing the action
1065      *        against which document, as well as additional operations to take against the document,
1066      *        such as updating document data
1067      * @param movePoint the point to move the document
1068      *
1069      * @return the result of executing the action, including a view on the updated state of the
1070      *         document and related actions
1071      *
1072      * @throws RiceIllegalArgumentException if {@code parameters} is null
1073      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
1074      *         {@code parameters} exists
1075      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
1076      *         in {@code parameters} exists
1077      * @throws InvalidDocumentContentException if the document content on the
1078      *         {@link DocumentContentUpdate} supplied with the {@code parameters} is invalid.
1079      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
1080      *         action
1081      */
1082     @WebMethod(operationName = "move")
1083     @WebResult(name = "documentActionResult")
1084     @XmlElement(name = "documentActionResult", required = true)
1085     DocumentActionResult move(
1086             @WebParam(name = "parameters") DocumentActionParameters parameters,
1087             @WebParam(name = "movePoint") MovePoint movePoint)
1088             throws RiceIllegalArgumentException, InvalidDocumentContentException, InvalidActionTakenException;
1089 
1090     /**
1091      * Triggers the execution of a {@link ActionType#TAKE_GROUP_AUTHORITY} action for the given
1092      * principal and document specified in the supplied parameters. Takes authority of a group by a
1093      * member of that group.
1094      *
1095      * @param parameters the parameters which indicate which principal is executing the action
1096      *        against which document, as well as additional operations to take against the document,
1097      *        such as updating document data
1098      * @param groupId the group id to take authority of
1099      *
1100      * @return the result of executing the action, including a view on the updated state of the
1101      *         document and related actions
1102      *
1103      * @throws RiceIllegalArgumentException if {@code parameters} is null
1104      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
1105      *         {@code parameters} exists
1106      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
1107      *         in {@code parameters} exists
1108      * @throws InvalidDocumentContentException if the document content on the
1109      *         {@link DocumentContentUpdate} supplied with the {@code parameters} is invalid.
1110      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
1111      *         action
1112      */
1113     @WebMethod(operationName = "takeGroupAuthority")
1114     @WebResult(name = "documentActionResult")
1115     @XmlElement(name = "documentActionResult", required = true)
1116     DocumentActionResult takeGroupAuthority(
1117             @WebParam(name = "parameters") DocumentActionParameters parameters,
1118             @WebParam(name = "groupId") String groupId)
1119             throws RiceIllegalArgumentException, InvalidDocumentContentException, InvalidActionTakenException;
1120 
1121     /**
1122      * Triggers the execution of a {@link ActionType#RELEASE_GROUP_AUTHORITY} action for the given
1123      * principal and document specified in the supplied parameters. Releases authority of a group by a
1124      * member of that group.
1125      *
1126      * @param parameters the parameters which indicate which principal is executing the action
1127      *        against which document, as well as additional operations to take against the document,
1128      *        such as updating document data
1129      * @param groupId the group id to take authority of
1130      *
1131      * @return the result of executing the action, including a view on the updated state of the
1132      *         document and related actions
1133      *
1134      * @throws RiceIllegalArgumentException if {@code parameters} is null
1135      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
1136      *         {@code parameters} exists
1137      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
1138      *         in {@code parameters} exists
1139      * @throws InvalidDocumentContentException if the document content on the
1140      *         {@link DocumentContentUpdate} supplied with the {@code parameters} is invalid.
1141      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
1142      *         action
1143      */
1144     @WebMethod(operationName = "releaseGroupAuthority")
1145     @WebResult(name = "documentActionResult")
1146     @XmlElement(name = "documentActionResult", required = true)
1147     DocumentActionResult releaseGroupAuthority(
1148             @WebParam(name = "parameters") DocumentActionParameters parameters,
1149             @WebParam(name = "groupId") String groupId)
1150             throws RiceIllegalArgumentException, InvalidDocumentContentException, InvalidActionTakenException;
1151 
1152     /**
1153      * Triggers the execution of a {@link ActionType#SAVE} action for the given
1154      * principal and document specified in the supplied parameters. Saves a document to a
1155      * at the current point.
1156      *
1157      * @param parameters the parameters which indicate which principal is executing the action
1158      *        against which document, as well as additional operations to take against the document,
1159      *        such as updating document data
1160      *
1161      * @return the result of executing the action, including a view on the updated state of the
1162      *         document and related actions
1163      *
1164      * @throws RiceIllegalArgumentException if {@code parameters} is null
1165      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
1166      *         {@code parameters} exists
1167      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
1168      *         in {@code parameters} exists
1169      * @throws InvalidDocumentContentException if the document content on the
1170      *         {@link DocumentContentUpdate} supplied with the {@code parameters} is invalid.
1171      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
1172      *         action
1173      */
1174     @WebMethod(operationName = "save")
1175     @WebResult(name = "documentActionResult")
1176     @XmlElement(name = "documentActionResult", required = true)
1177     DocumentActionResult save(@WebParam(name = "parameters") DocumentActionParameters parameters)
1178             throws RiceIllegalArgumentException, InvalidDocumentContentException, InvalidActionTakenException;
1179 
1180     /**
1181      * Triggers the execution of a {@link ActionType#SAVE} action for the given
1182      * principal and document specified in the supplied parameters. Saves the current document data for
1183      * the document.  Note that passing an annotation to this will have no effect because it is not
1184      * recorded in the route log
1185      *
1186      * @param parameters the parameters which indicate which principal is executing the action
1187      *        against which document, as well as additional operations to take against the document,
1188      *        such as updating document data
1189      *
1190      * @return the result of executing the action, including a view on the updated state of the
1191      *         document and related actions
1192      *
1193      * @throws RiceIllegalArgumentException if {@code parameters} is null
1194      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
1195      *         {@code parameters} exists
1196      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
1197      *         in {@code parameters} exists
1198      * @throws InvalidDocumentContentException if the document content on the
1199      *         {@link DocumentContentUpdate} supplied with the {@code parameters} is invalid.
1200      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
1201      *         action
1202      */
1203     @WebMethod(operationName = "saveDocumentData")
1204     @WebResult(name = "documentActionResult")
1205     @XmlElement(name = "documentActionResult", required = true)
1206     DocumentActionResult saveDocumentData(@WebParam(name = "parameters") DocumentActionParameters parameters)
1207             throws RiceIllegalArgumentException, InvalidDocumentContentException, InvalidActionTakenException;
1208 
1209     /**
1210      * Deletes the document.
1211      *
1212      * @param documentId the unique id of the document to delete
1213      * @param principalId
1214      *
1215      * @return the document that was removed from the system
1216      *
1217      * @throws RiceIllegalArgumentException if {@code documentId} is null
1218      * @throws RiceIllegalArgumentException if {@code principalId} is null
1219      * @throws RiceIllegalArgumentException if no document with the {@code documentId} exists
1220      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
1221      *         action
1222      */
1223     @WebMethod(operationName = "delete")
1224     @WebResult(name = "document")
1225     @XmlElement(name = "document", required = true)
1226     Document delete(
1227             @WebParam(name = "documentId") String documentId,
1228             @WebParam(name = "principalId") String principalId)
1229             throws RiceIllegalArgumentException, InvalidActionTakenException;
1230 
1231     /**
1232      * Records the non-routed document action. - Checks to make sure the document status
1233      * allows the action. Records the action.
1234      *
1235      * @param documentId the unique id of the document to delete
1236      * @param principalId
1237      *
1238      * @return the document that was removed from the system
1239      *
1240      * @throws RiceIllegalArgumentException if {@code documentId} is null
1241      * @throws RiceIllegalArgumentException if {@code principalId} is null
1242      * @throws RiceIllegalArgumentException if {@code annotation} is null
1243      * @throws RiceIllegalArgumentException if no document with the {@code documentId} exists
1244      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
1245      *         action
1246      */
1247     @WebMethod(operationName = "logAnnotation")
1248     void logAnnotation(
1249             @WebParam(name = "documentId") String documentId,
1250             @WebParam(name = "principalId") String principalId,
1251             @WebParam(name = "annotation") String annotation)
1252             throws RiceIllegalArgumentException, InvalidActionTakenException;
1253 
1254     /**
1255      * Initiates the process of document attribute indexing for the document with the given id.
1256      * Calling this method does not trigger processing of the workflow engine, though it may occur
1257      * asynchronously or synchronously depending on configuration of the implementation.
1258      *
1259      * @param documentId the unique id of the document for which to initiate indexing
1260      *
1261      * @throws RiceIllegalArgumentException if {@code documentId} is null
1262      */
1263     @WebMethod(operationName = "initiateIndexing")
1264     void initiateIndexing(@WebParam(name = "documentId") String documentId)
1265             throws RiceIllegalArgumentException;
1266 
1267 
1268     /**
1269      * Triggers the execution of a {@link ActionType#SU_BLANKET_APPROVE} action for the given
1270      * principal and document specified in the supplied parameters. Does a blanket approve for a super user
1271      * and runs post-processing depending on {@code executePostProcessor}
1272      *
1273      * @param parameters the parameters which indicate which principal is executing the action
1274      *        against which document, as well as additional operations to take against the document,
1275      *        such as updating document data
1276      * @param executePostProcessor boolean value determining if the post-processor should be run or not
1277      *
1278      * @return the result of executing the action, including a view on the updated state of the
1279      *         document and related actions
1280      *
1281      * @throws RiceIllegalArgumentException if {@code parameters} is null
1282      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
1283      *         {@code parameters} exists
1284      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
1285      *         in {@code parameters} exists
1286      * @throws InvalidDocumentContentException if the document content on the
1287      *         {@link DocumentContentUpdate} supplied with the {@code parameters} is invalid.
1288      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
1289      *         action
1290      */
1291     @WebMethod(operationName = "superUserBlanketApprove")
1292     @WebResult(name = "documentActionResult")
1293     @XmlElement(name = "documentActionResult", required = true)
1294     DocumentActionResult superUserBlanketApprove(
1295             @WebParam(name = "parameters") DocumentActionParameters parameters,
1296             @WebParam(name = "executePostProcessor") boolean executePostProcessor)
1297             throws RiceIllegalArgumentException, InvalidDocumentContentException, InvalidActionTakenException;
1298 
1299     /**
1300      * Triggers the execution of a {@link ActionType#SU_APPROVE} action for the given
1301      * principal and document specified in the supplied parameters. Does an approve for a super user
1302      * on a node and runs post-processing depending on {@code executePostProcessor}
1303      *
1304      * @param parameters the parameters which indicate which principal is executing the action
1305      *        against which document, as well as additional operations to take against the document,
1306      *        such as updating document data
1307      * @param executePostProcessor boolean value determining if the post-processor should be run or not
1308      *
1309      * @return the result of executing the action, including a view on the updated state of the
1310      *         document and related actions
1311      *
1312      * @throws RiceIllegalArgumentException if {@code parameters} is null
1313      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
1314      *         {@code parameters} exists
1315      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
1316      *         in {@code parameters} exists
1317      * @throws InvalidDocumentContentException if the document content on the
1318      *         {@link DocumentContentUpdate} supplied with the {@code parameters} is invalid.
1319      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
1320      *         action
1321      */
1322     @WebMethod(operationName = "superUserNodeApprove")
1323     @WebResult(name = "documentActionResult")
1324     @XmlElement(name = "documentActionResult", required = true)
1325     DocumentActionResult superUserNodeApprove(
1326             @WebParam(name = "parameters") DocumentActionParameters parameters,
1327             @WebParam(name = "executePostProcessor") boolean executePostProcessor,
1328             @WebParam(name = "nodeName") String nodeName)
1329             throws RiceIllegalArgumentException, InvalidDocumentContentException, InvalidActionTakenException;
1330 
1331     /**
1332      * Triggers the execution of a {@link ActionType#SU_APPROVE} action for the given
1333      * actionRequestId and principal and document specified in the supplied parameters. Does an approve for a super user
1334      * on a node and runs post-processing depending on {@code executePostProcessor}
1335      *
1336      * @param parameters the parameters which indicate which principal is executing the action
1337      *        against which document, as well as additional operations to take against the document,
1338      *        such as updating document data
1339      * @param actionRequestId unique Id of an action request to take action on
1340      * @param executePostProcessor boolean value determining if the post-processor should be run or not
1341      *
1342      * @return the result of executing the action, including a view on the updated state of the
1343      *         document and related actions
1344      *
1345      * @throws RiceIllegalArgumentException if {@code parameters} is null
1346      * @throws RiceIllegalArgumentException if (@code actionRequestId}
1347      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
1348      *         {@code parameters} exists
1349      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
1350      *         in {@code parameters} exists
1351      * @throws InvalidDocumentContentException if the document content on the
1352      *         {@link DocumentContentUpdate} supplied with the {@code parameters} is invalid.
1353      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
1354      *         action
1355      */
1356     @WebMethod(operationName = "superUserTakeRequestedAction")
1357     @WebResult(name = "documentActionResult")
1358     @XmlElement(name = "documentActionResult", required = true)
1359     DocumentActionResult superUserTakeRequestedAction(
1360             @WebParam(name = "parameters") DocumentActionParameters parameters,
1361             @WebParam(name = "executePostProcessor") boolean executePostProcessor,
1362             @WebParam(name = "actionRequestId") String actionRequestId)
1363             throws RiceIllegalArgumentException, InvalidDocumentContentException, InvalidActionTakenException;
1364 
1365     /**
1366      * Triggers the execution of a {@link ActionType#SU_DISAPPROVE} action for the given
1367      * principal and document specified in the supplied parameters. Does a disapprove for a super user
1368      * on a node and runs post-processing depending on {@code executePostProcessor}
1369      *
1370      * @param parameters the parameters which indicate which principal is executing the action
1371      *        against which document, as well as additional operations to take against the document,
1372      *        such as updating document data
1373      * @param executePostProcessor boolean value determining if the post-processor should be run or not
1374      *
1375      * @return the result of executing the action, including a view on the updated state of the
1376      *         document and related actions
1377      *
1378      * @throws RiceIllegalArgumentException if {@code parameters} is null
1379      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
1380      *         {@code parameters} exists
1381      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
1382      *         in {@code parameters} exists
1383      * @throws InvalidDocumentContentException if the document content on the
1384      *         {@link DocumentContentUpdate} supplied with the {@code parameters} is invalid.
1385      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
1386      *         action
1387      */
1388     @WebMethod(operationName = "superUserDisapprove")
1389     @WebResult(name = "documentActionResult")
1390     @XmlElement(name = "documentActionResult", required = true)
1391     DocumentActionResult superUserDisapprove(
1392             @WebParam(name = "parameters") DocumentActionParameters parameters,
1393             @WebParam(name = "executePostProcessor") boolean executePostProcessor)
1394             throws RiceIllegalArgumentException, InvalidDocumentContentException, InvalidActionTakenException;
1395 
1396     /**
1397      * Triggers the execution of a {@link ActionType#SU_CANCEL} action for the given
1398      * principal and document specified in the supplied parameters. Does an cancel for a super user
1399      * on a node and runs post-processing depending on {@code executePostProcessor}
1400      *
1401      * @param parameters the parameters which indicate which principal is executing the action
1402      *        against which document, as well as additional operations to take against the document,
1403      *        such as updating document data
1404      * @param executePostProcessor boolean value determining if the post-processor should be run or not
1405      *
1406      * @return the result of executing the action, including a view on the updated state of the
1407      *         document and related actions
1408      *
1409      * @throws RiceIllegalArgumentException if {@code parameters} is null
1410      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
1411      *         {@code parameters} exists
1412      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
1413      *         in {@code parameters} exists
1414      * @throws InvalidDocumentContentException if the document content on the
1415      *         {@link DocumentContentUpdate} supplied with the {@code parameters} is invalid.
1416      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
1417      *         action
1418      */
1419     @WebMethod(operationName = "superUserCancel")
1420     @WebResult(name = "documentActionResult")
1421     @XmlElement(name = "documentActionResult", required = true)
1422     DocumentActionResult superUserCancel(
1423             @WebParam(name = "parameters") DocumentActionParameters parameters,
1424             @WebParam(name = "executePostProcessor") boolean executePostProcessor)
1425             throws RiceIllegalArgumentException, InvalidDocumentContentException, InvalidActionTakenException;
1426 
1427     /**
1428      * Triggers the execution of a {@link ActionType#SU_RETURN_TO_PREVIOUS} action for the given
1429      * principal and document specified in the supplied parameters. Returns the document to the
1430      * previous node for a super user on a node and runs post-processing depending on {@code executePostProcessor}
1431      *
1432      * @param parameters the parameters which indicate which principal is executing the action
1433      *        against which document, as well as additional operations to take against the document,
1434      *        such as updating document data
1435      * @param executePostProcessor boolean value determining if the post-processor should be run or not
1436      * @param returnPoint point to return to
1437      *
1438      * @return the result of executing the action, including a view on the updated state of the
1439      *         document and related actions
1440      *
1441      * @throws RiceIllegalArgumentException if {@code parameters} is null
1442      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
1443      *         {@code parameters} exists
1444      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
1445      *         in {@code parameters} exists
1446      * @throws InvalidDocumentContentException if the document content on the
1447      *         {@link DocumentContentUpdate} supplied with the {@code parameters} is invalid.
1448      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
1449      *         action
1450      */
1451     @WebMethod(operationName = "superUserReturnToPreviousNode")
1452     @WebResult(name = "documentActionResult")
1453     @XmlElement(name = "documentActionResult", required = true)
1454     DocumentActionResult superUserReturnToPreviousNode(
1455             @WebParam(name = "parameters") DocumentActionParameters parameters,
1456             @WebParam(name = "executePostProcessor") boolean executePostProcessor,
1457             @WebParam(name = "returnPoint") ReturnPoint returnPoint)
1458             throws RiceIllegalArgumentException, InvalidDocumentContentException, InvalidActionTakenException;
1459 
1460     /**
1461      * Places a document in exception routing or the given principal and document specified in the supplied parameters.
1462      *
1463      * @param parameters the parameters which indicate which principal is executing the action
1464      *        against which document, as well as additional operations to take against the document,
1465      *        such as updating document data
1466      *
1467      * @return the result of executing the action, including a view on the updated state of the
1468      *         document and related actions
1469      *
1470      * @throws RiceIllegalArgumentException if {@code parameters} is null
1471      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
1472      *         {@code parameters} exists
1473      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
1474      *         in {@code parameters} exists
1475      * @throws InvalidDocumentContentException if the document content on the
1476      *         {@link DocumentContentUpdate} supplied with the {@code parameters} is invalid.
1477      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
1478      *         action
1479      */
1480     @WebMethod(operationName = "placeInExceptionRouting")
1481     @WebResult(name = "documentActionResult")
1482     @XmlElement(name = "documentActionResult", required = true)
1483     DocumentActionResult placeInExceptionRouting(@WebParam(name = "parameters") DocumentActionParameters parameters)
1484             throws RiceIllegalArgumentException, InvalidDocumentContentException, InvalidActionTakenException;
1485 
1486     /**
1487      * Validates a workflow attribute definition and returns a list of validation errors
1488      *
1489      * @param definition WorkflowAttributeDefinition to validate
1490      *
1491      * @return a list of RemotableAttributeErrors caused by validation of the passed in {@code definition}
1492      *
1493      * @throws RiceIllegalArgumentException if {@code parameters} is null
1494      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
1495      *         {@code parameters} exists
1496      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
1497      *         in {@code parameters} exists
1498      * @throws InvalidDocumentContentException if the document content on the
1499      *         {@link DocumentContentUpdate} supplied with the {@code parameters} is invalid.
1500      * @throws InvalidActionTakenException if the supplied principal is not allowed to execute this
1501      *         action
1502      */
1503     @WebMethod(operationName = "validateWorkflowAttributeDefinition")
1504     @WebResult(name = "validationErrors")
1505     @XmlElementWrapper(name = "validationErrors", required = true)
1506     @XmlElement(name = "validationError", required = true)
1507     List<RemotableAttributeError> validateWorkflowAttributeDefinition(
1508             @WebParam(name = "definition") WorkflowAttributeDefinition definition)
1509             throws RiceIllegalArgumentException;
1510 
1511     // TODO add, annotate, and javadoc the following methods to this service
1512     /**
1513      * Determines if a passed in user exists in a document's route log or future route depending on the passed in
1514      * {@code lookFuture} value
1515      *
1516      * @param documentId unique Id of document
1517      * @param principalId unique Id of Principal to look for in document's route log
1518      * @param lookFuture boolean value determines whether or not to look at the future route log
1519      *
1520      * @return boolean value representing if a principal exists in a Document's route log
1521      *
1522      * @throws RiceIllegalArgumentException if {@code documentId} is null
1523      * @throws RiceIllegalArgumentException if {@code principalId} is null
1524      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
1525      *         {@code parameters} exists
1526      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
1527      *         in {@code parameters} exists
1528      */
1529     @WebMethod(operationName = "isUserInRouteLog")
1530     @WebResult(name = "userInRouteLog")
1531     boolean isUserInRouteLog(
1532             @WebParam(name = "documentId") String documentId,
1533             @WebParam(name = "principalId") String principalId,
1534             @WebParam(name = "lookFuture") boolean lookFuture)
1535             throws RiceIllegalArgumentException;
1536 
1537     /**
1538      * Determines if a passed in user exists in a document's route log or future route depending on the passed in
1539      * {@code lookFuture} value and {@code flattenNodes}
1540      *
1541      * @param documentId unique Id of document
1542      * @param principalId unique Id of Principal to look for in document's route log
1543      * @param lookFuture boolean value determines whether or not to look at the future route log
1544      *
1545      * @return boolean value representing if a principal exists in a Document's route log
1546      *
1547      * @throws RiceIllegalArgumentException if {@code documentId} is null
1548      * @throws RiceIllegalArgumentException if {@code principalId} is null
1549      * @throws RiceIllegalArgumentException if no document with the {@code documentId} specified in
1550      *         {@code parameters} exists
1551      * @throws RiceIllegalArgumentException if no principal with the {@code principalId} specified
1552      *         in {@code parameters} exists
1553      */
1554     @WebMethod(operationName = "isUserInRouteLogWithOptionalFlattening")
1555     @WebResult(name = "userInRouteLogWithOptionalFlattening")
1556     boolean isUserInRouteLogWithOptionalFlattening(
1557             @WebParam(name = "documentId") String documentId,
1558             @WebParam(name = "principalId") String principalId,
1559             @WebParam(name = "lookFuture") boolean lookFuture,
1560             @WebParam(name = "flattenNodes") boolean flattenNodes)
1561             throws RiceIllegalArgumentException;
1562 
1563     /**
1564      * Re-resolves the given role for all documents for the given document type (including children).
1565      *
1566      * @param documentTypeName documentTypeName of DocuemntType for role
1567      * @param roleName name of Role to reresolve
1568      * @param qualifiedRoleNameLabel qualified role name label
1569      *
1570      * @throws RiceIllegalArgumentException if {@code documentTypeName} is null
1571      * @throws RiceIllegalArgumentException if {@code roleName} is null
1572      * @throws RiceIllegalArgumentException if {@code qualifiedRoleNameLable} is null
1573      */
1574     @WebMethod(operationName = "reResolveRoleByDocTypeName")
1575     void reResolveRoleByDocTypeName(
1576             @WebParam(name = "documentTypeName") String documentTypeName,
1577             @WebParam(name = "roleName") String roleName,
1578             @WebParam(name = "qualifiedRoleNameLabel") String qualifiedRoleNameLabel)
1579             throws RiceIllegalArgumentException;
1580 
1581     /**
1582      * Re-resolves the given role for all documents for the given document id (including children).
1583      *
1584      * @param documentId documentId of Docuemnt for role
1585      * @param roleName name of Role to reresolve
1586      * @param qualifiedRoleNameLabel qualified role name label
1587      *
1588      * @throws RiceIllegalArgumentException if {@code documentTypeName} is null
1589      * @throws RiceIllegalArgumentException if {@code roleName} is null
1590      * @throws RiceIllegalArgumentException if {@code qualifiedRoleNameLable} is null
1591      */
1592     @WebMethod(operationName = "reResolveRoleByDocumentId")
1593     void reResolveRoleByDocumentId(
1594             @WebParam(name = "documentId") String documentId,
1595             @WebParam(name = "roleName") String roleName,
1596             @WebParam(name = "qualifiedRoleNameLabel") String qualifiedRoleNameLabel)
1597             throws RiceIllegalArgumentException;
1598 
1599     /**
1600      * Executes a simulation of a document to get all previous and future route information
1601      *
1602      * @param reportCriteria criteria for the simulation to follow
1603      *
1604      * @return DocumentDetail object representing the results of the simulation
1605      *
1606      * @throws RiceIllegalArgumentException if {@code reportCriteria} is null
1607      */
1608     @WebMethod(operationName = "executeSimulation")
1609     @WebResult(name = "documentDetail")
1610     DocumentDetail executeSimulation(
1611             @WebParam(name = "reportCriteria") RoutingReportCriteria reportCriteria)
1612             throws RiceIllegalArgumentException;
1613 
1614     /**
1615      * Determines if a passed in user is the final approver for a document
1616      *
1617      * @param documentId unique Id of the document
1618      * @param principalId unique Id of Principal to look for in document's route log
1619      *
1620      * @return boolean value representing if a principal is the final approver for a document
1621      *
1622      * @throws RiceIllegalArgumentException if {@code documentId} is null
1623      * @throws RiceIllegalArgumentException if {@code principalId} is null
1624      */
1625     @WebMethod(operationName = "isFinalApprover")
1626     @WebResult(name = "finalApprover")
1627     boolean isFinalApprover(
1628             @WebParam(name = "documentId") String documentId,
1629             @WebParam(name = "principalId") String principalId)
1630             throws RiceIllegalArgumentException;
1631 
1632     /**
1633      * Determines if a passed in user is the last approver at a specified route node
1634      *
1635      * @param documentId unique Id of the document
1636      * @param principalId unique Id of Principal to look for in document's route log
1637      * @param nodeName name of route node to determine last approver for
1638      *
1639      * @return boolean value representing if a principal is the last approver at the specified route node
1640      *
1641      * @throws RiceIllegalArgumentException if {@code documentId} is null
1642      * @throws RiceIllegalArgumentException if {@code principalId} is null
1643      * @throws RiceIllegalArgumentException if {@code nodeName} is null
1644      */
1645     @WebMethod(operationName = "isLastApproverAtNode")
1646     @WebResult(name = "lastApproverAtNode")
1647     boolean isLastApproverAtNode(
1648             @WebParam(name = "documentId") String documentId,
1649             @WebParam(name = "principalId") String principalId,
1650             @WebParam(name = "nodeName") String nodeName)
1651             throws RiceIllegalArgumentException;
1652 
1653     /**
1654      * Determines if a route node has an 'approve action' request
1655      *
1656      * @param docType document type of document
1657      * @param docContent string representing content of document
1658      * @param nodeName name of route node to determine if approve action request exists
1659      *
1660      * @return boolean value representing if a route node has an 'approve action' request
1661      *
1662      * @throws RiceIllegalArgumentException if {@code docType} is null
1663      * @throws RiceIllegalArgumentException if {@code docContent} is null
1664      * @throws RiceIllegalArgumentException if {@code nodeName} is null
1665      */
1666     @WebMethod(operationName = "routeNodeHasApproverActionRequest")
1667     @WebResult(name = "routeNodeHasApproverActionRequest")
1668     boolean routeNodeHasApproverActionRequest(
1669             @WebParam(name = "docType") String docType,
1670             @WebParam(name = "docContent") String docContent,
1671             @WebParam(name = "nodeName") String nodeName)
1672             throws RiceIllegalArgumentException;
1673 
1674     /**
1675      * Determines if a document has at least one action request
1676      *
1677      * @param reportCriteria criteria for routing report
1678      * @param actionRequestedCodes list of action request codes to see if they exist for the document
1679      * @param ignoreCurrentActionRequests boolean value to determine if current action requests should be ignored
1680      *
1681      * @return boolean value representing if a document will have at least one action request
1682      *
1683      * @throws RiceIllegalArgumentException if {@code docType} is null
1684      * @throws RiceIllegalArgumentException if {@code docContent} is null
1685      * @throws RiceIllegalArgumentException if {@code nodeName} is null
1686      */
1687     @WebMethod(operationName = "documentWillHaveAtLeastOneActionRequest")
1688     @WebResult(name = "documentWillHaveAtLeastOneActionRequest")
1689     boolean documentWillHaveAtLeastOneActionRequest(
1690             @WebParam(name = "reportCriteria") RoutingReportCriteria reportCriteria,
1691             @WebParam(name = "actionRequestedCodes") List<String> actionRequestedCodes,
1692             @WebParam(name = "ignoreCurrentActionRequests") boolean ignoreCurrentActionRequests)
1693             throws RiceIllegalArgumentException;
1694 
1695     /**
1696      * Returns a list of principal Ids that exist in a route log
1697      *
1698      * @param documentId unique id of the document to get the route log for
1699      * @param lookFuture boolean value that determines if the method should look at future action requests
1700      *
1701      * @return list of principal ids that exist in a route log
1702      *
1703      * @throws RiceIllegalArgumentException if {@code documentId} is null
1704      */
1705     @WebMethod(operationName = "getPrincipalIdsInRouteLog")
1706     @WebResult(name = "principalIds")
1707     @XmlElementWrapper(name = "principalIds", required = true)
1708     @XmlElement(name = "principalId", required = true)
1709     List<String> getPrincipalIdsInRouteLog(
1710             @WebParam(name = "documentId") String documentId,
1711             @WebParam(name = "lookFuture") boolean lookFuture)
1712             throws RiceIllegalArgumentException;
1713 
1714 }