git-tfs-id: [http://tfs.userrendszerhaz.hu:8080/tfs/DefaultCollection]$/MediaCube...
authorvasary.daniel <TFS\vasary.daniel>
Mon, 9 Aug 2021 14:27:32 +0000 (14:27 +0000)
committervasary.daniel <TFS\vasary.daniel>
Mon, 9 Aug 2021 14:27:32 +0000 (14:27 +0000)
server/user.jobengine.executors/src/user/jobengine/server/steps/SafeDeleteRecursive.java
server/user.jobengine.osgi.commons/src/user/commons/StoreUri.java
server/user.mediacube.metadata/src/user/mediacube/metadata/MetadataProviderFactory.java
server/user.mediacube.metadata/src/user/mediacube/metadata/MyBatisMetadataProvider.java
server/user.mediacube.metadata/src/user/mediacube/metadata/planair/PlanAirMetadataProvider.java

index c3d603c42e8674dad891ec27e880afe7e8d4f7b1..491e5a380891ac49b642ed1f59980908a3f51702 100644 (file)
@@ -2,6 +2,7 @@ package user.jobengine.server.steps;
 \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
@@ -9,20 +10,28 @@ import java.nio.file.Path;
 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
@@ -39,10 +48,8 @@ public class SafeDeleteRecursive extends JobStep implements FileVisitor<Path> {
        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
@@ -59,32 +66,31 @@ public class SafeDeleteRecursive extends JobStep implements FileVisitor<Path> {
                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
@@ -98,33 +104,20 @@ public class SafeDeleteRecursive extends JobStep implements FileVisitor<Path> {
                        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
@@ -182,16 +175,6 @@ public class SafeDeleteRecursive extends JobStep implements FileVisitor<Path> {
                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
@@ -212,62 +195,57 @@ public class SafeDeleteRecursive extends JobStep implements FileVisitor<Path> {
        }\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
@@ -284,4 +262,50 @@ public class SafeDeleteRecursive extends JobStep implements FileVisitor<Path> {
                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
index ede5844ec9d69660f5a350c6feac132974077719..37315c6ae75583a52ee4a767f89cee697c1d23f4 100644 (file)
@@ -97,9 +97,7 @@ public class StoreUri extends EntityBase implements Serializable {
 
                result.setName(targetFileName);
 
-               //TSM teszthez egy kamu ertek bellitasaval!
                result.setSize(source.getSize());
-               result.setSize(1001);
 
                ProgressEvent progressEvent = new ProgressEvent(this, 0);
                StatusEvent statusEvent = new StatusEvent(this);
index e2f9629b04564f305e78535e4daf38af65c3143d..273fa35b22143778e0af16fbb75ab95592352429 100644 (file)
@@ -7,7 +7,6 @@ import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;\r
 \r
 import user.commons.configuration.IConfiguration;\r
-import user.mediacube.metadata.hsm.HSMMetadataProvider;\r
 import user.mediacube.metadata.interfaces.IMetadataProvider;\r
 import user.mediacube.metadata.interfaces.IMetadataProviderFactory;\r
 import user.mediacube.metadata.interfaces.MetadataProviderType;\r
@@ -31,11 +30,19 @@ public class MetadataProviderFactory implements IMetadataProviderFactory {
                if (service instanceof IConfiguration) {\r
                        systemConfig = (IConfiguration) service;\r
                        logger.info("IConfiguration service binded");\r
-                       try {\r
-                               providers.put(MetadataProviderType.PLANAIR, new PlanAirMetadataProvider());\r
-                               providers.put(MetadataProviderType.HSM, new HSMMetadataProvider());\r
-                       } catch (Exception e) {\r
-                       }\r
+\r
+                       createProvider(MetadataProviderType.PLANAIR);\r
+                       createProvider(MetadataProviderType.HSM);\r
+\r
+               }\r
+       }\r
+\r
+       private void createProvider(MetadataProviderType type) {\r
+               try {\r
+                       logger.info("Creating metadata provider for {}", type);\r
+                       providers.put(type, new PlanAirMetadataProvider());\r
+               } catch (Exception e) {\r
+                       logger.error("Metadata provider not created for {}. Error: {}", type, e.getMessage());\r
                }\r
        }\r
 \r
index 2b0c807bc3bc12b0da4f7f43ea4b81e9e9f6bd6e..dbb90e5430eecfee0edef7246921ac6a6e456182 100644 (file)
@@ -10,6 +10,8 @@ import org.apache.ibatis.session.SqlSession;
 import org.apache.ibatis.session.SqlSessionFactory;\r
 import org.apache.ibatis.session.SqlSessionFactoryBuilder;\r
 import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
 \r
 import com.ibm.nosql.json.api.BasicDBObject;\r
 \r
@@ -18,13 +20,19 @@ import user.mediacube.metadata.interfaces.IMetadataListOptions;
 import user.mediacube.metadata.interfaces.IMetadataProvider;\r
 \r
 public abstract class MyBatisMetadataProvider implements IMetadataProvider {\r
+       private final static Logger logger = LogManager.getLogger();\r
        private final SqlSessionFactory sqlSessionFactory;\r
 \r
        public MyBatisMetadataProvider() throws Exception {\r
+               String driverClassName = null;\r
                try {\r
-                       Class.forName(getDriverClassName());\r
+                       driverClassName = getDriverClassName();\r
+                       Class.forName(driverClassName);\r
                        sqlSessionFactory = buildqlSessionFactory();\r
+\r
+                       logger.info("Metadata driver {} loaded", driverClassName);\r
                } catch (Exception e) {\r
+                       logger.error("Can't load metadata driver {}. Error: {}", driverClassName, e.getMessage());\r
                        throw e;\r
                }\r
        }\r
index 97d0ea2c08d203588bdb14f55ea2fec65f419d78..50c42fc833401a61d99f18520ad0390dd8dbffaf 100644 (file)
@@ -18,7 +18,7 @@ import user.mediacube.metadata.interfaces.IMetadataListOptions;
 import user.mediacube.metadata.interfaces.PlanAirMetadataListOptions;\r
 \r
 public class PlanAirMetadataProvider extends MyBatisMetadataProvider {\r
-       private String JDBC_DRIVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver";\r
+       private static final String JDBC_DRIVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver";\r
 \r
        public PlanAirMetadataProvider() throws Exception {\r
                super();\r