--- /dev/null
+package user.jobengine.server.steps;\r
+\r
+import java.io.File;\r
+import java.io.IOException;\r
+import java.nio.file.DirectoryStream;\r
+import java.nio.file.FileVisitResult;\r
+import java.nio.file.FileVisitor;\r
+import java.nio.file.Files;\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+import java.nio.file.SimpleFileVisitor;\r
+import java.nio.file.attribute.BasicFileAttributes;\r
+import java.text.ParseException;\r
+import java.text.SimpleDateFormat;\r
+import java.util.ArrayList;\r
+import java.util.Collections;\r
+import java.util.Date;\r
+import java.util.List;\r
+\r
+import org.apache.commons.io.FileUtils;\r
+import org.apache.commons.lang.StringUtils;\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+import org.apache.logging.log4j.Marker;\r
+\r
+import user.jobengine.server.IJobEngine;\r
+import user.jobengine.server.IJobRuntime;\r
+import user.jobengine.server.steps.shared.MetadataType;\r
+import user.jobengine.server.steps.shared.MetadataTypeDetector;\r
+\r
+public class ProjectCleanupMountedLocationStep extends JobStep implements FileVisitor<Path> {\r
+\r
+ private static final Logger logger = LogManager.getLogger();\r
+ private static final String DATEFORMAT = "yyyyMMdd";\r
+ private static final String DOT = ".";\r
+ private static final String STATUSFOLDER = ".STATUS";\r
+ private static final String KILLDATEEXT = ".killdate";\r
+ private Marker marker;\r
+ final int[] allCount = { 0 };\r
+ final int[] currentCount = { 0 };\r
+ private Path sourcePath;\r
+ private SimpleDateFormat dateFormat;\r
+\r
+ private Date checkExpiration(List<Path> killDateFiles) {\r
+ Date killDate = null;\r
+ for (Path killDateFile : killDateFiles) {\r
+ Date currentKillDate = getKillDate(killDateFile);\r
+ if (currentKillDate == null)\r
+ continue;\r
+ if ((killDate != null && currentKillDate.after(killDate)) || killDate == null)\r
+ killDate = currentKillDate;\r
+ }\r
+ return new Date().after(killDate) ? killDate : null;\r
+ }\r
+\r
+ @StepEntry\r
+ public Object[] execute(String sourceFolder, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
+ marker = jobRuntime.getSessionMarker();\r
+ sourcePath = Paths.get(sourceFolder);\r
+ DirectoryStream<Path> directoryStream = null;\r
+ if (StringUtils.isBlank(sourcePath.toString())) {\r
+ logger.error(marker, "A folyamat 'sourcePath' bemeneti paramétere üres.");\r
+ throw new NullPointerException(\r
+ "System is not configured properly, 'sourceFolder' input parameter missing.");\r
+ }\r
+\r
+ if (!sourcePath.toFile().exists() || !sourcePath.toFile().isDirectory()) {\r
+ logger.error(marker, "A(z) {} mappa nem létezik.", sourceFolder);\r
+ throw new NullPointerException(String.format("Directory %s does not exist.", sourceFolder));\r
+ }\r
+ try {\r
+ setProgress(1);\r
+ dateFormat = new SimpleDateFormat(DATEFORMAT);\r
+ Files.walkFileTree(sourcePath, new SimpleFileVisitor<Path>() {\r
+ @Override\r
+ public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {\r
+ allCount[0]++;\r
+ return super.visitFile(file, attrs);\r
+ }\r
+ });\r
+ Files.walkFileTree(sourcePath, this);\r
+ } catch (Exception e) {\r
+ logger.catching(e);\r
+ logger.error(marker, "Az '{}' mappa elérése sikertelen. A rendszer hibaüzenete: {}", sourcePath,\r
+ e.getMessage());\r
+ throw e;\r
+ } finally {\r
+ if (directoryStream != null) {\r
+ try {\r
+ directoryStream.close();\r
+ } catch (IOException e) {\r
+ }\r
+ }\r
+ }\r
+ return null;\r
+ }\r
+\r
+ private Date getKillDate(Path killDateFile) {\r
+ String fileName = killDateFile.getFileName().toString();\r
+ int end = fileName.lastIndexOf(DOT);\r
+ if (end < 1)\r
+ return null;\r
+ int start = fileName.lastIndexOf(DOT, end - 1);\r
+ if (start < 0)\r
+ return null;\r
+ String strKillDate = fileName.substring(start + 1, end);\r
+ Date result = null;\r
+ if (StringUtils.isNumeric(strKillDate)) {\r
+ try {\r
+ result = dateFormat.parse(strKillDate);\r
+ } catch (ParseException e) {\r
+ logger.error(marker,\r
+ "A {} fájl 'killdate' állománya hibás formátumú, a {} karaktersorozat nem konvertálható dátummá.",\r
+ fileName, strKillDate);\r
+ return null;\r
+ }\r
+ } else\r
+ logger.error(marker, "A {} fájl 'killdate' állománya hibás formátumú, az dátum helyett ez áll: '{}'.",\r
+ fileName, strKillDate);\r
+ return result;\r
+ }\r
+\r
+ private List<Path> getKillDateFiles(Path filePath) {\r
+ String killDateFilePattern = String.format("%s.*%s", filePath.getFileName().toString(), KILLDATEEXT);\r
+ List<Path> result = new ArrayList<>();\r
+ Path statusPath = null;\r
+ try {\r
+ statusPath = Paths.get(filePath.getParent().toString(), STATUSFOLDER);\r
+ } catch (Exception e) {\r
+ logger.catching(e);\r
+ return null;\r
+ }\r
+ File statusPathFile = statusPath.toFile();\r
+ if (statusPathFile.exists() && statusPathFile.isDirectory()) {\r
+ try (DirectoryStream<Path> stream = Files.newDirectoryStream(statusPath, killDateFilePattern)) {\r
+ stream.forEach(p -> result.add(p));\r
+ } catch (Exception e) {\r
+ logger.catching(e);\r
+ }\r
+ }\r
+ Collections.sort(result);\r
+ return result;\r
+ }\r
+\r
+ private Path getProjectRootPath(Path filePath) {\r
+ Path result = null;\r
+ if (filePath.getNameCount() > sourcePath.getNameCount()) {\r
+ String dir = filePath.getName(sourcePath.getNameCount()).toString();\r
+ String[] tokens = dir.split("-");\r
+ if (tokens.length != 0 && MetadataTypeDetector.GuessMetadataType(tokens[0]) == MetadataType.TrafficPromo)\r
+ result = Paths.get(sourcePath.toAbsolutePath().toString(), dir);\r
+ }\r
+ return result;\r
+ }\r
+\r
+ @Override\r
+ public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {\r
+ return FileVisitResult.CONTINUE;\r
+ }\r
+\r
+ @Override\r
+ public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {\r
+ if (dir.equals(sourcePath))\r
+ return FileVisitResult.CONTINUE;\r
+\r
+ Path parent = getProjectRootPath(dir);\r
+ if (parent == null) {\r
+ System.out.println("Skipping " + dir);\r
+ return FileVisitResult.SKIP_SUBTREE;\r
+ }\r
+\r
+ return FileVisitResult.CONTINUE;\r
+ }\r
+\r
+ private boolean processPathItem(Path filePath) {\r
+ currentCount[0]++;\r
+ int progress = currentCount[0] * 100 / allCount[0];\r
+ setProgress(progress);\r
+\r
+ if (filePath.toFile().isDirectory() || !filePath.toString().toUpperCase().endsWith(".EZP"))\r
+ return false;\r
+\r
+ // level check\r
+ if (filePath.getNameCount() != sourcePath.getNameCount() + 3) {\r
+ // logger.warn(marker, "A {} fájl elérési útja a várttól eltérő.", filePath);\r
+ return false;\r
+ }\r
+\r
+ List<Path> killDateFiles = getKillDateFiles(filePath);\r
+ if (killDateFiles == null || killDateFiles.size() == 0) {\r
+ logger.warn(marker, "A {} fájlhoz nem található 'killdate' állomány.", filePath);\r
+ return false;\r
+ }\r
+\r
+ if (killDateFiles.size() != 1)\r
+ logger.warn(marker,\r
+ "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.",\r
+ filePath);\r
+\r
+ Date killDate = checkExpiration(killDateFiles);\r
+ if (killDate == null)\r
+ return false;\r
+\r
+ Path parent = getProjectRootPath(filePath);\r
+ if (parent != null) {\r
+ Path pathToDelete = Paths.get(sourcePath.toAbsolutePath().toString(),\r
+ filePath.getName(sourcePath.getNameCount()).toString());\r
+ try {\r
+ FileUtils.deleteDirectory(pathToDelete.toFile());\r
+ logger.info(marker, "A {} mappa sikeresen törlődött. Lejárat: {}", pathToDelete,\r
+ dateFormat.format(killDate));\r
+ } catch (Exception e) {\r
+ logger.error(marker, "A {} mappa törlése nem lehetséges, a rendszer üzenete: {}", pathToDelete,\r
+ e.getMessage());\r
+ logger.error(e);\r
+ }\r
+ }\r
+ // else\r
+ // logger.warn(marker, "A {} fájlhoz nem határozható meg a törlendő\r
+ // szülőkönyvtár.", filePath);\r
+ return true;\r
+ }\r
+\r
+ @Override\r
+ public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {\r
+ processPathItem(file);\r
+ return FileVisitResult.CONTINUE;\r
+ }\r
+\r
+ @Override\r
+ public FileVisitResult visitFileFailed(Path file, IOException e) throws IOException {\r
+ logger.error(marker, "A {} fájl nem érhető el. A rendszer hibaüzenete: {}", file.toString(), e.getMessage());\r
+ return FileVisitResult.CONTINUE;\r
+ }\r
+}\r
--- /dev/null
+package user.jobengine.server.steps.shared;\r
+\r
+import org.apache.commons.lang.StringUtils;\r
+\r
+public class MetadataTypeDetector {\r
+\r
+ private static final String HYPHEN = "-";\r
+ private static final String DOT = ".";\r
+\r
+ private static final String REGEXP_TRAFFICMATERIALID = "^M{1}[0-9]{6}[A-Z]{1}";\r
+ private static final String REGEXP_TRAFFICADID = "^R{1}[0-9]{6}[A-Z]{1}";\r
+ private static final String REGEXP_TRAFFICPROMOID = "^P{1}[0-9]{6}[A-Z]{1}";\r
+ private static final String REGEXP_OCTOPUSSTORYID = "^[0-9]+";\r
+ private static final String REGEXP_OCTOPUSPLACEHOLDERID = "^[0-9]+_[0-9]+";\r
+ private static final String REGEXP_OCTOPUSPLACEHOLDERVERSIONEDID = "^[0-9]+_[0-9]+-[0-9]{3}";\r
+\r
+ public static MetadataType GuessMetadataType(String id) {\r
+ if (StringUtils.isBlank(id))\r
+ return MetadataType.Generic;\r
+ if (id.matches(REGEXP_TRAFFICMATERIALID))\r
+ return MetadataType.TrafficMaterial;\r
+ if (id.matches(REGEXP_TRAFFICPROMOID))\r
+ return MetadataType.TrafficPromo;\r
+ if (id.matches(REGEXP_TRAFFICADID))\r
+ return MetadataType.TrafficAD;\r
+ if (id.matches(REGEXP_OCTOPUSSTORYID))\r
+ return MetadataType.OctopusStory;\r
+ if (id.matches(REGEXP_OCTOPUSPLACEHOLDERID))\r
+ return MetadataType.OctopusPlaceholder;\r
+ if (id.matches(REGEXP_OCTOPUSPLACEHOLDERVERSIONEDID))\r
+ return MetadataType.OctopusPlaceholder;\r
+ return MetadataType.Generic;\r
+ }\r
+\r
+ public static String truncateExtension(String name) {\r
+ String result = name;\r
+ if (result != null && result.contains(DOT))\r
+ result = result.substring(0, result.lastIndexOf(DOT));\r
+ return result;\r
+ }\r
+\r
+ public static String truncateVersion(String name) {\r
+ String result = name;\r
+ if (result != null && result.contains(HYPHEN))\r
+ result = result.split(HYPHEN)[0];\r
+ return result;\r
+ }\r
+\r
+}\r
private static final String STATUSFOLDER = ".STATUS";\r
private static final String KILLDATEEXT = ".killdate";\r
private Marker marker;\r
- final int[] allCount = { 0 };\r
- final int[] currentCount = { 0 };\r
+ final int[] allCount = new int[] { 0 };\r
+ final int[] currentCount = new int[] { 0 };\r
private Path sourcePath;\r
private SimpleDateFormat dateFormat;\r
\r
DirectoryStream<Path> directoryStream = null;\r
if (StringUtils.isBlank(sourcePath.toString())) {\r
logger.error(marker, "A folyamat 'sourcePath' bemeneti paramétere üres.");\r
- throw new NullPointerException(\r
- "System is not configured properly, 'sourceFolder' input parameter missing.");\r
+ throw new NullPointerException("System is not configured properly, 'sourceFolder' input parameter missing.");\r
}\r
\r
if (!sourcePath.toFile().exists() || !sourcePath.toFile().isDirectory()) {\r
Files.walkFileTree(sourcePath, this);\r
} catch (Exception e) {\r
logger.catching(e);\r
- logger.error(marker, "Az '{}' mappa elérése sikertelen. A rendszer hibaüzenete: {}", sourcePath,\r
- e.getMessage());\r
+ logger.error(marker, "Az '{}' mappa elérése sikertelen. A rendszer hibaüzenete: {}", sourcePath, e.getMessage());\r
throw e;\r
} finally {\r
if (directoryStream != null) {\r
try {\r
result = dateFormat.parse(strKillDate);\r
} catch (ParseException e) {\r
- logger.error(marker,\r
- "A {} fájl 'killdate' állománya hibás formátumú, a {} karaktersorozat nem konvertálható dátummá.",\r
- fileName, strKillDate);\r
+ logger.error(marker, "A {} fájl 'killdate' állománya hibás formátumú, a {} karaktersorozat nem konvertálható dátummá.", fileName, strKillDate);\r
return null;\r
}\r
} else\r
- logger.error(marker, "A {} fájl 'killdate' állománya hibás formátumú, az dátum helyett ez áll: '{}'.",\r
- fileName, strKillDate);\r
+ logger.error(marker, "A {} fájl 'killdate' állománya hibás formátumú, az dátum helyett ez áll: '{}'.", fileName, strKillDate);\r
return result;\r
}\r
\r
}\r
\r
if (killDateFiles.size() != 1)\r
- logger.warn(marker,\r
- "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.",\r
- filePath);\r
+ 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
\r
Date killDate = checkExpiration(killDateFiles);\r
if (killDate == null)\r
\r
Path parent = getProjectRootPath(filePath);\r
if (parent != null) {\r
- Path pathToDelete = Paths.get(sourcePath.toAbsolutePath().toString(),\r
- filePath.getName(sourcePath.getNameCount()).toString());\r
+ Path pathToDelete = Paths.get(sourcePath.toAbsolutePath().toString(), filePath.getName(sourcePath.getNameCount()).toString());\r
try {\r
FileUtils.deleteDirectory(pathToDelete.toFile());\r
- logger.info(marker, "A {} mappa sikeresen törlődött. Lejárat: {}", pathToDelete,\r
- dateFormat.format(killDate));\r
+ logger.info(marker, "A {} mappa sikeresen törlődött. Lejárat: {}", pathToDelete, dateFormat.format(killDate));\r
} catch (Exception e) {\r
- logger.error(marker, "A {} mappa törlése nem lehetséges, a rendszer üzenete: {}", pathToDelete,\r
- e.getMessage());\r
+ logger.error(marker, "A {} mappa törlése nem lehetséges, a rendszer üzenete: {}", pathToDelete, e.getMessage());\r
logger.error(e);\r
}\r
}\r