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 package org.kuali.kfs.sec.businessobject.lookup; 017 018 import java.util.ArrayList; 019 import java.util.HashMap; 020 import java.util.Iterator; 021 import java.util.List; 022 import java.util.Map; 023 024 import org.apache.commons.lang.StringUtils; 025 import org.kuali.kfs.sec.SecPropertyConstants; 026 import org.kuali.kfs.sec.businessobject.ModelMember; 027 import org.kuali.rice.kim.bo.Group; 028 import org.kuali.rice.kim.bo.Person; 029 import org.kuali.rice.kim.bo.role.dto.KimRoleInfo; 030 import org.kuali.rice.kim.service.GroupService; 031 import org.kuali.rice.kim.service.PersonService; 032 import org.kuali.rice.kim.service.RoleService; 033 import org.kuali.rice.kim.util.KIMPropertyConstants; 034 import org.kuali.rice.kim.util.KimConstants; 035 import org.kuali.rice.kns.bo.BusinessObject; 036 import org.kuali.rice.kns.datadictionary.BusinessObjectEntry; 037 import org.kuali.rice.kns.lookup.KualiLookupableHelperServiceImpl; 038 import org.kuali.rice.kns.service.KNSServiceLocator; 039 import org.kuali.rice.kns.util.FieldUtils; 040 import org.kuali.rice.kns.util.KNSConstants; 041 import org.kuali.rice.kns.util.KNSPropertyConstants; 042 import org.kuali.rice.kns.web.ui.Row; 043 044 045 /** 046 * Lookupable for ModelMember business object. Needs to change the lookup to search Person, Role, or Group based on the member type passed in 047 */ 048 public class ModelMemberLookupableHelperServiceImpl extends KualiLookupableHelperServiceImpl { 049 protected RoleService roleService; 050 protected GroupService groupSevice; 051 protected PersonService personService; 052 053 protected List<Row> rows; 054 055 public ModelMemberLookupableHelperServiceImpl() { 056 rows = null; 057 } 058 059 /** 060 * @see org.kuali.rice.kns.lookup.KualiLookupableHelperServiceImpl#getSearchResults(java.util.Map) 061 */ 062 @Override 063 public List<? extends BusinessObject> getSearchResults(Map<String, String> fieldValues) { 064 List results = new ArrayList(); 065 066 Map<String, String> searchValues = new HashMap<String, String>(); 067 068 String memberTypeCode = fieldValues.get(SecPropertyConstants.MEMBER_TYPE_CODE); 069 if (KimConstants.KimUIConstants.MEMBER_TYPE_ROLE_CODE.equals(memberTypeCode)) { 070 List<String> roleSearchFields = getRoleLookupFields(); 071 roleSearchFields.remove(SecPropertyConstants.MEMBER_TYPE_CODE); 072 for (String roleField : roleSearchFields) { 073 if (fieldValues.containsKey(roleField) && StringUtils.isNotBlank(fieldValues.get(roleField))) { 074 searchValues.put(roleField, fieldValues.get(roleField)); 075 } 076 } 077 078 List<KimRoleInfo> resultRoles = roleService.lookupRoles(searchValues); 079 for (KimRoleInfo kimRoleInfo : resultRoles) { 080 ModelMember member = new ModelMember(); 081 member.setMemberId(kimRoleInfo.getRoleId()); 082 member.setMemberTypeCode(KimConstants.KimUIConstants.MEMBER_TYPE_ROLE_CODE); 083 member.setMemberName(kimRoleInfo.getNamespaceCode() + "-" + kimRoleInfo.getRoleName()); 084 member.setActive(kimRoleInfo.isActive()); 085 086 results.add(member); 087 } 088 } 089 else if (KimConstants.KimUIConstants.MEMBER_TYPE_GROUP_CODE.equals(memberTypeCode)) { 090 List<String> groupSearchFields = getGroupLookupFields(); 091 groupSearchFields.remove(SecPropertyConstants.MEMBER_TYPE_CODE); 092 for (String groupField : groupSearchFields) { 093 if (fieldValues.containsKey(groupField) && StringUtils.isNotBlank(fieldValues.get(groupField))) { 094 searchValues.put(groupField, fieldValues.get(groupField)); 095 } 096 } 097 098 List<? extends Group> resultGroups = groupSevice.lookupGroups(searchValues); 099 for (Group group : resultGroups) { 100 ModelMember member = new ModelMember(); 101 member.setMemberId(group.getGroupId()); 102 member.setMemberTypeCode(KimConstants.KimUIConstants.MEMBER_TYPE_GROUP_CODE); 103 member.setMemberName(group.getNamespaceCode() + "-" + group.getGroupName()); 104 member.setActive(group.isActive()); 105 106 results.add(member); 107 } 108 } 109 else { 110 List<String> personSearchFields = getPersonLookupFields(); 111 personSearchFields.remove(SecPropertyConstants.MEMBER_TYPE_CODE); 112 for (String personField : personSearchFields) { 113 if (fieldValues.containsKey(personField) && StringUtils.isNotBlank(fieldValues.get(personField))) { 114 searchValues.put(personField, fieldValues.get(personField)); 115 } 116 } 117 118 List<? extends Person> resultPersons = personService.findPeople(searchValues); 119 for (Person person : resultPersons) { 120 ModelMember member = new ModelMember(); 121 member.setMemberId(person.getPrincipalId()); 122 member.setMemberTypeCode(KimConstants.KimUIConstants.MEMBER_TYPE_PRINCIPAL_CODE); 123 member.setMemberName(person.getName()); 124 member.setActive(person.isActive()); 125 126 results.add(member); 127 } 128 } 129 130 return results; 131 } 132 133 /** 134 * @see org.kuali.rice.kns.lookup.AbstractLookupableHelperServiceImpl#setRows() 135 */ 136 @Override 137 protected void setRows() { 138 List<String> lookupFieldAttributeList = new ArrayList<String>(); 139 if (getParameters().containsKey(SecPropertyConstants.MEMBER_TYPE_CODE)) { 140 String memberTypeCode = ((String[]) getParameters().get(SecPropertyConstants.MEMBER_TYPE_CODE))[0]; 141 142 if (KimConstants.KimUIConstants.MEMBER_TYPE_ROLE_CODE.equals(memberTypeCode)) { 143 lookupFieldAttributeList = getRoleLookupFields(); 144 } 145 else if (KimConstants.KimUIConstants.MEMBER_TYPE_GROUP_CODE.equals(memberTypeCode)) { 146 lookupFieldAttributeList = getGroupLookupFields(); 147 } 148 else { 149 lookupFieldAttributeList = getPersonLookupFields(); 150 } 151 } 152 else { 153 lookupFieldAttributeList = getPersonLookupFields(); 154 } 155 156 // construct field object for each search attribute 157 List fields = new ArrayList(); 158 int numCols; 159 try { 160 fields = FieldUtils.createAndPopulateFieldsForLookup(lookupFieldAttributeList, getReadOnlyFieldsList(), getBusinessObjectClass()); 161 162 BusinessObjectEntry boe = KNSServiceLocator.getDataDictionaryService().getDataDictionary().getBusinessObjectEntry(this.getBusinessObjectClass().getName()); 163 numCols = boe.getLookupDefinition().getNumOfColumns(); 164 165 } 166 catch (InstantiationException e) { 167 throw new RuntimeException("Unable to create instance of business object class" + e.getMessage()); 168 } 169 catch (IllegalAccessException e) { 170 throw new RuntimeException("Unable to create instance of business object class" + e.getMessage()); 171 } 172 173 if (numCols == 0) 174 numCols = KNSConstants.DEFAULT_NUM_OF_COLUMNS; 175 176 rows = FieldUtils.wrapFields(fields, numCols); 177 } 178 179 /** 180 * @see org.kuali.rice.kns.lookup.AbstractLookupableHelperServiceImpl#getRows() 181 */ 182 @Override 183 public List<Row> getRows() { 184 return rows; 185 } 186 187 /** 188 * Builds List of search field names for the role lookup 189 * 190 * @return List<String> containing lookup field names 191 */ 192 protected List<String> getRoleLookupFields() { 193 List<String> lookupFields = new ArrayList<String>(); 194 195 lookupFields.add(KIMPropertyConstants.Role.ROLE_ID); 196 lookupFields.add(KIMPropertyConstants.Role.ROLE_NAME); 197 lookupFields.add(KimConstants.UniqueKeyConstants.NAMESPACE_CODE); 198 lookupFields.add(KNSPropertyConstants.ACTIVE); 199 lookupFields.add(SecPropertyConstants.MEMBER_TYPE_CODE); 200 201 return lookupFields; 202 } 203 204 /** 205 * Builds List of search field names for the group lookup 206 * 207 * @return List<String> containing lookup field names 208 */ 209 protected List<String> getGroupLookupFields() { 210 List<String> lookupFields = new ArrayList<String>(); 211 212 lookupFields.add(KIMPropertyConstants.Group.GROUP_ID); 213 lookupFields.add(KimConstants.UniqueKeyConstants.GROUP_NAME); 214 lookupFields.add(KNSPropertyConstants.ACTIVE); 215 lookupFields.add(SecPropertyConstants.MEMBER_TYPE_CODE); 216 217 return lookupFields; 218 } 219 220 /** 221 * Builds List of search field names for the person lookup 222 * 223 * @return List<String> containing lookup field names 224 */ 225 protected List<String> getPersonLookupFields() { 226 List<String> lookupFields = new ArrayList<String>(); 227 228 lookupFields.add(KIMPropertyConstants.Person.PRINCIPAL_NAME); 229 lookupFields.add(KIMPropertyConstants.Person.PRINCIPAL_ID); 230 lookupFields.add(KIMPropertyConstants.Person.ENTITY_ID); 231 lookupFields.add(KIMPropertyConstants.Person.FIRST_NAME); 232 lookupFields.add(KIMPropertyConstants.Person.MIDDLE_NAME); 233 lookupFields.add(KIMPropertyConstants.Person.LAST_NAME); 234 lookupFields.add(KIMPropertyConstants.Person.EMAIL_ADDRESS); 235 lookupFields.add(KIMPropertyConstants.Person.EMPLOYEE_ID); 236 lookupFields.add(KNSPropertyConstants.ACTIVE); 237 lookupFields.add(SecPropertyConstants.MEMBER_TYPE_CODE); 238 239 return lookupFields; 240 } 241 242 /** 243 * Sets the roleService attribute value. 244 * 245 * @param roleService The roleService to set. 246 */ 247 public void setRoleService(RoleService roleService) { 248 this.roleService = roleService; 249 } 250 251 /** 252 * Sets the groupSevice attribute value. 253 * 254 * @param groupSevice The groupSevice to set. 255 */ 256 public void setGroupSevice(GroupService groupSevice) { 257 this.groupSevice = groupSevice; 258 } 259 260 /** 261 * Sets the personService attribute value. 262 * 263 * @param personService The personService to set. 264 */ 265 public void setPersonService(PersonService personService) { 266 this.personService = personService; 267 } 268 269 }