1 /** 2 * Copyright 2005-2012 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