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.sys.service.impl;
017    
018    import java.util.ArrayList;
019    import java.util.Collection;
020    import java.util.HashMap;
021    import java.util.List;
022    import java.util.Map;
023    
024    import org.apache.commons.lang.StringUtils;
025    import org.kuali.kfs.coa.businessobject.Chart;
026    import org.kuali.kfs.coa.businessobject.Organization;
027    import org.kuali.kfs.coa.identity.FinancialSystemUserRoleTypeServiceImpl;
028    import org.kuali.kfs.sys.KFSConstants;
029    import org.kuali.kfs.sys.KFSPropertyConstants;
030    import org.kuali.kfs.sys.businessobject.ChartOrgHolder;
031    import org.kuali.kfs.sys.context.SpringContext;
032    import org.kuali.kfs.sys.identity.KfsKimAttributes;
033    import org.kuali.kfs.sys.service.FinancialSystemUserService;
034    import org.kuali.rice.kim.bo.Person;
035    import org.kuali.rice.kim.bo.types.dto.AttributeSet;
036    import org.kuali.rice.kim.service.IdentityManagementService;
037    import org.kuali.rice.kim.service.PersonService;
038    import org.kuali.rice.kim.service.RoleManagementService;
039    import org.kuali.rice.kns.service.BusinessObjectService;
040    
041    public class FinancialSystemUserServiceImpl implements FinancialSystemUserService {
042    
043        private BusinessObjectService businessObjectService;
044        private IdentityManagementService identityManagementService;
045        private RoleManagementService roleManagementService;
046        private PersonService personService;
047        private String userRoleId;
048        private List<String> userRoleIdList = new ArrayList<String>(1);
049    
050        protected BusinessObjectService getBusinessObjectService() {
051            if (businessObjectService == null) {
052                businessObjectService = SpringContext.getBean(BusinessObjectService.class);
053            }
054            return businessObjectService;
055        }
056    
057        protected IdentityManagementService getIdentityManagementService() {
058            if (identityManagementService == null) {
059                identityManagementService = SpringContext.getBean(IdentityManagementService.class);
060            }
061            return identityManagementService;
062        }
063    
064        protected RoleManagementService getRoleManagementService() {
065            if (roleManagementService == null) {
066                roleManagementService = SpringContext.getBean(RoleManagementService.class);
067            }
068            return roleManagementService;
069        }
070        
071        protected PersonService getPersonService() {
072            if (personService == null) {
073                personService = SpringContext.getBean(PersonService.class);
074            }
075            return personService;        
076        }
077    
078        protected String getUserRoleId() {
079            if (userRoleId == null) {
080                userRoleId = getRoleManagementService().getRoleIdByName(KFSConstants.ParameterNamespaces.KFS, FinancialSystemUserRoleTypeServiceImpl.FINANCIAL_SYSTEM_USER_ROLE_NAME);
081            }
082            return userRoleId;
083        }
084    
085        protected List<String> getUserRoleIdAsList() {
086            if (userRoleIdList.isEmpty()) {
087                userRoleIdList.add(getUserRoleId());
088            }
089            return userRoleIdList;
090        }
091    
092        /**
093         * @see org.kuali.kfs.sys.service.FinancialSystemUserService#isActiveFinancialSystemUser(org.kuali.rice.kim.bo.Person)
094         */
095        public boolean isActiveFinancialSystemUser(Person p) {
096            return getRoleManagementService().principalHasRole(p.getPrincipalId(), getUserRoleIdAsList(), null);
097        }
098    
099        /**
100         * @see org.kuali.kfs.sys.service.FinancialSystemUserService#isActiveFinancialSystemUser(java.lang.String)
101         */
102        public boolean isActiveFinancialSystemUser(String principalId) {
103            return getRoleManagementService().principalHasRole(principalId, getUserRoleIdAsList(), null);
104        }
105    
106        /**
107         * @see org.kuali.kfs.sys.service.FinancialSystemUserService#getPrimaryOrganization(org.kuali.rice.kim.bo.Person,
108         *      java.lang.String)
109         */
110        public ChartOrgHolder getPrimaryOrganization(Person person, String namespaceCode) {
111            if (person == null) {
112                return null;
113            }
114            ChartOrgHolder chartOrgHolder = getOrganizationForFinancialSystemUser(person.getPrincipalId(), namespaceCode);
115            if (chartOrgHolder == null) {
116                chartOrgHolder = getOrganizationForNonFinancialSystemUser(person);
117            }
118            return (chartOrgHolder == null) ? new ChartOrgHolderImpl() : chartOrgHolder;
119        }
120    
121        /**
122         * @see org.kuali.kfs.sys.service.FinancialSystemUserService#getOrganizationByNamespaceCode(org.kuali.rice.kim.bo.Person,
123         *      java.lang.String)
124         */
125        public ChartOrgHolder getPrimaryOrganization(String principalId, String namespaceCode) {
126            ChartOrgHolder chartOrgHolder = getOrganizationForFinancialSystemUser(principalId, namespaceCode);
127            if (chartOrgHolder == null) {
128                chartOrgHolder = getOrganizationForNonFinancialSystemUser(getPersonService().getPerson(principalId));
129            }
130            return (chartOrgHolder == null) ? new ChartOrgHolderImpl() : chartOrgHolder;
131        }
132        
133        protected ChartOrgHolder getOrganizationForFinancialSystemUser(String principalId, String namespaceCode) {
134            if (principalId == null) {
135                return null;
136            }
137            AttributeSet qualification = new AttributeSet(2);
138            qualification.put(FinancialSystemUserRoleTypeServiceImpl.PERFORM_QUALIFIER_MATCH, "true");
139            qualification.put(KfsKimAttributes.NAMESPACE_CODE, namespaceCode);
140            List<AttributeSet> roleQualifiers = getRoleManagementService().getRoleQualifiersForPrincipal(principalId, KFSConstants.ParameterNamespaces.KFS, FinancialSystemUserRoleTypeServiceImpl.FINANCIAL_SYSTEM_USER_ROLE_NAME, qualification); 
141            if ((roleQualifiers != null) && !roleQualifiers.isEmpty()) {
142                return new ChartOrgHolderImpl(roleQualifiers.get(0).get(KfsKimAttributes.CHART_OF_ACCOUNTS_CODE), roleQualifiers.get(0).get(KfsKimAttributes.ORGANIZATION_CODE));
143            }
144            return null;
145        }
146        
147        protected ChartOrgHolder getOrganizationForNonFinancialSystemUser(Person person) {
148            if (person.getPrimaryDepartmentCode().contains("-")) {
149                return new ChartOrgHolderImpl(StringUtils.substringBefore(person.getPrimaryDepartmentCode(), "-"), StringUtils.substringAfter(person.getPrimaryDepartmentCode(), "-"));
150            }
151            return null;
152        }
153        
154        public Collection<String> getPrincipalIdsForFinancialSystemOrganizationUsers( String namespaceCode, ChartOrgHolder chartOrg) {
155            AttributeSet qualification = new AttributeSet(4);
156            qualification.put(FinancialSystemUserRoleTypeServiceImpl.PERFORM_QUALIFIER_MATCH, "true");
157            qualification.put(KfsKimAttributes.NAMESPACE_CODE, namespaceCode);
158            qualification.put(KfsKimAttributes.CHART_OF_ACCOUNTS_CODE, chartOrg.getChartOfAccountsCode());
159            qualification.put(KfsKimAttributes.ORGANIZATION_CODE, chartOrg.getOrganizationCode());
160            return getRoleManagementService().getRoleMemberPrincipalIds(KFSConstants.ParameterNamespaces.KFS, FinancialSystemUserRoleTypeServiceImpl.FINANCIAL_SYSTEM_USER_ROLE_NAME, qualification);
161        }
162        
163        public Collection<String> getPrincipalIdsForFinancialSystemOrganizationUsers(String namespaceCode, List<ChartOrgHolder> chartOrgs) {
164            List<String> principalIds = new ArrayList<String>();
165            for ( ChartOrgHolder chartOrg : chartOrgs ) {
166                principalIds.addAll( getPrincipalIdsForFinancialSystemOrganizationUsers(namespaceCode, chartOrg));
167            }
168            return principalIds;
169        }
170        
171        public class ChartOrgHolderImpl implements ChartOrgHolder {
172            private String chartOfAccountsCode;
173            private String organizationCode;
174            
175            
176            public ChartOrgHolderImpl() {
177            }
178    
179            public ChartOrgHolderImpl(String chartOfAccountsCode, String organizationCode) {
180                this.chartOfAccountsCode = chartOfAccountsCode;
181                this.organizationCode = organizationCode;
182            }
183    
184            public Chart getChartOfAccounts() {
185                Map<String, String> pk = new HashMap<String, String>(2);
186                pk.put(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, chartOfAccountsCode);
187                return (Chart) getBusinessObjectService().findByPrimaryKey(Chart.class, pk);
188            }
189    
190            public Organization getOrganization() {
191                Map<String, String> pk = new HashMap<String, String>(2);
192                pk.put(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, chartOfAccountsCode);
193                pk.put(KFSPropertyConstants.ORGANIZATION_CODE, organizationCode);
194                return (Organization) getBusinessObjectService().findByPrimaryKey(Organization.class, pk);
195            }
196    
197            public String getChartOfAccountsCode() {
198                return chartOfAccountsCode;
199            }
200    
201            public void setChartOfAccountsCode(String chartOfAccountsCode) {
202                this.chartOfAccountsCode = chartOfAccountsCode;
203            }
204    
205            public String getOrganizationCode() {
206                return organizationCode;
207            }
208    
209            public void setOrganizationCode(String organizationCode) {
210                this.organizationCode = organizationCode;
211            }
212            @Override
213            public boolean equals(Object obj) {
214                if ( !(obj instanceof ChartOrgHolder) ) {
215                    return false;
216                }
217                return chartOfAccountsCode.equals(((ChartOrgHolder)obj).getChartOfAccountsCode())
218                        && organizationCode.equals(((ChartOrgHolder)obj).getOrganizationCode());
219            }
220            
221            @Override
222            public int hashCode() {
223                return chartOfAccountsCode.hashCode() + organizationCode.hashCode();
224            }
225        }
226    }