001 /** 002 * Copyright 2005-2014 The Kuali Foundation 003 * 004 * Licensed under the Educational Community License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/ecl2.php 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 package org.kuali.rice.krad.service; 017 018 import org.kuali.rice.kew.api.exception.WorkflowException; 019 import org.kuali.rice.kim.api.identity.Person; 020 import org.kuali.rice.krad.bo.AdHocRouteRecipient; 021 import org.kuali.rice.krad.bo.Note; 022 import org.kuali.rice.krad.document.Document; 023 import org.kuali.rice.krad.exception.ValidationException; 024 import org.kuali.rice.krad.rules.rule.event.KualiDocumentEvent; 025 import org.kuali.rice.krad.rules.rule.event.SaveEvent; 026 027 import java.util.List; 028 029 /** 030 * Defines various operations that support the Document framework. 031 * 032 * The calling code should always use any returned Document object for future operations since a new object will be 033 * created if a passed-in document is saved. 034 * 035 * @author Kuali Rice Team (rice.collab@kuali.org) 036 */ 037 public interface DocumentService { 038 039 /** 040 * @param documentHeaderId 041 * @return true if a document with the given documentHeaderId exists 042 */ 043 public boolean documentExists(String documentHeaderId); 044 045 /** 046 * get a new blank document instance based on the document type name 047 * 048 * @param documentTypeName 049 * @return new document instance 050 */ 051 public Document getNewDocument(String documentTypeName) throws WorkflowException; 052 053 /** 054 * get a new blank document instance having the given Document class 055 * 056 * @param documentClass 057 * @return new document instance 058 */ 059 public Document getNewDocument(Class<? extends Document> documentClass) throws WorkflowException; 060 061 /** 062 * get a new blank document instance based on the document type name. The principal name 063 * passed in will be used as the document initiator. 064 * 065 * @param documentTypeName 066 * @param initiatorPrincipalNm 067 * @return new document instance 068 */ 069 public Document getNewDocument(String documentTypeName, String initiatorPrincipalNm) throws WorkflowException; 070 071 /** 072 * get a document based on the document header id which is the primary key for all document types 073 * 074 * @param documentHeaderId 075 * @return document, by id 076 */ 077 public Document getByDocumentHeaderId(String documentHeaderId) throws WorkflowException; 078 /** 079 * get a document based on the document header id which is the primary key for all document types. Using this 080 * method does not require that GlobalVariables.getUserSession() be populated. Therefore, this method can be used 081 * when a HTTP request is not being processed (e.g. during workflow indexing/post-processing). 082 * 083 * @param documentHeaderId 084 * @return document, by id 085 */ 086 public Document getByDocumentHeaderIdSessionless(String documentHeaderId) throws WorkflowException; 087 088 /** 089 * This method retrieves a list of fully-populated documents given a list of document header id values. 090 * 091 * @param documentClass 092 * @param documentHeaderIds 093 * @return list of fully-populated documents 094 * @throws WorkflowException 095 */ 096 public List<Document> getDocumentsByListOfDocumentHeaderIds(Class<? extends Document> documentClass, List<String> documentHeaderIds) throws WorkflowException; 097 098 /** 099 * This method is to allow for documents to be updated. It is currently used to update the document status as 100 * well as to allow for locked docs to be unlocked 101 * 102 * @param document the document to be updated 103 * @return the updated document 104 */ 105 public Document updateDocument(Document document); 106 107 /** 108 * This is a helper method that performs the same as the {@link #saveDocument(Document, Class)} method. The 109 * convenience of this method is that the event being used is the standard SaveDocumentEvent. 110 * 111 * @see org.kuali.rice.krad.service.DocumentService#saveDocument(Document, Class) 112 */ 113 public Document saveDocument(Document document) throws WorkflowException; 114 115 /** 116 * Saves the passed-in document. This will persist it both to the Kuali database, and also initiate it 117 * (if necessary) within workflow, so its available in the initiator's action list. This method uses the 118 * passed in KualiDocumentEvent class when saving the document. The KualiDocumentEvent class must implement 119 * the {@link SaveEvent} interface. 120 * 121 * Note that the system does not support passing in Workflow Annotations or AdHoc Route Recipients on a SaveDocument 122 * call. These are sent to workflow on a routeDocument action, or any of the others which actually causes a 123 * routing action to happen in workflow. 124 * 125 * Also note that this method will not check the document action flags to check if a save is valid 126 * 127 * The calling code should always use the object returned from this method for future operations since a new 128 * object is created when the passed-in document is saved. 129 * 130 * @param document the document to be saved 131 * @param kualiDocumentEventClass the event class to use when saving (class must implement the SaveEvent interface) 132 * @return the saved document 133 * @throws WorkflowException 134 */ 135 public Document saveDocument(Document document, Class<? extends KualiDocumentEvent> kualiDocumentEventClass) throws WorkflowException; 136 137 /** 138 * Save and then route the document, optionally providing an annotation which will show up in the route log 139 * of the document for the action taken, and optionally providing a list of ad hoc recipients for the document. 140 * 141 * @param document the document to be routed 142 * @param annotation the annotation to appear in the route log of the document 143 * @param adHocRoutingRecipients list of ad hoc recipients to which the document will be routed 144 * @return the saved and routed document 145 * @throws WorkflowException 146 */ 147 public Document routeDocument(Document document, String annotation, List<AdHocRouteRecipient> adHocRoutingRecipients) throws WorkflowException; 148 149 /** 150 * Save and then approve the document, optionally providing an annotation which will show up in the route log 151 * of the document for the action taken, and optionally providing a list of ad hoc recipients for the document. 152 * 153 * @param document the document to be approved 154 * @param annotation the annotation to appear in the route log of the document 155 * @param adHocRoutingRecipients list of ad hoc recipients to which the document will be routed 156 * @return the saved and approved document 157 * @throws WorkflowException 158 */ 159 public Document approveDocument(Document document, String annotation, List<AdHocRouteRecipient> adHocRoutingRecipients) throws WorkflowException; 160 161 /** 162 * Save and then approve the document as a super user, optionally providing an annotation which will show up in the 163 * route log of the document for the action taken. 164 * 165 * @param document the document to be super user approved 166 * @param annotation the annotation to appear in the route log of the document 167 * @return the saved and super user approved document 168 * @throws WorkflowException 169 */ 170 public Document superUserApproveDocument(Document document, String annotation) throws WorkflowException; 171 172 /** 173 * Save and then cancel the document as a super user, optionally providing an annotation which will show up in the 174 * route log of the document for the action taken. 175 * 176 * @param document the document to be super user canceled 177 * @param annotation the annotation to appear in the route log of the document 178 * @return the saved and super user canceled document 179 * @throws WorkflowException 180 */ 181 public Document superUserCancelDocument(Document document, String annotation) throws WorkflowException; 182 183 /** 184 * Save and then disapprove the document as a super user, optionally providing an annotation which will show up 185 * in the route log of the document for the action taken. 186 * 187 * @param document the document to be super user disapproved 188 * @param annotation the annotation to appear in the route log of the document 189 * @return the saved and super user disapproved document 190 * @throws WorkflowException 191 */ 192 public Document superUserDisapproveDocument(Document document, String annotation) throws WorkflowException; 193 194 /** 195 * Disapprove the document as super user, without saving, optionally providing an annotation which will show 196 * up in the route log of the document for the action taken. 197 * 198 * @param document the document to be super user disapproved 199 * @param annotation the annotation to appear in the route log of the document 200 * @return the super user disapproved document 201 * @throws WorkflowException 202 */ 203 public Document superUserDisapproveDocumentWithoutSaving(Document document, String annotation) throws WorkflowException; 204 205 /** 206 * Disapprove the document, without saving, optionally providing an annotation which will show up in the route log 207 * of the document for the action taken. 208 * 209 * @param document the document to be disapproved 210 * @param annotation the annotation to appear in the route log of the document 211 * @return the disapproved document 212 * @throws Exception 213 */ 214 public Document disapproveDocument(Document document, String annotation) throws Exception; 215 216 /** 217 * Cancel the document, without saving, optionally providing an annotation for the disapproval which will show 218 * up in the route log of the document for the action taken. 219 * 220 * @param document the document to be canceled 221 * @param annotation the annotation to appear in the route log of the document 222 * @return the canceled document 223 * @throws WorkflowException 224 */ 225 public Document cancelDocument(Document document, String annotation) throws WorkflowException; 226 227 /** 228 * Acknowledge the document, optionally providing an annotation for the acknowledgement which will show up in the 229 * route log of the document, and optionally providing a list of ad hoc recipients for the document. The list of 230 * ad hoc recipients for this document should have an action requested of acknowledge or fyi as all other actions 231 * requested will be discarded as invalid due to the fact that this action being taken is an acknowledgement. 232 * 233 * @param document the document to be acknowledged 234 * @param annotation the annotation to appear in the route log of the document 235 * @param adHocRecipients list of ad hoc recipients to which the document will be routed 236 * @return the acknowledged document 237 * @throws WorkflowException 238 */ 239 public Document acknowledgeDocument(Document document, String annotation, List<AdHocRouteRecipient> adHocRecipients) throws WorkflowException; 240 241 /** 242 * Blanket approve the document which will save the document, approve the document, and stand in for an 243 * approve for all typically generated approval actions requested for this document. The user must have blanket 244 * approval authority for this document by being registered as a user in the blanket approval workgroup that is 245 * associated with this document type. Optionally an annotation can be provided which will show up for the 246 * action taken on the document in the route log. Also optionally a list of ad hoc recipients can be provided 247 * for the document, which should be restricted to actions requested of acknowledge and fyi as all other actions 248 * requested will be discarded. 249 * 250 * @param document the document to be blanket approved 251 * @param annotation the annotation to appear in the route log of the document 252 * @param adHocRecipients list of ad hoc recipients to which the document will be routed 253 * @return the saved and blanket approved document 254 * @throws WorkflowException 255 */ 256 public Document blanketApproveDocument(Document document, String annotation, List<AdHocRouteRecipient> adHocRecipients) throws WorkflowException; 257 258 /** 259 * Clear the fyi requests for the document, optionally providing a list of ad hoc recipients for the document, 260 * which should be restricted to action requested of fyi as all other actions requested will be discarded. 261 * 262 * @param document the document to clear of fyi requests 263 * @param adHocRecipients list of ad hoc recipients to which the document will be routed 264 * @return the document 265 * @throws WorkflowException 266 */ 267 public Document clearDocumentFyi(Document document, List<AdHocRouteRecipient> adHocRecipients) throws WorkflowException; 268 269 /** 270 * Sets the title and app document id in the workflow document 271 * 272 * @param document the document to prepare 273 * @throws WorkflowException 274 */ 275 public void prepareWorkflowDocument(Document document) throws WorkflowException; 276 277 /** 278 * This method creates a note from the given document and note text. The resulting Note will 279 * have it's note type set to the value of {@link Document#getNoteType()}. Additionally, it's 280 * remoteObjectId will be set to the object id of the document's note target. 281 * 282 * @param document the document from which to use the note type and note target when creating the note 283 * @param text the text value to include in the resulting note 284 * @return the note that was created 285 */ 286 public Note createNoteFromDocument(Document document, String text); 287 288 /** 289 * Saves the notes associated with the given document if they are in a state where they can be 290 * saved. In certain cases they may not be ready to be saved. For example, in maintenance documents 291 * where the notes are associated with the business object instead of the document header, the notes 292 * cannot be saved until the business object itself has been persisted. 293 * 294 * @param document the document for which to save notes 295 * @return true if the notes were saved, false if they were not 296 */ 297 public boolean saveDocumentNotes(Document document); 298 299 /** 300 * Send ad hoc requests for the given document, optionally providing an annotation which will show up in the route 301 * log of the document. Also optionally providing a list of ad hoc recipients for the document. However if 302 * no ad hoc recipients are provided, no ad hoc requests will be sent. 303 * 304 * @param document the document for which the ad hoc requests are sent 305 * @param annotation the annotation to appear in the route log of the document 306 * @param adHocRecipients list of ad hoc recipients to which the document will be routed 307 * @return the document 308 * @throws WorkflowException 309 */ 310 public Document sendAdHocRequests(Document document, String annotation, List<AdHocRouteRecipient> adHocRecipients) throws WorkflowException; 311 312 /** 313 * Builds an workflow notification request for the note and sends it to note recipient. 314 * 315 * @param document - document that contains the note 316 * @param note - note to notify 317 * @param sender - user who is sending the notification 318 * @return the document 319 * @throws WorkflowException 320 */ 321 public Document sendNoteRouteNotification(Document document, Note note, Person sender) throws WorkflowException; 322 323 /** 324 * Recall the document, optionally providing an annotation for the recall which will show up in the route 325 * log of the document for the action taken. 326 * 327 * @since 2.1 328 * @param document the document to recall 329 * @param annotation the annotation to appear in the route log of the document 330 * @param cancel indicates if the document should be canceled as part of the recall 331 * @return the recalled document 332 * @throws WorkflowException 333 */ 334 public Document recallDocument(Document document, String annotation, boolean cancel) throws WorkflowException; 335 336 /** 337 * Save and then complete the document, optionally providing an annotation which will show up in the route log 338 * of the document for the action taken, and optionally providing a list of ad hoc recipients for the document 339 * 340 * @param document the document to complete 341 * @param annotation the annotation to appear in the route log of the document 342 * @param adHocRecipients list of ad hoc recipients to which the document will be routed 343 * @return the saved and completed document 344 */ 345 public Document completeDocument(Document document, String annotation, List adHocRecipients) throws WorkflowException; 346 347 /** 348 * Helper method used to save and validate a document 349 * 350 * @param document document to be validated and persisted 351 * @param event indicates which kualiDocumentEvent was requested 352 * @return the saved document 353 */ 354 public Document validateAndPersistDocument(Document document, KualiDocumentEvent event) throws ValidationException; 355 }