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