/* * 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.coa.identity; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Properties; import org.apache.commons.lang.StringUtils; import org.kuali.kfs.coa.service.OrgReviewRoleService; import org.kuali.kfs.sys.KFSConstants; import org.kuali.kfs.sys.KFSPropertyConstants; import org.kuali.kfs.sys.identity.KfsKimAttributes; import org.kuali.rice.core.api.criteria.PredicateUtils; import org.kuali.rice.core.api.criteria.QueryByCriteria; import org.kuali.rice.core.api.delegation.DelegationType; import org.kuali.rice.kim.api.KimConstants; import org.kuali.rice.kim.api.common.delegate.DelegateMember; import org.kuali.rice.kim.api.common.delegate.DelegateType; import org.kuali.rice.kim.api.identity.principal.Principal; import org.kuali.rice.kim.api.identity.principal.PrincipalQueryResults; import org.kuali.rice.kim.api.role.DelegateMemberQueryResults; import org.kuali.rice.kim.api.role.Role; import org.kuali.rice.kim.api.role.RoleMember; import org.kuali.rice.kim.api.role.RoleMemberQueryResults; import org.kuali.rice.kim.api.role.RoleQueryResults; import org.kuali.rice.kim.api.services.KimApiServiceLocator; import org.kuali.rice.kns.document.authorization.BusinessObjectRestrictions; 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.web.struts.form.LookupForm; import org.kuali.rice.krad.bo.BusinessObject; import org.kuali.rice.krad.util.KRADConstants; import org.kuali.rice.krad.util.UrlFactory; public class OrgReviewRoleLookupableHelperServiceImpl extends KualiLookupableHelperServiceImpl { private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(OrgReviewRoleLookupableHelperServiceImpl.class); protected OrgReviewRoleService orgReviewRoleService; protected static final String MEMBER_ID = "memberId"; protected static final String MEMBER_ATTRIBUTE_NAME_KEY = "attributeDetails.kimAttribute.attributeName"; protected static final String MEMBER_ATTRIBUTE_VALUE_KEY = "attributeDetails.attributeValue"; protected static final Map<String,Map<DelegationType,String>> DELEGATION_ID_CACHE = new HashMap<String, Map<DelegationType,String>>(2); protected static final String DELEGATE_SEARCH_IND = "delegate"; @Override public Collection performLookup(LookupForm lookupForm, Collection resultTable, boolean bounded) { lookupForm.setShowMaintenanceLinks(true); lookupForm.setSuppressActions(false); lookupForm.setHideReturnLink(true); return super.performLookup(lookupForm, resultTable, bounded); } @Override public List<HtmlData> getCustomActionUrls(BusinessObject businessObject, List pkNames){ OrgReviewRole orr = (OrgReviewRole)businessObject; List<HtmlData> htmlDataList = super.getCustomActionUrls(businessObject, pkNames); if(StringUtils.isNotBlank(getMaintenanceDocumentTypeName()) && allowsMaintenanceEditAction(businessObject) && !orr.isDelegate()) { HtmlData createDelegationUrl = getCreateDelegationUrl(businessObject, pkNames); //createDelegationUrl.setDisplayText(KFSConstants.COAConstants.ORG_REVIEW_ROLE_CREATE_DELEGATION_DISPLAY_TEXT); htmlDataList.add(createDelegationUrl); } return htmlDataList; } protected AnchorHtmlData getCreateDelegationUrl(BusinessObject businessObject, List pkNames){ OrgReviewRole orr = (OrgReviewRole)businessObject; Properties parameters = new Properties(); parameters.put(OrgReviewRole.ORIGINAL_DELEGATION_MEMBER_ID_TO_MODIFY, OrgReviewRole.NEW_DELEGATION_ID_KEY_VALUE); parameters.put(KFSConstants.DISPATCH_REQUEST_PARAMETER, KRADConstants.MAINTENANCE_EDIT_METHOD_TO_CALL); parameters.put(KRADConstants.BUSINESS_OBJECT_CLASS_ATTRIBUTE, businessObject.getClass().getName()); parameters.put(KRADConstants.COPY_KEYS, OrgReviewRole.ORIGINAL_DELEGATION_MEMBER_ID_TO_MODIFY+","+OrgReviewRole.ORIGINAL_ROLE_MEMBER_ID_TO_MODIFY+","+KRADConstants.DISPATCH_REQUEST_PARAMETER); parameters.put(OrgReviewRole.ORIGINAL_ROLE_MEMBER_ID_TO_MODIFY, orr.getRoleMemberId()); String href = UrlFactory.parameterizeUrl(KRADConstants.MAINTENANCE_ACTION, parameters); return new AnchorHtmlData(href, KRADConstants.DOC_HANDLER_METHOD, KFSConstants.COAConstants.ORG_REVIEW_ROLE_CREATE_DELEGATION_DISPLAY_TEXT); } @Override protected String getActionUrlHref(BusinessObject businessObject, String methodToCall, List pkNames){ OrgReviewRole orr = (OrgReviewRole)businessObject; Properties parameters = new Properties(); parameters.put(KRADConstants.DISPATCH_REQUEST_PARAMETER, methodToCall); parameters.put(KRADConstants.BUSINESS_OBJECT_CLASS_ATTRIBUTE, OrgReviewRole.class.getName()); if(orr.isDelegate()){ parameters.put(KRADConstants.COPY_KEYS, OrgReviewRole.ORIGINAL_DELEGATION_MEMBER_ID_TO_MODIFY+","+KRADConstants.DISPATCH_REQUEST_PARAMETER); parameters.put(OrgReviewRole.ORIGINAL_DELEGATION_MEMBER_ID_TO_MODIFY, orr.getDelegationMemberId()); } else { parameters.put(KRADConstants.COPY_KEYS, OrgReviewRole.ORIGINAL_DELEGATION_MEMBER_ID_TO_MODIFY+","+OrgReviewRole.ORIGINAL_ROLE_MEMBER_ID_TO_MODIFY+","+KRADConstants.DISPATCH_REQUEST_PARAMETER); parameters.put(OrgReviewRole.ORIGINAL_ROLE_MEMBER_ID_TO_MODIFY, orr.getRoleMemberId()); } return UrlFactory.parameterizeUrl(KRADConstants.MAINTENANCE_ACTION, parameters); } protected List<String> getOverridePKNamesForActionLinks(OrgReviewRole orr){ List overridePKNames = new ArrayList<String>(); if(orr.isDelegate()) { overridePKNames.add(KimConstants.PrimaryKeyConstants.DELEGATION_MEMBER_ID); } else { overridePKNames.add(KimConstants.PrimaryKeyConstants.ROLE_MEMBER_ID); } return overridePKNames; } @Override protected String getActionUrlTitleText(BusinessObject businessObject, String displayText, List pkNames, BusinessObjectRestrictions businessObjectRestrictions){ OrgReviewRole orr = (OrgReviewRole)businessObject; return super.getActionUrlTitleText(businessObject, displayText, getOverridePKNamesForActionLinks(orr), businessObjectRestrictions); } @Override public List<? extends BusinessObject> getSearchResults(Map<String,String> fieldValues) { return getMemberSearchResults(fieldValues); } /** * @see org.kuali.rice.kns.lookup.KualiLookupableHelperServiceImpl#getSearchResultsUnbounded(java.util.Map) */ @Override public List<? extends BusinessObject> getSearchResultsUnbounded( Map<String, String> fieldValues) { return getMemberSearchResults(fieldValues); } protected List<? extends BusinessObject> getMemberSearchResults(Map<String, String> fieldValues){ String delegateSearchIndicator = fieldValues.get(DELEGATE_SEARCH_IND); String documentTypeName = fieldValues.get(KfsKimAttributes.FINANCIAL_SYSTEM_DOCUMENT_TYPE_CODE); List<KfsKimDocDelegateMember> searchResultsDelegationMembers = new ArrayList<KfsKimDocDelegateMember>(); List<RoleMember> searchResultsRoleMembers = new ArrayList<RoleMember>(); boolean delegateBoolean = getBooleanValueForString(delegateSearchIndicator, false); if(StringUtils.isBlank(delegateSearchIndicator) || delegateBoolean ) { Map<String, String> searchCriteriaDelegations = buildOrgReviewRoleSearchCriteriaForDelegations(documentTypeName, fieldValues); if ( searchCriteriaDelegations != null ) { searchResultsDelegationMembers.addAll(searchDelegations(searchCriteriaDelegations)); } } if(StringUtils.isBlank(delegateSearchIndicator) || !delegateBoolean ) { Map<String, String> searchCriteriaRoleMembers = buildOrgReviewRoleSearchCriteria(documentTypeName, fieldValues); if ( searchCriteriaRoleMembers != null ) { searchResultsRoleMembers.addAll(searchRoleMembers(searchCriteriaRoleMembers)); } } List<OrgReviewRole> flattenedSearchResults = new ArrayList<OrgReviewRole>(); flattenedSearchResults.addAll(flattenToOrgReviewMembers(fieldValues.get(KFSPropertyConstants.ACTIVE), documentTypeName, searchResultsRoleMembers)); flattenedSearchResults.addAll(flattenToOrgReviewDelegationMembers(fieldValues.get(KFSPropertyConstants.ACTIVE), documentTypeName, searchResultsDelegationMembers)); filterOrgReview(fieldValues, flattenedSearchResults); return flattenedSearchResults; } protected List<String> getPrincipalIdsForWildcardedPrincipalName( String principalName ) { if(StringUtils.isNotBlank(principalName)){ PrincipalQueryResults results = KimApiServiceLocator.getIdentityService().findPrincipals(QueryByCriteria.Builder.fromPredicates(PredicateUtils.convertMapToPredicate(Collections.singletonMap(KimConstants.UniqueKeyConstants.PRINCIPAL_NAME, getQueryString(principalName))) )); List<String> principalIds = new ArrayList<String>(results.getResults().size()); for ( Principal principals : results.getResults() ) { principalIds.add( principals.getPrincipalId() ); } return principalIds; } return Collections.emptyList(); } protected List<String> getGroupIdsForWildcardedGroupName( String namespaceCode, String groupName ) { Map<String, String> searchCriteria = new HashMap<String, String>(2); if( StringUtils.isNotBlank(namespaceCode) ) { searchCriteria.put(KimConstants.UniqueKeyConstants.NAMESPACE_CODE, namespaceCode); } if( StringUtils.isNotBlank(groupName) ) { searchCriteria.put(KimConstants.UniqueKeyConstants.GROUP_NAME, getQueryString(groupName)); } if ( searchCriteria.isEmpty() ) { return Collections.emptyList(); } return KimApiServiceLocator.getGroupService().findGroupIds( QueryByCriteria.Builder.fromPredicates(PredicateUtils.convertMapToPredicate(searchCriteria) ) ); } protected List<String> getRoleIdsForWildcardedRoleName( String namespaceCode, String roleName ) { Map<String, String> searchCriteria = new HashMap<String, String>(2); if( StringUtils.isNotBlank(namespaceCode) ) { searchCriteria.put(KimConstants.UniqueKeyConstants.NAMESPACE_CODE, namespaceCode); } if( StringUtils.isNotBlank(roleName) ) { searchCriteria.put(KimConstants.UniqueKeyConstants.NAME, getQueryString(roleName)); } if ( searchCriteria.isEmpty() ) { return Collections.emptyList(); } RoleQueryResults results = KimApiServiceLocator.getRoleService().findRoles( QueryByCriteria.Builder.fromPredicates(PredicateUtils.convertMapToPredicate(searchCriteria) ) ); List<String> roleIds = new ArrayList<String>(results.getResults().size()); for ( Role role : results.getResults() ) { roleIds.add( role.getId() ); } return roleIds; } protected void filterOrgReview(Map<String, String> fieldValues, List<OrgReviewRole> searchResults){ if ( LOG.isDebugEnabled() ) { LOG.debug( "Performing local filtering of search results" ); LOG.debug( "Criteria: " + fieldValues ); LOG.debug( "Initial Results: " + searchResults ); } List<String> principalIds = null; List<String> groupIds = null; List<String> roleIds = null; if ( StringUtils.isNotBlank(fieldValues.get(OrgReviewRole.PRINCIPAL_NAME_FIELD_NAME)) ) { principalIds = getPrincipalIdsForWildcardedPrincipalName(fieldValues.get(OrgReviewRole.PRINCIPAL_NAME_FIELD_NAME)); } if ( StringUtils.isNotBlank(fieldValues.get(OrgReviewRole.GROUP_NAME_FIELD_NAMESPACE_CODE)) || StringUtils.isNotBlank(fieldValues.get(OrgReviewRole.GROUP_NAME_FIELD_NAME)) ) { groupIds = getGroupIdsForWildcardedGroupName( fieldValues.get(OrgReviewRole.GROUP_NAME_FIELD_NAMESPACE_CODE), fieldValues.get(OrgReviewRole.GROUP_NAME_FIELD_NAME)); } if ( StringUtils.isNotBlank(fieldValues.get(OrgReviewRole.ROLE_NAME_FIELD_NAMESPACE_CODE)) || StringUtils.isNotBlank(fieldValues.get(OrgReviewRole.ROLE_NAME_FIELD_NAME)) ) { roleIds = getRoleIdsForWildcardedRoleName( fieldValues.get(OrgReviewRole.ROLE_NAME_FIELD_NAMESPACE_CODE), fieldValues.get(OrgReviewRole.ROLE_NAME_FIELD_NAME)); } String financialSystemDocumentTypeCode = fieldValues.get(KfsKimAttributes.FINANCIAL_SYSTEM_DOCUMENT_TYPE_CODE); String chartOfAccountsCode = fieldValues.get(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE); String organizationCode = fieldValues.get(KFSPropertyConstants.ORGANIZATION_CODE); //Loop through org review roles and remove rows where necessary Iterator<OrgReviewRole> it = searchResults.iterator(); while ( it.hasNext() ) { OrgReviewRole orgReviewRole = it.next(); boolean remove = false; //check member attribute parameters if(StringUtils.isNotBlank(organizationCode)){ //filter by chart/document type if they exist if(StringUtils.isNotBlank(chartOfAccountsCode)){ if(!chartOfAccountsCode.equals(orgReviewRole.getChartOfAccountsCode())){ LOG.debug( "Removing RoleMember because chart does not match" ); remove = true; } } if(StringUtils.isNotBlank(financialSystemDocumentTypeCode)){ if(!financialSystemDocumentTypeCode.equals(orgReviewRole.getFinancialSystemDocumentTypeCode())){ LOG.debug( "Removing RoleMember because document type does not match" ); remove = true; } } }else if(StringUtils.isNotBlank(chartOfAccountsCode)){ //filter by document type if it exists if(StringUtils.isNotBlank(financialSystemDocumentTypeCode)){ if(!financialSystemDocumentTypeCode.equals(orgReviewRole.getFinancialSystemDocumentTypeCode())){ LOG.debug( "Removing RoleMember because document type does not match" ); remove = true; } } } List<String> items = new ArrayList<String>(); //check member id parameters, and only if it hasn't already been marked for removal. if(!remove){ if(roleIds!=null){ if(groupIds!=null){ items.addAll( groupIds ); if(!items.contains(orgReviewRole.getGroupMemberGroupId())){ LOG.debug( "Removing RoleMember because group member id does not match" ); remove = true; } } if(principalIds!=null){ items.addAll( principalIds ); if(!items.contains(orgReviewRole.getPrincipalMemberPrincipalId())){ LOG.debug( "Removing RoleMember because principal id does not match" ); remove = true; } } }else if(groupIds!=null){ if(principalIds!=null){ items.addAll( principalIds ); if(!items.contains(orgReviewRole.getPrincipalMemberPrincipalId())){ LOG.debug( "Removing RoleMember because principal id does not match" ); remove = true; } } } } //remove if necessary if(remove){ it.remove(); } } } protected String getDelegationIdByRoleAndDelegationType( String roleId, DelegationType type ) { if ( StringUtils.isBlank( roleId ) || type == null ) { return null; } Map<DelegationType,String> tempCache = DELEGATION_ID_CACHE.get(roleId); if ( tempCache == null ) { tempCache = new HashMap<DelegationType, String>(2); DelegateType dt = KimApiServiceLocator.getRoleService().getDelegateTypeByRoleIdAndDelegateTypeCode(roleId, type); if ( dt != null ) { tempCache.put(type, dt.getDelegationId() ); } synchronized (DELEGATION_ID_CACHE) { DELEGATION_ID_CACHE.put(roleId, tempCache); } } else { if ( !tempCache.containsKey(type) ) { DelegateType dt = KimApiServiceLocator.getRoleService().getDelegateTypeByRoleIdAndDelegateTypeCode(roleId, type); if ( dt != null ) { synchronized (DELEGATION_ID_CACHE) { tempCache.put(type, dt.getDelegationId() ); } } } } return tempCache.get(type); } protected void addDelegationsToDelegationMemberSearchCriteria(String documentTypeName, Map<String, String> searchCriteria){ List<String> roleNamesToSearchInto = orgReviewRoleService.getRolesToConsider(documentTypeName); if(roleNamesToSearchInto!=null){ StringBuilder rolesQueryString = new StringBuilder(); boolean firstItem = true; for( String roleName : roleNamesToSearchInto ) { String roleId = KimApiServiceLocator.getRoleService().getRoleIdByNamespaceCodeAndName(KFSConstants.SysKimApiConstants.ORGANIZATION_REVIEWER_ROLE_NAMESPACECODE, roleName); if ( roleId != null ) { for ( DelegationType type : DelegationType.values() ) { String delegationId = getDelegationIdByRoleAndDelegationType(roleId, type); if ( delegationId != null ) { if ( !firstItem ) { rolesQueryString.append( KimConstants.KimUIConstants.OR_OPERATOR ); } else { firstItem = false; } rolesQueryString.append( delegationId ); } } } } if ( rolesQueryString.length() > 0 ) { searchCriteria.put("delegationId", rolesQueryString.toString()); } } } protected void addRolesToRoleMemberSearchCriteria(String documentTypeName, Map<String, String> searchCriteria){ List<String> roleNamesToSearchInto = orgReviewRoleService.getRolesToConsider(documentTypeName); if( roleNamesToSearchInto != null) { StringBuilder rolesQueryString = new StringBuilder(); boolean firstItem = true; for ( String roleName : roleNamesToSearchInto ) { String roleId = KimApiServiceLocator.getRoleService().getRoleIdByNamespaceCodeAndName(KFSConstants.SysKimApiConstants.ORGANIZATION_REVIEWER_ROLE_NAMESPACECODE, roleName); if ( roleId != null ) { if ( !firstItem ) { rolesQueryString.append( KimConstants.KimUIConstants.OR_OPERATOR ); } else { firstItem = false; } rolesQueryString.append( roleId ); } } if ( rolesQueryString.length() > 0 ) { searchCriteria.put("roleId", rolesQueryString.toString()); } } } protected List<RoleMember> searchRoleMembers(Map<String, String> searchCriteriaRoleMembers){ if ( searchCriteriaRoleMembers == null ) { return Collections.emptyList(); } if ( LOG.isDebugEnabled() ) { LOG.debug("About to perform Role lookup. Criteria: " + searchCriteriaRoleMembers); } RoleMemberQueryResults results = KimApiServiceLocator.getRoleService().findRoleMembers( QueryByCriteria.Builder.fromPredicates( PredicateUtils.convertMapToPredicate(searchCriteriaRoleMembers))); if ( LOG.isDebugEnabled() ) { LOG.debug( "Role Member Lookup Results from KIM: " + results ); } if ( results == null ) { return Collections.emptyList(); } return results.getResults(); } protected List<KfsKimDocDelegateMember> searchDelegations(Map<String, String> searchCriteriaDelegateMembers){ DelegateMemberQueryResults queryResults = KimApiServiceLocator.getRoleService().findDelegateMembers(QueryByCriteria.Builder.fromPredicates( PredicateUtils.convertMapToPredicate(searchCriteriaDelegateMembers))); List<DelegateMember> tmpResults = queryResults.getResults(); Integer totalRowCount = tmpResults.size(); ArrayList<KfsKimDocDelegateMember> results = new ArrayList<KfsKimDocDelegateMember>(totalRowCount); if ( totalRowCount > 0 ) { for ( DelegateMember dm : tmpResults ) { results.add( new KfsKimDocDelegateMember( dm ) ); } } return results; } private static final String[] TRUE_VALUES = new String[] { "true", "yes", "t", "y" }; public static boolean getBooleanValueForString(String value, boolean defaultValue) { if (!StringUtils.isBlank(value)) { for (String trueValue : TRUE_VALUES) { if (value.equalsIgnoreCase(trueValue)) { return true; } } return false; } return defaultValue; } protected List<OrgReviewRole> flattenToOrgReviewMembers(String active, String documentTypeName, List<RoleMember> members){ LOG.debug( "\"flattening\" RoleMember objects to OrgReviewRole object" ); if(members==null || members.isEmpty() ) { return Collections.emptyList(); } boolean activeInd = getBooleanValueForString(active, true); List<OrgReviewRole> orgReviewRoles = new ArrayList<OrgReviewRole>(); for(RoleMember member: members){ if ( LOG.isDebugEnabled() ) { LOG.debug( "Converting Role Member: " + member ); } if(StringUtils.isBlank(active) || activeInd == member.isActive() ) { OrgReviewRole orgReviewRole = new OrgReviewRole(); orgReviewRole.setRoleMember(member); if ( LOG.isDebugEnabled() ) { LOG.debug( "Converted To OrgReviewRole: " + orgReviewRole ); } orgReviewRoles.add(orgReviewRole); } else { LOG.debug( "RoleMember skipped because it did not match the active flag on the lookup" ); } } return orgReviewRoles; } protected List<OrgReviewRole> flattenToOrgReviewDelegationMembers(String active, String documentTypeName, List<KfsKimDocDelegateMember> delegationMembers){ if( delegationMembers == null ) { return Collections.emptyList(); } List<OrgReviewRole> orgReviewRoles = new ArrayList<OrgReviewRole>(); boolean activeInd = getBooleanValueForString(active, true); for(KfsKimDocDelegateMember member: delegationMembers){ if ( LOG.isDebugEnabled() ) { LOG.debug( "Converting Delegation Member: " + member ); } if( StringUtils.isBlank(active) || activeInd == member.isActive() ) { OrgReviewRole orr = new OrgReviewRole(); orgReviewRoleService.populateOrgReviewRoleFromDelegationMember(orr, member.getRoleMemberId(), member.getDelegationMemberId()); if ( LOG.isDebugEnabled() ) { LOG.debug( "Converted To OrgReviewRole: " + orr ); } orgReviewRoles.add(orr); } } return orgReviewRoles; } protected String getQueryString(String parameter){ if(StringUtils.isBlank(parameter)) { return KFSConstants.WILDCARD_CHARACTER; } else { return KFSConstants.WILDCARD_CHARACTER+parameter+KFSConstants.WILDCARD_CHARACTER; } } protected Map<String, String> buildOrgReviewRoleSearchCriteria(String documentTypeName, Map<String, String> fieldValues){ List<String> principalIds = null; List<String> groupIds = null; List<String> roleIds = null; if ( StringUtils.isNotBlank(fieldValues.get(OrgReviewRole.PRINCIPAL_NAME_FIELD_NAME)) ) { principalIds = getPrincipalIdsForWildcardedPrincipalName(fieldValues.get(OrgReviewRole.PRINCIPAL_NAME_FIELD_NAME)); if( principalIds.isEmpty() ) { return null; } } if ( StringUtils.isNotBlank(fieldValues.get(OrgReviewRole.GROUP_NAME_FIELD_NAMESPACE_CODE)) || StringUtils.isNotBlank(fieldValues.get(OrgReviewRole.GROUP_NAME_FIELD_NAME)) ) { groupIds = getGroupIdsForWildcardedGroupName( fieldValues.get(OrgReviewRole.GROUP_NAME_FIELD_NAMESPACE_CODE), fieldValues.get(OrgReviewRole.GROUP_NAME_FIELD_NAME)); if( groupIds.isEmpty() ) { return null; } } if ( StringUtils.isNotBlank(fieldValues.get(OrgReviewRole.ROLE_NAME_FIELD_NAMESPACE_CODE)) || StringUtils.isNotBlank(fieldValues.get(OrgReviewRole.ROLE_NAME_FIELD_NAME)) ) { roleIds = getRoleIdsForWildcardedRoleName( fieldValues.get(OrgReviewRole.ROLE_NAME_FIELD_NAMESPACE_CODE), fieldValues.get(OrgReviewRole.ROLE_NAME_FIELD_NAME)); if( roleIds.isEmpty() ) { return null; } } String financialSystemDocumentTypeCode = fieldValues.get(KfsKimAttributes.FINANCIAL_SYSTEM_DOCUMENT_TYPE_CODE); String chartOfAccountsCode = fieldValues.get(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE); String organizationCode = fieldValues.get(KFSPropertyConstants.ORGANIZATION_CODE); Map<String, String> searchCriteriaMain = new HashMap<String, String>(); // Yes, the lines below overwrite each other. We are essentially attempting to use the most-selective one present. // Complete filtering will be performed later, after the results are retrieved if(StringUtils.isNotBlank(chartOfAccountsCode)){ searchCriteriaMain.put(MEMBER_ATTRIBUTE_NAME_KEY, KfsKimAttributes.CHART_OF_ACCOUNTS_CODE); searchCriteriaMain.put(MEMBER_ATTRIBUTE_VALUE_KEY, chartOfAccountsCode); } if(StringUtils.isNotBlank(financialSystemDocumentTypeCode)){ searchCriteriaMain.put(MEMBER_ATTRIBUTE_NAME_KEY, KimConstants.AttributeConstants.DOCUMENT_TYPE_NAME); searchCriteriaMain.put(MEMBER_ATTRIBUTE_VALUE_KEY, financialSystemDocumentTypeCode); } if(StringUtils.isNotBlank(organizationCode)){ searchCriteriaMain.put(MEMBER_ATTRIBUTE_NAME_KEY, KfsKimAttributes.ORGANIZATION_CODE); searchCriteriaMain.put(MEMBER_ATTRIBUTE_VALUE_KEY, organizationCode); } String memberIdString = buildMemberIdLookupString(principalIds, groupIds, roleIds); if ( StringUtils.isNotBlank(memberIdString) ) { searchCriteriaMain.put(MEMBER_ID, memberIdString ); } addRolesToRoleMemberSearchCriteria(documentTypeName, searchCriteriaMain); return searchCriteriaMain; } protected String buildMemberIdLookupString( List<String> principalIds, List<String> groupIds, List<String> roleIds ) { Collection<String> allMemberIds = new ArrayList<String>(); if(principalIds!=null){ allMemberIds.addAll(principalIds); } if(groupIds!=null){ allMemberIds.addAll(groupIds); } if(roleIds!=null){ allMemberIds.addAll(roleIds); } return StringUtils.join(allMemberIds, KimConstants.KimUIConstants.OR_OPERATOR); } protected Map<String, String> buildOrgReviewRoleSearchCriteriaForDelegations(String documentTypeName, Map<String, String> fieldValues){ List<String> principalIds = null; List<String> groupIds = null; List<String> roleIds = null; String principalName = fieldValues.get(OrgReviewRole.PRINCIPAL_NAME_FIELD_NAME); if ( StringUtils.isNotBlank(principalName) ) { principalIds = getPrincipalIdsForWildcardedPrincipalName(principalName); if( principalIds.isEmpty() ) { return null; } } if ( StringUtils.isNotBlank(fieldValues.get(OrgReviewRole.GROUP_NAME_FIELD_NAMESPACE_CODE)) || StringUtils.isNotBlank(fieldValues.get(OrgReviewRole.GROUP_NAME_FIELD_NAME)) ) { groupIds = getGroupIdsForWildcardedGroupName( fieldValues.get(OrgReviewRole.GROUP_NAME_FIELD_NAMESPACE_CODE), fieldValues.get(OrgReviewRole.GROUP_NAME_FIELD_NAME)); if( groupIds.isEmpty() ) { return null; } } if ( StringUtils.isNotBlank(fieldValues.get(OrgReviewRole.ROLE_NAME_FIELD_NAMESPACE_CODE)) || StringUtils.isNotBlank(fieldValues.get(OrgReviewRole.ROLE_NAME_FIELD_NAME)) ) { roleIds = getRoleIdsForWildcardedRoleName( fieldValues.get(OrgReviewRole.ROLE_NAME_FIELD_NAMESPACE_CODE), fieldValues.get(OrgReviewRole.ROLE_NAME_FIELD_NAME)); if( roleIds.isEmpty() ) { return null; } } // pull the other main three search criteria String financialSystemDocumentTypeCode = fieldValues.get(KfsKimAttributes.FINANCIAL_SYSTEM_DOCUMENT_TYPE_CODE); String chartOfAccountsCode = fieldValues.get(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE); String organizationCode = fieldValues.get(KFSPropertyConstants.ORGANIZATION_CODE); // Yes, the lines below overwrite each other. We are essentially attempting to use the most-selective one present. // Complete filtering will be performed later, after the results are retrieved Map<String, String> searchCriteriaMain = new HashMap<String, String>(); if(StringUtils.isNotBlank(chartOfAccountsCode)){ searchCriteriaMain.put(MEMBER_ATTRIBUTE_NAME_KEY, KfsKimAttributes.CHART_OF_ACCOUNTS_CODE); searchCriteriaMain.put(MEMBER_ATTRIBUTE_VALUE_KEY, chartOfAccountsCode); } if(StringUtils.isNotBlank(financialSystemDocumentTypeCode)){ searchCriteriaMain.put(MEMBER_ATTRIBUTE_NAME_KEY, KimConstants.AttributeConstants.DOCUMENT_TYPE_NAME); searchCriteriaMain.put(MEMBER_ATTRIBUTE_VALUE_KEY, financialSystemDocumentTypeCode); } if(StringUtils.isNotBlank(organizationCode)){ searchCriteriaMain.put(MEMBER_ATTRIBUTE_NAME_KEY, KfsKimAttributes.ORGANIZATION_CODE); searchCriteriaMain.put(MEMBER_ATTRIBUTE_VALUE_KEY, organizationCode); } String memberIdString = buildMemberIdLookupString(principalIds, groupIds, roleIds); if ( StringUtils.isNotBlank(memberIdString) ) { searchCriteriaMain.put(MEMBER_ID, memberIdString ); } addDelegationsToDelegationMemberSearchCriteria(documentTypeName, searchCriteriaMain); return searchCriteriaMain; } @Override public void validateSearchParameters(Map fieldValues) { if ( fieldValues != null ) { orgReviewRoleService.validateDocumentType((String)fieldValues.get(KfsKimAttributes.FINANCIAL_SYSTEM_DOCUMENT_TYPE_CODE)); } super.validateSearchParameters(fieldValues); } public void setOrgReviewRoleService(OrgReviewRoleService orgReviewRoleService) { this.orgReviewRoleService = orgReviewRoleService; } }