001    /*
002     * Copyright 2011 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 org.kuali.kfs.gl.batch.service.impl;
017    
018    import java.io.BufferedReader;
019    import java.io.File;
020    import java.io.FileNotFoundException;
021    import java.io.FileReader;
022    import java.io.IOException;
023    import java.io.PrintStream;
024    import java.sql.Date;
025    import java.util.ArrayList;
026    import java.util.Collection;
027    import java.util.List;
028    
029    import org.apache.commons.lang.StringUtils;
030    import org.apache.log4j.Logger;
031    import org.kuali.kfs.gl.GeneralLedgerConstants;
032    import org.kuali.kfs.gl.batch.service.CollectorHelperService;
033    import org.kuali.kfs.gl.batch.service.CollectorScrubberService;
034    import org.kuali.kfs.gl.batch.service.CollectorService;
035    import org.kuali.kfs.gl.batch.service.RunDateService;
036    import org.kuali.kfs.gl.businessobject.LedgerEntryHolder;
037    import org.kuali.kfs.gl.businessobject.OriginEntryGroup;
038    import org.kuali.kfs.gl.businessobject.OriginEntrySource;
039    import org.kuali.kfs.gl.report.CollectorReportData;
040    import org.kuali.kfs.gl.service.OriginEntryGroupService;
041    import org.kuali.kfs.gl.service.OriginEntryService;
042    import org.kuali.kfs.gl.service.impl.CollectorScrubberStatus;
043    import org.kuali.kfs.sys.batch.BatchInputFileType;
044    import org.kuali.kfs.sys.batch.service.BatchInputFileService;
045    import org.kuali.kfs.sys.service.ReportWriterService;
046    import org.kuali.rice.kns.service.DateTimeService;
047    import org.springframework.transaction.annotation.Transactional;
048    
049    /**
050     * The base implementation of the Collector service
051     */
052    @Transactional
053    public class CollectorServiceImpl implements CollectorService {
054        private static Logger LOG = Logger.getLogger(CollectorServiceImpl.class);
055    
056        private CollectorHelperService collectorHelperService;
057        private BatchInputFileService batchInputFileService;
058        private List<BatchInputFileType> collectorInputFileTypes;
059        private OriginEntryGroupService originEntryGroupService;
060        private DateTimeService dateTimeService;
061        private CollectorScrubberService collectorScrubberService;
062        private RunDateService runDateService;
063        private String batchFileDirectoryName;
064        
065        private ReportWriterService collectorReportWriterService;
066    
067        /**
068         * performs collection
069         * 
070         * @return status information related to the collection execution
071         */
072        public CollectorReportData performCollection() {
073            List<String> processedFiles = new ArrayList<String>();
074            Date executionDate = dateTimeService.getCurrentSqlDate();
075    
076            Date runDate = new Date(runDateService.calculateRunDate(executionDate).getTime());
077            CollectorReportData collectorReportData = new CollectorReportData();
078            List<CollectorScrubberStatus> collectorScrubberStatuses = new ArrayList<CollectorScrubberStatus>();
079    
080            String collectorFinalOutputFileName = batchFileDirectoryName + File.separator + GeneralLedgerConstants.BatchFileSystem.COLLECTOR_OUTPUT + GeneralLedgerConstants.BatchFileSystem.EXTENSION;
081          
082            PrintStream collectorFinalOutputFilePs = null;
083            BufferedReader inputFileReader = null;
084            try {
085                collectorFinalOutputFilePs = new PrintStream(collectorFinalOutputFileName);
086                    
087            } catch (FileNotFoundException e) {
088                throw new RuntimeException("writing all collector result files to output file process Stopped: " + e.getMessage(), e);
089            }
090    
091            for (BatchInputFileType collectorInputFileType : collectorInputFileTypes) {
092                List<String> fileNamesToLoad = batchInputFileService.listInputFileNamesWithDoneFile(collectorInputFileType);
093                for (String inputFileName : fileNamesToLoad) {
094                    boolean processSuccess = false;
095                    
096                    LOG.info("Collecting file: " + inputFileName);
097                    processSuccess = collectorHelperService.loadCollectorFile(inputFileName, collectorReportData, collectorScrubberStatuses, collectorInputFileType, collectorFinalOutputFilePs);
098                    processedFiles.add(inputFileName);
099                    if (processSuccess) {
100                        renameCollectorScrubberFiles();
101                    }
102                    collectorReportData.getLoadedfileNames().add(inputFileName);
103                    
104                }
105                updateCollectorReportDataWithExecutionStatistics(collectorReportData, collectorScrubberStatuses);
106            }
107    
108            collectorScrubberService.removeTempGroups(collectorScrubberStatuses);
109            collectorFinalOutputFilePs.close();
110                
111            return collectorReportData;
112        }
113    
114        /**
115         * Clears out associated .done files for the processed data files.
116         * @param dataFileNames the name of files with done files to remove
117         */
118        protected void removeDoneFiles(List<String> dataFileNames) {
119            for (String dataFileName : dataFileNames) {
120                File doneFile = new File(StringUtils.substringBeforeLast(dataFileName, ".") + ".done");
121                if (doneFile.exists()) {
122                    doneFile.delete();
123                }
124            }
125        }
126        
127        protected void renameCollectorScrubberFiles() {
128            String filePath = batchFileDirectoryName + File.separator;
129            List<String> fileNameList = new ArrayList<String>();
130            fileNameList.add(GeneralLedgerConstants.BatchFileSystem.COLLECTOR_BACKUP_FILE);
131            fileNameList.add(GeneralLedgerConstants.BatchFileSystem.COLLECTOR_SCRUBBER_INPUT_FILE);
132            fileNameList.add(GeneralLedgerConstants.BatchFileSystem.COLLECTOR_SCRUBBER_VALID_OUTPUT_FILE);
133            fileNameList.add(GeneralLedgerConstants.BatchFileSystem.COLLECTOR_SCRUBBER_ERROR_OUTPUT_FILE);
134            fileNameList.add(GeneralLedgerConstants.BatchFileSystem.COLLECTOR_SCRUBBER_EXPIRED_OUTPUT_FILE);
135            fileNameList.add(GeneralLedgerConstants.BatchFileSystem.COLLECTOR_SCRUBBER_ERROR_SORTED_FILE);
136            fileNameList.add(GeneralLedgerConstants.BatchFileSystem.COLLECTOR_DEMERGER_VAILD_OUTPUT_FILE);
137            fileNameList.add(GeneralLedgerConstants.BatchFileSystem.COLLECTOR_DEMERGER_ERROR_OUTPUT_FILE);
138            
139            for (String fileName : fileNameList){
140                File file = new File(filePath + fileName + GeneralLedgerConstants.BatchFileSystem.EXTENSION);
141                if (file.exists()) {
142                    String changedFileName = filePath + fileName + "." + getDateTimeService().toDateTimeStringForFilename(dateTimeService.getCurrentDate());
143                    file.renameTo(new File(changedFileName + GeneralLedgerConstants.BatchFileSystem.EXTENSION));
144                }
145            }
146        }
147        
148        public void finalizeCollector(CollectorReportData collectorReportData){
149            // remove all done files for processed files
150            removeDoneFiles( (List) collectorReportData.getLoadedfileNames());
151            
152            // create a done file for collector gl output
153            String collectorFinalOutputDoneFileName = batchFileDirectoryName + File.separator + GeneralLedgerConstants.BatchFileSystem.COLLECTOR_OUTPUT + GeneralLedgerConstants.BatchFileSystem.DONE_FILE_EXTENSION;
154            File doneFile = new File (collectorFinalOutputDoneFileName);
155            if (!doneFile.exists()){
156                try {
157                    doneFile.createNewFile();
158                } catch (IOException e) {
159                    throw new RuntimeException("Error creating collector done file", e);
160                }
161            }
162        }
163        
164    
165        public void setCollectorHelperService(CollectorHelperService collectorHelperService) {
166            this.collectorHelperService = collectorHelperService;
167        }
168    
169        public void setBatchInputFileService(BatchInputFileService batchInputFileService) {
170            this.batchInputFileService = batchInputFileService;
171        }
172    
173        public void setCollectorInputFileTypes(List<BatchInputFileType> collectorInputFileTypes) {
174            this.collectorInputFileTypes = collectorInputFileTypes;
175        }
176    
177        /**
178         * Gets the originEntryGroupService attribute.
179         * 
180         * @return Returns the originEntryGroupService.
181         */
182        public OriginEntryGroupService getOriginEntryGroupService() {
183            return originEntryGroupService;
184        }
185    
186        /**
187         * Sets the originEntryGroupService attribute value.
188         * 
189         * @param originEntryGroupService The originEntryGroupService to set.
190         */
191        public void setOriginEntryGroupService(OriginEntryGroupService originEntryGroupService) {
192            this.originEntryGroupService = originEntryGroupService;
193        }
194    
195        /**
196         * Gets the dateTimeService attribute.
197         * 
198         * @return Returns the dateTimeService.
199         */
200        public DateTimeService getDateTimeService() {
201            return dateTimeService;
202        }
203    
204        /**
205         * Sets the dateTimeService attribute value.
206         * 
207         * @param dateTimeService The dateTimeService to set.
208         */
209        public void setDateTimeService(DateTimeService dateTimeService) {
210            this.dateTimeService = dateTimeService;
211        }
212    
213        /**
214         * Gets the collectorScrubberService attribute.
215         * 
216         * @return Returns the collectorScrubberService.
217         */
218        public CollectorScrubberService getCollectorScrubberService() {
219            return collectorScrubberService;
220        }
221    
222        /**
223         * Sets the collectorScrubberService attribute value.
224         * 
225         * @param collectorScrubberService The collectorScrubberService to set.
226         */
227        public void setCollectorScrubberService(CollectorScrubberService collectorScrubberService) {
228            this.collectorScrubberService = collectorScrubberService;
229        }
230    
231        /**
232         * Adds execution statistics to the Collector run
233         * 
234         * @param collectorReportData data gathered from the run of the Collector
235         * @param collectorScrubberStatuses a List of CollectorScrubberStatus records
236         */
237        protected void updateCollectorReportDataWithExecutionStatistics(CollectorReportData collectorReportData, List<CollectorScrubberStatus> collectorScrubberStatuses) {
238        }
239    
240        public RunDateService getRunDateService() {
241            return runDateService;
242        }
243    
244        public void setRunDateService(RunDateService runDateService) {
245            this.runDateService = runDateService;
246        }
247    
248        public void setBatchFileDirectoryName(String batchFileDirectoryName) {
249            this.batchFileDirectoryName = batchFileDirectoryName;
250        }
251    
252        /**
253         * Sets the collectorReportWriterService attribute value.
254         * @param collectorReportWriterService The collectorReportWriterService to set.
255         */
256        public void setCollectorReportWriterService(ReportWriterService collectorReportWriterService) {
257            this.collectorReportWriterService = collectorReportWriterService;
258        }
259    }