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