001 /* 002 * Copyright 2011 The Kuali Foundation. 003 * 004 * Licensed under the Educational Community License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/ecl2.php 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 package org.kuali.kfs.gl.dataaccess.impl; 017 018 import java.sql.Connection; 019 import java.sql.Date; 020 import java.sql.Statement; 021 import java.util.ArrayList; 022 import java.util.Collection; 023 import java.util.Iterator; 024 import java.util.List; 025 import java.util.Map; 026 027 import org.apache.ojb.broker.query.Criteria; 028 import org.apache.ojb.broker.query.QueryByCriteria; 029 import org.apache.ojb.broker.query.QueryFactory; 030 import org.apache.ojb.broker.query.ReportQueryByCriteria; 031 import org.kuali.kfs.gl.businessobject.OriginEntryGroup; 032 import org.kuali.kfs.gl.businessobject.OriginEntrySource; 033 import org.kuali.kfs.gl.dataaccess.OriginEntryGroupDao; 034 import org.kuali.rice.kns.dao.impl.PlatformAwareDaoBaseOjb; 035 036 /** 037 * An OJB specific implementation of OriginEntryGroupDao 038 */ 039 public class OriginEntryGroupDaoOjb extends PlatformAwareDaoBaseOjb implements OriginEntryGroupDao { 040 private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(OriginEntryGroupDaoOjb.class); 041 042 private static final String DATE = "date"; 043 private static final String ID = "id"; 044 private static final String SOURCE_CODE = "sourceCode"; 045 private static final String PROCESS = "process"; 046 private static final String VALID = "valid"; 047 private static final String SCRUB = "scrub"; 048 private static final String ORIGIN_ENTRY_GRP_ID = "ORIGIN_ENTRY_GRP_ID"; 049 private static final String MAX_ORIGIN_ENTRY_GRP_ID = "max(ORIGIN_ENTRY_GRP_ID)"; 050 051 /** 052 * Given an origin entry group source type (defined in OriginEntrySource) 053 * 054 * @param sourceCode the source code of the groups to find 055 * @return a OriginEntryGroup with the given source code and max ORIGIN_ENTRY_GRP_ID 056 * @see org.kuali.kfs.gl.businessobject.OriginEntrySource 057 * @see org.kuali.kfs.gl.dataaccess.OriginEntryGroupDao#getGroupWithMaxIdFromSource(java.lang.String) 058 */ 059 public OriginEntryGroup getGroupWithMaxIdFromSource(String sourceCode) { 060 LOG.debug("getGroupWithMaxIdFromSource() started"); 061 062 Criteria crit = new Criteria(); 063 064 Criteria subCrit = new Criteria(); 065 subCrit.addEqualTo(SOURCE_CODE, sourceCode); 066 ReportQueryByCriteria subQuery = new ReportQueryByCriteria(OriginEntryGroup.class, subCrit); 067 subQuery.setAttributes(new String[]{MAX_ORIGIN_ENTRY_GRP_ID}); 068 069 crit.addGreaterOrEqualThan(ORIGIN_ENTRY_GRP_ID, subQuery); 070 071 QueryByCriteria qbc = QueryFactory.newQuery(OriginEntryGroup.class, crit); 072 073 return (OriginEntryGroup) getPersistenceBrokerTemplate().getObjectByQuery(qbc); 074 } 075 076 /** 077 * Get all the groups that are older than a date 078 * 079 * @param day the date groups returned should be older than 080 * @return a Collection of origin entry groups older than that date 081 * @see org.kuali.kfs.gl.dataaccess.OriginEntryGroupDao#getOlderGroups(Date) 082 */ 083 public Collection<OriginEntryGroup> getOlderGroups(Date day) { 084 LOG.debug("getOlderGroups() started"); 085 086 Criteria criteria = new Criteria(); 087 criteria.addLessOrEqualThan(DATE, day); 088 089 return getPersistenceBrokerTemplate().getCollectionByQuery(QueryFactory.newQuery(OriginEntryGroup.class, criteria)); 090 } 091 092 /** 093 * Delete all the groups in the list. Note...it doesn't delete the entries within them, you need 094 * OriginEntryDao.deleteGroups for that 095 * 096 * @params groups a Collection of origin entry groups to delete 097 * @see org.kuali.kfs.gl.dataaccess.OriginEntryGroupDao#deleteGroups(java.util.Collection) 098 */ 099 public void deleteGroups(Collection<OriginEntryGroup> groups) { 100 LOG.debug("deleteGroups() started"); 101 102 List ids = new ArrayList(); 103 for (Iterator iter = groups.iterator(); iter.hasNext();) { 104 OriginEntryGroup element = (OriginEntryGroup) iter.next(); 105 ids.add(element.getId()); 106 } 107 Criteria criteria = new Criteria(); 108 criteria.addIn(ID, ids); 109 110 getPersistenceBrokerTemplate().deleteByQuery(QueryFactory.newQuery(OriginEntryGroup.class, criteria)); 111 getPersistenceBrokerTemplate().clearCache(); 112 } 113 114 /** 115 * Builds an OJB query out of the given map of criteria and fetches all the groups that match the criteria 116 * 117 * @param searchCriteria a Map of search criteria to form the query 118 * @return a Collection of Origin Entry Groups that match that criteria 119 * @see org.kuali.kfs.gl.dataaccess.OriginEntryGroupDao#getMatchingGroups(java.util.Map) 120 */ 121 public Collection getMatchingGroups(Map searchCriteria) { 122 LOG.debug("getMatchingGroups() started"); 123 124 Criteria criteria = new Criteria(); 125 for (Iterator iterator = searchCriteria.keySet().iterator(); iterator.hasNext();) { 126 String key = iterator.next().toString(); 127 criteria.addEqualTo(key, searchCriteria.get(key)); 128 } 129 130 QueryByCriteria qbc = QueryFactory.newQuery(OriginEntryGroup.class, criteria); 131 return getPersistenceBrokerTemplate().getCollectionByQuery(qbc); 132 } 133 134 /** 135 * Get all the groups for the poster (that is to say, Groups with "Process" being true) 136 * 137 * @param groupSourceCode the source code of origin entry groups to return 138 * @return a Collection of origin entry groups that should be processed by the poster 139 * @see org.kuali.kfs.gl.dataaccess.OriginEntryGroupDao#getPosterGroups(java.lang.String) 140 */ 141 public Collection getPosterGroups(String groupSourceCode) { 142 LOG.debug("getPosterGroups() started"); 143 144 Criteria criteria = new Criteria(); 145 criteria.addEqualTo(SOURCE_CODE, groupSourceCode); 146 criteria.addEqualTo(PROCESS, Boolean.TRUE); 147 criteria.addEqualTo(VALID, Boolean.TRUE); 148 149 QueryByCriteria qbc = QueryFactory.newQuery(OriginEntryGroup.class, criteria); 150 return getPersistenceBrokerTemplate().getCollectionByQuery(qbc); 151 } 152 153 /** 154 * Gets a collection of all backup groups that are scrubbable (i.e. valid, process, scrub indicators all set to true) 155 * 156 * @return a Collection of scrubbable origin entry groups 157 * @see org.kuali.kfs.gl.dataaccess.OriginEntryGroupDao#getAllScrubbableBackupGroups() 158 */ 159 public Collection<OriginEntryGroup> getAllScrubbableBackupGroups() { 160 Criteria criteria = new Criteria(); 161 criteria.addEqualTo(SOURCE_CODE, OriginEntrySource.BACKUP); 162 criteria.addEqualTo(SCRUB, Boolean.TRUE); 163 criteria.addEqualTo(PROCESS, Boolean.TRUE); 164 criteria.addEqualTo(VALID, Boolean.TRUE); 165 166 QueryByCriteria qbc = QueryFactory.newQuery(OriginEntryGroup.class, criteria); 167 return getPersistenceBrokerTemplate().getCollectionByQuery(qbc); 168 } 169 170 /** 171 * Get all the groups to be copied into the backup group 172 * 173 * @param groupDate the date returned origin entry groups must have been created on or before 174 * @return a Collection of origin entry groups to backup 175 * @see org.kuali.kfs.gl.dataaccess.OriginEntryGroupDao#getScrubberGroups(java.sql.Date) 176 */ 177 public Collection getGroupsToBackup(Date groupDate) { 178 LOG.debug("getGroupsToBackup() started"); 179 180 Criteria criteria = new Criteria(); 181 criteria.addLessOrEqualThan(DATE, groupDate); 182 criteria.addEqualTo(SCRUB, Boolean.TRUE); 183 criteria.addEqualTo(PROCESS, Boolean.TRUE); 184 criteria.addEqualTo(VALID, Boolean.TRUE); 185 186 QueryByCriteria qbc = QueryFactory.newQuery(OriginEntryGroup.class, criteria); 187 return getPersistenceBrokerTemplate().getCollectionByQuery(qbc); 188 } 189 190 /** 191 * Saves an origin entry group 192 * 193 * @param group the group to save 194 * @see org.kuali.kfs.gl.dataaccess.OriginEntryGroupDao#save(org.kuali.kfs.gl.businessobject.OriginEntryGroup) 195 */ 196 public void save(OriginEntryGroup group) { 197 LOG.debug("save() started"); 198 199 getPersistenceBrokerTemplate().store(group); 200 } 201 202 /** 203 * We all know that computers aren't naturally exact. They like to fudge things. Databases especially. 204 * If you send a database a table name and a primary key on that table, you really never know what you're 205 * going to get, now do you? But this method makes sure that that rascally database returns the origin 206 * entry group with the primary key of the given group id. Or null if it can't find anything. It works 207 * by magic. 208 * 209 * @param id the id of the origin entry group to return 210 * @return an Origin Entry Group, or null if the exact one couldn't be found 211 * @see org.kuali.kfs.gl.dataaccess.OriginEntryGroupDao#getExactMatchingEntryGroup(java.lang.Integer) 212 */ 213 public OriginEntryGroup getExactMatchingEntryGroup(Integer id) { 214 LOG.debug("getMatchingEntries() started"); 215 return (OriginEntryGroup) getPersistenceBrokerTemplate().getObjectById(OriginEntryGroup.class, id); 216 } 217 218 /** 219 * Given a date, finds all origin entry groups that were created on or after that date 220 * @param day the date that defines recency - all qualifying origin entries groups will have been created on or after that day 221 * @return a Collection of OriginEntryGroup records 222 * @see org.kuali.kfs.gl.dataaccess.OriginEntryGroupDao#getRecentGroups(Date) 223 */ 224 public Collection<OriginEntryGroup> getRecentGroups(Date day) { 225 LOG.debug("getOlderGroups() started"); 226 227 Criteria criteria = new Criteria(); 228 criteria.addGreaterOrEqualThan(DATE, day); 229 230 return getPersistenceBrokerTemplate().getCollectionByQuery(QueryFactory.newQuery(OriginEntryGroup.class, criteria)); 231 } 232 233 234 }