1 package user.jobengine.server.steps;
\r
4 import java.io.IOException;
\r
5 import java.nio.file.DirectoryStream;
\r
6 import java.nio.file.FileVisitResult;
\r
7 import java.nio.file.FileVisitor;
\r
8 import java.nio.file.Files;
\r
9 import java.nio.file.Path;
\r
10 import java.nio.file.Paths;
\r
11 import java.nio.file.SimpleFileVisitor;
\r
12 import java.nio.file.attribute.BasicFileAttributes;
\r
13 import java.text.ParseException;
\r
14 import java.text.SimpleDateFormat;
\r
15 import java.util.ArrayList;
\r
16 import java.util.Collections;
\r
17 import java.util.Date;
\r
18 import java.util.List;
\r
20 import org.apache.commons.io.FileUtils;
\r
21 import org.apache.commons.lang.StringUtils;
\r
22 import org.apache.logging.log4j.LogManager;
\r
23 import org.apache.logging.log4j.Logger;
\r
24 import org.apache.logging.log4j.Marker;
\r
26 import user.jobengine.server.IJobEngine;
\r
27 import user.jobengine.server.IJobRuntime;
\r
28 import user.jobengine.server.steps.MetadataTypeDetector.MetadataType;
\r
30 public class ProjectCleanupMountedLocationStep extends JobStep implements FileVisitor<Path> {
\r
32 private static final Logger logger = LogManager.getLogger();
\r
33 private static final String DATEFORMAT = "yyyyMMdd";
\r
34 private static final String DOT = ".";
\r
35 private static final String STATUSFOLDER = ".STATUS";
\r
36 private static final String KILLDATEEXT = ".killdate";
\r
37 private Marker marker;
\r
38 final int[] allCount = { 0 };
\r
39 final int[] currentCount = { 0 };
\r
40 private Path sourcePath;
\r
41 private SimpleDateFormat dateFormat;
\r
43 private Date checkExpiration(List<Path> killDateFiles) {
\r
44 Date killDate = null;
\r
45 for (Path killDateFile : killDateFiles) {
\r
46 Date currentKillDate = getKillDate(killDateFile);
\r
47 if (currentKillDate == null)
\r
49 if ((killDate != null && currentKillDate.after(killDate)) || killDate == null)
\r
50 killDate = currentKillDate;
\r
52 return new Date().after(killDate) ? killDate : null;
\r
56 public Object[] execute(String sourceFolder, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {
\r
57 marker = jobRuntime.getMarker();
\r
58 sourcePath = Paths.get(sourceFolder);
\r
59 DirectoryStream<Path> directoryStream = null;
\r
60 if (StringUtils.isBlank(sourcePath.toString())) {
\r
61 logger.error(marker, "A folyamat 'sourcePath' bemeneti paramétere üres.");
\r
62 throw new NullPointerException("System is not configured properly, 'sourceFolder' input parameter missing.");
\r
65 if (!sourcePath.toFile().exists() || !sourcePath.toFile().isDirectory()) {
\r
66 logger.error(marker, "A {} mappa nem létezik.", sourceFolder);
\r
67 throw new NullPointerException(String.format("Directory %s not exists.", sourceFolder));
\r
71 dateFormat = new SimpleDateFormat(DATEFORMAT);
\r
72 Files.walkFileTree(sourcePath, new SimpleFileVisitor<Path>() {
\r
74 public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
\r
76 return super.visitFile(file, attrs);
\r
79 Files.walkFileTree(sourcePath, this);
\r
80 } catch (Exception e) {
\r
82 logger.error(marker, "Az '{}' mappa elérése sikertelen. A rendszer hibaüzenete: {}", sourcePath, e.getMessage());
\r
85 if (directoryStream != null) {
\r
87 directoryStream.close();
\r
88 } catch (IOException e) {
\r
95 private Date getKillDate(Path killDateFile) {
\r
96 String fileName = killDateFile.getFileName().toString();
\r
97 int end = fileName.lastIndexOf(DOT);
\r
100 int start = fileName.lastIndexOf(DOT, end - 1);
\r
103 String strKillDate = fileName.substring(start + 1, end);
\r
104 Date result = null;
\r
105 if (StringUtils.isNumeric(strKillDate)) {
\r
107 result = dateFormat.parse(strKillDate);
\r
108 } catch (ParseException e) {
\r
109 logger.error(marker, "A {} fájl 'killdate' állománya hibás formátumú, a {} karaktersorozat nem konvertálható dátummá.", fileName, strKillDate);
\r
113 logger.error(marker, "A {} fájl 'killdate' állománya hibás formátumú, az dátum helyett ez áll: '{}'.", fileName, strKillDate);
\r
117 private List<Path> getKillDateFiles(Path filePath) {
\r
118 String killDateFilePattern = String.format("%s.*%s", filePath.getFileName().toString(), KILLDATEEXT);
\r
119 List<Path> result = new ArrayList<>();
\r
120 Path statusPath = null;
\r
122 statusPath = Paths.get(filePath.getParent().toString(), STATUSFOLDER);
\r
123 } catch (Exception e) {
\r
124 logger.catching(e);
\r
127 File statusPathFile = statusPath.toFile();
\r
128 if (statusPathFile.exists() && statusPathFile.isDirectory()) {
\r
129 try (DirectoryStream<Path> stream = Files.newDirectoryStream(statusPath, killDateFilePattern)) {
\r
130 stream.forEach(p -> result.add(p));
\r
131 } catch (Exception e) {
\r
132 logger.catching(e);
\r
135 Collections.sort(result);
\r
139 private Path getProjectRootPath(Path filePath) {
\r
140 Path result = null;
\r
141 if (filePath.getNameCount() > sourcePath.getNameCount()) {
\r
142 String dir = filePath.getName(sourcePath.getNameCount()).toString();
\r
143 String[] tokens = dir.split("-");
\r
144 if (tokens.length != 0 && MetadataTypeDetector.GuessMetadataType(tokens[0]) == MetadataType.TrafficPromo)
\r
145 result = Paths.get(sourcePath.toAbsolutePath().toString(), dir);
\r
151 public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
\r
152 return FileVisitResult.CONTINUE;
\r
156 public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
\r
157 if (dir.equals(sourcePath))
\r
158 return FileVisitResult.CONTINUE;
\r
160 Path parent = getProjectRootPath(dir);
\r
161 if (parent == null) {
\r
162 System.out.println("Skipping " + dir);
\r
163 return FileVisitResult.SKIP_SUBTREE;
\r
166 return FileVisitResult.CONTINUE;
\r
169 private boolean processPathItem(Path filePath) {
\r
171 setProgress(currentCount[0] * 100 / allCount[0]);
\r
173 if (filePath.toFile().isDirectory() || !filePath.toString().toUpperCase().endsWith(".EZP"))
\r
176 List<Path> killDateFiles = getKillDateFiles(filePath);
\r
177 if (killDateFiles == null || killDateFiles.size() == 0) {
\r
178 logger.warn(marker, "A {} fájlhoz nem található 'killdate' állomány.", filePath);
\r
182 if (killDateFiles.size() != 1)
\r
183 logger.warn(marker, "A {} fájlhoz több 'killdate' állomány található, a legújabb dátum határozza meg a törlés időpontját.", filePath);
\r
185 Date killDate = checkExpiration(killDateFiles);
\r
186 if (killDate == null)
\r
189 Path parent = getProjectRootPath(filePath);
\r
190 if (parent != null) {
\r
191 Path pathToDelete = Paths.get(sourcePath.toAbsolutePath().toString(), filePath.getName(sourcePath.getNameCount()).toString());
\r
193 FileUtils.deleteDirectory(pathToDelete.toFile());
\r
194 logger.info(marker, "A {} mappa sikeresen törlődött", pathToDelete);
\r
195 } catch (IOException e) {
\r
196 logger.error(marker, "A {} mappa törlése nem lehetséges, a rendszer üzenete: {}", pathToDelete, e.getMessage());
\r
200 logger.warn(marker, "A {} fájlhoz nem határozható meg a törlendő szülőkönyvtár.", filePath);
\r
205 public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
\r
206 processPathItem(file);
\r
207 return FileVisitResult.CONTINUE;
\r
211 public FileVisitResult visitFileFailed(Path file, IOException e) throws IOException {
\r
212 logger.error(marker, "A {} fájl nem érhető el. A rendszer hibaüzenete: {}", file.toString(), e.getMessage());
\r
213 return FileVisitResult.CONTINUE;
\r