/* * The Kuali Financial System, a comprehensive financial management system for higher education. * * Copyright 2005-2014 The Kuali Foundation * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.kuali.kfs.gl.dataaccess.impl; import java.sql.Date; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.Map; import org.apache.ojb.broker.query.Criteria; import org.apache.ojb.broker.query.QueryByCriteria; import org.apache.ojb.broker.query.QueryFactory; import org.apache.ojb.broker.query.ReportQueryByCriteria; import org.kuali.kfs.gl.businessobject.OriginEntryGroup; import org.kuali.kfs.gl.businessobject.OriginEntrySource; import org.kuali.kfs.gl.dataaccess.OriginEntryGroupDao; import org.kuali.rice.core.framework.persistence.ojb.dao.PlatformAwareDaoBaseOjb; /** * An OJB specific implementation of OriginEntryGroupDao */ public class OriginEntryGroupDaoOjb extends PlatformAwareDaoBaseOjb implements OriginEntryGroupDao { private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(OriginEntryGroupDaoOjb.class); private static final String DATE = "date"; private static final String ID = "id"; private static final String SOURCE_CODE = "sourceCode"; private static final String PROCESS = "process"; private static final String VALID = "valid"; private static final String SCRUB = "scrub"; private static final String ORIGIN_ENTRY_GRP_ID = "ORIGIN_ENTRY_GRP_ID"; private static final String MAX_ORIGIN_ENTRY_GRP_ID = "max(ORIGIN_ENTRY_GRP_ID)"; /** * Given an origin entry group source type (defined in OriginEntrySource) * * @param sourceCode the source code of the groups to find * @return a OriginEntryGroup with the given source code and max ORIGIN_ENTRY_GRP_ID * @see org.kuali.kfs.gl.businessobject.OriginEntrySource * @see org.kuali.kfs.gl.dataaccess.OriginEntryGroupDao#getGroupWithMaxIdFromSource(java.lang.String) */ public OriginEntryGroup getGroupWithMaxIdFromSource(String sourceCode) { LOG.debug("getGroupWithMaxIdFromSource() started"); Criteria crit = new Criteria(); Criteria subCrit = new Criteria(); subCrit.addEqualTo(SOURCE_CODE, sourceCode); ReportQueryByCriteria subQuery = new ReportQueryByCriteria(OriginEntryGroup.class, subCrit); subQuery.setAttributes(new String[]{MAX_ORIGIN_ENTRY_GRP_ID}); crit.addGreaterOrEqualThan(ORIGIN_ENTRY_GRP_ID, subQuery); QueryByCriteria qbc = QueryFactory.newQuery(OriginEntryGroup.class, crit); return (OriginEntryGroup) getPersistenceBrokerTemplate().getObjectByQuery(qbc); } /** * Get all the groups that are older than a date * * @param day the date groups returned should be older than * @return a Collection of origin entry groups older than that date * @see org.kuali.kfs.gl.dataaccess.OriginEntryGroupDao#getOlderGroups(Date) */ public Collection<OriginEntryGroup> getOlderGroups(Date day) { LOG.debug("getOlderGroups() started"); Criteria criteria = new Criteria(); criteria.addLessOrEqualThan(DATE, day); return getPersistenceBrokerTemplate().getCollectionByQuery(QueryFactory.newQuery(OriginEntryGroup.class, criteria)); } /** * Delete all the groups in the list. Note...it doesn't delete the entries within them, you need * OriginEntryDao.deleteGroups for that * * @params groups a Collection of origin entry groups to delete * @see org.kuali.kfs.gl.dataaccess.OriginEntryGroupDao#deleteGroups(java.util.Collection) */ public void deleteGroups(Collection<OriginEntryGroup> groups) { LOG.debug("deleteGroups() started"); List ids = new ArrayList(); for (Iterator iter = groups.iterator(); iter.hasNext();) { OriginEntryGroup element = (OriginEntryGroup) iter.next(); ids.add(element.getId()); } Criteria criteria = new Criteria(); criteria.addIn(ID, ids); getPersistenceBrokerTemplate().deleteByQuery(QueryFactory.newQuery(OriginEntryGroup.class, criteria)); getPersistenceBrokerTemplate().clearCache(); } /** * Builds an OJB query out of the given map of criteria and fetches all the groups that match the criteria * * @param searchCriteria a Map of search criteria to form the query * @return a Collection of Origin Entry Groups that match that criteria * @see org.kuali.kfs.gl.dataaccess.OriginEntryGroupDao#getMatchingGroups(java.util.Map) */ public Collection getMatchingGroups(Map searchCriteria) { LOG.debug("getMatchingGroups() started"); Criteria criteria = new Criteria(); for (Iterator iterator = searchCriteria.keySet().iterator(); iterator.hasNext();) { String key = iterator.next().toString(); criteria.addEqualTo(key, searchCriteria.get(key)); } QueryByCriteria qbc = QueryFactory.newQuery(OriginEntryGroup.class, criteria); return getPersistenceBrokerTemplate().getCollectionByQuery(qbc); } /** * Get all the groups for the poster (that is to say, Groups with "Process" being true) * * @param groupSourceCode the source code of origin entry groups to return * @return a Collection of origin entry groups that should be processed by the poster * @see org.kuali.kfs.gl.dataaccess.OriginEntryGroupDao#getPosterGroups(java.lang.String) */ public Collection getPosterGroups(String groupSourceCode) { LOG.debug("getPosterGroups() started"); Criteria criteria = new Criteria(); criteria.addEqualTo(SOURCE_CODE, groupSourceCode); criteria.addEqualTo(PROCESS, Boolean.TRUE); criteria.addEqualTo(VALID, Boolean.TRUE); QueryByCriteria qbc = QueryFactory.newQuery(OriginEntryGroup.class, criteria); return getPersistenceBrokerTemplate().getCollectionByQuery(qbc); } /** * Gets a collection of all backup groups that are scrubbable (i.e. valid, process, scrub indicators all set to true) * * @return a Collection of scrubbable origin entry groups * @see org.kuali.kfs.gl.dataaccess.OriginEntryGroupDao#getAllScrubbableBackupGroups() */ public Collection<OriginEntryGroup> getAllScrubbableBackupGroups() { Criteria criteria = new Criteria(); criteria.addEqualTo(SOURCE_CODE, OriginEntrySource.BACKUP); criteria.addEqualTo(SCRUB, Boolean.TRUE); criteria.addEqualTo(PROCESS, Boolean.TRUE); criteria.addEqualTo(VALID, Boolean.TRUE); QueryByCriteria qbc = QueryFactory.newQuery(OriginEntryGroup.class, criteria); return getPersistenceBrokerTemplate().getCollectionByQuery(qbc); } /** * Get all the groups to be copied into the backup group * * @param groupDate the date returned origin entry groups must have been created on or before * @return a Collection of origin entry groups to backup * @see org.kuali.kfs.gl.dataaccess.OriginEntryGroupDao#getScrubberGroups(java.sql.Date) */ public Collection getGroupsToBackup(Date groupDate) { LOG.debug("getGroupsToBackup() started"); Criteria criteria = new Criteria(); criteria.addLessOrEqualThan(DATE, groupDate); criteria.addEqualTo(SCRUB, Boolean.TRUE); criteria.addEqualTo(PROCESS, Boolean.TRUE); criteria.addEqualTo(VALID, Boolean.TRUE); QueryByCriteria qbc = QueryFactory.newQuery(OriginEntryGroup.class, criteria); return getPersistenceBrokerTemplate().getCollectionByQuery(qbc); } /** * We all know that computers aren't naturally exact. They like to fudge things. Databases especially. * If you send a database a table name and a primary key on that table, you really never know what you're * going to get, now do you? But this method makes sure that that rascally database returns the origin * entry group with the primary key of the given group id. Or null if it can't find anything. It works * by magic. * * @param id the id of the origin entry group to return * @return an Origin Entry Group, or null if the exact one couldn't be found * @see org.kuali.kfs.gl.dataaccess.OriginEntryGroupDao#getExactMatchingEntryGroup(java.lang.Integer) */ public OriginEntryGroup getExactMatchingEntryGroup(Integer id) { LOG.debug("getMatchingEntries() started"); return (OriginEntryGroup) getPersistenceBrokerTemplate().getObjectById(OriginEntryGroup.class, id); } /** * Given a date, finds all origin entry groups that were created on or after that date * @param day the date that defines recency - all qualifying origin entries groups will have been created on or after that day * @return a Collection of OriginEntryGroup records * @see org.kuali.kfs.gl.dataaccess.OriginEntryGroupDao#getRecentGroups(Date) */ public Collection<OriginEntryGroup> getRecentGroups(Date day) { LOG.debug("getOlderGroups() started"); Criteria criteria = new Criteria(); criteria.addGreaterOrEqualThan(DATE, day); return getPersistenceBrokerTemplate().getCollectionByQuery(QueryFactory.newQuery(OriginEntryGroup.class, criteria)); } }