1 /** 2 * Copyright 2005-2016 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.data.provider; 17 18 import org.kuali.rice.core.api.criteria.QueryByCriteria; 19 import org.kuali.rice.core.api.criteria.QueryResults; 20 import org.kuali.rice.krad.data.CopyOption; 21 import org.kuali.rice.krad.data.PersistenceOption; 22 23 /** 24 * Defines persistence SPI for data providers. 25 * 26 * <p> 27 * PersistenceProviders are responsible for creating, updating, querying, copying and deleting data objects. 28 * DataObjectTypes the PersistenceProvider supports must be queried through {@link #handles(Class)} before interaction 29 * with the PersistenceProvider. 30 * </p> 31 * 32 * @author Kuali Rice Team (rice.collab@kuali.org) 33 */ 34 public interface PersistenceProvider extends Provider { 35 36 /** 37 * Saves the given data object, determining whether or not this is a new data object which is being created, or an 38 * existing one which should be updated. 39 * 40 * <p> 41 * Optional persistence options can be passed to indicate whether or not linking should be performed prior to 42 * persistence and whether or not validation should be performed. By default, linking is performed as well as 43 * validation. 44 * </p> 45 * 46 * @param dataObject the data object to save 47 * @param options the options to use when saving the data object 48 * @param <T> the data object class type 49 * 50 * @return the saved data object, calling code should always use the reference the object returned from this method 51 * for future operations after calling the save since it could have been updated 52 * 53 * @throws IllegalArgumentException if {@code dataObject} is not a valid data object 54 * @throws org.springframework.dao.DataAccessException if data access fails 55 */ 56 <T> T save(T dataObject, PersistenceOption... options); 57 58 /** 59 * Invoked to retrieve a data object instance by a single primary key field or id object. 60 * 61 * <p>In the case of a compound primary key consisting of multiple attributes on the data object, a CompoundKey can 62 * be passed in order to encapsulate these into a single argument. 63 * </p> 64 * 65 * @param type the type of the data object to find 66 * @param id the id representing the primary key of the data object to find 67 * @param <T> the data object class type 68 * 69 * @return the entity with the given primary key or null if none found 70 * 71 * @throws IllegalArgumentException if {@code type} does not denote a data object type or {@code id} is not a valid 72 * type for the data object's primary key or is null 73 * @throws org.springframework.dao.DataAccessException if data access fails 74 */ 75 <T> T find(Class<T> type, Object id); 76 77 /** 78 * Executes a query for the given data object. 79 * 80 * <p> 81 * If the given QueryByCriteria is empty or null, then all data objects for the given type will be returned. 82 * Depending on the given criteria and the implementation for the query execution, not all matching results may be 83 * returned. The QueryResults will contain information on whether or not there are additional results which can be 84 * used for paging and similar functionality. 85 * </p> 86 * 87 * @param type the type of the data objects to query 88 * @param queryByCriteria query object, can contain sorting and page request configuration 89 * @param <T> the data object class type 90 * 91 * @return the results of the query, will never return null but may return empty results 92 * 93 * @throws IllegalArgumentException if {@code type} does not denote a data object type or if {@code queryByCriteria} 94 * is null 95 * @throws org.springframework.dao.DataAccessException if data access fails 96 */ 97 <T> QueryResults<T> findMatching(Class<T> type, QueryByCriteria queryByCriteria); 98 99 /** 100 * Retrieves all data objects for the given type. 101 * 102 * @param type the type of data objects to find 103 * @param <T> the data object class type 104 * 105 * @return the results of the query, will never return null but may return empty results 106 * 107 * @throws java.lang.IllegalArgumentException if type is null. 108 */ 109 <T> QueryResults<T> findAll(Class<T> type); 110 111 /** 112 * Deletes a given data object. 113 * 114 * @param dataObject the data object to delete 115 * 116 * @throws IllegalArgumentException if {@code dataObject} is not a valid data object 117 * @throws org.springframework.dao.DataAccessException if data access fails 118 */ 119 void delete(Object dataObject); 120 121 /** 122 * Deletes data objects based on the given criteria 123 * 124 * <p>If the given criteria is empty or null than an {@link java.lang.IllegalArgumentException} will be thrown. 125 * If the given type is null then an {@link java.lang.IllegalArgumentException} will be thrown.</p> 126 * 127 * @param type the type of data object 128 * @param queryByCriteria criteria to filter by 129 * 130 * @throws IllegalArgumentException if the criteria or criteria predicate is null 131 * @throws org.springframework.dao.DataAccessException if data access fails 132 */ 133 <T> void deleteMatching(Class<T> type, QueryByCriteria queryByCriteria); 134 135 /** 136 * Deletes all data objects based on the given type. 137 * 138 * @param type the type of data objects to delete 139 * @param <T> the data object class type 140 * 141 * @throws IllegalArgumentException if the class type is null 142 * @throws org.springframework.dao.DataAccessException if data access fails 143 */ 144 <T> void deleteAll(Class<T> type); 145 146 /** 147 * Returns a copy of the given data object instance. 148 * 149 * <p> 150 * The method of copying is provider dependent, and will handle instances (including nested) using whatever measures 151 * might be required to deal with the quirks of said provider (e.g. fetching lazy loaded relations). 152 * </p> 153 * 154 * @param dataObject the data object to copy 155 * @param <T> the type of the data object 156 * 157 * @return a copy of the given data object 158 */ 159 <T> T copyInstance(T dataObject, CopyOption... options); 160 161 /** 162 * Indicates whether or not this provider handles persistence for the given data object type. 163 * 164 * <p> 165 * Responsibility on with the caller to call prior to invocation of any other PersistenceProvider methods to ensure 166 * the data objects of the right type are passed. 167 * </p> 168 * 169 * @param type the data object type to check 170 * 171 * @return true if this provider can handle the given type, false otherwise 172 */ 173 boolean handles(Class<?> type); 174 175 /** 176 * Flush any outstanding changes within the current context for the provider pertaining to the given data object 177 * Class type. 178 * 179 * <p> 180 * If an implementation of this interface does not support or require the concept of "flushing", this method can be 181 * ignored. However, when used, this must purge *all* cache items for the given types from all caches managed by 182 * this provider. 183 * </p> 184 * 185 * @param type 186 * the type of the data object for which to perform the flush. This should be used to identify the 187 * context in which to perform the flush. 188 */ 189 void flush(Class<?> type); 190 191 }