argos/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/schedule/file/FileCleanUpJobs.java

121 lines
5.0 KiB
Java

package eu.eudat.logic.utilities.schedule.file;
import eu.eudat.configurations.file.PermProperties;
import eu.eudat.configurations.file.TimeProperties;
import eu.eudat.configurations.file.TmpProperties;
import eu.eudat.data.entities.FileUpload;
import eu.eudat.logic.managers.FileManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.LinkedList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
@Component
public class FileCleanUpJobs {
private static final Logger logger = LoggerFactory.getLogger(FileCleanUpJobs.class);
private final FileManager fileManager;
private final Environment environment;
@Autowired
public FileCleanUpJobs(FileManager fileManager, Environment environment, PermProperties permProperties, TmpProperties tmpProperties) {
this.fileManager = fileManager;
this.environment = environment;
if (permProperties != null) {
System.getProperties().put("perm.cron", createCron(permProperties.getTime()));
}
if (tmpProperties != null) {
System.getProperties().put("temp.cron", createCron(tmpProperties.getTime()));
}
}
@Scheduled(cron = "${perm.cron}")
public void deleteUnusedPermFiles() {
logger.info("Start deleting unused permanent files");
List<FileUpload> fileUploads = fileManager.getDeletedFileUploads();
try {
List<Path> tempFilePaths = Files.walk(Paths.get(Objects.requireNonNull(environment.getProperty("file.storage")))).filter(Files::isRegularFile).collect(Collectors.toList());
for (Path tempFilePath : tempFilePaths) {
if (fileUploads.stream().map(FileUpload::getId).anyMatch(uuid -> tempFilePath.endsWith(uuid.toString()))) {
Files.deleteIfExists(tempFilePath);
}
}
logger.info("Unused permanent files have been successfully deleted");
} catch (IOException e) {
logger.error(e.getLocalizedMessage(), e);
}
}
@Scheduled(cron = "${temp.cron}")
public void deleteTempFiles() {
logger.info("Start deleting temporary files");
try {
List<Path> tempFilePaths = Files.walk(Paths.get(Objects.requireNonNull(environment.getProperty("temp.temp")))).filter(Files::isRegularFile).collect(Collectors.toList());
for (Path tempFilePath : tempFilePaths) {
Files.deleteIfExists(tempFilePath);
}
logger.info("Temporary files have been successfully deleted");
} catch (IOException e) {
logger.error(e.getLocalizedMessage(), e);
}
}
private String createCron(TimeProperties timeProperties) {
List<String> cronList = new LinkedList<>();
cronList.add("0");
switch (timeProperties.getTimeUnit()) {
case MINUTES:
cronList.add("0/" + timeProperties.getInterval());
break;
case HOURS:
cronList.add(toSafeString(timeProperties.getStartTime().getMinute()));
cronList.add("0/" + timeProperties.getInterval());
break;
case DAYS:
cronList.add(toSafeString(timeProperties.getStartTime().getMinute()));
cronList.add(toSafeString(timeProperties.getStartTime().getHour()));
cronList.add("*/" + timeProperties.getInterval());
break;
case MONTHS:
cronList.add(toSafeString(timeProperties.getStartTime().getMinute()));
cronList.add(toSafeString(timeProperties.getStartTime().getHour()));
cronList.add(toSafeString(timeProperties.getStartTime().getDayOfMonth(), "1"));
cronList.add("*/" + timeProperties.getInterval());
break;
case WEEKS:
cronList.add(toSafeString(timeProperties.getStartTime().getMinute()));
cronList.add(toSafeString(timeProperties.getStartTime().getHour()));
cronList.add("*/" + (timeProperties.getInterval() * 7));
cronList.add("*");
cronList.add(toSafeString(timeProperties.getStartTime().getDayOfWeek(), "1"));
break;
}
if (cronList.size() < 6) {
for (int i = cronList.size(); i < 6; i++) {
cronList.add("*");
}
}
return String.join(" ", cronList);
}
private String toSafeString(Object object) {
return toSafeString(object, "0");
}
private String toSafeString(Object object, String defaultValue) {
return object != null ? object.toString() : defaultValue;
}
}