001 /** 002 * Copyright 2005-2014 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.rice.kim.impl.group; 017 018 import org.apache.commons.lang.StringUtils; 019 import org.kuali.rice.core.api.criteria.Predicate; 020 import org.kuali.rice.core.api.criteria.PredicateUtils; 021 import org.kuali.rice.core.api.criteria.QueryByCriteria; 022 import org.kuali.rice.kim.api.KimConstants; 023 import org.kuali.rice.kim.api.group.Group; 024 import org.kuali.rice.kim.api.group.GroupQueryResults; 025 import org.kuali.rice.kim.api.group.GroupService; 026 import org.kuali.rice.kim.api.services.KimApiServiceLocator; 027 import org.kuali.rice.krad.lookup.LookupableImpl; 028 import org.kuali.rice.krad.lookup.LookupForm; 029 030 import java.sql.Timestamp; 031 import java.util.ArrayList; 032 import java.util.Calendar; 033 import java.util.Collection; 034 import java.util.HashMap; 035 import java.util.List; 036 import java.util.Map; 037 038 import static org.kuali.rice.core.api.criteria.PredicateFactory.*; 039 import static org.kuali.rice.core.api.criteria.PredicateFactory.and; 040 import static org.kuali.rice.core.api.criteria.PredicateFactory.lessThan; 041 042 /** 043 * Custom lookupable for the {@link GroupBo} lookup to call the group service for searching 044 * 045 * @author Kuali Rice Team (rice.collab@kuali.org) 046 */ 047 public class GroupLookupableImpl extends LookupableImpl { 048 private static final long serialVersionUID = -3149952849854425077L; 049 050 /** 051 * Translates any search criteria on principal name to member id and active data, then calls group service to 052 * retrieve matching groups 053 * 054 * @return List<GroupBo> 055 */ 056 @Override 057 protected Collection<?> executeSearch(Map<String, String> adjustedSearchCriteria, 058 List<String> wildcardAsLiteralSearchCriteria, boolean bounded, Integer searchResultsLimit) { 059 Map<String, String> criteriaMap = new HashMap<String, String>(adjustedSearchCriteria); 060 QueryByCriteria.Builder criteria = QueryByCriteria.Builder.create(); 061 062 if (!criteriaMap.isEmpty()) { 063 List<Predicate> predicates = new ArrayList<Predicate>(); 064 //principalId doesn't exist on 'Group'. Lets do this predicate conversion separately 065 if (StringUtils.isNotBlank(criteriaMap.get(KimConstants.UniqueKeyConstants.PRINCIPAL_NAME))) { 066 String principalId = KimApiServiceLocator.getIdentityService().getPrincipalByPrincipalName( 067 criteriaMap.get(KimConstants.UniqueKeyConstants.PRINCIPAL_NAME)).getPrincipalId(); 068 Timestamp currentTime = new Timestamp(Calendar.getInstance().getTimeInMillis()); 069 predicates.add(and(equal("members.memberId", principalId), equal("members.typeCode", 070 KimConstants.KimGroupMemberTypes.PRINCIPAL_MEMBER_TYPE.getCode()), and(or(isNull( 071 "members.activeFromDateValue"), greaterThanOrEqual("members.activeFromDateValue", currentTime)), 072 or(isNull("members.activeToDateValue"), lessThan("members.activeToDateValue", currentTime))))); 073 074 } 075 criteriaMap.remove(KimConstants.UniqueKeyConstants.PRINCIPAL_NAME); 076 077 predicates.add(PredicateUtils.convertMapToPredicate(criteriaMap)); 078 criteria.setPredicates(and(predicates.toArray(new Predicate[predicates.size()]))); 079 } 080 081 GroupQueryResults groupResults = getGroupService().findGroups(criteria.build()); 082 List<Group> groups = groupResults.getResults(); 083 084 //have to convert back to Bos :( 085 List<GroupBo> groupBos = new ArrayList<GroupBo>(groups.size()); 086 for (Group group : groups) { 087 groupBos.add(GroupBo.from(group)); 088 } 089 090 return groupBos; 091 } 092 093 public GroupService getGroupService() { 094 return KimApiServiceLocator.getGroupService(); 095 } 096 }