View Javadoc

1   /*
2    * Copyright 2011 The Kuali Foundation
3    *
4    * Licensed under the Educational Community License, Version 1.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    * http://www.opensource.org/licenses/ecl1.php
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package edu.sampleu.travel.service;
17  
18  import java.util.ArrayList;
19  import java.util.Collection;
20  import java.util.HashMap;
21  import java.util.Iterator;
22  import java.util.List;
23  import java.util.Map;
24  
25  import org.kuali.rice.kns.service.BusinessObjectService;
26  import org.kuali.rice.kns.service.KNSServiceLocator;
27  import org.kuali.rice.kns.service.KNSServiceLocatorWeb;
28  import org.kuali.rice.kns.service.LookupService;
29  import org.springframework.beans.BeanUtils;
30  
31  import edu.sampleu.travel.bo.FiscalOfficer;
32  import edu.sampleu.travel.bo.TravelAccount;
33  import edu.sampleu.travel.dto.FiscalOfficerInfo;
34  import edu.sampleu.travel.dto.TravelAccountInfo;
35  
36  /**
37   * 
38   * @author Kuali Rice Team (rice.collab@kuali.org)
39   */
40  public class FiscalOfficerServiceImpl implements FiscalOfficerService {
41  
42      protected static String[] FOI_SKIP = { "accounts" };
43      
44      protected BusinessObjectService businessObjectService;
45      protected LookupService lookupService;
46      
47      @Override
48      public FiscalOfficerInfo createFiscalOfficer(FiscalOfficerInfo fiscalOfficerInfo) {
49          getBusinessObjectService().save(toFiscalOfficer(fiscalOfficerInfo));
50          
51          Map<String, Object> criteria = new HashMap<String, Object>();
52          criteria.put("id", fiscalOfficerInfo.getId());
53          FiscalOfficer fiscalOfficer = getBusinessObjectService().findByPrimaryKey(FiscalOfficer.class, criteria);
54          return toFiscalOfficerInfo(fiscalOfficer);
55      }
56  
57      @Override
58      public List<FiscalOfficerInfo> lookupFiscalOfficer(Map<String, String> criteria) {
59          @SuppressWarnings("unchecked")
60          Collection<FiscalOfficer> temp = getLookupService().findCollectionBySearch(FiscalOfficer.class, criteria);
61          
62          List<FiscalOfficerInfo> results = new ArrayList<FiscalOfficerInfo>();
63          if(temp != null) {
64              for(FiscalOfficer fiscalOfficer : temp) {
65                  results.add(toFiscalOfficerInfo(fiscalOfficer));
66              }
67          }
68          
69          return results;
70      }
71  
72      @Override
73      public FiscalOfficerInfo retrieveFiscalOfficer(Long id) {
74          FiscalOfficer temp = getBusinessObjectService().findBySinglePrimaryKey(FiscalOfficer.class, id);
75          FiscalOfficerInfo result = toFiscalOfficerInfo(temp);
76          return result;
77      }
78  
79      @Override
80      public FiscalOfficerInfo updateFiscalOfficer(FiscalOfficerInfo fiscalOfficerInfo) {
81          FiscalOfficer fiscalOfficer = getBusinessObjectService().findBySinglePrimaryKey(FiscalOfficer.class, fiscalOfficerInfo.getId());
82          
83          if(fiscalOfficer != null) {
84              getBusinessObjectService().save(toFiscalOfficerUpdate(fiscalOfficerInfo, fiscalOfficer));
85              fiscalOfficer = getBusinessObjectService().findBySinglePrimaryKey(FiscalOfficer.class, fiscalOfficerInfo.getId());
86          }
87          
88          return toFiscalOfficerInfo(fiscalOfficer);
89      }
90      
91      /**
92       * This method only copies fields from the dto to the ojb bean that should be copied
93       * on an update call.
94       * 
95       * @param fiscalOfficerInfo dto to convert to ojb bean
96       * @param fiscalOfficer target ojb bean to update from info
97       * @return
98       */
99      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 = KNSServiceLocator.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 = KNSServiceLocatorWeb.getLookupService();
210         }
211         return this.lookupService;
212     }
213 
214     public void setLookupService(LookupService lookupService) {
215         this.lookupService = lookupService;
216     }
217 
218 }