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.coa.service.impl; 017 018 import java.util.Iterator; 019 import java.util.List; 020 021 import org.apache.commons.lang.StringUtils; 022 import org.kuali.kfs.coa.businessobject.AccountDelegate; 023 import org.kuali.kfs.coa.dataaccess.AccountDelegateDao; 024 import org.kuali.kfs.coa.dataaccess.AccountDelegateGlobalDao; 025 import org.kuali.kfs.coa.document.AccountDelegateGlobalMaintainableImpl; 026 import org.kuali.kfs.coa.document.AccountDelegateMaintainableImpl; 027 import org.kuali.kfs.coa.service.AccountDelegateService; 028 import org.kuali.kfs.sys.KFSConstants; 029 import org.kuali.kfs.sys.context.SpringContext; 030 import org.kuali.kfs.sys.document.FinancialSystemMaintainable; 031 import org.kuali.kfs.sys.service.NonTransactional; 032 import org.kuali.rice.kim.service.RoleManagementService; 033 import org.kuali.rice.kns.bo.PersistableBusinessObject; 034 import org.kuali.rice.kns.document.MaintenanceLock; 035 import org.kuali.rice.kns.maintenance.Maintainable; 036 import org.kuali.rice.kns.service.BusinessObjectService; 037 import org.kuali.rice.kns.service.DataDictionaryService; 038 import org.springframework.transaction.annotation.Propagation; 039 import org.springframework.transaction.annotation.Transactional; 040 041 /** 042 * The default implementation of AccountDelegateService. 043 */ 044 public class AccountDelegateServiceImpl implements AccountDelegateService { 045 046 private AccountDelegateDao accountDelegateDao; 047 private AccountDelegateGlobalDao accountDelegateGlobalDao; 048 private DataDictionaryService dataDictionaryService; 049 private BusinessObjectService businessObjectService; 050 051 /** 052 * 053 * @see org.kuali.kfs.coa.service.AccountDelegateService#getLockingDocumentId(org.kuali.kfs.coa.document.AccountDelegateGlobalMaintainableImpl, java.lang.String) 054 */ 055 @NonTransactional 056 public String getLockingDocumentId(AccountDelegateGlobalMaintainableImpl global, String docNumber) { 057 String lockingDocId = null; 058 List<MaintenanceLock> maintenanceLocks = global.generateMaintenanceLocks(); 059 for (MaintenanceLock maintenanceLock : maintenanceLocks) { 060 lockingDocId = accountDelegateGlobalDao.getLockingDocumentNumber(maintenanceLock.getLockingRepresentation(),docNumber); 061 if (StringUtils.isNotBlank(lockingDocId)) { 062 break; 063 } 064 } 065 return lockingDocId; 066 } 067 068 /** 069 * 070 * @see org.kuali.kfs.coa.service.AccountDelegateService#getLockingDocumentId(org.kuali.kfs.coa.document.AccountDelegateMaintainableImpl, java.lang.String) 071 */ 072 @NonTransactional 073 public String getLockingDocumentId(AccountDelegateMaintainableImpl delegate, String docNumber) { 074 String lockingDocId = null; 075 List<MaintenanceLock> maintenanceLocks = delegate.generateMaintenanceLocks(); 076 maintenanceLocks.add(delegate.createGlobalAccountLock()); 077 078 for (MaintenanceLock maintenanceLock : maintenanceLocks) { 079 lockingDocId = accountDelegateDao.getLockingDocumentNumber(maintenanceLock.getLockingRepresentation(),docNumber); 080 if (StringUtils.isNotBlank(lockingDocId)) { 081 break; 082 } 083 } 084 return lockingDocId; 085 } 086 087 088 /** 089 * @see org.kuali.kfs.coa.service.AccountDelegateService#buildMaintainableForAccountDelegate(org.kuali.kfs.coa.businessobject.AccountDelegate) 090 */ 091 @NonTransactional 092 public FinancialSystemMaintainable buildMaintainableForAccountDelegate(AccountDelegate delegate) { 093 FinancialSystemMaintainable maintainable = getAccountDelegateMaintainable(); 094 maintainable.setBoClass(delegate.getClass()); 095 maintainable.setBusinessObject(delegate); 096 return maintainable; 097 } 098 099 /** 100 * @return the proper class for the Maintainable associated with AccountDelegate maintenance documents 101 */ 102 protected Class<? extends Maintainable> getAccountDelegateMaintainableClass() { 103 return getDataDictionaryService().getDataDictionary().getMaintenanceDocumentEntryForBusinessObjectClass(AccountDelegate.class).getMaintainableClass(); 104 } 105 106 /** 107 * @return a new instance of the proper maintainable for AccountDelegate maintenance documents 108 */ 109 protected FinancialSystemMaintainable getAccountDelegateMaintainable() { 110 final Class<? extends Maintainable> maintainableClazz = getAccountDelegateMaintainableClass(); 111 final FinancialSystemMaintainable maintainable; 112 try { 113 maintainable = (FinancialSystemMaintainable)maintainableClazz.newInstance(); 114 } 115 catch (InstantiationException ie) { 116 throw new RuntimeException("Could not instantiate maintainable for AccountDelegate maintenance document", ie); 117 } 118 catch (IllegalAccessException iae) { 119 throw new RuntimeException("Could not instantiate maintainable for AccountDelegate maintenance document", iae); 120 } 121 return maintainable; 122 } 123 124 /** 125 * @see org.kuali.kfs.coa.service.AccountDelegateService#retrieveAllActiveDelegationsForPerson(java.lang.String) 126 */ 127 @NonTransactional 128 public Iterator<AccountDelegate> retrieveAllActiveDelegationsForPerson(String principalId, boolean primary) { 129 return (Iterator<AccountDelegate>)getAccountDelegateDao().getAccountDelegationsForPerson(principalId, primary); 130 } 131 132 /** 133 * @see org.kuali.kfs.coa.service.AccountDelegateService#isPrincipalInAnyWayShapeOrFormPrimaryAccountDelegate(java.lang.String) 134 */ 135 @NonTransactional 136 public boolean isPrincipalInAnyWayShapeOrFormPrimaryAccountDelegate(String principalId) { 137 return accountDelegateDao.isPrincipalInAnyWayShapeOrFormPrimaryAccountDelegate(principalId); 138 } 139 140 /** 141 * @see org.kuali.kfs.coa.service.AccountDelegateService#isPrincipalInAnyWayShapeOrFormSecondaryAccountDelegate(java.lang.String) 142 */ 143 @NonTransactional 144 public boolean isPrincipalInAnyWayShapeOrFormSecondaryAccountDelegate(String principalId) { 145 return accountDelegateDao.isPrincipalInAnyWayShapeOrFormSecondaryAccountDelegate(principalId); 146 } 147 148 /** 149 * Saves the given account delegate to the persistence store 150 * @param accountDelegate the account delegate to save 151 */ 152 @Transactional(propagation = Propagation.REQUIRES_NEW) 153 public void saveForMaintenanceDocument(AccountDelegate accountDelegate) { 154 getBusinessObjectService().linkAndSave(accountDelegate); 155 } 156 157 /** 158 * Persists the given account delegate global maintenance document inactivations 159 * @param delegatesToInactivate the List of delegates to inactivate 160 */ 161 @Transactional(propagation = Propagation.REQUIRES_NEW) 162 public void saveInactivationsForGlobalMaintenanceDocument(List<PersistableBusinessObject> delegatesToInactivate) { 163 if (delegatesToInactivate != null && !delegatesToInactivate.isEmpty()) { 164 getBusinessObjectService().save(delegatesToInactivate); 165 } 166 } 167 168 /** 169 * Persists the given account delegate global maintenance document changes 170 * @param delegatesToChange the List of delegates to change 171 */ 172 @Transactional(propagation = Propagation.REQUIRES_NEW) 173 public void saveChangesForGlobalMaintenanceDocument(List<PersistableBusinessObject> delegatesToChange) { 174 if (delegatesToChange != null && !delegatesToChange.isEmpty()) { 175 getBusinessObjectService().save(delegatesToChange); 176 } 177 } 178 179 /** 180 * Updates the role that this delegate is part of, to account for the changes in this delegate 181 */ 182 @Transactional 183 public void updateDelegationRole() { 184 final RoleManagementService roleManagementService = SpringContext.getBean(RoleManagementService.class); 185 final String roleId = roleManagementService.getRoleIdByName(KFSConstants.ParameterNamespaces.KFS, KFSConstants.SysKimConstants.FISCAL_OFFICER_KIM_ROLE_NAME); 186 if (!StringUtils.isBlank(roleId)) { 187 roleManagementService.applicationRoleMembershipChanged(roleId); 188 } 189 } 190 191 /** 192 * Gets the accountDelegateDao attribute. 193 * @return Returns the accountDelegateDao. 194 */ 195 @NonTransactional 196 public AccountDelegateDao getAccountDelegateDao() { 197 return accountDelegateDao; 198 } 199 200 /** 201 * Sets the accountDelegateDao attribute value. 202 * @param accountDelegateDao The accountDelegateDao to set. 203 */ 204 @NonTransactional 205 public void setAccountDelegateDao(AccountDelegateDao accountDelegateDao) { 206 this.accountDelegateDao = accountDelegateDao; 207 } 208 209 /** 210 * Gets the accountDelegateGlobalDao attribute. 211 * @return Returns the accountDelegateGlobalDao. 212 */ 213 @NonTransactional 214 public AccountDelegateGlobalDao getAccountDelegateGlobalDao() { 215 return accountDelegateGlobalDao; 216 } 217 218 /** 219 * Sets the accountDelegateGlobalDao attribute value. 220 * @param accountDelegateGlobalDao The accountDelegateGlobalDao to set. 221 */ 222 @NonTransactional 223 public void setAccountDelegateGlobalDao(AccountDelegateGlobalDao accountDelegateGlobalDao) { 224 this.accountDelegateGlobalDao = accountDelegateGlobalDao; 225 } 226 227 /** 228 * Gets the dataDictionaryService attribute. 229 * @return Returns the dataDictionaryService. 230 */ 231 @NonTransactional 232 public DataDictionaryService getDataDictionaryService() { 233 return dataDictionaryService; 234 } 235 236 /** 237 * Sets the dataDictionaryService attribute value. 238 * @param dataDictionaryService The dataDictionaryService to set. 239 */ 240 @NonTransactional 241 public void setDataDictionaryService(DataDictionaryService dataDictionaryService) { 242 this.dataDictionaryService = dataDictionaryService; 243 } 244 245 /** 246 * Gets the businessObjectService attribute. 247 * @return Returns the businessObjectService. 248 */ 249 @NonTransactional 250 public BusinessObjectService getBusinessObjectService() { 251 return businessObjectService; 252 } 253 254 /** 255 * Sets the businessObjectService attribute value. 256 * @param businessObjectService The businessObjectService to set. 257 */ 258 @NonTransactional 259 public void setBusinessObjectService(BusinessObjectService businessObjectService) { 260 this.businessObjectService = businessObjectService; 261 } 262 263 }