/*
* 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.module.tem.businessobject.lookup;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.kuali.kfs.module.tem.businessobject.TemProfile;
import org.kuali.kfs.module.tem.businessobject.TemProfileFromKimPerson;
import org.kuali.kfs.module.tem.service.TemProfileService;
import org.kuali.kfs.module.tem.service.TemRoleService;
import org.kuali.kfs.module.tem.service.TravelerService;
import org.kuali.kfs.sys.KFSConstants;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.rice.kim.api.identity.Person;
import org.kuali.rice.kim.api.identity.PersonService;
import org.kuali.rice.kim.impl.identity.PersonImpl;
import org.kuali.rice.kns.datadictionary.BusinessObjectEntry;
import org.kuali.rice.kns.datadictionary.FieldDefinition;
import org.kuali.rice.kns.lookup.HtmlData;
import org.kuali.rice.kns.lookup.HtmlData.AnchorHtmlData;
import org.kuali.rice.kns.lookup.KualiLookupableHelperServiceImpl;
import org.kuali.rice.kns.util.KNSGlobalVariables;
import org.kuali.rice.kns.web.struts.form.LookupForm;
import org.kuali.rice.krad.bo.BusinessObject;
import org.kuali.rice.krad.lookup.CollectionIncomplete;
import org.kuali.rice.krad.util.BeanPropertyComparator;
import org.kuali.rice.krad.util.GlobalVariables;
import org.kuali.rice.krad.util.UrlFactory;
@SuppressWarnings("rawtypes")
public class TemProfileFromKimLookupableHelperServiceImpl extends KualiLookupableHelperServiceImpl {
public static Logger LOG = Logger.getLogger(TemProfileFromKimLookupableHelperServiceImpl.class);
private TravelerService travelerService;
private PersonService personService;
private TemProfileService temProfileService;
/**
* @see org.kuali.rice.kns.lookup.AbstractLookupableHelperServiceImpl#performLookup(org.kuali.rice.kns.web.struts.form.LookupForm, java.util.Collection, boolean)
*/
@Override
public Collection performLookup(LookupForm lookupForm, Collection resultTable, boolean bounded) {
lookupForm.setSuppressActions(false);
lookupForm.setSupplementalActionsEnabled(true);
lookupForm.setHideReturnLink(false);
lookupForm.setShowMaintenanceLinks(true);
return super.performLookup(lookupForm, resultTable, bounded);
}
/**
* @see org.kuali.rice.kns.lookup.KualiLookupableHelperServiceImpl#getSearchResults(java.util.Map)
*/
@Override
public List<? extends BusinessObject> getSearchResults(Map<String, String> fieldValues) {
List<TemProfileFromKimPerson> searchResults = new ArrayList<TemProfileFromKimPerson>();
//final Map<String, String> kimFieldsForLookup = fieldValues;
final Map<String, String> kimFieldsForLookup = getPersonFieldValues(fieldValues);
LOG.debug("Looking up people with criteria " + kimFieldsForLookup);
final List<? extends Person> persons = personService.findPeople(kimFieldsForLookup);
for (Person personDetail : persons) {
if (!StringUtils.isBlank(personDetail.getPrincipalId())) {
searchResults.add(travelerService.convertToTemProfileFromKim(personDetail));
}
}
CollectionIncomplete results = new CollectionIncomplete(searchResults, Long.valueOf(searchResults.size()));
// sort list if default sort column given
List<String> defaultSortColumns = getDefaultSortColumns();
if (defaultSortColumns.size() > 0) {
Collections.sort(results, new BeanPropertyComparator(defaultSortColumns, true));
}
return results;
}
/**
* @see org.kuali.rice.kns.lookup.AbstractLookupableHelperServiceImpl#getBusinessObjectClass()
*/
@Override
public Class getBusinessObjectClass() {
return TemProfileFromKimPerson.class;
}
/**
* Generates a {@link Map} of field values where object properties are mapped to values for
* search purposes.
*
* @param fieldValues original field values passed to the lookup
* @return Map of values
*/
protected Map<String, String> getPersonFieldValues(final Map<String, String> fieldValues) {
BusinessObjectEntry businessObjectEntry = (BusinessObjectEntry)getDataDictionaryService().getDataDictionary().getBusinessObjectEntry(PersonImpl.class.getName());
Collection<FieldDefinition> lookupFields = businessObjectEntry.getLookupDefinition().getLookupFields();
Map<String, String> personFieldValues = new HashMap<String, String>();
for (final FieldDefinition lookupField : lookupFields) {
final String attrName = lookupField.getAttributeName();
if (containsAttribute(PersonImpl.class, attrName)) {
personFieldValues.put(attrName, fieldValues.get(attrName));
}
}
return personFieldValues;
}
/**
* @see org.kuali.rice.kns.datadictionary.DataDictionary#getBusinessObjectEntry(String)
*/
protected boolean containsAttribute(final Class boClass, final String attributeName) {
return getDataDictionaryService().isAttributeDefined(boClass, attributeName);
}
/**
* @see org.kuali.rice.kns.lookup.KualiLookupableHelperServiceImpl#getSearchResultsUnbounded(java.util.Map)
*/
@Override
public List<? extends BusinessObject> getSearchResultsUnbounded(Map<String, String> fieldValues) {
return super.getSearchResultsUnbounded(fieldValues);
}
/**
* @see org.kuali.rice.kns.lookup.AbstractLookupableHelperServiceImpl#getCustomActionUrls(org.kuali.rice.kns.bo.BusinessObject, java.util.List)
*/
@Override
public List<HtmlData> getCustomActionUrls(BusinessObject businessObject, List pkNames) {
List<HtmlData> htmlDataList = super.getCustomActionUrls(businessObject, pkNames);
TemRoleService temRoleService = SpringContext.getBean(TemRoleService.class);
boolean profileAdmin = temRoleService.isProfileAdmin(GlobalVariables.getUserSession().getPerson(), ((TemProfileFromKimPerson)businessObject).getPrimaryDepartmentCode());
if (!profileAdmin) {
return htmlDataList;
}
String principalId = ((TemProfileFromKimPerson) businessObject).getPrincipalId();
if (!StringUtils.isBlank(principalId)) {
Properties parameters = new Properties();
parameters.put(KFSConstants.BUSINESS_OBJECT_CLASS_ATTRIBUTE, TemProfile.class.getName());
parameters.put(KFSConstants.OVERRIDE_KEYS, "principalId");
parameters.put(KFSConstants.REFRESH_CALLER, "principalId" + "::" + principalId);
parameters.put("principalId", principalId);
Map<String,String> criteria = new HashMap<String,String>(2);
criteria.put("principalId", principalId);
// If a TEM Profile doesn't exist, display a create link
if (temProfileService.findTemProfile(criteria) == null) {
parameters.put(KFSConstants.DISPATCH_REQUEST_PARAMETER, KFSConstants.MAINTENANCE_NEW_METHOD_TO_CALL);
String href = UrlFactory.parameterizeUrl(KFSConstants.MAINTENANCE_ACTION, parameters);
AnchorHtmlData anchorHtmlData = new AnchorHtmlData(href, "start", "create new profile");
htmlDataList.add(anchorHtmlData);
}
else {
// An active TEM Profile exists, display an edit link
parameters.put(KFSConstants.DISPATCH_REQUEST_PARAMETER, KFSConstants.MAINTENANCE_EDIT_METHOD_TO_CALL);
String href = UrlFactory.parameterizeUrl(KFSConstants.MAINTENANCE_ACTION, parameters);
AnchorHtmlData anchorHtmlData = new AnchorHtmlData(href, "start", "edit profile");
htmlDataList.add(anchorHtmlData);
}
}
return htmlDataList;
}
/**
* This is a hack. This is called by Lookup's execute and it's just our way of making sure that maint links are turned on, even for an otherwise
* erstwhile non-maintainable object
* @see org.kuali.rice.kns.lookup.AbstractLookupableHelperServiceImpl#applyConditionalLogicForFieldDisplay()
*/
@Override
public void applyConditionalLogicForFieldDisplay() {
super.applyConditionalLogicForFieldDisplay();
LookupForm lookupForm = (LookupForm)KNSGlobalVariables.getKualiForm();
lookupForm.setShowMaintenanceLinks(true);
}
/**
* Sets the personService attribute value.
*
* @param personService The personService to set.
*/
public void setPersonService(PersonService personService) {
this.personService = personService;
}
/**
*
* Sets the travelerService attribute
* @param travelerService
*/
public void setTravelerService(final TravelerService travelerService) {
this.travelerService = travelerService;
}
/**
* Sets the temProfileService attribute value.
* @param temProfileService The temProfileService to set.
*/
public void setTemProfileService(TemProfileService temProfileService) {
this.temProfileService = temProfileService;
}
}