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    }