001/**
002 * Copyright 2005-2016 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 */
016package edu.sampleu.travel.service;
017
018import java.util.ArrayList;
019import java.util.Collection;
020import java.util.HashMap;
021import java.util.Iterator;
022import java.util.List;
023import java.util.Map;
024
025import org.kuali.rice.krad.service.BusinessObjectService;
026import org.kuali.rice.krad.service.KRADServiceLocator;
027import org.kuali.rice.krad.service.KRADServiceLocatorWeb;
028import org.kuali.rice.krad.service.LookupService;
029import org.springframework.beans.BeanUtils;
030
031import edu.sampleu.travel.bo.FiscalOfficer;
032import edu.sampleu.travel.bo.TravelAccount;
033import edu.sampleu.travel.dto.FiscalOfficerInfo;
034import edu.sampleu.travel.dto.TravelAccountInfo;
035
036/**
037 * 
038 * @author Kuali Rice Team (rice.collab@kuali.org)
039 */
040public 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}