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    }