/* * 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.sys.service.impl; import java.sql.Timestamp; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.commons.codec.binary.Base64; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.kuali.kfs.sys.KFSPropertyConstants; import org.kuali.kfs.sys.service.SegmentedLookupResultsService; import org.kuali.rice.core.api.datetime.DateTimeService; import org.kuali.rice.kns.lookup.LookupResultsServiceImpl; import org.kuali.rice.kns.lookup.LookupUtils; import org.kuali.rice.kns.web.ui.ResultRow; import org.kuali.rice.krad.bo.LookupResults; import org.kuali.rice.krad.bo.PersistableBusinessObject; import org.kuali.rice.krad.bo.SelectedObjectIds; import org.kuali.rice.krad.exception.AuthorizationException; import org.kuali.rice.krad.util.ObjectUtils; import org.springframework.transaction.annotation.Transactional; /** * Used for segemented lookup results */ @Transactional public class SegmentedLookupResultsServiceImpl extends LookupResultsServiceImpl implements SegmentedLookupResultsService { private static final Log LOG = LogFactory.getLog(SegmentedLookupResultsServiceImpl.class); private DateTimeService dateTimeService; /** * Retrieve the Date Time Service * * @return Date Time Service */ public DateTimeService getDateTimeService() { return dateTimeService; } /** * Assign the Date Time Service * * @param dateTimeService */ public void setDateTimeService(DateTimeService dateTimeService) { this.dateTimeService = dateTimeService; } /** * @see org.kuali.rice.kns.lookup.LookupResultsService#persistResultsTable(java.lang.String, java.util.List, java.lang.String) */ public void persistResultsTable(String lookupResultsSequenceNumber, List<ResultRow> resultTable, String personId) throws Exception { String resultTableString = new String(Base64.encodeBase64(ObjectUtils.toByteArray(resultTable))); Timestamp now = getDateTimeService().getCurrentTimestamp(); LookupResults lookupResults = retrieveLookupResults(lookupResultsSequenceNumber); if (lookupResults == null) { lookupResults = new LookupResults(); lookupResults.setLookupResultsSequenceNumber(lookupResultsSequenceNumber); } lookupResults.setLookupResultsSequenceNumber(lookupResultsSequenceNumber); lookupResults.setLookupPersonId(personId); lookupResults.setSerializedLookupResults(resultTableString); lookupResults.setLookupDate(now); getBusinessObjectService().save(lookupResults); if (LOG.isDebugEnabled()) { LOG.debug("Wrote resultTable " + resultTable); } } /** * @see org.kuali.rice.kns.lookup.LookupResultsService#persistSelectedObjectIds(java.lang.String, java.util.Set, java.lang.String) */ public void persistSelectedObjectIds(String lookupResultsSequenceNumber, Set<String> selectedObjectIds, String personId) throws Exception { SelectedObjectIds selectedObjectIdsBO = retrieveSelectedObjectIds(lookupResultsSequenceNumber); if (selectedObjectIdsBO == null) { selectedObjectIdsBO = new SelectedObjectIds(); selectedObjectIdsBO.setLookupResultsSequenceNumber(lookupResultsSequenceNumber); } selectedObjectIdsBO.setLookupResultsSequenceNumber(lookupResultsSequenceNumber); selectedObjectIdsBO.setLookupPersonId(personId); selectedObjectIdsBO.setSelectedObjectIds(LookupUtils.convertSetOfObjectIdsToString(selectedObjectIds)); selectedObjectIdsBO.setLookupDate(getDateTimeService().getCurrentTimestamp()); getBusinessObjectService().save(selectedObjectIdsBO); } /** * @see org.kuali.rice.kns.lookup.LookupResultsService#retrieveResultsTable(java.lang.String, java.lang.String) */ public List<ResultRow> retrieveResultsTable(String lookupResultsSequenceNumber, String personId) throws Exception { LookupResults lookupResults = retrieveLookupResults(lookupResultsSequenceNumber); if (!isAuthorizedToAccessLookupResults(lookupResults, personId)) { throw new AuthorizationException(personId, "retrieve lookup results", "lookup sequence number " + lookupResultsSequenceNumber); } List<ResultRow> resultTable = (List<ResultRow>) ObjectUtils.fromByteArray(Base64.decodeBase64(lookupResults.getSerializedLookupResults().getBytes())); return resultTable; } /** * Returns a list of BOs that were selected. This implementation makes an attempt to retrieve all BOs with the given object IDs, * unless they have been deleted or the object ID changed. Since data may have changed since the search, the returned BOs may * not match the criteria used to search. * * @see org.kuali.rice.kns.lookup.LookupResultsService#retrieveSelectedResultBOs(java.lang.String, java.lang.Class, * java.lang.String) */ public Collection<PersistableBusinessObject> retrieveSelectedResultBOs(String lookupResultsSequenceNumber, Class boClass, String personId) throws Exception { Set<String> setOfSelectedObjIds = retrieveSetOfSelectedObjectIds(lookupResultsSequenceNumber, personId); return retrieveSelectedResultBOs(lookupResultsSequenceNumber, setOfSelectedObjIds, boClass, personId); } /** * @param lookupResultsSequenceNumber * @param personId * @return Set<String> */ public Set<String> retrieveSetOfSelectedObjectIds(String lookupResultsSequenceNumber, String personId) throws Exception { SelectedObjectIds selectedObjectIds = retrieveSelectedObjectIds(lookupResultsSequenceNumber); if (!isAuthorizedToAccessSelectedObjectIds(selectedObjectIds, personId)) { throw new AuthorizationException(personId, "retrieve lookup results", "lookup sequence number " + lookupResultsSequenceNumber); } Set<String> retval = LookupUtils.convertStringOfObjectIdsToSet(selectedObjectIds.getSelectedObjectIds()); return retval; } /** * @param lookupResultsSequenceNumber * @param setOfSelectedObjIds * @param boClass * @param personId * @return Collection<PersistableBusinessObject> */ public Collection<PersistableBusinessObject> retrieveSelectedResultBOs(String lookupResultsSequenceNumber, Set<String> setOfSelectedObjIds, Class boClass, String personId) throws Exception { if (LOG.isDebugEnabled()) { LOG.debug("Retrieving results for class " + boClass + " with objectIds " + setOfSelectedObjIds); } if (setOfSelectedObjIds.isEmpty()) { // OJB throws exception if querying on empty set return new ArrayList<PersistableBusinessObject>(); } Map<String, Collection<String>> queryCriteria = new HashMap<String, Collection<String>>(); queryCriteria.put(KFSPropertyConstants.OBJECT_ID, setOfSelectedObjIds); return getBusinessObjectService().findMatching(boClass, queryCriteria); } }