001 /**
002 * Copyright 2005-2014 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 }