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