001 /** 002 * Copyright 2005-2013 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 edu.sampleu.travel.service; 017 018 import java.util.ArrayList; 019 import java.util.Collection; 020 import java.util.HashMap; 021 import java.util.Iterator; 022 import java.util.List; 023 import java.util.Map; 024 025 import org.kuali.rice.krad.service.BusinessObjectService; 026 import org.kuali.rice.krad.service.KRADServiceLocator; 027 import org.kuali.rice.krad.service.KRADServiceLocatorWeb; 028 import org.kuali.rice.krad.service.LookupService; 029 import org.springframework.beans.BeanUtils; 030 031 import edu.sampleu.travel.bo.FiscalOfficer; 032 import edu.sampleu.travel.bo.TravelAccount; 033 import edu.sampleu.travel.dto.FiscalOfficerInfo; 034 import edu.sampleu.travel.dto.TravelAccountInfo; 035 036 /** 037 * 038 * @author Kuali Rice Team (rice.collab@kuali.org) 039 */ 040 public class FiscalOfficerTravelAccountServiceImpl implements FiscalOfficerService, TravelAccountService { 041 042 protected static String[] FOI_SKIP = { "accounts" }; 043 044 protected BusinessObjectService businessObjectService; 045 protected LookupService lookupService; 046 047 @Override 048 public FiscalOfficerInfo createFiscalOfficer(FiscalOfficerInfo fiscalOfficerInfo) { 049 getBusinessObjectService().save(toFiscalOfficer(fiscalOfficerInfo)); 050 051 Map<String, Object> criteria = new HashMap<String, Object>(); 052 criteria.put("id", fiscalOfficerInfo.getId()); 053 FiscalOfficer fiscalOfficer = getBusinessObjectService().findByPrimaryKey(FiscalOfficer.class, criteria); 054 return toFiscalOfficerInfo(fiscalOfficer); 055 } 056 057 @Override 058 public List<FiscalOfficerInfo> lookupFiscalOfficer(Map<String, String> criteria) { 059 @SuppressWarnings("unchecked") 060 Collection<FiscalOfficer> temp = getLookupService().findCollectionBySearch(FiscalOfficer.class, criteria); 061 062 List<FiscalOfficerInfo> results = new ArrayList<FiscalOfficerInfo>(); 063 if(temp != null) { 064 for(FiscalOfficer fiscalOfficer : temp) { 065 results.add(toFiscalOfficerInfo(fiscalOfficer)); 066 } 067 } 068 069 return results; 070 } 071 072 @Override 073 public FiscalOfficerInfo retrieveFiscalOfficer(Long id) { 074 FiscalOfficer temp = getBusinessObjectService().findBySinglePrimaryKey(FiscalOfficer.class, id); 075 FiscalOfficerInfo result = toFiscalOfficerInfo(temp); 076 return result; 077 } 078 079 @Override 080 public FiscalOfficerInfo updateFiscalOfficer(FiscalOfficerInfo fiscalOfficerInfo) { 081 FiscalOfficer fiscalOfficer = getBusinessObjectService().findBySinglePrimaryKey(FiscalOfficer.class, fiscalOfficerInfo.getId()); 082 083 if(fiscalOfficer != null) { 084 getBusinessObjectService().save(toFiscalOfficerUpdate(fiscalOfficerInfo, fiscalOfficer)); 085 fiscalOfficer = getBusinessObjectService().findBySinglePrimaryKey(FiscalOfficer.class, fiscalOfficerInfo.getId()); 086 } 087 088 return toFiscalOfficerInfo(fiscalOfficer); 089 } 090 091 @Override 092 public TravelAccountInfo retrieveTravelAccount(String number) { 093 TravelAccount temp = getBusinessObjectService().findBySinglePrimaryKey(TravelAccount.class, number); 094 TravelAccountInfo result = toTravelAccountInfo(temp); 095 096 return result; 097 } 098 099 /** 100 * This method only copies fields from the dto to the ojb bean that should be copied 101 * on an update call. 102 * 103 * @param fiscalOfficerInfo dto to convert to ojb bean 104 * @param fiscalOfficer target ojb bean to update from info 105 * @return 106 */ 107 protected FiscalOfficer toFiscalOfficerUpdate(FiscalOfficerInfo fiscalOfficerInfo, 108 FiscalOfficer fiscalOfficer) { 109 110 BeanUtils.copyProperties(fiscalOfficerInfo, fiscalOfficer, FOI_SKIP); 111 112 List<TravelAccountInfo> newAccounts = new ArrayList<TravelAccountInfo>(); 113 Map<String, TravelAccountInfo> accountInfoMap = new HashMap<String, TravelAccountInfo>(); 114 115 // create a map of accounts that are being edited and list of accounts to be added 116 for(TravelAccountInfo accountInfo : fiscalOfficerInfo.getAccounts()) { 117 if(accountInfo.getVersionNumber() == null) { 118 newAccounts.add(accountInfo); 119 } 120 else { 121 accountInfoMap.put(accountInfo.getNumber(), accountInfo); 122 } 123 } 124 125 // iterator the accounts from the db, updating or removing if necessary 126 Iterator<TravelAccount> iterator = fiscalOfficer.getAccounts().iterator(); 127 while(iterator.hasNext()) { 128 TravelAccount account = iterator.next(); 129 TravelAccountInfo accountInfo = accountInfoMap.get(account.getNumber()); 130 131 if(accountInfo == null) { 132 // this really isnt the best example data set, so just orphan 133 // instead of actually deleting 134 //iterator.remove(); 135 136 account.setFoId(null); 137 account.setFiscalOfficer(null); 138 } 139 else { 140 BeanUtils.copyProperties(accountInfo, account); 141 } 142 } 143 144 // add the new accounts to the list 145 for(TravelAccountInfo accountInfo : newAccounts) { 146 fiscalOfficer.getAccounts().add(toTravelAccount(accountInfo)); 147 } 148 149 return fiscalOfficer; 150 } 151 152 protected FiscalOfficer toFiscalOfficer(FiscalOfficerInfo fiscalOfficerInfo) { 153 FiscalOfficer fiscalOfficer = new FiscalOfficer(); 154 155 BeanUtils.copyProperties(fiscalOfficerInfo, fiscalOfficer, FOI_SKIP); 156 157 if(fiscalOfficerInfo.getAccounts() != null) { 158 for(TravelAccountInfo accountInfo : fiscalOfficerInfo.getAccounts()) { 159 fiscalOfficer.getAccounts().add(toTravelAccount(accountInfo)); 160 } 161 } 162 163 return fiscalOfficer; 164 } 165 166 protected FiscalOfficerInfo toFiscalOfficerInfo(FiscalOfficer fiscalOfficer) { 167 FiscalOfficerInfo fiscalOfficerInfo = null; 168 169 if(fiscalOfficer != null) { 170 fiscalOfficerInfo = new FiscalOfficerInfo(); 171 172 BeanUtils.copyProperties(fiscalOfficer, fiscalOfficerInfo, FOI_SKIP); 173 174 if(fiscalOfficer.getAccounts() != null) { 175 List<TravelAccountInfo> accountInfoList = new ArrayList<TravelAccountInfo>(); 176 177 for(TravelAccount travelAccount : fiscalOfficer.getAccounts()) { 178 accountInfoList.add(toTravelAccountInfo(travelAccount)); 179 } 180 181 fiscalOfficerInfo.setAccounts(accountInfoList); 182 } 183 } 184 185 return fiscalOfficerInfo; 186 } 187 188 protected TravelAccountInfo toTravelAccountInfo(TravelAccount travelAccount) { 189 TravelAccountInfo travelAccountInfo = new TravelAccountInfo(); 190 191 BeanUtils.copyProperties(travelAccount, travelAccountInfo); 192 193 return travelAccountInfo; 194 } 195 196 protected TravelAccount toTravelAccount(TravelAccountInfo travelAccountInfo) { 197 TravelAccount travelAccount = new TravelAccount(); 198 199 BeanUtils.copyProperties(travelAccountInfo, travelAccount); 200 201 return travelAccount; 202 } 203 204 protected BusinessObjectService getBusinessObjectService() { 205 if(businessObjectService == null) { 206 businessObjectService = KRADServiceLocator.getBusinessObjectService(); 207 } 208 return this.businessObjectService; 209 } 210 211 public void setBusinessObjectService(BusinessObjectService businessObjectService) { 212 this.businessObjectService = businessObjectService; 213 } 214 215 protected LookupService getLookupService() { 216 if(lookupService == null) { 217 lookupService = KRADServiceLocatorWeb.getLookupService(); 218 } 219 return this.lookupService; 220 } 221 222 public void setLookupService(LookupService lookupService) { 223 this.lookupService = lookupService; 224 } 225 226 }