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.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.FilenameFilter;
023 import java.io.IOException;
024 import java.io.PrintStream;
025 import java.util.Arrays;
026 import java.util.List;
027
028 import org.apache.commons.lang.StringUtils;
029 import org.kuali.kfs.gl.GeneralLedgerConstants;
030 import org.kuali.kfs.gl.service.OriginEntryGroupService;
031 import org.kuali.rice.kns.service.DateTimeService;
032 import org.kuali.rice.kns.service.KualiModuleService;
033 import org.springframework.transaction.annotation.Transactional;
034
035 /**
036 * @see org.kuali.kfs.gl.service.OriginEntryGroupService
037 */
038 @Transactional
039 public class OriginEntryGroupServiceImpl implements OriginEntryGroupService {
040 private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(OriginEntryGroupServiceImpl.class);
041
042 protected DateTimeService dateTimeService;
043 protected String batchFileDirectoryName;
044 protected KualiModuleService kualiModuleService;
045 protected String nightlyOutFileName;
046 protected String backupFileName;
047
048 /**
049 * @see org.kuali.kfs.gl.service.OriginEntryGroupService#getNewestScrubberErrorFileName()
050 */
051 public String getNewestScrubberErrorFileName() {
052 File newestFile = null;
053
054 File[] files = null;
055 // can add filter here: listFiles(filter); -- check out originEntryTestBase from Jeff
056 if (new File(batchFileDirectoryName) == null) {
057 return null;
058 }
059 files = new File(batchFileDirectoryName).listFiles(new ScrubberErrorFilenameFilter());
060 List<File> fileList = Arrays.asList(files);
061 if (fileList.size() > 0) {
062 for (File eachFile : fileList) {
063 if (newestFile == null) {
064 newestFile = eachFile;
065 }
066 else {
067 if (newestFile.lastModified() < eachFile.lastModified()) {
068 newestFile = eachFile;
069 }
070 }
071 }
072 }
073 else {
074 return null;
075 }
076
077 return newestFile.getName();
078 }
079
080
081 /**
082 * Retrieves all groups to be created today, and creates backup group versions of them
083 *
084 * @see org.kuali.kfs.gl.service.OriginEntryGroupService#createBackupGroup()
085 */
086 public void createBackupGroup() {
087 LOG.debug("createBackupGroup() started");
088 // check file from nightly out
089 File nightlyOutFile = new File(batchFileDirectoryName + File.separator + nightlyOutFileName);
090 if (!nightlyOutFile.exists()) {
091 LOG.warn("nightlyOutFile doesn't exist :" + nightlyOutFileName);
092 }
093
094 String backupFile = batchFileDirectoryName + File.separator + backupFileName + GeneralLedgerConstants.BatchFileSystem.EXTENSION;
095 PrintStream backupPs = null;
096 try {
097 backupPs = new PrintStream(backupFile);
098 }
099 catch (FileNotFoundException e) {
100 throw new RuntimeException("backupFile doesn't exist " + backupFile);
101 }
102
103 // get all done files from originEntry Directory
104 File[] doneFileList = new File(batchFileDirectoryName).listFiles(new DoneFileFilter());
105 // build output file with doneFileList and print stream
106 buildBackupFileOutput(doneFileList, backupPs);
107 backupPs.close();
108 }
109
110
111 /*
112 * buildBackupFileOuput with doneFileList and PrintStream
113 */
114 protected void buildBackupFileOutput(File[] doneFileList, PrintStream ps) {
115 BufferedReader inputFileReader = null;
116
117 for (File doneFile : doneFileList) {
118 // get data file with done file
119 File dataFile = getDataFile(doneFile);
120 if (dataFile != null) {
121 try {
122 inputFileReader = new BufferedReader(new FileReader(dataFile.getPath()));
123 String line = null;
124 while ((line = inputFileReader.readLine()) != null) {
125 try {
126 ps.printf("%s\n", line);
127 }
128 catch (Exception e) {
129 throw new IOException(e.toString());
130 }
131 }
132 inputFileReader.close();
133 inputFileReader = null;
134
135 }
136 catch (Exception e) {
137 throw new RuntimeException(e.toString());
138 }
139
140 doneFile.delete();
141 postProcessDataFile(dataFile);
142
143 }
144 }
145 }
146
147 protected void postProcessDataFile( File dataFile )
148 {
149 // do nothing. A hook for institution extension.
150 }
151
152
153 /**
154 * @see org.kuali.kfs.gl.service.OriginEntryGroupService#createGroup(java.lang.String)
155 */
156 public File createGroup(String fileName) {
157 return new File(batchFileDirectoryName + File.separator + fileName);
158 }
159
160 /**
161 * @see org.kuali.kfs.gl.service.OriginEntryGroupService#getGroupExists(java.lang.String)
162 */
163 public boolean getGroupExists(String groupId) {
164
165 File file = new File(batchFileDirectoryName + File.separator + groupId);
166 if (file == null) {
167 return false;
168 }
169 else {
170 return true;
171 }
172 }
173
174 /**
175 * @see org.kuali.kfs.gl.service.OriginEntryGroupService#getAllFileInBatchDirectory()
176 */
177 public File[] getAllFileInBatchDirectory() {
178 File[] returnFiles = null;
179 if (new File(batchFileDirectoryName) != null) {
180 returnFiles = new File(batchFileDirectoryName).listFiles(new DateAndDoneFileFilter());
181 }
182 return returnFiles;
183 }
184
185
186 /**
187 * @see org.kuali.kfs.gl.service.OriginEntryGroupService#deleteFile(java.lang.String)
188 */
189 public void deleteFile(String fileNameWithPath) {
190 File file = new File(fileNameWithPath);
191 if (file.exists()) {
192 file.delete();
193 }
194 }
195
196 /**
197 * @see org.kuali.kfs.gl.service.OriginEntryGroupService#getLaborFileWithFileName(java.lang.String)
198 */
199 public File getFileWithFileName(String fileName) {
200 return new File(batchFileDirectoryName + File.separator + fileName);
201 }
202
203 protected class ScrubberErrorFilenameFilter implements FilenameFilter {
204 /**
205 * @see java.io.FilenameFilter#accept(java.io.File, java.lang.String)
206 */
207 public boolean accept(File dir, String name) {
208 return name.contains(GeneralLedgerConstants.BatchFileSystem.SCRUBBER_ERROR_PREFIX);
209 }
210 }
211
212 protected class DateAndDoneFileFilter implements FilenameFilter {
213 /**
214 * @see java.io.FilenameFilter#accept(java.io.File, java.lang.String)
215 */
216 public boolean accept(File dir, String name) {
217 return name.contains(GeneralLedgerConstants.BatchFileSystem.DONE_FILE_EXTENSION) || name.contains(GeneralLedgerConstants.BatchFileSystem.EXTENSION);
218 }
219 }
220
221 protected class DoneFileFilter implements FilenameFilter {
222 /**
223 * @see java.io.FilenameFilter#accept(java.io.File, java.lang.String)
224 */
225 public boolean accept(File dir, String name) {
226 return name.contains(GeneralLedgerConstants.BatchFileSystem.DONE_FILE_EXTENSION);
227 }
228 }
229
230 protected File getDataFile(File doneFile) {
231 String doneFileAbsPath = doneFile.getAbsolutePath();
232 if (!doneFileAbsPath.endsWith(GeneralLedgerConstants.BatchFileSystem.DONE_FILE_EXTENSION)) {
233 throw new IllegalArgumentException("Done file name must end with " + GeneralLedgerConstants.BatchFileSystem.DONE_FILE_EXTENSION);
234 }
235 String dataFileAbsPath = StringUtils.removeEnd(doneFileAbsPath, GeneralLedgerConstants.BatchFileSystem.DONE_FILE_EXTENSION) + GeneralLedgerConstants.BatchFileSystem.EXTENSION;
236 File dataFile = new File(dataFileAbsPath);
237 if (!dataFile.exists() || !dataFile.canRead()) {
238 LOG.error("Cannot find/read data file " + dataFileAbsPath);
239 return null;
240 }
241 return dataFile;
242 }
243
244 public void setBatchFileDirectoryName(String batchFileDirectoryName) {
245 this.batchFileDirectoryName = batchFileDirectoryName;
246 }
247
248
249 public void setKualiModuleService(KualiModuleService kualiModuleService) {
250 this.kualiModuleService = kualiModuleService;
251 }
252
253 public void setDateTimeService(DateTimeService dts) {
254 dateTimeService = dts;
255 }
256
257 public void setNightlyOutFileName(String nightlyOutFileName) {
258 this.nightlyOutFileName = nightlyOutFileName;
259 }
260
261 public void setBackupFileName(String backupFileName) {
262 this.backupFileName = backupFileName;
263 }
264
265 protected DateTimeService getDateTimeService() {
266 return dateTimeService;
267 }
268
269 protected String getBatchFileDirectoryName() {
270 return batchFileDirectoryName;
271 }
272
273 protected KualiModuleService getKualiModuleService() {
274 return kualiModuleService;
275 }
276
277
278 }