/*
* The Kuali Financial System, a comprehensive financial management system for higher education.
*
* Copyright 2005-2014 The Kuali Foundation
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.kuali.kfs.sys.batch.service.impl;
import java.io.File;
import java.util.List;
import org.apache.commons.io.filefilter.AndFileFilter;
import org.apache.commons.io.filefilter.IOFileFilter;
import org.apache.commons.io.filefilter.OrFileFilter;
import org.kuali.kfs.sys.FileUtil;
import org.kuali.kfs.sys.batch.FilePurgeCustomAge;
import org.kuali.kfs.sys.batch.FilePurgeDirectoryWalker;
import org.kuali.kfs.sys.batch.FilePurgeStep;
import org.kuali.kfs.sys.batch.MaxAgePurgeFileFilter;
import org.kuali.kfs.sys.batch.NotAmongDirectoriesFileFilter;
import org.kuali.kfs.sys.batch.service.FilePurgeService;
import org.kuali.rice.coreservice.framework.parameter.ParameterService;
/**
* Default implementation of the FilePurgeService
*/
public class FilePurgeServiceImpl implements FilePurgeService {
protected org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(FilePurgeServiceImpl.class);
private ParameterService parameterService;
protected static final String DAYS_BEFORE_PURGE_PARAMETER_SUFFIX = "_NUMBER_OF_DAYS_OLD";
protected static final String DAYS_BEFORE_PURGE_PARAMETER_PREFIX = "DEFAULT";
/**
* Uses a FilePurgeDirectoryWalker to get a List of Files to purge, then purges each
* @see org.kuali.kfs.gl.batch.service.FilePurgeService#purgeFiles(java.lang.String, java.util.List)
*/
public void purgeFiles(String directory, List<FilePurgeCustomAge> customAges) {
//add a step to check for directory existence
FileUtil.createDirectory(directory);
purgeCustomAgeFiles(directory, customAges);
purgeDefaultFiles(directory, customAges);
}
/**
* Purges any files in the given directory associated with custom ages
* @param directory the directory to purge files from
* @param customAges custom ages to purge files for
*/
protected void purgeCustomAgeFiles(String directory, List<FilePurgeCustomAge> customAges) {
// purge custom age directories
if (customAges != null && customAges.size() > 0) {
FilePurgeDirectoryWalker directoryWalker = getCustomAgesDirectoryWalker(customAges);
List<File> filesToPurge = directoryWalker.getFilesToPurge(directory);
for (File fileToPurge : filesToPurge) {
LOG.info("Purging file "+fileToPurge.getPath());
fileToPurge.delete();
}
}
}
/**
* Purges any files in the given directory not associated with custom ages
* @param directory the directory to purge files from
* @param customAges the custom ages with directories to avoid
*/
protected void purgeDefaultFiles(String directory, List<FilePurgeCustomAge> customAges) {
// purge standard directories
FilePurgeDirectoryWalker directoryWalker = getDefaultDirectoryWalker(customAges);
List<File> filesToPurge = directoryWalker.getFilesToPurge(directory);
for (File fileToPurge : filesToPurge) {
LOG.info("Purging file "+fileToPurge.getPath());
fileToPurge.delete();
}
}
/**
* Gets a directory walker which will
* @param customAges the custom ages to purge files for
* @return a new FilePurgeDirectoryWalker which will walk directories for us
*/
protected FilePurgeDirectoryWalker getCustomAgesDirectoryWalker(List<FilePurgeCustomAge> customAges) {
OrFileFilter fileFilter = new OrFileFilter();
for (FilePurgeCustomAge customAge : customAges) {
fileFilter.addFileFilter(customAge.getFileFilter());
}
return new FilePurgeDirectoryWalker(fileFilter);
}
/**
* Gets the directory walker for the default directories
* @param customAges the custom ages, because custom age directories will not be purged
* @return a new FilePurgeDirectoryWalker
*/
protected FilePurgeDirectoryWalker getDefaultDirectoryWalker(List<FilePurgeCustomAge> customAges) {
IOFileFilter ageFileFilter = buildDefaultAgeFileFilter();
if (customAges != null && customAges.size() > 0) {
AndFileFilter andFileFilter = new AndFileFilter();
andFileFilter.addFileFilter(ageFileFilter);
andFileFilter.addFileFilter(buildAnyDirectoryButCustomAgeDirectoryFileFilter(customAges));
return new FilePurgeDirectoryWalker(andFileFilter);
} else {
return new FilePurgeDirectoryWalker(ageFileFilter);
}
}
/**
* Builds a file filter which will skip the directories taken by the CustomAges
* @param customAges the customAges to avoid
* @return a file filter
*/
protected IOFileFilter buildAnyDirectoryButCustomAgeDirectoryFileFilter(List<FilePurgeCustomAge> customAges) {
NotAmongDirectoriesFileFilter skipDirectoriesFileFilter = new NotAmongDirectoriesFileFilter(customAges);
return skipDirectoriesFileFilter;
}
/**
* @see org.kuali.kfs.gl.batch.service.FilePurgeService#getAgeInDaysForCustomAge(org.kuali.kfs.sys.batch.FilePurgeCustomAge)
*/
public int getDaysBeforePurgeForCustomAge(FilePurgeCustomAge customAge) {
final String parameterName = customAge.getParameterPrefix()+getDaysBeforePurgeSuffix();
return retrieveDaysBeforePurgeParameterValue(parameterName);
}
/**
* @return the standard suffix of parameter names from a custom age
*/
protected String getDaysBeforePurgeSuffix() {
return FilePurgeServiceImpl.DAYS_BEFORE_PURGE_PARAMETER_SUFFIX;
}
/**
* @see org.kuali.kfs.gl.batch.service.FilePurgeService#getStandardDaysBeforePurge()
*/
public int getStandardDaysBeforePurge() {
final String parameterName = getStandardDaysBeforePurgeParameterName();
return retrieveDaysBeforePurgeParameterValue(parameterName);
}
/**
* @return the parameter name to find the default days before purging files
*/
protected String getStandardDaysBeforePurgeParameterName() {
return FilePurgeServiceImpl.DAYS_BEFORE_PURGE_PARAMETER_PREFIX+FilePurgeServiceImpl.DAYS_BEFORE_PURGE_PARAMETER_SUFFIX;
}
/**
* Retrieves the parameter value of the KFS-SYS / FilePurgeStep / parameterName parameter and converts it to an integer number of days
* @param parameterName the name of the parameter to retrieve the value of
* @return the integer number of days
*/
protected int retrieveDaysBeforePurgeParameterValue(String parameterName) {
final String parameterValue = getParameterService().getParameterValueAsString(FilePurgeStep.class, parameterName);
Integer parameterValueAsInteger = null;
parameterValueAsInteger = new Integer(parameterValue);
return (parameterValueAsInteger == null ? Integer.MAX_VALUE : parameterValueAsInteger.intValue());
}
/**
* Builds an age file filter for the default removal run
* @return a properly constructed IOFileFilter
*/
protected IOFileFilter buildDefaultAgeFileFilter() {
return new MaxAgePurgeFileFilter();
}
/**
* Gets the parameterService attribute.
* @return Returns the parameterService.
*/
public ParameterService getParameterService() {
return parameterService;
}
/**
* Sets the parameterService attribute value.
* @param parameterService The parameterService to set.
*/
public void setParameterService(ParameterService parameterService) {
this.parameterService = parameterService;
}
}