001/* 002 * Copyright 2008 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 */ 016package org.kuali.ole.sys.service.impl; 017 018import java.util.ArrayList; 019import java.util.Collection; 020import java.util.HashMap; 021import java.util.List; 022import java.util.Map; 023 024import org.apache.commons.lang.StringUtils; 025import org.kuali.ole.coa.businessobject.Chart; 026import org.kuali.ole.coa.businessobject.Organization; 027import org.kuali.ole.coa.identity.FinancialSystemUserRoleTypeServiceImpl; 028import org.kuali.ole.coa.service.ChartService; 029import org.kuali.ole.coa.service.OrganizationService; 030import org.kuali.ole.sys.OLEConstants; 031import org.kuali.ole.sys.businessobject.ChartOrgHolder; 032import org.kuali.ole.sys.identity.OleKimAttributes; 033import org.kuali.ole.sys.service.FinancialSystemUserService; 034import org.kuali.rice.kim.api.KimConstants; 035import org.kuali.rice.kim.api.identity.Person; 036import org.kuali.rice.kim.api.identity.PersonService; 037import org.kuali.rice.kim.api.role.RoleService; 038 039public class FinancialSystemUserServiceImpl implements FinancialSystemUserService { 040 041 protected ChartService chartService; 042 protected OrganizationService organizationService; 043 protected RoleService roleService; 044 protected PersonService personService; 045 protected String userRoleId; 046 private List<String> userRoleIdList = new ArrayList<String>(1); 047 048 protected String getUserRoleId() { 049 if (userRoleId == null) { 050 userRoleId = roleService.getRoleIdByNamespaceCodeAndName(OLEConstants.CoreModuleNamespaces.OLE, OLEConstants.SysKimApiConstants.KFS_USER_ROLE_NAME); 051 } 052 return userRoleId; 053 } 054 055 protected List<String> getUserRoleIdAsList() { 056 if (userRoleIdList.isEmpty()) { 057 userRoleIdList.add(getUserRoleId()); 058 } 059 return userRoleIdList; 060 } 061 062 /** 063 * @see org.kuali.ole.sys.service.FinancialSystemUserService#isActiveFinancialSystemUser(org.kuali.rice.kim.api.identity.Person) 064 */ 065 @Override 066 public boolean isActiveFinancialSystemUser(Person p) { 067 if ( p == null ) { 068 return false; 069 } 070 return isActiveFinancialSystemUser(p.getPrincipalId()); 071 } 072 073 /** 074 * @see org.kuali.ole.sys.service.FinancialSystemUserService#isActiveFinancialSystemUser(java.lang.String) 075 */ 076 @Override 077 public boolean isActiveFinancialSystemUser(String principalId) { 078 if ( StringUtils.isBlank(principalId)) { 079 return false; 080 } 081 return roleService.principalHasRole(principalId, getUserRoleIdAsList(), new HashMap<String, String>()); 082 } 083 084 /** 085 * @see org.kuali.ole.sys.service.FinancialSystemUserService#getPrimaryOrganization(org.kuali.rice.kim.api.identity.Person, 086 * java.lang.String) 087 */ 088 @Override 089 public ChartOrgHolder getPrimaryOrganization(Person person, String namespaceCode) { 090 if ( person == null ) { 091 return null; 092 } 093 ChartOrgHolder chartOrgHolder = getOrganizationForFinancialSystemUser(person.getPrincipalId(), namespaceCode); 094 if (chartOrgHolder == null) { 095 chartOrgHolder = getOrganizationForNonFinancialSystemUser(person); 096 } 097 return (chartOrgHolder == null) ? new ChartOrgHolderImpl() : chartOrgHolder; 098 } 099 100 /** 101 * @see org.kuali.ole.sys.service.FinancialSystemUserService#getOrganizationByNamespaceCode(org.kuali.rice.kim.api.identity.Person, 102 * java.lang.String) 103 */ 104 @Override 105 public ChartOrgHolder getPrimaryOrganization(String principalId, String namespaceCode) { 106 if ( StringUtils.isBlank(principalId) ) { 107 return new ChartOrgHolderImpl(); 108 } 109 ChartOrgHolder chartOrgHolder = getOrganizationForFinancialSystemUser(principalId, namespaceCode); 110 if (chartOrgHolder == null) { 111 chartOrgHolder = getOrganizationForNonFinancialSystemUser(personService.getPerson(principalId)); 112 } 113 return (chartOrgHolder == null) ? new ChartOrgHolderImpl() : chartOrgHolder; 114 } 115 116 protected ChartOrgHolder getOrganizationForFinancialSystemUser(String principalId, String namespaceCode) { 117 if ( StringUtils.isBlank( principalId ) ) { 118 return null; 119 } 120 Map<String,String> qualification = new HashMap<String,String>(2); 121 qualification.put(FinancialSystemUserRoleTypeServiceImpl.PERFORM_QUALIFIER_MATCH, "true"); 122 qualification.put(KimConstants.AttributeConstants.NAMESPACE_CODE, namespaceCode); 123 List<Map<String,String>> roleQualifiers = roleService.getRoleQualifersForPrincipalByNamespaceAndRolename(principalId, OLEConstants.CoreModuleNamespaces.OLE, OLEConstants.SysKimApiConstants.KFS_USER_ROLE_NAME, qualification); 124 if ((roleQualifiers != null) && !roleQualifiers.isEmpty()) { 125 return new ChartOrgHolderImpl(roleQualifiers.get(0).get(OleKimAttributes.CHART_OF_ACCOUNTS_CODE), roleQualifiers.get(0).get(OleKimAttributes.ORGANIZATION_CODE)); 126 } 127 return null; 128 } 129 130 @Deprecated 131 protected ChartOrgHolder getOrganizationForNonFinancialSystemUser(Person person) { 132 // HACK ALERT!!!!! - This is to support the original universal user table setup where the home department 133 // was encoded as CAMPUS-ORG (Where campus happened to match the chart) in the original FS_UNIVERSAL_USR_T table. 134 // This **REALLY** needs a new implementation 135 if (person.getPrimaryDepartmentCode().contains("-")) { 136 return new ChartOrgHolderImpl(StringUtils.substringBefore(person.getPrimaryDepartmentCode(), "-"), StringUtils.substringAfter(person.getPrimaryDepartmentCode(), "-")); 137 } 138 return null; 139 } 140 141 @Override 142 public Collection<String> getPrincipalIdsForFinancialSystemOrganizationUsers( String namespaceCode, ChartOrgHolder chartOrg) { 143 Map<String,String> qualification = new HashMap<String,String>(2); 144 qualification.put(FinancialSystemUserRoleTypeServiceImpl.PERFORM_QUALIFIER_MATCH, "true"); 145 qualification.put(KimConstants.AttributeConstants.NAMESPACE_CODE, namespaceCode); 146 qualification.put(OleKimAttributes.CHART_OF_ACCOUNTS_CODE, chartOrg.getChartOfAccountsCode()); 147 qualification.put(OleKimAttributes.ORGANIZATION_CODE, chartOrg.getOrganizationCode()); 148 return roleService.getRoleMemberPrincipalIds(OLEConstants.CoreModuleNamespaces.OLE, OLEConstants.SysKimApiConstants.KFS_USER_ROLE_NAME, qualification); 149 } 150 151 @Override 152 public Collection<String> getPrincipalIdsForFinancialSystemOrganizationUsers(String namespaceCode, List<ChartOrgHolder> chartOrgs) { 153 List<String> principalIds = new ArrayList<String>(); 154 for ( ChartOrgHolder chartOrg : chartOrgs ) { 155 principalIds.addAll( getPrincipalIdsForFinancialSystemOrganizationUsers(namespaceCode, chartOrg)); 156 } 157 return principalIds; 158 } 159 160 public class ChartOrgHolderImpl implements ChartOrgHolder { 161 protected String chartOfAccountsCode; 162 protected String organizationCode; 163 164 165 public ChartOrgHolderImpl() {} 166 167 public ChartOrgHolderImpl(String chartOfAccountsCode, String organizationCode) { 168 this.chartOfAccountsCode = chartOfAccountsCode; 169 this.organizationCode = organizationCode; 170 } 171 172 @Override 173 public Chart getChartOfAccounts() { 174 return chartService.getByPrimaryId(chartOfAccountsCode); 175 } 176 177 @Override 178 public Organization getOrganization() { 179 return organizationService.getByPrimaryIdWithCaching(chartOfAccountsCode, organizationCode); 180 } 181 182 @Override 183 public String getChartOfAccountsCode() { 184 return chartOfAccountsCode; 185 } 186 187 public void setChartOfAccountsCode(String chartOfAccountsCode) { 188 this.chartOfAccountsCode = chartOfAccountsCode; 189 } 190 191 @Override 192 public String getOrganizationCode() { 193 return organizationCode; 194 } 195 196 public void setOrganizationCode(String organizationCode) { 197 this.organizationCode = organizationCode; 198 } 199 @Override 200 public boolean equals(Object obj) { 201 if ( !(obj instanceof ChartOrgHolder) ) { 202 return false; 203 } 204 return chartOfAccountsCode.equals(((ChartOrgHolder)obj).getChartOfAccountsCode()) 205 && organizationCode.equals(((ChartOrgHolder)obj).getOrganizationCode()); 206 } 207 208 @Override 209 public int hashCode() { 210 return chartOfAccountsCode.hashCode() + organizationCode.hashCode(); 211 } 212 } 213 214 public void setChartService(ChartService chartService) { 215 this.chartService = chartService; 216 } 217 218 public void setOrganizationService(OrganizationService organizationService) { 219 this.organizationService = organizationService; 220 } 221 222 public void setRoleService(RoleService roleService) { 223 this.roleService = roleService; 224 } 225 226 public void setPersonService(PersonService personService) { 227 this.personService = personService; 228 } 229}