001 /* 002 * Copyright 2011 The Kuali Foundation 003 * 004 * Licensed under the Educational Community License, Version 1.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/ecl1.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 FiscalOfficerServiceImpl implements FiscalOfficerService { 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 /** 092 * This method only copies fields from the dto to the ojb bean that should be copied 093 * on an update call. 094 * 095 * @param fiscalOfficerInfo dto to convert to ojb bean 096 * @param fiscalOfficer target ojb bean to update from info 097 * @return 098 */ 099 protected FiscalOfficer toFiscalOfficerUpdate(FiscalOfficerInfo fiscalOfficerInfo, 100 FiscalOfficer fiscalOfficer) { 101 102 BeanUtils.copyProperties(fiscalOfficerInfo, fiscalOfficer, FOI_SKIP); 103 104 List<TravelAccountInfo> newAccounts = new ArrayList<TravelAccountInfo>(); 105 Map<String, TravelAccountInfo> accountInfoMap = new HashMap<String, TravelAccountInfo>(); 106 107 // create a map of accounts that are being edited and list of accounts to be added 108 for(TravelAccountInfo accountInfo : fiscalOfficerInfo.getAccounts()) { 109 if(accountInfo.getVersionNumber() == null) { 110 newAccounts.add(accountInfo); 111 } 112 else { 113 accountInfoMap.put(accountInfo.getNumber(), accountInfo); 114 } 115 } 116 117 // iterator the accounts from the db, updating or removing if necessary 118 Iterator<TravelAccount> iterator = fiscalOfficer.getAccounts().iterator(); 119 while(iterator.hasNext()) { 120 TravelAccount account = iterator.next(); 121 TravelAccountInfo accountInfo = accountInfoMap.get(account.getNumber()); 122 123 if(accountInfo == null) { 124 // this really isnt the best example data set, so just orphan 125 // instead of actually deleting 126 //iterator.remove(); 127 128 account.setFoId(null); 129 account.setFiscalOfficer(null); 130 } 131 else { 132 BeanUtils.copyProperties(accountInfo, account); 133 } 134 } 135 136 // add the new accounts to the list 137 for(TravelAccountInfo accountInfo : newAccounts) { 138 fiscalOfficer.getAccounts().add(toTravelAccount(accountInfo)); 139 } 140 141 return fiscalOfficer; 142 } 143 144 protected FiscalOfficer toFiscalOfficer(FiscalOfficerInfo fiscalOfficerInfo) { 145 FiscalOfficer fiscalOfficer = new FiscalOfficer(); 146 147 BeanUtils.copyProperties(fiscalOfficerInfo, fiscalOfficer, FOI_SKIP); 148 149 if(fiscalOfficerInfo.getAccounts() != null) { 150 for(TravelAccountInfo accountInfo : fiscalOfficerInfo.getAccounts()) { 151 fiscalOfficer.getAccounts().add(toTravelAccount(accountInfo)); 152 } 153 } 154 155 return fiscalOfficer; 156 } 157 158 protected FiscalOfficerInfo toFiscalOfficerInfo(FiscalOfficer fiscalOfficer) { 159 FiscalOfficerInfo fiscalOfficerInfo = null; 160 161 if(fiscalOfficer != null) { 162 fiscalOfficerInfo = new FiscalOfficerInfo(); 163 164 BeanUtils.copyProperties(fiscalOfficer, fiscalOfficerInfo, FOI_SKIP); 165 166 if(fiscalOfficer.getAccounts() != null) { 167 List<TravelAccountInfo> accountInfoList = new ArrayList<TravelAccountInfo>(); 168 169 for(TravelAccount travelAccount : fiscalOfficer.getAccounts()) { 170 accountInfoList.add(toTravelAccountInfo(travelAccount)); 171 } 172 173 fiscalOfficerInfo.setAccounts(accountInfoList); 174 } 175 } 176 177 return fiscalOfficerInfo; 178 } 179 180 protected TravelAccountInfo toTravelAccountInfo(TravelAccount travelAccount) { 181 TravelAccountInfo travelAccountInfo = new TravelAccountInfo(); 182 183 BeanUtils.copyProperties(travelAccount, travelAccountInfo); 184 185 return travelAccountInfo; 186 } 187 188 protected TravelAccount toTravelAccount(TravelAccountInfo travelAccountInfo) { 189 TravelAccount travelAccount = new TravelAccount(); 190 191 BeanUtils.copyProperties(travelAccountInfo, travelAccount); 192 193 return travelAccount; 194 } 195 196 protected BusinessObjectService getBusinessObjectService() { 197 if(businessObjectService == null) { 198 businessObjectService = KRADServiceLocator.getBusinessObjectService(); 199 } 200 return this.businessObjectService; 201 } 202 203 public void setBusinessObjectService(BusinessObjectService businessObjectService) { 204 this.businessObjectService = businessObjectService; 205 } 206 207 protected LookupService getLookupService() { 208 if(lookupService == null) { 209 lookupService = KRADServiceLocatorWeb.getLookupService(); 210 } 211 return this.lookupService; 212 } 213 214 public void setLookupService(LookupService lookupService) { 215 this.lookupService = lookupService; 216 } 217 218 }