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 * This interface defines methods that a BusinessObjectService must provide.
27 *
28 *
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 */
41 public <T extends PersistableBusinessObject> T save(T bo);
42
43 /**
44 * Saves the businessObjects on the list via the persistence layer.
45 *
46 * This will throw an IllegalArgumentException (runtime exception) if any of the objects passed in is not a descendent of
47 * BusinessObject.
48 *
49 * @param businessObjects A List<PersistableBusinessObject> of objects to persist.
50 *
51 */
52 public List<? extends PersistableBusinessObject> save(List<? extends PersistableBusinessObject> businessObjects);
53
54 /**
55 * Links up any contained objects, and then Saves the passed in object via the persistence layer.
56 *
57 * This will throw an IllegalArgumentException (runtime exception) if the object passed in is not a descendent of
58 * BusinessObject.
59 *
60 * @param bo A BusinessObject instance or descendent that you wish to be stored.
61 *
62 */
63 public PersistableBusinessObject linkAndSave(PersistableBusinessObject bo);
64
65 /**
66 * Links up any contained objects, and Saves the businessObjects on the list via the persistence layer.
67 *
68 * This will throw an IllegalArgumentException (runtime exception) if any of the objects passed in is not a descendent of
69 * BusinessObject.
70 *
71 * @param businessObjects A List<BusinessObject> of objects to persist.
72 *
73 */
74 public List<? extends PersistableBusinessObject> linkAndSave(List<? extends PersistableBusinessObject> businessObjects);
75
76 /**
77 * Retrieves an object instance identified by its primary key. For composite keys, use {@link #findByPrimaryKey(Class, Map)}
78 *
79 * @param clazz
80 * @param primaryKey
81 * @return
82 */
83 public <T extends BusinessObject> T findBySinglePrimaryKey(Class<T> clazz, Object primaryKey);
84
85 /**
86 * Retrieves an object instance identified by its primary keys and values. This can be done by constructing a map where the key
87 * to the map entry is the primary key attribute and the value of the entry being the primary key value. For composite keys,
88 * pass in each primaryKey attribute and its value as a map entry.
89 *
90 * @param clazz
91 * @param primaryKeys
92 * @return
93 */
94 public <T extends BusinessObject> T findByPrimaryKey(Class<T> clazz, Map<String, ?> primaryKeys);
95
96 /**
97 * Retrieves an object instance identified by the class of the given object and the object's primary key values.
98 *
99 * @param object
100 * @return
101 */
102 public PersistableBusinessObject retrieve(PersistableBusinessObject object);
103
104 /**
105 * Retrieves a collection of business objects populated with data, such that each record in the database populates a new object
106 * instance. This will only retrieve business objects by class type.
107 *
108 * @param clazz
109 * @return
110 */
111 public <T extends BusinessObject> Collection<T> findAll(Class<T> clazz);
112
113 /**
114 * Retrieves a collection of business objects populated with data, such that each record in the database populates a new object
115 * instance. This will only retrieve business objects by class type.
116 *
117 * @param clazz
118 * @return
119 */
120 public <T extends BusinessObject> Collection<T> findAllOrderBy( Class<T> clazz, String sortField, boolean sortAscending );
121
122 /**
123 * This method retrieves a collection of business objects populated with data, such that each record in the database populates a
124 * new object instance. This will retrieve business objects by class type and also by criteria passed in as key-value pairs,
125 * specifically attribute name and its expected value.
126 *
127 * @param clazz
128 * @param fieldValues
129 * @return
130 */
131 public <T extends BusinessObject> Collection<T> findMatching(Class<T> clazz, Map<String, ?> fieldValues);
132
133 /**
134 * Finds all entities matching the passed in Rice JPA criteria
135 *
136 * @param <T> the type of the entity that will be returned
137 * @param criteria the criteria to form the query with
138 * @return a Collection (most likely a List) of all matching entities
139 */
140 //public abstract <T extends BusinessObject> Collection<T> findMatching(Criteria criteria);
141
142 /**
143 * This method retrieves a count of the business objects populated with data which match the criteria in the given Map.
144 *
145 * @param clazz
146 * @param fieldValues
147 * @return number of businessObjects of the given class whose fields match the values in the given expected-value Map
148 */
149 public int countMatching(Class clazz, Map<String, ?> fieldValues);
150
151 /**
152 * This method retrieves a count of the business objects populated with data which match both the positive criteria
153 * and the negative criteria in the given Map.
154 *
155 * @param clazz
156 * @param positiveFieldValues
157 * @param negativeFieldValues
158 * @return number of businessObjects of the given class whose fields match the values in the given expected-value Maps
159 */
160 public int countMatching(Class clazz, Map<String, ?> positiveFieldValues, Map<String, ?> negativeFieldValues);
161
162 /**
163 * This method retrieves a collection of business objects populated with data, such that each record in the database populates a
164 * new object instance. This will retrieve business objects by class type and also by criteria passed in as key-value pairs,
165 * specifically attribute name and its expected value. Performs an order by on sort field.
166 *
167 * @param clazz
168 * @param fieldValues
169 * @return
170 */
171 public <T extends BusinessObject> Collection<T> findMatchingOrderBy(Class<T> clazz, Map<String, ?> fieldValues, String sortField, boolean sortAscending);
172
173 /**
174 * Deletes a business object from the database.
175 *
176 * @param bo
177 */
178 public void delete(PersistableBusinessObject bo);
179
180 /**
181 * Deletes each business object in the given List.
182 *
183 * @param boList
184 */
185 public void delete(List<? extends PersistableBusinessObject> boList);
186
187 /**
188 * Deletes the object(s) matching the given field values
189 *
190 * @param clazz
191 * @param fieldValues
192 */
193 public void deleteMatching(Class clazz, Map<String, ?> fieldValues);
194
195 /**
196 *
197 * This method attempts to retrieve the reference from a BO if it exists.
198 *
199 * @param bo - populated BusinessObject instance that includes the referenceName property
200 * @param referenceName - name of the member/property to load
201 * @return A populated object from the DB, if it exists
202 *
203 */
204 public BusinessObject getReferenceIfExists(BusinessObject bo, String referenceName);
205
206 /**
207 *
208 * Updates all KualiUser or Person objects contained within this BO, based on the UserID as the authoritative key. The
209 * appropriate foreign-key field in the BO itself is also updated.
210 *
211 * This allows UserIDs to be entered on forms, and the back-end will link up correctly based on this non-key field.
212 *
213 * @param bo The populated BO (or descendent) instance to be linked & updated
214 *
215 */
216 public void linkUserFields(PersistableBusinessObject bo);
217
218 /**
219 *
220 * Updates all KualiUser or Person objects contained within this BO, based on the UserID as the authoritative key. The
221 * appropriate foreign-key field in the BO itself is also updated.
222 *
223 * This allows UserIDs to be entered on forms, and the back-end will link up correctly based on this non-key field.
224 *
225 * @param bos A List of populated BusinessObject (or descendent) instances to be linked & updated.
226 */
227 public void linkUserFields(List<PersistableBusinessObject> bos);
228
229 /**
230 * Merges the given business object, but tells the ORM that the object is to be treated as Read Only,
231 * and even if it has changes, it will not be persisted to the database
232 *
233 * @param bo the business object to managed
234 * @return the managed copied of the business object
235 */
236 public PersistableBusinessObject manageReadOnly(PersistableBusinessObject bo);
237
238 }
239