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.sys.batch.service.impl;
017
018 import java.io.File;
019 import java.util.List;
020
021 import org.apache.commons.io.filefilter.AndFileFilter;
022 import org.apache.commons.io.filefilter.IOFileFilter;
023 import org.apache.commons.io.filefilter.OrFileFilter;
024 import org.kuali.kfs.sys.batch.FilePurgeCustomAge;
025 import org.kuali.kfs.sys.batch.FilePurgeDirectoryWalker;
026 import org.kuali.kfs.sys.batch.FilePurgeStep;
027 import org.kuali.kfs.sys.batch.MaxAgePurgeFileFilter;
028 import org.kuali.kfs.sys.batch.NotAmongDirectoriesFileFilter;
029 import org.kuali.kfs.sys.batch.service.FilePurgeService;
030 import org.kuali.rice.kns.service.ParameterService;
031
032 /**
033 * Default implementation of the FilePurgeService
034 */
035 public class FilePurgeServiceImpl implements FilePurgeService {
036 protected org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(FilePurgeServiceImpl.class);
037 private ParameterService parameterService;
038
039 protected static final String DAYS_BEFORE_PURGE_PARAMETER_SUFFIX = "_NUMBER_OF_DAYS_OLD";
040 protected static final String DAYS_BEFORE_PURGE_PARAMETER_PREFIX = "DEFAULT";
041
042 /**
043 * Uses a FilePurgeDirectoryWalker to get a List of Files to purge, then purges each
044 * @see org.kuali.kfs.gl.batch.service.FilePurgeService#purgeFiles(java.lang.String, java.util.List)
045 */
046 public void purgeFiles(String directory, List<FilePurgeCustomAge> customAges) {
047 purgeCustomAgeFiles(directory, customAges);
048 purgeDefaultFiles(directory, customAges);
049 }
050
051 /**
052 * Purges any files in the given directory associated with custom ages
053 * @param directory the directory to purge files from
054 * @param customAges custom ages to purge files for
055 */
056 protected void purgeCustomAgeFiles(String directory, List<FilePurgeCustomAge> customAges) {
057 // purge custom age directories
058 if (customAges != null && customAges.size() > 0) {
059 FilePurgeDirectoryWalker directoryWalker = getCustomAgesDirectoryWalker(customAges);
060 List<File> filesToPurge = directoryWalker.getFilesToPurge(directory);
061 for (File fileToPurge : filesToPurge) {
062 LOG.info("Purging file "+fileToPurge.getPath());
063 fileToPurge.delete();
064 }
065 }
066 }
067
068 /**
069 * Purges any files in the given directory not associated with custom ages
070 * @param directory the directory to purge files from
071 * @param customAges the custom ages with directories to avoid
072 */
073 protected void purgeDefaultFiles(String directory, List<FilePurgeCustomAge> customAges) {
074 // purge standard directories
075 FilePurgeDirectoryWalker directoryWalker = getDefaultDirectoryWalker(customAges);
076 List<File> filesToPurge = directoryWalker.getFilesToPurge(directory);
077 for (File fileToPurge : filesToPurge) {
078 LOG.info("Purging file "+fileToPurge.getPath());
079 fileToPurge.delete();
080 }
081 }
082
083 /**
084 * Gets a directory walker which will
085 * @param customAges the custom ages to purge files for
086 * @return a new FilePurgeDirectoryWalker which will walk directories for us
087 */
088 protected FilePurgeDirectoryWalker getCustomAgesDirectoryWalker(List<FilePurgeCustomAge> customAges) {
089 OrFileFilter fileFilter = new OrFileFilter();
090 for (FilePurgeCustomAge customAge : customAges) {
091 fileFilter.addFileFilter(customAge.getFileFilter());
092 }
093 return new FilePurgeDirectoryWalker(fileFilter);
094 }
095
096 /**
097 * Gets the directory walker for the default directories
098 * @param customAges the custom ages, because custom age directories will not be purged
099 * @return a new FilePurgeDirectoryWalker
100 */
101 protected FilePurgeDirectoryWalker getDefaultDirectoryWalker(List<FilePurgeCustomAge> customAges) {
102 IOFileFilter ageFileFilter = buildDefaultAgeFileFilter();
103 if (customAges != null && customAges.size() > 0) {
104 AndFileFilter andFileFilter = new AndFileFilter();
105 andFileFilter.addFileFilter(ageFileFilter);
106 andFileFilter.addFileFilter(buildAnyDirectoryButCustomAgeDirectoryFileFilter(customAges));
107 return new FilePurgeDirectoryWalker(andFileFilter);
108 } else {
109 return new FilePurgeDirectoryWalker(ageFileFilter);
110 }
111 }
112
113 /**
114 * Builds a file filter which will skip the directories taken by the CustomAges
115 * @param customAges the customAges to avoid
116 * @return a file filter
117 */
118 protected IOFileFilter buildAnyDirectoryButCustomAgeDirectoryFileFilter(List<FilePurgeCustomAge> customAges) {
119 NotAmongDirectoriesFileFilter skipDirectoriesFileFilter = new NotAmongDirectoriesFileFilter(customAges);
120 return skipDirectoriesFileFilter;
121 }
122
123 /**
124 * @see org.kuali.kfs.gl.batch.service.FilePurgeService#getAgeInDaysForCustomAge(org.kuali.kfs.sys.batch.FilePurgeCustomAge)
125 */
126 public int getDaysBeforePurgeForCustomAge(FilePurgeCustomAge customAge) {
127 final String parameterName = customAge.getParameterPrefix()+getDaysBeforePurgeSuffix();
128 return retrieveDaysBeforePurgeParameterValue(parameterName);
129 }
130
131 /**
132 * @return the standard suffix of parameter names from a custom age
133 */
134 protected String getDaysBeforePurgeSuffix() {
135 return FilePurgeServiceImpl.DAYS_BEFORE_PURGE_PARAMETER_SUFFIX;
136 }
137
138 /**
139 * @see org.kuali.kfs.gl.batch.service.FilePurgeService#getStandardDaysBeforePurge()
140 */
141 public int getStandardDaysBeforePurge() {
142 final String parameterName = getStandardDaysBeforePurgeParameterName();
143 return retrieveDaysBeforePurgeParameterValue(parameterName);
144 }
145
146 /**
147 * @return the parameter name to find the default days before purging files
148 */
149 protected String getStandardDaysBeforePurgeParameterName() {
150 return FilePurgeServiceImpl.DAYS_BEFORE_PURGE_PARAMETER_PREFIX+FilePurgeServiceImpl.DAYS_BEFORE_PURGE_PARAMETER_SUFFIX;
151 }
152
153 /**
154 * Retrieves the parameter value of the KFS-SYS / FilePurgeStep / parameterName parameter and converts it to an integer number of days
155 * @param parameterName the name of the parameter to retrieve the value of
156 * @return the integer number of days
157 */
158 protected int retrieveDaysBeforePurgeParameterValue(String parameterName) {
159 final String parameterValue = getParameterService().getParameterValue(FilePurgeStep.class, parameterName);
160 Integer parameterValueAsInteger = null;
161 parameterValueAsInteger = new Integer(parameterValue);
162 return (parameterValueAsInteger == null ? Integer.MAX_VALUE : parameterValueAsInteger.intValue());
163 }
164
165 /**
166 * Builds an age file filter for the default removal run
167 * @return a properly constructed IOFileFilter
168 */
169 protected IOFileFilter buildDefaultAgeFileFilter() {
170 return new MaxAgePurgeFileFilter();
171 }
172
173 /**
174 * Gets the parameterService attribute.
175 * @return Returns the parameterService.
176 */
177 public ParameterService getParameterService() {
178 return parameterService;
179 }
180
181 /**
182 * Sets the parameterService attribute value.
183 * @param parameterService The parameterService to set.
184 */
185 public void setParameterService(ParameterService parameterService) {
186 this.parameterService = parameterService;
187 }
188 }