\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.Paths;\r
import java.nio.file.attribute.BasicFileAttributes;\r
import java.text.SimpleDateFormat;\r
+import java.util.ArrayList;\r
import java.util.Arrays;\r
+import java.util.Collections;\r
+import java.util.Date;\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.IEntityBase;\r
+import user.commons.RemoteFile;\r
+import user.commons.StoreUri;\r
import user.commons.mediatool.MediaInfo;\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
+import user.jobengine.db.Item;\r
+import user.jobengine.db.Media;\r
+import user.jobengine.db.MediaFile;\r
+import user.jobengine.db.MediaFileDAO;\r
+import user.jobengine.db.Store;\r
import user.jobengine.server.steps.shared.EscortFiles;\r
import user.mediacube.metadata.interfaces.IMetadata;\r
import user.mediacube.metadata.interfaces.IMetadataProvider;\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
+ private static final String KILLDATEEXT = ".killdate";\r
+ private SimpleDateFormat df = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");\r
\r
private List<String> skipPathNames = Arrays.asList("!ARCHIVALAS_ALATT", EscortFiles.STATUSFOLDER,\r
EscortFiles.CONFLICTFOLDER);\r
return result;\r
}\r
\r
- private void checkArchiveItem(ArchiveItem archiveItem) throws Exception {\r
+ private boolean checkArchiveItem(ArchiveItem archiveItem, Item item, Media media) {\r
if (archiveItem == null)\r
- throw new Exception("No metadata specified.");\r
+ return false;\r
+\r
+ String itemHouseId = archiveItem.getItemHouseId() == null ? "" : archiveItem.getItemHouseId();\r
+ if (!itemHouseId.equals(item.getHouseId()))\r
+ return false;\r
\r
- if (StringUtils.isBlank(archiveItem.getItemHouseId()))\r
- throw new Exception("No Item HouseID specified in metadata.");\r
+ String itemTitle = archiveItem.getItemTitle() == null ? "" : archiveItem.getItemTitle();\r
+ if (!itemTitle.equals(item.getTitle()))\r
+ return false;\r
\r
- if (StringUtils.isBlank(archiveItem.getItemTitle()))\r
- throw new Exception("No Item Title specified in metadata.");\r
+ String mediaHouseId = archiveItem.getMediaHouseId() == null ? "" : archiveItem.getMediaHouseId();\r
+ if (!mediaHouseId.equals(media.getHouseId()))\r
+ return false;\r
\r
- if (StringUtils.isBlank(archiveItem.getMediaHouseId()))\r
- throw new Exception("No Media HouseID specified in metadata.");\r
+ String mediaTitle = archiveItem.getMediaTitle() == null ? "" : archiveItem.getMediaTitle();\r
+ if (!mediaTitle.equals(media.getTitle()))\r
+ return false;\r
\r
- if (StringUtils.isBlank(archiveItem.getMediaTitle()))\r
- throw new Exception("No Media Title specified in metadata.");\r
- }\r
+ String mediaDescription = archiveItem.getMediaDescription() == null ? "" : archiveItem.getMediaDescription();\r
+ if (!mediaDescription.equals(media.getDescription()))\r
+ return false;\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
+ return true;\r
}\r
\r
private ArchiveItem createArchiveItem(Path filePath) throws Exception {\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
+ logger.info(getSessionMarker(), "{};{};{};{};{};{};{};{};{};{};{};{};{};", "Napló időbélyeg", "Törlés sikeres",\r
+ "Neve", "Elérése", "Mérete", "Létrehozva", "Módosítva", "Catched", "Killdate", "Archivált (MC)",\r
+ "Archiválva (MC)", "Archivált (TSM)", "Archiválva (TSM)", "Méret (TSM)", "Metaadat egyezés");\r
+\r
try {\r
if (getJobRuntime().forkPrepare()) {\r
Files.walkFileTree(Paths.get(sourcePath), this);\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
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
+ BasicFileAttributes attr = Files.readAttributes(mediaPath, BasicFileAttributes.class);\r
+ File mediaFSFile = mediaPath.toFile();\r
\r
- File mediaFile = mediaPath.toFile();\r
- if (mediaFile.isDirectory()) {\r
- //logger.info(getSessionMarker(), "Skipping directory {}", mediaPath);\r
+ if (mediaFSFile.isDirectory())\r
return false;\r
- }\r
-\r
- if (EscortFiles.isMediaCatched(mediaPath)) {\r
- //logger.info(getSessionMarker(), "Skipping already catched {}", mediaPath);\r
- return false;\r
- }\r
\r
+ String fileName = mediaPath.getFileName().toString();\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
+ List<Path> killDateFiles = getKillDateFiles(mediaPath);\r
+ MediaFile mediaFile = getMediaFile(fileName);\r
+\r
+ long size = mediaFSFile.length();\r
+ Date lastModifiedDate = new Date(attr.lastModifiedTime().toMillis());\r
+ Date lastAccesDate = new Date(attr.lastAccessTime().toMillis());\r
+ Date createDate = new Date(attr.creationTime().toMillis());\r
+ boolean catchedExists = EscortFiles.isMediaCatched(mediaPath);\r
+ boolean noMDExists = nomdFile.toFile().exists();\r
+ boolean killdateExists = killDateFiles.size() > 0;\r
+ //boolean mediaInfoAvailable = canReadMediaInfo(mediaPath);\r
+ boolean mcArchived = mediaFile != null;\r
+ boolean metadataEquals = false;\r
+ Date mcArchivedDate = null;\r
+ if (mcArchived) {\r
+ Media media = getManager().getMedia(mediaFile.getMediaId());\r
+ mcArchivedDate = media.getCreated();\r
+ Item item = getManager().getItem(media.getItemId());\r
+ metadataEquals = checkArchiveItem(archiveItem, item, media);\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
+ RemoteFile tsmFile = getTSMFile(mediaFile.getRelativePath());\r
+ boolean tsmArchived = tsmFile != null;\r
+ long tsmSize = 0;\r
+ if (tsmArchived) {\r
+ tsmSize = tsmFile.getSize();\r
}\r
\r
+ boolean canDelete = !noMDExists && catchedExists && killdateExists && mcArchived && tsmArchived;\r
+ Date now = new Date(System.currentTimeMillis());\r
+ logger.info(getSessionMarker(), "{};{};{};{};{};{};{};{};{};{};{};{};{};", df.format(now), YN(canDelete),\r
+ fileName, mediaPath.getParent(), size, df.format(createDate), df.format(lastModifiedDate),\r
+ YN(catchedExists), YN(killdateExists), YN(mcArchived), df.format(mcArchivedDate), YN(tsmArchived),\r
+ "Archiválva (TSM)", tsmSize, YN(metadataEquals));\r
+\r
return true;\r
}\r
\r
+ private char YN(boolean value) {\r
+ return value ? 'Y' : 'N';\r
+ }\r
+\r
@Override\r
public FileVisitResult visitFile(Path filePath, BasicFileAttributes paramBasicFileAttributes) throws IOException {\r
// logger.info(getSessionMarker(), "Will checked {}", filePath);\r
logger.info("Error archive {}", filePath);\r
return FileVisitResult.CONTINUE;\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(), EscortFiles.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
+ MediaFile getMediaFile(String fileName) {\r
+ MediaFile result = null;\r
+ MediaFileDAO mfDAO = (MediaFileDAO) getManager().getBaseDAO(MediaFile.class);\r
+ List<IEntityBase> mfList = mfDAO.getByHouseId(fileName);\r
+ if (mfList != null && mfList.size() == 1)\r
+ result = (MediaFile) mfList.get(0);\r
+ return result;\r
+ }\r
+\r
+ RemoteFile getTSMFile(String mcFileName) {\r
+ RemoteFile result = null;\r
+ Store tsmStore = getManager().getSystemStore(false);\r
+ StoreUri tsmStoreUri = tsmStore.getSourceStoreUri(RemoteStoreProtocol.TSM);\r
+ try {\r
+ result = tsmStoreUri.getRemoteFile(mcFileName);\r
+ } catch (Exception e) {\r
+ logger.error(e);\r
+ } finally {\r
+ tsmStoreUri.cleanUp();\r
+ }\r
+ return result;\r
+ }\r
+\r
}\r