View Javadoc

1   /**
2    * Copyright 2005-2014 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.krad.maintenance;
17  
18  import org.kuali.rice.kim.api.identity.Person;
19  import org.kuali.rice.krad.bo.BusinessObject;
20  import org.kuali.rice.krad.bo.DocumentHeader;
21  import org.kuali.rice.krad.bo.PersistableBusinessObject;
22  import org.kuali.rice.krad.uif.service.ViewHelperService;
23  
24  import java.util.List;
25  import java.util.Map;
26  
27  /**
28   * Provides contract for implementing a maintenance object within the maintenance framework
29   *
30   * <p> Currently the <code>Maintainable</code> serves many purposes. First since all maintenance documents share the
31   * same document class <code>MaintenanceDocumentBase</code> certain document callbacks such as workflow post processing
32   * are invoked on the maintainable. Second the maintainable provides a hook for custom actions on the maintenance view.
33   * Finally since the maintainable extends <code>ViewHelperService</code> it is used to customize <code>View</code>
34   * configuration for <code>MaintenanceView</code> instances </p>
35   *
36   * @author Kuali Rice Team (rice.collab@kuali.org)
37   */
38  public interface Maintainable extends ViewHelperService, java.io.Serializable {
39  
40      /**
41       * Sets the document number on this maintainable for referencing back to the containing
42       * <code>MaintenanceDocument</code>
43       *
44       * @param documentNumber - document number for the containing maintenance document
45       */
46      public void setDocumentNumber(String documentNumber);
47  
48      /**
49       * Invoked when setting the title for the document instance in workflow (doc search results)
50       * to customize the title
51       *
52       * @param document - maintenance document instance to build title for
53       * @return String document title
54       */
55      public String getDocumentTitle(MaintenanceDocument document);
56  
57      /**
58       * Returns instance of the data object that is being maintained
59       *
60       * @return Object data object instance
61       */
62      public Object getDataObject();
63  
64      /**
65       * Sets an instance of a data object that should be maintained
66       *
67       * @param object - data object instance
68       */
69      public void setDataObject(Object object);
70  
71      /**
72       * Returns the class for the data object being maintained
73       *
74       * @return Class data object class
75       */
76      public Class getDataObjectClass();
77  
78      /**
79       * Sets the class for the data object that will be maintained
80       *
81       * @param dataObjectClass - class for maintenance data object
82       */
83      public void setDataObjectClass(Class dataObjectClass);
84  
85      /**
86       * Indicates whether the object can be locked
87       *
88       * <p>
89       * If this method is overridden, most likely  getPersistableBusinessObject() should be
90       * overridden as well.
91       * </p>
92       *
93       * @return true if maintenance is lockable, false otherwise
94       */
95      public boolean isLockable();
96  
97      /**
98       * Returns the persistable business object or null if none exists.
99       *
100      * @return persistable buisness object
101      */
102     public PersistableBusinessObject getPersistableBusinessObject();
103 
104     /**
105      * Returns the type of maintenance action this maintainable has been configured with
106      *
107      * @return String maintenance action string
108      */
109     public String getMaintenanceAction();
110 
111     /**
112      * Sets the type of maintenance action to be performed (new, edit, or copy)
113      *
114      * @param maintenanceAction - string identifying the action type
115      */
116     public void setMaintenanceAction(String maintenanceAction);
117 
118     /**
119      * Invoked to generating the list of maintenance locks used to block other edits
120      * of the same data object record
121      *
122      * @return the locking representation(s) of this document, which are reproducible
123      *         given the same keys and the same maintainable object
124      */
125     public List<MaintenanceLock> generateMaintenanceLocks();
126 
127     /**
128      * Invoked to persist changes to the data object being maintained
129      *
130      * <p>
131      * Called after the maintenance document has become final indicating
132      * the changes should be applied
133      * </p>
134      */
135     public void saveDataObject();
136 
137     /**
138      * Invokes to delete the data object being maintained
139      *
140      * <p>
141      * Called after the maintenance document has become final indicating
142      * the changes should be applied
143      * </p>
144      */
145     public void deleteDataObject();
146 
147     /**
148      * Invoked do perform custom processing when the route status for the containing
149      * maintenance document changes
150      *
151      * <p>
152      * Usually used for determining when the document has become final so further actions
153      * can take place in addition to the usual persistence of the object changes
154      * </p>
155      *
156      * @param documentHeader - document header instance for containing maintenance document which
157      * can be used to check the new status
158      */
159     public void doRouteStatusChange(DocumentHeader documentHeader);
160 
161     /**
162      * Retrieves the locking document id for the maintainable which is used to create the
163      * maintenance lock string
164      *
165      * @return String locking id
166      */
167     public String getLockingDocumentId();
168 
169     /**
170      * Return an array of document ids to lock prior to processing this document
171      * in the workflow engine
172      *
173      * @return List<String> list of document ids
174      */
175     public List<String> getWorkflowEngineDocumentIdsToLock();
176 
177     /**
178      * Indicates whether or not this maintainable supports custom lock
179      * descriptors for pessimistic locking.
180      *
181      * @return boolean true if the maintainable can generate custom lock descriptors,
182      *         false otherwise
183      * @see #getCustomLockDescriptor(Map, org.kuali.rice.kim.api.identity.Person)
184      */
185     public boolean useCustomLockDescriptors();
186 
187     /**
188      * Generates a custom lock descriptor for pessimistic locking. This method
189      * should not be called unless {@link #useCustomLockDescriptors()} returns
190      * true
191      *
192      * @param user - the user trying to establish the lock
193      * @return String representing the lock descriptor
194      * @see #useCustomLockDescriptors()
195      * @see org.kuali.rice.krad.service.PessimisticLockService
196      * @see org.kuali.rice.krad.service.impl.PessimisticLockServiceImpl
197      */
198     public String getCustomLockDescriptor(Person user);
199 
200     /**
201      * Indicates whether this maintainable supports notes on the maintenance object
202      *
203      * <p>
204      * Note this is only applicable if the data object is an instance of <code>BusinessObject</code>
205      * </p>
206      *
207      * @return boolean true if notes are supported, false if they are not supported
208      */
209     public boolean isNotesEnabled();
210 
211     /**
212      * Indicates whether the object being maintained is an instance of <code>ExternalizableBusinessObject</code>
213      *
214      * <p>
215      * For the case when we want to maintain a business object that doesn't
216      * necessarily map to a single table in the database or may doesn't map to a
217      * database at all
218      * </p>
219      *
220      * @return boolean true if the data object is an external business object, false if not
221      */
222     public boolean isExternalBusinessObject();
223 
224     /**
225      * Invoked to prepare a new <code>BusinessObject</code> instance that is external
226      *
227      * @param businessObject - new business object instance to prepare
228      */
229     public void prepareExternalBusinessObject(BusinessObject businessObject);
230 
231     /**
232      * Indicates whether their is an old data object for the maintainable
233      *
234      * @return boolean true if old data object exists, false if not
235      */
236     public boolean isOldDataObjectInDocument();
237 
238     /**
239      * Hook for performing any custom processing before the maintenance object is saved
240      */
241     public void prepareForSave();
242 
243     /**
244      * Hook for performing any custom processing after the maintenance object is retrieved from persistence storage
245      */
246     public void processAfterRetrieve();
247 
248     /**
249      * Called during setupMaintenanceObject to retrieve the original dataObject that is being
250      * edited or copied.  Override this method for non BusinessObject external persistence,
251      * Maintainable objects that extend BO should override isExternalBusinessObject and
252      * prepareBusinessObject instead.
253      *
254      * Do not override this method and isExternalBusinessObject.
255      *
256      * @param document document instance for the maintenance object
257      * @param dataObjectKeys Map of keys for the requested object
258      * @return the object identified by the dataObjectKeys
259      */
260     public Object retrieveObjectForEditOrCopy(MaintenanceDocument document, Map<String, String> dataObjectKeys);
261 
262     /**
263      * Performs the setting of some attributes that might be necessary
264      * if we're creating a new business object using on an existing business object.
265      * For example, create a division Vendor based on an existing parent Vendor.
266      * (Please see VendorMaintainableImpl.java)
267      *
268      * @param document - maintenance document instance this maintainable belong to
269      * @param requestParameters - map of request parameters sent for the request
270      */
271     public void setupNewFromExisting(MaintenanceDocument document, Map<String, String[]> parameters);
272 
273     /**
274      * Hook for performing any custom processing after the maintenance object has been setup for a copy action
275      *
276      * @param document - maintenance document instance this maintainable belong to
277      * @param requestParameters - map of request parameters sent for the copy request
278      */
279     public void processAfterCopy(MaintenanceDocument document, Map<String, String[]> requestParameters);
280 
281     /**
282      * Hook for performing any custom processing after the maintenance object has been setup for a edit action
283      *
284      * @param document - maintenance document instance this maintainable belong to
285      * @param requestParameters - map of request parameters sent for the copy request
286      */
287     public void processAfterEdit(MaintenanceDocument document, Map<String, String[]> requestParameters);
288 
289     /**
290      * Hook for performing any custom processing after the maintenance object has been setup for a new action
291      *
292      * @param document - maintenance document instance this maintainable belong to
293      * @param requestParameters - map of request parameters sent for the copy request
294      */
295     public void processAfterNew(MaintenanceDocument document, Map<String, String[]> requestParameters);
296 
297     /**
298      * Hook for performing any custom processing after each posting of the maintenance document (for various actions
299      * like add line, refresh)
300      *
301      * @param document - maintenance document instance this maintainable belong to
302      * @param requestParameters - map of request parameters from the post
303      */
304     public void processAfterPost(MaintenanceDocument document, Map<String, String[]> requestParameters);
305 }