--- /dev/null
+package user.jobengine.server.steps;\r
+\r
+import java.io.File;\r
+import java.io.IOException;\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.attribute.BasicFileAttributes;\r
+import java.text.SimpleDateFormat;\r
+import java.util.Arrays;\r
+import java.util.List;\r
+\r
+import org.apache.commons.io.FilenameUtils;\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.message.Message;\r
+import org.apache.logging.log4j.message.ParameterizedMessage;\r
+\r
+import com.ibm.nosql.json.api.BasicDBObject;\r
+\r
+import user.commons.MediaCubeMarker;\r
+import user.commons.mediatool.MediaInfo;\r
+import user.jobengine.server.steps.shared.EscortFiles;\r
+import user.mediacube.metadata.interfaces.IMetadata;\r
+import user.mediacube.metadata.interfaces.IMetadataProvider;\r
+import user.mediacube.metadata.interfaces.IMetadataProviderFactory;\r
+import user.mediacube.metadata.interfaces.MetadataProviderType;\r
+import user.mediacube.metadata.interfaces.MetadataType;\r
+import user.mediacube.metadata.interfaces.PlanAirMetadataListOptions;\r
+\r
+public class SafeDeleteRecursive extends JobStep implements FileVisitor<Path> {\r
+ private static final Logger logger = LogManager.getLogger();\r
+ private static final String ITEM_TITLE = "itemTitle";\r
+ private static final String ITEM_HOUSEID = "itemHouseId";\r
+ private static final String MEDIA_HOUSEID = "mediaHouseId";\r
+ private static final String MEDIA_TITLE = "mediaTitle";\r
+ private static final String MEDIA_DESCRIPTION = "mediaDescription";\r
+ private static final String MEDIA_TYPE = "mediaType";\r
+ private static final String ARCHIVE = "Archiválás";\r
+ private static final String ARCHIVE_ITEM = "archiveItem";\r
+ private static final String KILL_DATE_DAYS = "killDateDays";\r
+ private SimpleDateFormat df = new SimpleDateFormat("yyyy.MM.dd");\r
+\r
+ private List<String> skipPathNames = Arrays.asList("!ARCHIVALAS_ALATT", EscortFiles.STATUSFOLDER,\r
+ EscortFiles.CONFLICTFOLDER);\r
+\r
+ private boolean canReadMediaInfo(Path mediaFilePath) {\r
+ boolean result = false;\r
+ try {\r
+ MediaInfo mi = new MediaInfo(mediaFilePath);\r
+ mi.process();\r
+ result = true;\r
+ } catch (Exception e) {\r
+ logger.warn(getSessionMarker(), e.getMessage());\r
+ }\r
+ return result;\r
+ }\r
+\r
+ private void checkArchiveItem(ArchiveItem archiveItem) throws Exception {\r
+ if (archiveItem == null)\r
+ throw new Exception("No metadata specified.");\r
+\r
+ if (StringUtils.isBlank(archiveItem.getItemHouseId()))\r
+ throw new Exception("No Item HouseID specified in metadata.");\r
+\r
+ if (StringUtils.isBlank(archiveItem.getItemTitle()))\r
+ throw new Exception("No Item Title specified in metadata.");\r
+\r
+ if (StringUtils.isBlank(archiveItem.getMediaHouseId()))\r
+ throw new Exception("No Media HouseID specified in metadata.");\r
+\r
+ if (StringUtils.isBlank(archiveItem.getMediaTitle()))\r
+ throw new Exception("No Media Title specified in metadata.");\r
+ }\r
+\r
+ private String archiveItemJSON(ArchiveItem result) {\r
+ BasicDBObject obj = new BasicDBObject();\r
+ obj.put("itemHouseId", result.getItemHouseId());\r
+ obj.put("itemTitle", result.getItemTitle());\r
+ obj.put("mediaHouseId", result.getMediaHouseId());\r
+ obj.put("mediaTitle", result.getMediaTitle());\r
+ obj.put("mediaDescription", result.getMediaDescription());\r
+ obj.put("mediaType", result.getMediaType());\r
+ return obj.toPrettyString("");\r
+ }\r
+\r
+ private ArchiveItem createArchiveItem(Path filePath) throws Exception {\r
+ ArchiveItem result = null;\r
+\r
+ String fileName = filePath.getFileName().toString();\r
+ String mediaHouseId = FilenameUtils.removeExtension(fileName);\r
+ try {\r
+ result = getPlanAirMetadata(mediaHouseId);\r
+\r
+ if (result != null)\r
+ result.setMediaFile(filePath.toString());\r
+\r
+ logger.info(getSessionMarker(), "PlanAir query done for {}", filePath);\r
+ } catch (Exception e) {\r
+ logger.error(getSessionMarker(), "PlanAir metadata error", e);\r
+ // nem latja a drivert pl.\r
+ throw e;\r
+ }\r
+\r
+ //210616 Ha nincs metaadat, nem archivalunk\r
+ // if (result == null) {\r
+ // result = new ArchiveItem();\r
+ // BasicFileAttributes attr = Files.readAttributes(filePath, BasicFileAttributes.class);\r
+ // result.setItemHouseId(df.format(attr.lastModifiedTime().toMillis()));\r
+ // result.setItemTitle(filePath.getParent().toString());\r
+ // result.setMediaHouseId(mediaHouseId);\r
+ // result.setMediaTitle(fileName);\r
+ // // TODO kesobb kivenni\r
+ // // result.setMediaDescription("/OMARCHIVE");\r
+ // result.setMediaType("Generic");\r
+ // result.setMediaFile(filePath.toString());\r
+ // }\r
+\r
+ return result;\r
+ }\r
+\r
+ @StepEntry\r
+ public Object[] execute(String sourcePath) throws Exception {\r
+ logger.info(getSessionMarker(), "Starting in {}", sourcePath);\r
+ try {\r
+ if (getJobRuntime().forkPrepare()) {\r
+ Files.walkFileTree(Paths.get(sourcePath), this);\r
+ }\r
+ } catch (Exception e) {\r
+ logger.error(getSessionMarker(), "Az '{}' mappa elérése sikertelen. A rendszer hibaüzenete: {}", sourcePath,\r
+ e.getMessage());\r
+ } finally {\r
+ getJobRuntime().forkWaitComplete();\r
+ }\r
+ return null;\r
+ }\r
+\r
+ private ArchiveItem getPlanAirMetadata(String mediaHouseId) throws Exception {\r
+ PlanAirMetadataListOptions opt = new PlanAirMetadataListOptions();\r
+ opt.setSearch(mediaHouseId);\r
+ opt.setType(MetadataType.Material);\r
+\r
+ BasicDBObject json = null;\r
+ List<IMetadata> data = null;\r
+\r
+ IMetadataProviderFactory factory = getService(IMetadataProviderFactory.class);\r
+ if (factory == null)\r
+ logger.info(getSessionMarker(), "IMetadataProviderFactory is null");\r
+\r
+ IMetadataProvider planairProvider = factory.getProvider(MetadataProviderType.PLANAIR);\r
+ if (planairProvider == null)\r
+ logger.info(getSessionMarker(), "IMetadataProvider is null");\r
+\r
+ ArchiveItem result = null;\r
+ data = planairProvider.list(opt);\r
+ if (data.size() != 0)\r
+ json = data.get(0).asJSON();\r
+ else {\r
+ opt.setType(MetadataType.Promo);\r
+ data = planairProvider.list(opt);\r
+ if (data.size() != 0)\r
+ json = data.get(0).asJSON();\r
+ else {\r
+ opt.setType(MetadataType.AD);\r
+ data = planairProvider.list(opt);\r
+ if (data.size() != 0)\r
+ json = data.get(0).asJSON();\r
+ }\r
+ }\r
+ if (json != null) {\r
+ result = new ArchiveItem();\r
+ result.setItemHouseId(json.getString(ITEM_HOUSEID));\r
+ result.setItemTitle(json.getString(ITEM_TITLE));\r
+ result.setMediaHouseId(json.getString(MEDIA_HOUSEID));\r
+ result.setMediaTitle(json.getString(MEDIA_TITLE));\r
+ result.setMediaDescription(json.getString(MEDIA_DESCRIPTION));\r
+ result.setMediaType(json.getString(MEDIA_TYPE));\r
+ }\r
+ return result;\r
+ }\r
+\r
+ private boolean handleArchiveConflict(Path mediaPath) throws Exception {\r
+ boolean result = false;\r
+ String sourceFileName = mediaPath.getFileName().toString();\r
+ if (getManager().isMediaFileExists(sourceFileName)) {\r
+ EscortFiles.createMediaCatch(mediaPath);\r
+ result = true;\r
+ }\r
+ return result;\r
+ }\r
+\r
+ @Override\r
+ public FileVisitResult postVisitDirectory(Path paramT, IOException paramIOException) throws IOException {\r
+ return FileVisitResult.CONTINUE;\r
+ }\r
+\r
+ @Override\r
+ public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes paramBasicFileAttributes)\r
+ throws IOException {\r
+ Path dirName = dir.getFileName();\r
+\r
+ if (skipPathNames.contains(dirName.toString())) {\r
+ logger.info(getSessionMarker(), "PreVisit skip {}", dir);\r
+ return FileVisitResult.SKIP_SUBTREE;\r
+ } else\r
+ logger.info(getSessionMarker(), "PreVisit {}", dir);\r
+\r
+ return FileVisitResult.CONTINUE;\r
+ }\r
+\r
+ private boolean processPathItem(Path mediaPath) throws Exception {\r
+ String fileName = mediaPath.getFileName().toString();\r
+ if (fileName.startsWith(".") || fileName.endsWith(".nomd"))\r
+ return false;\r
+\r
+ logger.info(getSessionMarker(), "Processing {}", mediaPath);\r
+\r
+ File mediaFile = mediaPath.toFile();\r
+ if (mediaFile.isDirectory()) {\r
+ //logger.info(getSessionMarker(), "Skipping directory {}", mediaPath);\r
+ return false;\r
+ }\r
+\r
+ if (EscortFiles.isMediaCatched(mediaPath)) {\r
+ //logger.info(getSessionMarker(), "Skipping already catched {}", mediaPath);\r
+ return false;\r
+ }\r
+\r
+ Path nomdFile = Paths.get(mediaPath.toString() + ".nomd");\r
+\r
+ if (nomdFile.toFile().exists()) {\r
+ //logger.info(getSessionMarker(), "Skipping nomd file exists {}", nomdFile);\r
+ return false;\r
+ }\r
+\r
+ if (handleArchiveConflict(mediaPath)) {\r
+ logger.info(getSessionMarker(), "Skipping archive db already contains {}", mediaPath);\r
+ return false;\r
+ }\r
+\r
+ if (!canReadMediaInfo(mediaPath)) {\r
+ logger.info(getSessionMarker(), "Skipping cant read mediainfo {}", mediaPath);\r
+ return false;\r
+ }\r
+\r
+ ArchiveItem archiveItem = createArchiveItem(mediaPath);\r
+\r
+ if (archiveItem == null) {\r
+ Message msg = new ParameterizedMessage("Nincs metaadat!");\r
+ logger.info(new MediaCubeMarker("vasary@elgekko.net,muszak@mediavivantis.hu",\r
+ "Értesítés problémás " + mediaPath.getFileName().toString() + " archiválásról"), msg);\r
+ Files.createFile(nomdFile);\r
+ return false;\r
+ }\r
+\r
+ try {\r
+ checkArchiveItem(archiveItem);\r
+ String metadata = archiveItemJSON(archiveItem);\r
+ } catch (Exception e) {\r
+ logger.error(getSessionMarker(),\r
+ "Az '{}' állomány archiválási kísérlete sikertelen. A rendszer üzenete: {}", mediaPath,\r
+ e.getMessage());\r
+ }\r
+\r
+ return true;\r
+ }\r
+\r
+ @Override\r
+ public FileVisitResult visitFile(Path filePath, BasicFileAttributes paramBasicFileAttributes) throws IOException {\r
+ // logger.info(getSessionMarker(), "Will checked {}", filePath);\r
+ try {\r
+ processPathItem(filePath);\r
+ } catch (Exception e) {\r
+ logger.catching(e);\r
+ }\r
+ return FileVisitResult.CONTINUE;\r
+ }\r
+\r
+ @Override\r
+ public FileVisitResult visitFileFailed(Path filePath, IOException paramIOException) throws IOException {\r
+ logger.info("Error archive {}", filePath);\r
+ return FileVisitResult.CONTINUE;\r
+ }\r
+}\r