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 017 package org.kuali.kfs.sys.service.impl; 018 019 import java.sql.Timestamp; 020 import java.util.ArrayList; 021 import java.util.Collection; 022 import java.util.HashMap; 023 import java.util.List; 024 import java.util.Map; 025 import java.util.Set; 026 027 import org.apache.commons.codec.binary.Base64; 028 import org.apache.commons.logging.Log; 029 import org.apache.commons.logging.LogFactory; 030 import org.kuali.kfs.sys.KFSPropertyConstants; 031 import org.kuali.kfs.sys.service.SegmentedLookupResultsService; 032 import org.kuali.rice.kns.bo.LookupResults; 033 import org.kuali.rice.kns.bo.PersistableBusinessObject; 034 import org.kuali.rice.kns.bo.SelectedObjectIds; 035 import org.kuali.rice.kns.exception.AuthorizationException; 036 import org.kuali.rice.kns.lookup.LookupResultsServiceImpl; 037 import org.kuali.rice.kns.lookup.LookupUtils; 038 import org.kuali.rice.kns.service.DateTimeService; 039 import org.kuali.rice.kns.util.ObjectUtils; 040 import org.kuali.rice.kns.web.ui.ResultRow; 041 import org.springframework.transaction.annotation.Transactional; 042 043 /** 044 * Used for segemented lookup results 045 */ 046 @Transactional 047 public class SegmentedLookupResultsServiceImpl extends LookupResultsServiceImpl implements SegmentedLookupResultsService { 048 049 private static final Log LOG = LogFactory.getLog(SegmentedLookupResultsServiceImpl.class); 050 051 private DateTimeService dateTimeService; 052 053 /** 054 * Retrieve the Date Time Service 055 * 056 * @return Date Time Service 057 */ 058 public DateTimeService getDateTimeService() { 059 return dateTimeService; 060 } 061 062 /** 063 * Assign the Date Time Service 064 * 065 * @param dateTimeService 066 */ 067 public void setDateTimeService(DateTimeService dateTimeService) { 068 this.dateTimeService = dateTimeService; 069 } 070 071 /** 072 * @see org.kuali.rice.kns.lookup.LookupResultsService#persistResultsTable(java.lang.String, java.util.List, java.lang.String) 073 */ 074 public void persistResultsTable(String lookupResultsSequenceNumber, List<ResultRow> resultTable, String personId) throws Exception { 075 String resultTableString = new String(Base64.encodeBase64(ObjectUtils.toByteArray(resultTable))); 076 077 Timestamp now = getDateTimeService().getCurrentTimestamp(); 078 079 LookupResults lookupResults = retrieveLookupResults(lookupResultsSequenceNumber); 080 if (lookupResults == null) { 081 lookupResults = new LookupResults(); 082 lookupResults.setLookupResultsSequenceNumber(lookupResultsSequenceNumber); 083 } 084 lookupResults.setLookupResultsSequenceNumber(lookupResultsSequenceNumber); 085 lookupResults.setLookupPersonId(personId); 086 lookupResults.setSerializedLookupResults(resultTableString); 087 lookupResults.setLookupDate(now); 088 getBusinessObjectService().save(lookupResults); 089 LOG.debug("Wrote resultTable " + resultTable); 090 } 091 092 /** 093 * @see org.kuali.rice.kns.lookup.LookupResultsService#persistSelectedObjectIds(java.lang.String, java.util.Set, java.lang.String) 094 */ 095 public void persistSelectedObjectIds(String lookupResultsSequenceNumber, Set<String> selectedObjectIds, String personId) throws Exception { 096 SelectedObjectIds selectedObjectIdsBO = retrieveSelectedObjectIds(lookupResultsSequenceNumber); 097 if (selectedObjectIdsBO == null) { 098 selectedObjectIdsBO = new SelectedObjectIds(); 099 selectedObjectIdsBO.setLookupResultsSequenceNumber(lookupResultsSequenceNumber); 100 } 101 selectedObjectIdsBO.setLookupResultsSequenceNumber(lookupResultsSequenceNumber); 102 selectedObjectIdsBO.setLookupPersonId(personId); 103 selectedObjectIdsBO.setSelectedObjectIds(LookupUtils.convertSetOfObjectIdsToString(selectedObjectIds)); 104 selectedObjectIdsBO.setLookupDate(getDateTimeService().getCurrentTimestamp()); 105 getBusinessObjectService().save(selectedObjectIdsBO); 106 } 107 108 /** 109 * @see org.kuali.rice.kns.lookup.LookupResultsService#retrieveResultsTable(java.lang.String, java.lang.String) 110 */ 111 public List<ResultRow> retrieveResultsTable(String lookupResultsSequenceNumber, String personId) throws Exception { 112 LookupResults lookupResults = retrieveLookupResults(lookupResultsSequenceNumber); 113 if (!isAuthorizedToAccessLookupResults(lookupResults, personId)) { 114 throw new AuthorizationException(personId, "retrieve lookup results", "lookup sequence number " + lookupResultsSequenceNumber); 115 } 116 List<ResultRow> resultTable = (List<ResultRow>) ObjectUtils.fromByteArray(Base64.decodeBase64(lookupResults.getSerializedLookupResults().getBytes())); 117 return resultTable; 118 } 119 120 /** 121 * Returns a list of BOs that were selected. This implementation makes an attempt to retrieve all BOs with the given object IDs, 122 * unless they have been deleted or the object ID changed. Since data may have changed since the search, the returned BOs may 123 * not match the criteria used to search. 124 * 125 * @see org.kuali.rice.kns.lookup.LookupResultsService#retrieveSelectedResultBOs(java.lang.String, java.lang.Class, 126 * java.lang.String) 127 */ 128 public Collection<PersistableBusinessObject> retrieveSelectedResultBOs(String lookupResultsSequenceNumber, Class boClass, String personId) throws Exception { 129 Set<String> setOfSelectedObjIds = retrieveSetOfSelectedObjectIds(lookupResultsSequenceNumber, personId); 130 return retrieveSelectedResultBOs(lookupResultsSequenceNumber, setOfSelectedObjIds, boClass, personId); 131 } 132 133 /** 134 * @param lookupResultsSequenceNumber 135 * @param personId 136 * @return Set<String> 137 */ 138 public Set<String> retrieveSetOfSelectedObjectIds(String lookupResultsSequenceNumber, String personId) throws Exception { 139 SelectedObjectIds selectedObjectIds = retrieveSelectedObjectIds(lookupResultsSequenceNumber); 140 if (!isAuthorizedToAccessSelectedObjectIds(selectedObjectIds, personId)) { 141 throw new AuthorizationException(personId, "retrieve lookup results", "lookup sequence number " + lookupResultsSequenceNumber); 142 } 143 Set<String> retval = LookupUtils.convertStringOfObjectIdsToSet(selectedObjectIds.getSelectedObjectIds()); 144 return retval; 145 } 146 147 /** 148 * @param lookupResultsSequenceNumber 149 * @param setOfSelectedObjIds 150 * @param boClass 151 * @param personId 152 * @return Collection<PersistableBusinessObject> 153 */ 154 public Collection<PersistableBusinessObject> retrieveSelectedResultBOs(String lookupResultsSequenceNumber, Set<String> setOfSelectedObjIds, Class boClass, String personId) throws Exception { 155 LOG.debug("Retrieving results for class " + boClass + " with objectIds " + setOfSelectedObjIds); 156 if (setOfSelectedObjIds.isEmpty()) { 157 // OJB throws exception if querying on empty set 158 return new ArrayList<PersistableBusinessObject>(); 159 } 160 Map<String, Collection<String>> queryCriteria = new HashMap<String, Collection<String>>(); 161 queryCriteria.put(KFSPropertyConstants.OBJECT_ID, setOfSelectedObjIds); 162 return getBusinessObjectService().findMatching(boClass, queryCriteria); 163 } 164 165 } 166