1 /**
2 * Copyright 2005-2013 The Kuali Foundation
3 *
4 * Licensed under the Educational Community License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.opensource.org/licenses/ecl2.php
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 package org.kuali.rice.krad.service;
17
18 import org.kuali.rice.krad.bo.BusinessObject;
19 import org.kuali.rice.krad.bo.PersistableBusinessObject;
20
21 import java.util.Collection;
22 import java.util.List;
23 import java.util.Map;
24
25 /**
26 * Defines methods that a BusinessObjectService must provide
27 *
28 * @author Kuali Rice Team (rice.collab@kuali.org)
29 */
30 public interface BusinessObjectService {
31
32 /**
33 * Saves the passed in object via the persistence layer.
34 *
35 * This will throw an IllegalArgumentException (runtime exception) if the object passed in is not a descendent of
36 * BusinessObject.
37 *
38 * @param bo A BusinessObject instance or descendent that you wish to be stored.
39 */
40 public <T extends PersistableBusinessObject> T save(T bo);
41
42 /**
43 * Saves the businessObjects on the list via the persistence layer.
44 *
45 * This will throw an IllegalArgumentException (runtime exception) if any of the objects passed in is not a descendent of
46 * BusinessObject.
47 *
48 * @param businessObjects A List<PersistableBusinessObject> of objects to persist.
49 */
50 public List<? extends PersistableBusinessObject> save(List<? extends PersistableBusinessObject> businessObjects);
51
52 /**
53 * Links up any contained objects, and then Saves the passed in object via the persistence layer.
54 *
55 * This will throw an IllegalArgumentException (runtime exception) if the object passed in is not a descendent of
56 * BusinessObject.
57 *
58 * @param bo A BusinessObject instance or descendent that you wish to be stored.
59 */
60 public PersistableBusinessObject linkAndSave(PersistableBusinessObject bo);
61
62 /**
63 * Links up any contained objects, and Saves the businessObjects on the list via the persistence layer.
64 *
65 * This will throw an IllegalArgumentException (runtime exception) if any of the objects passed in is not a descendent of
66 * BusinessObject.
67 *
68 * @param businessObjects A List<BusinessObject> of objects to persist.
69 *
70 */
71 public List<? extends PersistableBusinessObject> linkAndSave(List<? extends PersistableBusinessObject> businessObjects);
72
73 /**
74 * Retrieves an object instance identified by its primary key. For composite keys, use {@link #findByPrimaryKey(Class, Map)}
75 *
76 * @param clazz
77 * @param primaryKey
78 * @return
79 */
80 public <T extends BusinessObject> T findBySinglePrimaryKey(Class<T> clazz, Object primaryKey);
81
82 /**
83 * Retrieves an object instance identified by its primary keys and values. This can be done by constructing a map where the key
84 * to the map entry is the primary key attribute and the value of the entry being the primary key value. For composite keys,
85 * pass in each primaryKey attribute and its value as a map entry.
86 *
87 * @param clazz
88 * @param primaryKeys
89 * @return
90 */
91 public <T extends BusinessObject> T findByPrimaryKey(Class<T> clazz, Map<String, ?> primaryKeys);
92
93 /**
94 * Retrieves an object instance identified by the class of the given object and the object's primary key values.
95 *
96 * @param object
97 * @return
98 */
99 public PersistableBusinessObject retrieve(PersistableBusinessObject object);
100
101 /**
102 * Retrieves a collection of business objects populated with data, such that each record in the database populates a new object
103 * instance. This will only retrieve business objects by class type.
104 *
105 * @param clazz
106 * @return
107 */
108 public <T extends BusinessObject> Collection<T> findAll(Class<T> clazz);
109
110 /**
111 * Retrieves a collection of business objects populated with data, such that each record in the database populates a new object
112 * instance. This will only retrieve business objects by class type.
113 *
114 * @param clazz
115 * @return
116 */
117 public <T extends BusinessObject> Collection<T> findAllOrderBy( Class<T> clazz, String sortField, boolean sortAscending );
118
119 /**
120 * This method retrieves a collection of business objects populated with data, such that each record in the database populates a
121 * new object instance. This will retrieve business objects by class type and also by criteria passed in as key-value pairs,
122 * specifically attribute name and its expected value.
123 *
124 * @param clazz
125 * @param fieldValues
126 * @return
127 */
128 public <T extends BusinessObject> Collection<T> findMatching(Class<T> clazz, Map<String, ?> fieldValues);
129
130 /**
131 * Finds all entities matching the passed in Rice JPA criteria
132 *
133 * @param <T> the type of the entity that will be returned
134 * @param criteria the criteria to form the query with
135 * @return a Collection (most likely a List) of all matching entities
136 */
137 //public abstract <T extends BusinessObject> Collection<T> findMatching(Criteria criteria);
138
139 /**
140 * This method retrieves a count of the business objects populated with data which match the criteria in the given Map.
141 *
142 * @param clazz
143 * @param fieldValues
144 * @return number of businessObjects of the given class whose fields match the values in the given expected-value Map
145 */
146 public int countMatching(Class clazz, Map<String, ?> fieldValues);
147
148 /**
149 * This method retrieves a count of the business objects populated with data which match both the positive criteria
150 * and the negative criteria in the given Map.
151 *
152 * @param clazz
153 * @param positiveFieldValues
154 * @param negativeFieldValues
155 * @return number of businessObjects of the given class whose fields match the values in the given expected-value Maps
156 */
157 public int countMatching(Class clazz, Map<String, ?> positiveFieldValues, Map<String, ?> negativeFieldValues);
158
159 /**
160 * This method retrieves a collection of business objects populated with data, such that each record in the database populates a
161 * new object instance. This will retrieve business objects by class type and also by criteria passed in as key-value pairs,
162 * specifically attribute name and its expected value. Performs an order by on sort field.
163 *
164 * @param clazz
165 * @param fieldValues
166 * @return
167 */
168 public <T extends BusinessObject> Collection<T> findMatchingOrderBy(Class<T> clazz, Map<String, ?> fieldValues, String sortField, boolean sortAscending);
169
170 /**
171 * Deletes a business object from the database.
172 *
173 * @param bo
174 */
175 public void delete(PersistableBusinessObject bo);
176
177 /**
178 * Deletes each business object in the given List.
179 *
180 * @param boList
181 */
182 public void delete(List<? extends PersistableBusinessObject> boList);
183
184 /**
185 * Deletes the object(s) matching the given field values
186 *
187 * @param clazz
188 * @param fieldValues
189 */
190 public void deleteMatching(Class clazz, Map<String, ?> fieldValues);
191
192 /**
193 *
194 * This method attempts to retrieve the reference from a BO if it exists.
195 *
196 * @param bo - populated BusinessObject instance that includes the referenceName property
197 * @param referenceName - name of the member/property to load
198 * @return A populated object from the DB, if it exists
199 *
200 */
201 public BusinessObject getReferenceIfExists(BusinessObject bo, String referenceName);
202
203 /**
204 *
205 * Updates all KualiUser or Person objects contained within this BO, based on the UserID as the authoritative key. The
206 * appropriate foreign-key field in the BO itself is also updated.
207 *
208 * This allows UserIDs to be entered on forms, and the back-end will link up correctly based on this non-key field.
209 *
210 * @param bo The populated BO (or descendent) instance to be linked & updated
211 *
212 */
213 public void linkUserFields(PersistableBusinessObject bo);
214
215 /**
216 *
217 * Updates all KualiUser or Person objects contained within this BO, based on the UserID as the authoritative key. The
218 * appropriate foreign-key field in the BO itself is also updated.
219 *
220 * This allows UserIDs to be entered on forms, and the back-end will link up correctly based on this non-key field.
221 *
222 * @param bos A List of populated BusinessObject (or descendent) instances to be linked & updated.
223 */
224 public void linkUserFields(List<PersistableBusinessObject> bos);
225
226 /**
227 * Merges the given business object, but tells the ORM that the object is to be treated as Read Only,
228 * and even if it has changes, it will not be persisted to the database
229 *
230 * @param bo the business object to managed
231 * @return the managed copied of the business object
232 */
233 public PersistableBusinessObject manageReadOnly(PersistableBusinessObject bo);
234
235 }
236