--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<executors>\r
+ <executor className="EscortFileUpdaterStep.java" maxConcurrent="1" isRemote="false" />\r
+ <executor className="PBARCHIVETransferFromStep.java" maxConcurrent="2" isRemote="false" />\r
+ <executor className="PBArchiveCheckerStep.java" maxConcurrent="1" isRemote="false" />\r
+ <executor className="ArchiveSubtitlesStep.java" maxConcurrent="1" isRemote="false" />\r
+ <executor className="SubtitleFilesCollectorStep.java" maxConcurrent="1" isRemote="false" />\r
+ <executor className="ServerStatusReportStep.java" maxConcurrent="1" isRemote="false" />\r
+ <executor className="TransferStep.java" maxConcurrent="1" isRemote="false" />\r
+ <executor className="TSMTransferToStep.java" maxConcurrent="4" isRemote="false" />\r
+ <executor className="TSMTransferFromStep.java" maxConcurrent="8" isRemote="false" />\r
+ <executor className="NEXIO1TransferToStep.java" maxConcurrent="4" isRemote="false" />\r
+ <executor className="NEXIO2TransferToStep.java" maxConcurrent="4" isRemote="false" />\r
+ <executor className="PASAPOOLTransferToStep.java" maxConcurrent="4" isRemote="false" />\r
+ <executor className="FILEZILLA_PASARESTORETransferToStep.java" maxConcurrent="4" isRemote="false" />\r
+ <executor className="FILEZILLA_AVIDTransferToStep.java" maxConcurrent="4" isRemote="false" />\r
+ <executor className="NEXIO1TransferFromStep.java" maxConcurrent="2" isRemote="false" />\r
+ <executor className="NEXIO2TransferFromStep.java" maxConcurrent="2" isRemote="false" />\r
+ <executor className="VODTransferToStep.java" maxConcurrent="3" isRemote="false" />\r
+ <executor className="RegisterVODRestoreStep.java" maxConcurrent="1" isRemote="false" />\r
+\r
+ <executor className="RegisterUserRestoreStep.java" maxConcurrent="3" isRemote="false" />\r
+ <executor className="FileValidatorStep.java" maxConcurrent="10" isRemote="false" />\r
+ <executor className="MetadataPersisterStep.java" maxConcurrent="10" isRemote="false" />\r
+ <executor className="FileCleanupStep.java" maxConcurrent="10" isRemote="false" />\r
+ <executor className="ForkUploadStep.java" maxConcurrent="1" isRemote="false" />\r
+ <executor className="ForkDownloadStep.java" maxConcurrent="1" isRemote="false" />\r
+ <executor className="NEXIOArchiveCheckerStep.java" maxConcurrent="2" isRemote="false" />\r
+ <executor className="NEXIOMetadataPersisterStep.java" maxConcurrent="5" isRemote="false" />\r
+ <executor className="HarrisMissingMaterialCheckerStep.java" maxConcurrent="2" isRemote="false" />\r
+ <executor className="PeableBeachMissingMaterialCheckerStep.java" maxConcurrent="1" isRemote="false" />\r
+\r
+ <executor className="CancelableStep.java" maxConcurrent="2" isRemote="false" />\r
+ <executor className="TestForkCancelableStep.java" maxConcurrent="3" isRemote="false" />\r
+ <executor className="DirMXFValidatorStep.java" maxConcurrent="1" isRemote="false" />\r
+</executors>
\ No newline at end of file
--- /dev/null
+{"joblist":[\r
+ {\r
+ "template": "PB-archive-checker.xml",\r
+ "name" : "PEABLEBEACH archiválás előkészítése",\r
+ "active": true,\r
+ "executeimmediate": false,\r
+ "cronexpression": "0 0 */1 * * ?",\r
+ "parameters": \r
+ [ \r
+ {"name": "sourceStoreName", "value": "PBARCHIVE", "type": "java.lang.String"},\r
+ {"name": "escortStoreName", "value": "MEDIACUBE_DOWNLOADS", "type": "java.lang.String"},\r
+ {"name": "lastModifiedHours", "value": 3, "type": "java.lang.Integer"}\r
+ ]\r
+ }, \r
+ {\r
+ "template": "sync-subtitles.xml",\r
+ "name" : "Feliratok szinkronizálása",\r
+ "active": true,\r
+ "cronexpression": "0 */30 * * * ?",\r
+ "parameters": [ \r
+ {"name": "sourceFolder", "value": "x:\\PB_ORIG", "type": "java.lang.String"}, \r
+ {"name": "syncTarget", "value": "r:\\BeachPool", "type": "java.lang.String"}, \r
+ {"name": "filter", "value": ".*\\.(stl)$", "type": "java.lang.String" } \r
+ ]\r
+ },\r
+ {\r
+ "template": "server-status-report.xml",\r
+ "name" : "MediaCube státusz",\r
+ "active": true,\r
+ "executeimmediate": false,\r
+ "cronexpression": "0 */30 * * * ?"\r
+ },\r
+ {\r
+ "template": "nexio1-archive-checker.xml",\r
+ "name" : "NEXIO1 archiválás előkészítése",\r
+ "active": true,\r
+ "executeimmediate": false,\r
+ "cronexpression": "0 0 */1 * * ?",\r
+ "parameters": \r
+ [ \r
+ {"name": "sourceStoreName", "value": "NEXIO1", "type": "java.lang.String"},\r
+ {"name": "escortStoreName", "value": "MEDIACUBE_DOWNLOADS", "type": "java.lang.String"},\r
+ {"name": "lastModifiedHours", "value": 3, "type": "java.lang.Integer"}\r
+ ]\r
+ }, \r
+ {\r
+ "template": "nexio2-archive-checker.xml",\r
+ "name" : "NEXIO2 archiválás előkészítése",\r
+ "active": true,\r
+ "executeimmediate": false,\r
+ "cronexpression": "0 0 */1 * * ?",\r
+ "parameters": \r
+ [ \r
+ {"name": "sourceStoreName", "value": "NEXIO2", "type": "java.lang.String"},\r
+ {"name": "escortStoreName", "value": "MEDIACUBE_DOWNLOADS", "type": "java.lang.String"},\r
+ {"name": "lastModifiedHours", "value": 3, "type": "java.lang.Integer"}\r
+ ]\r
+ },\r
+ {\r
+ "template": "fork-validate-and-archive.xml",\r
+ "name" : "Kötegelt validálás és archiválás",\r
+ "active": true,\r
+ "executeimmediate": false,\r
+ "cronexpression": "0 */30 * * * ?",\r
+ "parameters": \r
+ [ \r
+ {"name": "sourceStoreName", "value": "MEDIACUBE_DOWNLOADS", "type": "java.lang.String"},\r
+ {"name": "template", "value": "validate-and-archive.xml", "type": "java.lang.String"},\r
+ {"name": "expectedColorSpace", "value": "", "type": "java.lang.String"},\r
+ {"name": "limit", "value": 100, "type": "java.lang.Integer"}\r
+ ]\r
+ },\r
+ {\r
+ "template": "harris1-missingmaterial-checker.xml",\r
+ "name" : "HARRIS1 missing material lekérdezés",\r
+ "active": true,\r
+ "executeimmediate": false,\r
+ "cronexpression": "0 */5 * * * ?",\r
+ "parameters": \r
+ [ \r
+ {"name": "vicFiles", "value": ["z:\\NEXIO.VIC", "z:\\EDIT 9.VIC", "z:\\TRIM2.VIC"], "type": "com.ibm.nosql.json.api.BasicDBList"},\r
+ {"name": "escortStoreName", "value": "MEDIACUBE_UPLOADS", "type": "java.lang.String"},\r
+ {"name": "targetStoreName", "value": "NEXIO1", "type": "java.lang.String"},\r
+ {"name": "targetProtocol", "value": "FTP", "type": "java.lang.String"}\r
+ ]\r
+ },\r
+ {\r
+ "template": "harris2-missingmaterial-checker.xml",\r
+ "name" : "HARRIS2 missing material lekérdezés",\r
+ "active": true,\r
+ "executeimmediate": false,\r
+ "cronexpression": "0 */5 * * * ?",\r
+ "parameters": \r
+ [ \r
+ {"name": "vicFiles", "value": ["z:\\NEXIO2.VIC", "z:\\EDIT-4.VIC", "z:\\EDIT 10.VIC"], "type": "com.ibm.nosql.json.api.BasicDBList"},\r
+ {"name": "escortStoreName", "value": "MEDIACUBE_UPLOADS", "type": "java.lang.String"},\r
+ {"name": "targetStoreName", "value": "NEXIO2", "type": "java.lang.String"},\r
+ {"name": "targetProtocol", "value": "FTP", "type": "java.lang.String"}\r
+ ]\r
+ },\r
+ {\r
+ "template": "peablebeach-missingmaterial-checker.xml",\r
+ "name" : "PEABLEBEACH missing material lekérdezés",\r
+ "active": true,\r
+ "executeimmediate": false,\r
+ "cronexpression": "0 */5 * * * ?",\r
+ "parameters": \r
+ [ \r
+ {"name": "escortStoreName", "value": "MEDIACUBE_UPLOADS", "type": "java.lang.String"},\r
+ {"name": "lookupStoreNames", "value": ["PEABLEBEACH", "PASAPOOL", "SELENIOPOOL", "SELENIOPOOL_16_9", "SELENIOPOOL_16_9_PROCESSING", "SELENIOPOOL_4_3", "SELENIOPOOL_4_3_PROCESSING"], "type": "com.ibm.nosql.json.api.BasicDBList"},\r
+ {"name": "targetStoreName", "value": "PASAPOOL", "type": "java.lang.String"},\r
+ {"name": "targetProtocol", "value": "FTP", "type": "java.lang.String"},\r
+ {"name": "primaryEndPoint", "value": "http://10.170.100.61:18083", "type": "java.lang.String"},\r
+ {"name": "primaryUserName", "value": "pbs", "type": "java.lang.String"},\r
+ {"name": "primaryPassword", "value": "pbs", "type": "java.lang.String"},\r
+ {"name": "secondaryEndPoint", "value": "http://10.170.100.62:18083", "type": "java.lang.String"},\r
+ {"name": "secondaryUserName", "value": "pbs", "type": "java.lang.String"},\r
+ {"name": "secondaryPassword", "value": "pbs", "type": "java.lang.String"},\r
+ {"name": "rangeForwardHours", "value": 168, "type": "java.lang.Integer"}\r
+ ]\r
+ },\r
+ {\r
+ "template": "fork-validate-and-restore.xml",\r
+ "name" : "Kötegelt validálás és visszatöltés",\r
+ "active": true,\r
+ "executeimmediate": false,\r
+ "cronexpression": "0 */1 * * * ?",\r
+ "parameters": \r
+ [ \r
+ {"name": "sourceStoreName", "value": "MEDIACUBE_UPLOADS", "type": "java.lang.String"},\r
+ {"name": "template", "value": "validate-and-restore.xml", "type": "java.lang.String"},\r
+ {"name": "expectedColorSpace", "value": "", "type": "java.lang.String"},\r
+ {"name": "limit", "value": 0, "type": "java.lang.Integer"}\r
+ ]\r
+ },\r
+ {\r
+ "template": "register-user-restore.xml",\r
+ "name" : "Felhasználói visszatöltés regisztráció",\r
+ "active": false,\r
+ "executeimmediate": false,\r
+ "parameters": \r
+ [ \r
+ {"name": "escortStoreName", "value": "MEDIACUBE_UPLOADS", "type": "java.lang.String"}\r
+ ]\r
+ } \r
+]}\r
--- /dev/null
+package user.jobengine.server.steps;\r
+\r
+import java.io.File;\r
+import java.io.IOException;\r
+import java.nio.file.Files;\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+import java.nio.file.StandardCopyOption;\r
+import java.nio.file.attribute.FileAttribute;\r
+import java.nio.file.attribute.PosixFilePermission;\r
+import java.nio.file.attribute.PosixFilePermissions;\r
+import java.util.Arrays;\r
+import java.util.List;\r
+import java.util.Set;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+public class ArchiveSubtitlesStep extends JobStep {\r
+ private static final Logger logger = LogManager.getLogger();\r
+\r
+ @StepEntry\r
+ public Object[] execute(List<String> files, String syncTarget) {\r
+ int current = 0;\r
+ for (String file : files) {\r
+ Path source = Paths.get(file);\r
+ Path archive = archiveSubtitle(source);\r
+\r
+ if (archive != null) {\r
+ Path sync = Paths.get(syncTarget);\r
+ syncSubtitle(archive, sync);\r
+ }\r
+\r
+ current++;\r
+ int progress = current * 100 / files.size();\r
+ setProgress(progress);\r
+ }\r
+ setProgress(100);\r
+ return null;\r
+ }\r
+\r
+ private Path archiveSubtitle(Path source) {\r
+ Path archiveRoot = Paths.get(source.toString().replace("PB_ORIG", "PB_ARCH")).getParent().getParent();\r
+ String lang = source.getParent().getFileName().toString().toUpperCase();\r
+ // logger.info(getMarker(), "Archive root is {}, lang is {}", archiveRoot,\r
+ // lang);\r
+\r
+ String sourceFileName = source.getFileName().toString();\r
+ Path archive = Paths.get(archiveRoot.toString(), sourceFileName.replace(".stl", "_" + lang + ".stl"));\r
+ boolean isOverride = archive.toFile().exists();\r
+ try {\r
+ ensureFolder(archiveRoot);\r
+ Files.copy(source, archive, StandardCopyOption.REPLACE_EXISTING);\r
+\r
+ boolean isContentEquals = Arrays.equals(Files.readAllBytes(source), Files.readAllBytes(archive));\r
+ logger.info(getMarker(), "Contents equals {}", isContentEquals);\r
+ if (isContentEquals) {\r
+ if (isOverride)\r
+ logger.info(getMarker(), "Successfully replaced {}", archive);\r
+ else\r
+ logger.info(getMarker(), "Successfully archived {}", archive);\r
+\r
+ String doneFileName = sourceFileName.substring(0, sourceFileName.lastIndexOf("."));\r
+ Path done = Paths.get(source.getParent().toString(), doneFileName + "_DONE.stl");\r
+ Files.move(source, done, StandardCopyOption.REPLACE_EXISTING);\r
+ return archive;\r
+ } else\r
+ throw new Exception("Source and target content not equals");\r
+ } catch (Exception e) {\r
+ logger.error(getMarker(), "Error copy {} to {}. System message: {}", source, archive, e.getMessage());\r
+ }\r
+ return null;\r
+ }\r
+\r
+ private void syncSubtitle(Path archive, Path syncTarget) {\r
+ Path sync = Paths.get(syncTarget.toString(), archive.getFileName().toString());\r
+ logger.info(getMarker(), "Sync root {} exists {}", syncTarget, syncTarget.toFile().exists());\r
+\r
+ if (!sync.toFile().exists()) {\r
+ logger.info(getMarker(), "Skipping {} synchronization, target not exists", sync);\r
+ return;\r
+ }\r
+\r
+ logger.info(getMarker(), "Target {} synchronization required", sync);\r
+\r
+ try {\r
+ Files.copy(archive, sync, StandardCopyOption.REPLACE_EXISTING);\r
+ boolean isContentEquals = Arrays.equals(Files.readAllBytes(archive), Files.readAllBytes(sync));\r
+ if (isContentEquals)\r
+ logger.info(getMarker(), "Successfully synchronized {}", archive);\r
+ else\r
+ throw new Exception("Synchronization source and target content not equals");\r
+ } catch (Exception e) {\r
+ logger.error(getMarker(), "Error synchronize {} to {}. System message: {}", archive, sync, e.getMessage());\r
+ }\r
+ }\r
+\r
+ public void ensureFolder(Path filePath) throws IOException {\r
+ File folder = filePath.toFile();\r
+ if (!folder.exists() || !folder.isDirectory()) {\r
+ try {\r
+ Set<PosixFilePermission> perms = PosixFilePermissions.fromString("rwxrwxrwx");\r
+ FileAttribute<Set<PosixFilePermission>> attr = PosixFilePermissions.asFileAttribute(perms);\r
+ Files.createDirectories(filePath, attr);\r
+ } catch (Exception e) {\r
+ try {\r
+ Files.createDirectories(filePath);\r
+ } catch (Exception e1) {\r
+ logger.catching(e1);\r
+ throw e1;\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+}\r
--- /dev/null
+package user.jobengine.server.steps;\r
+\r
+import org.apache.commons.net.ftp.FTPClient;\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import user.commons.StoreUri;\r
+import user.commons.remotestore.FtpDirectoryLister;\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
+\r
+public class CancelableStep extends JobStep {\r
+ private static final Logger logger = LogManager.getLogger();\r
+ int count = 10;\r
+\r
+ @StepEntry\r
+ public Object[] execute(int param) throws Exception {\r
+ try {\r
+ getJobRuntime().setDisableRetry(true);\r
+ for (int i = 0; i < count; i++) {\r
+ if (getJobRuntime().isWaitingCancel())\r
+ break;\r
+ Thread.sleep(2000);\r
+ int progress = (i + 1) * 100 / count;\r
+ setProgress(progress);\r
+// if (i==9)\r
+// throw new Exception("Hiba teszt!");\r
+ }\r
+ } catch (Exception e) {\r
+ e.printStackTrace();\r
+ throw e;\r
+ }\r
+ return null;\r
+ }\r
+\r
+}\r
--- /dev/null
+package user.jobengine.server.steps;\r
+\r
+import java.nio.file.DirectoryStream;\r
+import java.nio.file.Files;\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import user.commons.mediatool.MediaInfo;\r
+import user.jobengine.db.Media;\r
+\r
+public class DirMXFValidatorStep extends JobStep {\r
+ private static final Logger logger = LogManager.getLogger();\r
+\r
+ @StepEntry\r
+ public Object[] execute(String source) throws Exception {\r
+ Path path = Paths.get(source);\r
+ DirectoryStream<Path> directoryStream = Files.newDirectoryStream(path);\r
+ for (Path file : directoryStream) {\r
+ if (getJobRuntime().isWaitingCancel()) {\r
+ cancel();\r
+ return null;\r
+ }\r
+\r
+ if (file.toFile().isDirectory())\r
+ continue;\r
+\r
+ String fileName = file.getFileName().toString();\r
+ if (fileName.contains("."))\r
+ fileName = fileName.substring(0, fileName.lastIndexOf("."));\r
+\r
+ if (file.toFile().length() == 0) {\r
+ logger.error("Zero: {}", fileName);\r
+ continue;\r
+ }\r
+\r
+ Media media = getManager().getMedia(fileName);\r
+ long frames = 0;\r
+ if (media == null) {\r
+ logger.warn("Unchecked yet: {}", fileName);\r
+ } else\r
+ frames = media.getLength();\r
+\r
+ MediaInfo mi = null;\r
+\r
+ try {\r
+ mi = new MediaInfo(file);\r
+ mi.process();\r
+ } catch (Exception e) {\r
+ logger.error(getSessionMarker(), e.getMessage());\r
+ logger.error("Unreadable: {}", fileName);\r
+ }\r
+\r
+ logger.info("Valid: {} MC farmes {} FF frames {}", fileName, frames, mi.getFrames());\r
+ }\r
+\r
+ return null;\r
+ }\r
+}\r
--- /dev/null
+package user.jobengine.server.steps;\r
+\r
+import java.io.FileNotFoundException;\r
+import java.nio.file.Files;\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import user.commons.DownloadableMedia;\r
+import user.commons.StoreUri;\r
+import user.commons.mediatool.MediaInfo;\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
+import user.jobengine.server.steps.shared.EscortFiles;\r
+\r
+public class EscortFileUpdaterStep extends JobStep {\r
+ private static final Logger logger = LogManager.getLogger();\r
+\r
+ @StepEntry\r
+ public Object[] execute(StoreUri sourceStoreUri, String fileName, String escortFile) throws Exception {\r
+ if (!RemoteStoreProtocol.LOCAL.equals(sourceStoreUri.getProtocol()))\r
+ throw new Exception("Store URI protocol must be local.");\r
+ Path filePath = Paths.get(sourceStoreUri.toString(true), fileName);\r
+ if (!filePath.toFile().exists())\r
+ throw new FileNotFoundException("File not exists: " + filePath.toString());\r
+\r
+ Path escortFilePath = Paths.get(escortFile);\r
+ DownloadableMedia downloadable = null;\r
+ try {\r
+ downloadable = EscortFiles.decode(escortFilePath);\r
+ } catch (Exception e) {\r
+ logger.error(getSessionMarker(), e.getMessage());\r
+ }\r
+\r
+ if (downloadable != null)\r
+ storeCurrentFrames(filePath, downloadable, escortFilePath);\r
+\r
+ return null;\r
+ }\r
+\r
+ private void storeCurrentFrames(Path filePath, DownloadableMedia downloadable, Path escortFilePath) {\r
+ MediaInfo mi = null;\r
+ try {\r
+ mi = new MediaInfo(filePath);\r
+ mi.process();\r
+ long frames = mi.getFrames();\r
+ downloadable.put("frames", frames);\r
+ Files.write(escortFilePath, downloadable.toPrettyString("").getBytes());\r
+ logger.info(getMarker(), "{} length {} is saved to escort file", filePath, frames,\r
+ escortFilePath.getFileName().toString());\r
+ } catch (Exception e) {\r
+ logger.error(getSessionMarker(), e.getMessage());\r
+ }\r
+ }\r
+\r
+}\r
--- /dev/null
+package user.jobengine.server.steps;\r
+\r
+import user.commons.StoreUri;\r
+\r
+public class FILEZILLA_AVIDTransferToStep extends TransferStep {\r
+ @Override\r
+ @StepEntry\r
+ public Object[] execute(StoreUri sourceStoreUri, String sourceFileName, StoreUri targetStoreUri, String targetFileName) throws Exception {\r
+ return super.execute(sourceStoreUri, sourceFileName, targetStoreUri, targetFileName);\r
+ }\r
+}\r
--- /dev/null
+package user.jobengine.server.steps;\r
+\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+import org.apache.logging.log4j.Marker;\r
+import org.apache.logging.log4j.MarkerManager;\r
+\r
+import user.commons.StoreUri;\r
+import user.commons.mediaarea.MediaArea;\r
+\r
+public class FILEZILLA_PASARESTORETransferToStep extends TransferStep {\r
+ private static final Logger logger = LogManager.getLogger();\r
+ private static final String CODEC_PROFILE_HIGH = "HIGH";\r
+ private static final String CODEC_PROFILE_MAIN = "MAIN";\r
+ private static final String CODEC_PROFILE_422 = "4:2:2";\r
+ private static final String DISPLAY_ASPECT_16_9 = "16:9";\r
+ private static final String DISPLAY_ASPECT_4_3 = "4:3";\r
+ private StoreUri sourceStoreUri;\r
+ private String sourceFileName;\r
+\r
+ @Override\r
+ @StepEntry\r
+ public Object[] execute(StoreUri sourceStoreUri, String sourceFileName, StoreUri targetStoreUri, String targetFileName) throws Exception {\r
+ this.sourceStoreUri = sourceStoreUri;\r
+ this.sourceFileName = sourceFileName;\r
+ logMediaProfile();\r
+ Object[] result = super.execute(sourceStoreUri, sourceFileName, targetStoreUri, targetFileName);\r
+ return result;\r
+ }\r
+\r
+ private boolean isHD(MediaArea mi) {\r
+ return mi.getHeight() == 1080;\r
+ }\r
+\r
+ private boolean isSD_HIGH_16_9(MediaArea mi) {\r
+ String formatProfileName = mi.getFormatProfileName();\r
+ return mi.getHeight() < 650 && formatProfileName.contains(CODEC_PROFILE_HIGH) && DISPLAY_ASPECT_16_9.equals(mi.getDisplayAspect());\r
+ }\r
+\r
+ private boolean isSD_HIGH_4_3(MediaArea mi) {\r
+ String formatProfileName = mi.getFormatProfileName();\r
+ return mi.getHeight() < 650 && formatProfileName.contains(CODEC_PROFILE_HIGH) && DISPLAY_ASPECT_4_3.equals(mi.getDisplayAspect());\r
+ }\r
+\r
+ private boolean isSD_MAIN_422(MediaArea mi) {\r
+ String formatProfileName = mi.getFormatProfileName();\r
+ return mi.getHeight() < 650 && (formatProfileName.contains(CODEC_PROFILE_MAIN) || formatProfileName.contains(CODEC_PROFILE_422));\r
+ }\r
+\r
+ protected void logMediaProfile() {\r
+ Marker marker = MarkerManager.getMarker("MEDIAPROFILE");\r
+ try {\r
+ Path filePath = Paths.get(sourceStoreUri.toString(true), sourceFileName);\r
+ MediaArea mi = new MediaArea(filePath);\r
+ mi.process();\r
+ logger.info(marker, "{} data : {} {} {}", sourceFileName, mi.getFormatProfileName(), mi.getHeight(), mi.getDisplayAspect());\r
+\r
+ if (isHD(mi)) {\r
+ logger.info(marker, "{} is MOVED_HD", sourceFileName);\r
+ return;\r
+ }\r
+\r
+ if (isSD_HIGH_16_9(mi)) {\r
+ logger.info(marker, "{} is CONVSD16_9", sourceFileName);\r
+ return;\r
+ }\r
+\r
+ if (isSD_HIGH_4_3(mi)) {\r
+ logger.info(marker, "{} is CONVSD4_3", sourceFileName);\r
+ return;\r
+ }\r
+\r
+ if (isSD_MAIN_422(mi)) {\r
+ logger.info(marker, "{} is MOVED_SD", sourceFileName);\r
+ return;\r
+ }\r
+ } catch (Exception e) {\r
+ logger.error(marker, e.getMessage());\r
+ }\r
+ }\r
+\r
+}\r
--- /dev/null
+package user.jobengine.server.steps;\r
+\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+\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 user.commons.StoreUri;\r
+import user.jobengine.server.steps.shared.EscortFiles;\r
+\r
+public class FileCleanupStep extends JobStep {\r
+ private static final Logger logger = LogManager.getLogger();\r
+\r
+ @StepEntry\r
+ public Object[] execute(StoreUri sourceStoreUri, String fileName, String escortFile) throws Exception {\r
+ try {\r
+\r
+ Message msg = new ParameterizedMessage("A {} fájl visszatöltése befejeződött.", fileName);\r
+ EscortFiles.notifyRecipient(Paths.get(escortFile), logger, msg);\r
+\r
+ Path filePath = Paths.get(sourceStoreUri.toString(true), fileName);\r
+ EscortFiles.remove(filePath);\r
+ EscortFiles.remove(Paths.get(escortFile));\r
+ EscortFiles.remove(Paths.get(escortFile + EscortFiles.DOT_CATCHED));\r
+ } catch (Exception e) {\r
+ logger.error(e.getMessage());\r
+ throw e;\r
+ }\r
+ return null;\r
+ }\r
+\r
+}\r
--- /dev/null
+package user.jobengine.server.steps;\r
+\r
+import java.nio.file.Path;\r
+import java.util.regex.Matcher;\r
+import java.util.regex.Pattern;\r
+\r
+import com.ibm.nosql.json.api.BasicDBObject;\r
+\r
+public class FileSearchFilterOptions {\r
+\r
+ private BasicDBObject filter;\r
+\r
+ public FileSearchFilterOptions(BasicDBObject filter) {\r
+ this.filter = filter;\r
+ }\r
+\r
+ public boolean acceptFile(Path file) {\r
+ if (filter == null)\r
+ return true;\r
+\r
+ if (filter.containsKey("fileName")) {\r
+ //.*\.(sh|ini|conf|vhost|xml|php)$\r
+ String fileNamePattern = filter.getString("fileName");\r
+ if (fileNamePattern == null || fileNamePattern.trim().length() == 0)\r
+ return true;\r
+\r
+ Pattern pattern = Pattern.compile(fileNamePattern, Pattern.CASE_INSENSITIVE);\r
+\r
+ Matcher matcher = pattern.matcher(file.getFileName().toString());\r
+ if (matcher.find())\r
+ return true;\r
+\r
+ }\r
+\r
+ return false;\r
+ }\r
+\r
+ public boolean preAcceptDirectory(Path file) {\r
+ return true;\r
+ }\r
+}\r
--- /dev/null
+package user.jobengine.server.steps;\r
+\r
+import java.io.FileNotFoundException;\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+\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 user.commons.DownloadableMedia;\r
+import user.commons.StoreUri;\r
+import user.commons.mediatool.MediaInfo;\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
+import user.jobengine.db.Media;\r
+import user.jobengine.server.steps.shared.EscortFiles;\r
+\r
+public class FileValidatorStep extends JobStep {\r
+ private static final String COLORSPACE = "COLORSPACE";\r
+ private static final Logger logger = LogManager.getLogger();\r
+\r
+ @StepEntry\r
+ public Object[] execute(StoreUri sourceStoreUri, String fileName, long expectedFrameNumber, long expectedSize, String exceptedColorSpace, String escortFile)\r
+ throws Exception {\r
+ if (!RemoteStoreProtocol.LOCAL.equals(sourceStoreUri.getProtocol()))\r
+ throw new Exception("Store URI protocol must be local.");\r
+ Path filePath = Paths.get(sourceStoreUri.toString(true), fileName);\r
+ if (!filePath.toFile().exists())\r
+ throw new FileNotFoundException("File not exists: " + filePath.toString());\r
+\r
+ Path escortFilePath = Paths.get(escortFile);\r
+\r
+ if (getJobRuntime().isWaitingCancel()) {\r
+ EscortFiles.remove(filePath);\r
+ //EscortFiles.remove(escortFilePath);\r
+ EscortFiles.remove(Paths.get(escortFile + EscortFiles.DOT_CATCHED));\r
+\r
+ Message msg = new ParameterizedMessage("A {} fájl visszatöltése kezelői beavatkozás miatt megszakadt.", fileName);\r
+ EscortFiles.notifyRecipient(escortFilePath, logger, msg);\r
+\r
+ cancel();\r
+ return null;\r
+ }\r
+\r
+ DownloadableMedia downloadable = null;\r
+ try {\r
+ downloadable = EscortFiles.decode(escortFilePath);\r
+ } catch (Exception e) {\r
+ logger.error(getSessionMarker(), e.getMessage());\r
+ }\r
+\r
+ if (downloadable != null && expectedFrameNumber == 0)\r
+ storeCurrentFrames(filePath, downloadable);\r
+\r
+ if (downloadable != null && downloadable.containsKey("skipValidation") && downloadable.getBoolean("skipValidation"))\r
+ return null;\r
+\r
+ if (expectedFrameNumber > 0 || StringUtils.isNotBlank(exceptedColorSpace))\r
+ validateMedia(filePath, expectedFrameNumber, exceptedColorSpace, escortFile);\r
+\r
+ if (expectedSize > 0)\r
+ validateSize(filePath, expectedSize, escortFile);\r
+\r
+ //A metadata persister miatt torlunk mindet teszt modban\r
+ /*\r
+ if (StringUtils.isNotBlank(testSimulate)) {\r
+ EscortFiles.remove(escortFilePath);\r
+ EscortFiles.remove(Paths.get(escortFile + EscortFiles.DOT_CATCHED));\r
+ logger.info(getMarker(), "{} deleted to prevent real processing", escortFile);\r
+ }\r
+ */\r
+ logger.info(getMarker(), "{} passed validation", fileName);\r
+ return null;\r
+ }\r
+\r
+ private void storeCurrentFrames(Path filePath, DownloadableMedia downloadable) {\r
+ MediaInfo mi = null;\r
+ try {\r
+ mi = new MediaInfo(filePath);\r
+ mi.process();\r
+ long frames = mi.getFrames();\r
+\r
+ if (downloadable.containsKey("mediaId")) {\r
+ Media media = getManager().getMedia(downloadable.getLong("mediaId"));\r
+ if (media != null) {\r
+ media.setLength(frames);\r
+ getManager().modify(media);\r
+ }\r
+\r
+ }\r
+\r
+ } catch (Exception e) {\r
+ logger.error(getSessionMarker(), e.getMessage());\r
+ }\r
+ }\r
+\r
+ private void validateMedia(Path filePath, long expectedFrameNumber, String exceptedColorSpace, String escortFile) throws Exception {\r
+ MediaInfo mi = null;\r
+ try {\r
+ mi = new MediaInfo(filePath);\r
+ mi.process();\r
+\r
+ if (expectedFrameNumber > 0) {\r
+ long frames = mi.getFrames();\r
+ if (Math.abs(frames - expectedFrameNumber) > 3) {\r
+ Message msg = new ParameterizedMessage("Validációs hiba miatt a {} fájl másolása nem lehetséges.", filePath.getFileName());\r
+ EscortFiles.notifyRecipient(Paths.get(escortFile), logger, msg);\r
+ getJobRuntime().setDisableRetry(true);\r
+ throw new Exception("Length mismatch in " + filePath + ". Expected: " + expectedFrameNumber + ", found: " + frames);\r
+ }\r
+ }\r
+\r
+ if (StringUtils.isNotBlank(exceptedColorSpace)) {\r
+ String colorSpace = mi.getColorSpace();\r
+ if (colorSpace == null) {\r
+ EscortFiles.createFellow(escortFile, COLORSPACE);\r
+ throw new Exception("Can not determine color space in " + filePath);\r
+ }\r
+\r
+ if (!colorSpace.equals(exceptedColorSpace)) {\r
+ EscortFiles.createFellow(escortFile, COLORSPACE);\r
+ throw new Exception("Expected color space is " + exceptedColorSpace + ", but found " + colorSpace);\r
+ }\r
+ }\r
+\r
+ } catch (Exception e) {\r
+ logger.error(getSessionMarker(), e.getMessage());\r
+ throw e;\r
+ }\r
+ }\r
+\r
+ private void validateSize(Path filePath, long expectedSize, String escortFile) throws Exception {\r
+ try {\r
+ long length = filePath.toFile().length();\r
+ if (length != expectedSize)\r
+ throw new Exception("Size mismatch. Expected: " + expectedSize + ", found: " + length);\r
+\r
+ } catch (Exception e) {\r
+ logger.error(getSessionMarker(), e.getMessage());\r
+ throw e;\r
+ }\r
+ }\r
+\r
+}\r
--- /dev/null
+package user.jobengine.server.steps;\r
+\r
+import java.io.IOException;\r
+import java.nio.file.DirectoryStream;\r
+import java.nio.file.Files;\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+import java.util.ArrayList;\r
+import java.util.HashMap;\r
+import java.util.List;\r
+import java.util.Map;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import user.commons.DownloadableMedia;\r
+import user.commons.JobStatus;\r
+import user.commons.RemoteFile;\r
+import user.commons.StoreUri;\r
+import user.commons.remotestore.FtpDirectoryLister;\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
+import user.jobengine.db.Store;\r
+import user.jobengine.server.IJobEngine;\r
+import user.jobengine.server.IJobRuntime;\r
+import user.jobengine.server.steps.shared.EscortFiles;\r
+\r
+public class ForkDownloadStep extends JobStep {\r
+ private static final Logger logger = LogManager.getLogger();\r
+\r
+ @StepEntry\r
+ public Object[] execute(String tempStoreName, String template, String expectedColorSpace, int limit)\r
+ throws Exception {\r
+ DirectoryStream<Path> directoryStream = null;\r
+ int count = limit;\r
+ int allCount = 0;\r
+ int currentCount = 0;\r
+\r
+ try {\r
+\r
+ StoreUri tempStoreUri = getManager().getStoreUri(tempStoreName, RemoteStoreProtocol.LOCAL);\r
+ Path path = Paths.get(tempStoreUri.toString(true), ".STATUS");\r
+\r
+ List<Path> escortFiles = new ArrayList<>();\r
+ directoryStream = Files.newDirectoryStream(path);\r
+ for (Path escortFile : directoryStream) {\r
+ if (getJobRuntime().isWaitingCancel()) {\r
+ cancel();\r
+ return null;\r
+ }\r
+ escortFiles.add(escortFile);\r
+ }\r
+ allCount = escortFiles.size();\r
+ escortFiles.sort((p1, p2) -> {\r
+ return Long.valueOf(p1.toFile().lastModified()).compareTo(p2.toFile().lastModified());\r
+ });\r
+\r
+ if (allCount > 0) {\r
+ for (Path escortFile : escortFiles) {\r
+ if (getJobRuntime().isWaitingCancel()) {\r
+ cancel();\r
+ break;\r
+ }\r
+\r
+ if (processPathItem(tempStoreUri, template, escortFile)) {\r
+ count--;\r
+ if (count == 0)\r
+ break;\r
+ }\r
+ currentCount++;\r
+ int progress = currentCount * 100 / allCount;\r
+ setProgress(progress);\r
+ }\r
+ }\r
+\r
+ setProgress(100);\r
+ } catch (Exception e) {\r
+ logger.error(getSessionMarker(), e.getMessage());\r
+ throw e;\r
+ } finally {\r
+ if (directoryStream != null) {\r
+ try {\r
+ directoryStream.close();\r
+ } catch (IOException e) {\r
+ }\r
+ }\r
+ }\r
+\r
+ return null;\r
+ }\r
+\r
+ private boolean processPathItem(StoreUri tempStoreUri, String template, Path escortFile) throws IOException {\r
+ if (escortFile.toFile().isDirectory())\r
+ return false;\r
+\r
+ //ami nem JSON azt nem kezeljuk\r
+ if (!escortFile.getFileName().toString().toLowerCase().endsWith(EscortFiles.DOT_JSON))\r
+ return false;\r
+\r
+ //aminek van COLORSPACE kiterjesztesu valtozata azt nem kezeljuk\r
+ // Path colorspaceFile = Paths.get(escortFile.toString() + ".colorspace");\r
+ // if (colorspaceFile.toFile().exists())\r
+ // return false;\r
+\r
+ if (EscortFiles.isCatchedFileExists(escortFile))\r
+ return false;\r
+\r
+ String escortFileName = escortFile.getFileName().toString();\r
+ //minimum 3 karakter: STORENAME.FILENAME.MXF.JSON\r
+ long dotCount = escortFileName.chars().filter(ch -> ch == '.').count();\r
+ if (dotCount < 3)\r
+ return false;\r
+\r
+ try {\r
+ DownloadableMedia downloadable = EscortFiles.decode(escortFile);\r
+ if (downloadable == null) {\r
+ logger.error(getSessionMarker(), "Can't encode {}", escortFile);\r
+ return false;\r
+ }\r
+\r
+ StoreUri sourceStoreUri = getManager().getStoreUri(downloadable.getLong("sourceStoreUriId"));\r
+ StoreUri targetStoreUri = getManager().getStoreUri(downloadable.getLong("targetStoreUriId"));\r
+\r
+ Store sourceStore = getManager().getStore(sourceStoreUri.getStoreId());\r
+ String sourceStoreName = sourceStore.getName();\r
+ template = sourceStoreName + "-" + template;\r
+ logger.info(getMarker(), "Starting {} for {}", template, escortFileName);\r
+\r
+ String sourceFileName = downloadable.getString("fileName");\r
+ Map<String, Object> parameters = new HashMap<>();\r
+ parameters.put("sourceStoreUri", sourceStoreUri);\r
+ parameters.put("fileName", sourceFileName);\r
+ parameters.put("tempStoreUri", tempStoreUri);\r
+ parameters.put("targetStoreUri", targetStoreUri);\r
+ parameters.put("expectedFrameNumber", downloadable.getLong("frames"));\r
+ parameters.put("expectedSize", downloadable.getLong("size"));\r
+ parameters.put("expectedColorSpace", downloadable.getString("colorSpace"));\r
+ parameters.put("escortFile", escortFile.toAbsolutePath().toString());\r
+\r
+ int priority = 50;\r
+\r
+ //megszakitasok miatt a mar lejott mozikat vegyuk elore 20.09.09\r
+ if (targetExists(tempStoreUri, sourceFileName))\r
+ priority = 51;\r
+\r
+ //parameterek: IJobRuntime parent, String template, String name, int priority, Map<String, Object> parameters\r
+ IJobRuntime child = getEngine().submit(null, e -> {\r
+ IJobRuntime r = (IJobRuntime) e.getSource();\r
+ if (r.isDisableRetry())\r
+ return;\r
+\r
+ if (e.getStatus().equals(JobStatus.CANCELED) || e.getStatus().equals(JobStatus.SUSPENDED))\r
+ EscortFiles.removeCatchedFile(escortFile);\r
+\r
+ if (e.getStatus().equals(JobStatus.FINISHED) && "PBARCHIVE".equals(sourceStoreName)) {\r
+ try {\r
+ FtpDirectoryLister lister = (FtpDirectoryLister) sourceStoreUri.getLister();\r
+ RemoteFile remoteFile = lister.get(sourceFileName);\r
+ if (remoteFile == null)\r
+ logger.info(getMarker(), "Remote file for {} is not available", sourceFileName);\r
+ else {\r
+ logger.info(getMarker(), "Remote file {} successfully archived, deleting...",\r
+ sourceFileName);\r
+ lister.delete(remoteFile);\r
+ }\r
+ } catch (Exception ex) {\r
+ logger.error(getMarker(), ex.getMessage());\r
+ } finally {\r
+ if (sourceStoreUri != null)\r
+ sourceStoreUri.cleanUp();\r
+ }\r
+ }\r
+\r
+ }, template, "Archiválás", priority, IJobEngine.DEFAULT_OWNER, parameters);\r
+ if (child == null)\r
+ throw new Exception("Submit error.");\r
+\r
+ child.setDescription(sourceFileName);\r
+\r
+ child.setRelated(downloadable.getString("title") + " / " + sourceStoreName);\r
+\r
+ EscortFiles.createCatchedFile(escortFile);\r
+\r
+ } catch (Exception e) {\r
+ logger.error(getSessionMarker(), e.getMessage());\r
+ return false;\r
+ }\r
+\r
+ return true;\r
+ }\r
+\r
+ private boolean targetExists(StoreUri storeUri, String fileName) {\r
+ try {\r
+ Path targetFile = Paths.get(storeUri.toString(true), fileName);\r
+ if (targetFile.toFile().exists()) {\r
+ logger.info(getMarker(), "Retrieved file {} exists", fileName);\r
+ return true;\r
+ }\r
+ } catch (Exception e) {\r
+ logger.error(getMarker(), e.getMessage());\r
+ }\r
+ logger.info(getMarker(), "Retrieved file {} not exists yet", fileName);\r
+ return false;\r
+ }\r
+}\r
--- /dev/null
+package user.jobengine.server.steps;\r
+\r
+import java.io.IOException;\r
+import java.nio.file.DirectoryStream;\r
+import java.nio.file.FileStore;\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.nio.file.attribute.FileTime;\r
+import java.text.NumberFormat;\r
+import java.util.ArrayList;\r
+import java.util.HashMap;\r
+import java.util.List;\r
+import java.util.Map;\r
+\r
+import org.apache.commons.lang.StringUtils;\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import user.commons.DownloadableMedia;\r
+import user.commons.JobStatus;\r
+import user.commons.StoreUri;\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
+import user.jobengine.db.Media;\r
+import user.jobengine.db.MediaFile;\r
+import user.jobengine.db.Store;\r
+import user.jobengine.server.IJobEngine;\r
+import user.jobengine.server.IJobRuntime;\r
+import user.jobengine.server.steps.shared.EscortFiles;\r
+\r
+public class ForkUploadStep extends JobStep {\r
+ private static final Logger logger = LogManager.getLogger();\r
+\r
+ @StepEntry\r
+ public Object[] execute(String tempStoreName, String template, String expectedColorSpace, int limit) throws Exception {\r
+ DirectoryStream<Path> directoryStream = null;\r
+ int count = limit;\r
+ int allCount = 0;\r
+ int currentCount = 0;\r
+\r
+ try {\r
+ StoreUri tempStoreUri = getManager().getStoreUri(tempStoreName, RemoteStoreProtocol.LOCAL);\r
+\r
+ try {\r
+ Path tempPath = Paths.get(tempStoreUri.toString(true));\r
+ FileStore store = Files.getFileStore(tempPath.getRoot());\r
+ NumberFormat nf = NumberFormat.getNumberInstance();\r
+ logger.info(getMarker(), "Free space on temp {}", nf.format(store.getUsableSpace()));\r
+ } catch (IOException e) {\r
+ logger.error(getMarker(), e.getMessage());\r
+ }\r
+\r
+ Path path = Paths.get(tempStoreUri.toString(true), ".STATUS");\r
+\r
+ List<Path> escortFiles = new ArrayList<>();\r
+ directoryStream = Files.newDirectoryStream(path);\r
+ for (Path escortFile : directoryStream) {\r
+ if (getJobRuntime().isWaitingCancel()) {\r
+ cancel();\r
+ return null;\r
+ }\r
+ escortFiles.add(escortFile);\r
+ }\r
+ allCount = escortFiles.size();\r
+ //a file neve az adasbakerules idopontjaval kezdodik\r
+ // escortFiles.sort((p1, p2) -> {\r
+ // return p1.compareTo(p2);\r
+ // });\r
+\r
+ //200911 megis inkabb a letrehozas idopontja legyen\r
+ try {\r
+ escortFiles.sort((p1, p2) -> {\r
+ int result = 0;\r
+ try {\r
+ FileTime mod1 = Files.readAttributes(p1, BasicFileAttributes.class).lastModifiedTime();\r
+ FileTime mod2 = Files.readAttributes(p2, BasicFileAttributes.class).lastModifiedTime();\r
+ result = mod1.compareTo(mod2);\r
+ } catch (Throwable e) {\r
+ }\r
+ return result;\r
+ });\r
+ } catch (Throwable e) {\r
+ }\r
+\r
+ if (allCount > 0) {\r
+ for (Path escortFile : escortFiles) {\r
+ if (getJobRuntime().isWaitingCancel()) {\r
+ cancel();\r
+ break;\r
+ }\r
+\r
+ if (processPathItem(tempStoreUri, template, escortFile)) {\r
+ count--;\r
+ if (count == 0)\r
+ break;\r
+ }\r
+ currentCount++;\r
+ int progress = currentCount * 100 / allCount;\r
+ setProgress(progress);\r
+ }\r
+ }\r
+\r
+ setProgress(100);\r
+ } catch (Exception e) {\r
+ logger.error(getSessionMarker(), e.getMessage());\r
+ throw e;\r
+ } finally {\r
+ if (directoryStream != null) {\r
+ try {\r
+ directoryStream.close();\r
+ } catch (IOException e) {\r
+ }\r
+ }\r
+ }\r
+\r
+ return null;\r
+ }\r
+\r
+ private String getTSMFileName(long mediaId, StoreUri sourceStoreUri) {\r
+ String result = null;\r
+ Media media = getManager().getMedia(mediaId);\r
+\r
+ if (media != null) {\r
+ List<MediaFile> mediaFiles = media.getMediaFiles();\r
+ for (MediaFile mediaFile : mediaFiles) {\r
+ if (mediaFile.getStoreId() == sourceStoreUri.getStoreId()) {\r
+ result = mediaFile.getRelativePath();\r
+ break;\r
+ }\r
+ }\r
+ }\r
+\r
+ return result;\r
+ }\r
+\r
+ private boolean processPathItem(StoreUri tempStoreUri, String template, Path escortFile) throws IOException {\r
+ if (escortFile.toFile().isDirectory())\r
+ return false;\r
+\r
+ //ami nem JSON azt nem kezeljuk\r
+ if (!escortFile.getFileName().toString().toLowerCase().endsWith(EscortFiles.DOT_JSON))\r
+ return false;\r
+\r
+ //aminek van COLORSPACE kiterjesztésű\r
+ // Path colorspaceFile = Paths.get(escortFile.toString() + ".colorspace");\r
+ // if (colorspaceFile.toFile().exists())\r
+ // return false;\r
+\r
+ if (EscortFiles.isCatchedFileExists(escortFile))\r
+ return false;\r
+\r
+ String escortFileName = escortFile.getFileName().toString();\r
+ //minimum 3 karakter: STORENAME.FILENAME.MXF.JSON\r
+ long dotCount = escortFileName.chars().filter(ch -> ch == '.').count();\r
+ if (dotCount < 3)\r
+ return false;\r
+\r
+ try {\r
+ DownloadableMedia downloadable = EscortFiles.decode(escortFile);\r
+\r
+ if (downloadable == null) {\r
+ logger.error(getSessionMarker(), "Can't decode {}", escortFile);\r
+ return false;\r
+ }\r
+\r
+ StoreUri sourceStoreUri = getManager().getStoreUri("TSM", RemoteStoreProtocol.TSM);\r
+\r
+ long mediaId = downloadable.getLong("mediaId");\r
+ String tsmFileName = getTSMFileName(mediaId, sourceStoreUri);\r
+ if (StringUtils.isBlank(tsmFileName)) {\r
+ logger.error(getMarker(), "Media ID not exists anymore {}", mediaId);\r
+ return false;\r
+ }\r
+\r
+ StoreUri targetStoreUri = getManager().getStoreUri(downloadable.getLong("targetStoreUriId"));\r
+\r
+ Store targetStore = getManager().getStore(targetStoreUri.getStoreId());\r
+ template = targetStore.getName() + "-" + template;\r
+ logger.info(getMarker(), "Starting {} for {}", template, escortFileName);\r
+\r
+ String targetFileName = downloadable.getString("fileName");\r
+\r
+ Map<String, Object> parameters = new HashMap<>();\r
+ parameters.put("sourceStoreUri", sourceStoreUri);\r
+ parameters.put("tsmFileName", tsmFileName);\r
+ parameters.put("fileName", targetFileName);\r
+ parameters.put("tempStoreUri", tempStoreUri);\r
+ parameters.put("targetStoreUri", targetStoreUri);\r
+ parameters.put("relativeTargetPath", downloadable.getString("relativeTargetPath"));\r
+ parameters.put("expectedFrameNumber", downloadable.getLong("frames"));\r
+ parameters.put("expectedSize", downloadable.getLong("size"));\r
+ parameters.put("expectedColorSpace", downloadable.getString("colorSpace"));\r
+ parameters.put("escortFile", escortFile.toAbsolutePath().toString());\r
+\r
+ //int priority = downloadable.containsKey("priority") ? downloadable.getInt("priority") : 0;\r
+ //mindenki egyforman induljon 20.09.07\r
+ //a NEXIO egy kicsit fontosabb 20.09.08. megsem 20.09.09\r
+ //int priority = escortFile.toString().contains("NEXIO") ? 51 : 50;\r
+ //megszakitasok miatt a mar lejott mozikat vegyuk elore 20.09.09\r
+\r
+ int priority = 50;\r
+ if (targetExists(tempStoreUri, targetFileName))\r
+ priority = 51;\r
+\r
+ //parameterek: IJobRuntime parent, String template, String name, int priority, Map<String, Object> parameters\r
+ IJobRuntime child = getEngine().submit(null, e -> {\r
+ IJobRuntime r = (IJobRuntime) e.getSource();\r
+ if (r.isDisableRetry())\r
+ return;\r
+ \r
+ if (e.getStatus().equals(JobStatus.CANCELED) || e.getStatus().equals(JobStatus.SUSPENDED))\r
+ EscortFiles.removeCatchedFile(escortFile);\r
+ }, template, "Visszatöltés", priority, IJobEngine.DEFAULT_OWNER, parameters);\r
+ if (child == null)\r
+ throw new Exception("Submit error.");\r
+\r
+ child.setDescription(escortFileName);\r
+\r
+ child.setRelated(downloadable.getString("title") + "|" + targetStore.getName());\r
+ EscortFiles.createCatchedFile(escortFile);\r
+ } catch (Exception e) {\r
+ logger.error(getSessionMarker(), e.getMessage());\r
+ return false;\r
+ }\r
+\r
+ return true;\r
+ }\r
+\r
+ private boolean targetExists(StoreUri storeUri, String fileName) {\r
+ try {\r
+ Path targetFile = Paths.get(storeUri.toString(true), fileName);\r
+ if (targetFile.toFile().exists()) {\r
+ logger.info(getMarker(), "Retrieved file {} exists", fileName);\r
+ return true;\r
+ }\r
+ } catch (Exception e) {\r
+ logger.error(getMarker(), e.getMessage());\r
+ }\r
+ logger.info(getMarker(), "Retrieved file {} not exists yet", fileName);\r
+ return false;\r
+ }\r
+}\r
--- /dev/null
+package user.jobengine.server.steps;\r
+\r
+import java.io.IOException;\r
+import java.nio.file.Paths;\r
+import java.sql.Timestamp;\r
+import java.util.List;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import user.commons.DownloadableMedia;\r
+import user.commons.RemoteFile;\r
+import user.commons.StoreUri;\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
+import user.jobengine.db.Media;\r
+import user.jobengine.server.steps.shared.EscortFiles;\r
+\r
+public class GenericArchiveCheckerStep extends JobStep {\r
+ private static final String DOT_MXF = ".MXF";\r
+ private static final Logger logger = LogManager.getLogger();\r
+\r
+ private boolean check(Timestamp modified, Timestamp created, Media media) {\r
+ boolean create = media == null;\r
+ create |= create || !media.getModified().equals(modified);\r
+ create |= create || !media.getCreated().equals(created);\r
+ return create;\r
+ }\r
+\r
+ @StepEntry\r
+ public Object[] execute(String sourceStoreName, String protocol, String wildCard, String escortStoreName, int limit) throws Exception {\r
+ StoreUri sourceStoreUri = null;\r
+ int count = limit;\r
+\r
+ try {\r
+ sourceStoreUri = getManager().getStoreUri(sourceStoreName, Enum.valueOf(RemoteStoreProtocol.class, protocol));\r
+ StoreUri escortSoreUri = getManager().getStoreUri(escortStoreName, RemoteStoreProtocol.LOCAL);\r
+ StoreUri targetStoreUri = getManager().getStoreUri("TSM", RemoteStoreProtocol.TSM);\r
+\r
+ String outputPath = Paths.get(escortSoreUri.toString(true)).toString();\r
+\r
+ //az FTP store nem tamogatja az asszinkron listazast\r
+ List<RemoteFile> remoteFiles = sourceStoreUri.getRemoteFiles(wildCard);\r
+ for (RemoteFile remoteFile : remoteFiles) {\r
+ if (processClip(sourceStoreName, remoteFile, sourceStoreUri, targetStoreUri, outputPath))\r
+ count--;\r
+\r
+ if (count == 0) {\r
+ logger.info("Limit reached: {}", limit);\r
+ break;\r
+ }\r
+\r
+ }\r
+ } catch (Exception e) {\r
+ throw e;\r
+ } finally {\r
+ if (sourceStoreUri != null)\r
+ sourceStoreUri.cleanUp();\r
+ }\r
+\r
+ return null;\r
+ }\r
+\r
+ private boolean processClip(String storeName, RemoteFile remoteFile, StoreUri sourceStoreUri, StoreUri targetStoreUri, String outputPath) {\r
+ boolean result = false;\r
+ String title = remoteFile.getName();\r
+ Timestamp modified = Timestamp.from(remoteFile.getModify().toInstant());\r
+ Timestamp created = Timestamp.from(remoteFile.getCreated().toInstant());\r
+\r
+ //TODO a masolas alatt allo klippeket kiszurni\r
+ if (title.contains("."))\r
+ title = title.substring(0, title.indexOf("."));\r
+ long size = remoteFile.getSize();\r
+\r
+ Media media = getManager().getMedia(title);\r
+\r
+ boolean createEscort = check(modified, created, media);\r
+\r
+ if (createEscort) {\r
+ long mediaId = media == null ? 0 : media.getId();\r
+ String fileName = title + DOT_MXF;\r
+ DownloadableMedia archive = DownloadableMedia.create(title, fileName, modified, created, 0, size, sourceStoreUri.getId(), targetStoreUri.getId(),\r
+ mediaId);\r
+ String escortFileName = storeName + "." + remoteFile.getName();\r
+ try {\r
+ result = EscortFiles.createMetadataIfNotExists(outputPath, escortFileName, archive.toPrettyString(""));\r
+ } catch (IOException e) {\r
+ logger.error("Escort file creation error.", e);\r
+ }\r
+ }\r
+\r
+ return result;\r
+ }\r
+\r
+}\r
--- /dev/null
+package user.jobengine.server.steps;\r
+\r
+import java.io.IOException;\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+import java.util.Arrays;\r
+import java.util.List;\r
+\r
+import org.apache.commons.lang.StringUtils;\r
+import org.apache.commons.net.ftp.FTPClient;\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import com.ibm.nosql.json.api.BasicDBList;\r
+\r
+import user.commons.DownloadableMedia;\r
+import user.commons.StoreUri;\r
+import user.commons.harris.HarrisRecord;\r
+import user.commons.harris.VICFileParser;\r
+import user.commons.remotestore.FtpDirectoryLister;\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
+import user.jobengine.db.Media;\r
+import user.jobengine.server.steps.shared.EscortFiles;\r
+\r
+public class HarrisMissingMaterialCheckerStep extends JobStep {\r
+ private static final Logger logger = LogManager.getLogger(HarrisMissingMaterialCheckerStep.class);\r
+ private static final String lineFormat = System.getProperty("harris.vic.lineformat",\r
+ "A TTTTTTTT LLLLLLLLLLL MMMMMMMMMMMMMMMMMMMMMMM X DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD");\r
+ private static final String validTypeCodes = System.getProperty("harris.vic.validtypecodes", "SPACE,E");\r
+ private static final String appendExtension = System.getProperty("missingmaterial.appendextension", ".mxf");\r
+\r
+ @StepEntry\r
+ public Object[] execute(BasicDBList vicFiles, String escortStoreName, String targetStoreName, String targetProtocol) throws Exception {\r
+ StoreUri escortStoreUri = null;\r
+ StoreUri targetStoreUri = null;\r
+ try {\r
+ getJobRuntime().setRelated(targetStoreName + " restore");\r
+\r
+ escortStoreUri = getManager().getStoreUri(escortStoreName, RemoteStoreProtocol.LOCAL);\r
+ targetStoreUri = getManager().getStoreUri(targetStoreName, Enum.valueOf(RemoteStoreProtocol.class, targetProtocol));\r
+ StoreUri sourceStoreUri = getManager().getStoreUri("TSM", RemoteStoreProtocol.TSM);\r
+ List<HarrisRecord> records = null;\r
+ for (Object vicFile : vicFiles) {\r
+ if (getJobRuntime().isWaitingCancel()) {\r
+ cancel();\r
+ break;\r
+ }\r
+\r
+ Path vicFilePath = Paths.get(String.valueOf(vicFile));\r
+\r
+ if (!vicFilePath.toFile().exists()) {\r
+ logger.warn("File not exists: {}", vicFilePath);\r
+ continue;\r
+ }\r
+\r
+ logger.info(getMarker(), "Processing {}", vicFilePath);\r
+ records = processVICFile(records, vicFilePath);\r
+ }\r
+\r
+ if (records != null && !getJobRuntime().isWaitingCancel()) {\r
+ FTPClient client = ((FtpDirectoryLister) targetStoreUri.getLister()).connect();\r
+ logger.info(getMarker(), "Reading target file list");\r
+ List<String> fileNames = Arrays.asList(client.listNames());\r
+ logger.info(getMarker(), "Target file list reading completed, mediabase size is {}", fileNames.size());\r
+ int i = 0;\r
+ for (HarrisRecord record : records) {\r
+\r
+ if (getJobRuntime().isWaitingCancel()) {\r
+ cancel();\r
+ break;\r
+ }\r
+\r
+ boolean contains = fileNames.contains(record.getFileName() + ".lxf");\r
+ if (contains)\r
+ logger.info(getMarker(), "File {} already exists on {}", record.getFileName(), targetStoreName);\r
+ else\r
+ processRecord(record, targetStoreName, sourceStoreUri, targetStoreUri, escortStoreUri);\r
+ i++;\r
+ int progress = i * 100 / records.size();\r
+ setProgress(progress);\r
+ }\r
+ }\r
+\r
+ if (records == null || records.size() == 0)\r
+ logger.info(getMarker(), "Nothing to do");\r
+ else\r
+ logger.info(getMarker(), "Completed");\r
+\r
+ setProgress(100);\r
+ } catch (Exception e) {\r
+ logger.error(e.getMessage());\r
+ throw e;\r
+ } finally {\r
+ if (escortStoreUri != null)\r
+ escortStoreUri.cleanUp();\r
+ if (targetStoreUri != null)\r
+ targetStoreUri.cleanUp();\r
+ }\r
+\r
+ return null;\r
+ }\r
+\r
+ private boolean processRecord(HarrisRecord record, String targetStoreName, StoreUri sourceStoreUri, StoreUri targetStoreUri, StoreUri escortStoreUri)\r
+ throws Exception {\r
+\r
+ String fileName = record.getFileName();\r
+ String outputPath = Paths.get(escortStoreUri.toString(true)).toString();\r
+\r
+ if (StringUtils.isNotBlank(appendExtension))\r
+ fileName += appendExtension;\r
+\r
+ String escortFileName = targetStoreName + "." + fileName;\r
+\r
+ //ha mar letezik, nem toltjuk fel ujra (a vic fajlbol kezzel torlik valamikor...)\r
+ try {\r
+ if (EscortFiles.isMetadataExists(outputPath, escortFileName)) {\r
+ logger.debug(getMarker(), "Status file already exists {}", escortFileName);\r
+ return true;\r
+ }\r
+ } catch (IOException e1) {\r
+ logger.info(getMarker(), "Status file check error for {}", fileName);\r
+ return true;\r
+ }\r
+\r
+ //nincs bent MC-ben\r
+ Media media = getManager().getMedia(record.getFileName());\r
+ if (media == null) {\r
+ logger.warn(getSessionMarker(), "File is not available in archive {}", record.getFileName());\r
+ return true;\r
+ }\r
+\r
+ // if (existsOnNexio(record, targetStoreName, targetStoreUri)) {\r
+ // logger.info(getMarker(), "File {} already exists on {}", record.getFileName(), targetStoreName);\r
+ // return false;\r
+ // }\r
+\r
+ DownloadableMedia downloadable = DownloadableMedia.create(media.getTitle(), fileName, media.getModified(), media.getCreated(), media.getLength(), 0L,\r
+ sourceStoreUri.getId(), targetStoreUri.getId(), media.getId());\r
+\r
+ //alapbol magasabb (1-99)\r
+ downloadable.put("priority", 50);\r
+ downloadable.put("isNexio", true);\r
+\r
+ try {\r
+ EscortFiles.createMetadata(outputPath, escortFileName, downloadable.toPrettyString(""));\r
+ logger.info(getMarker(), "Status file created {}", escortFileName);\r
+ } catch (Exception e) {\r
+ logger.error("Can't create escort file {}. System message is: {}", escortFileName, e.getMessage());\r
+ }\r
+ return true;\r
+ }\r
+\r
+ private List<HarrisRecord> processVICFile(List<HarrisRecord> records, Path vicFilePath) {\r
+ VICFileParser parser = null;\r
+ try {\r
+ parser = new VICFileParser(vicFilePath, lineFormat, validTypeCodes);\r
+\r
+ List<HarrisRecord> currentRecords = parser.getRecords();\r
+ if (records == null)\r
+ records = currentRecords;\r
+ else {\r
+ if (currentRecords != null)\r
+ records.addAll(currentRecords);\r
+ }\r
+\r
+ } catch (Exception e) {\r
+ logger.error(e.getMessage());\r
+ }\r
+ return records;\r
+ }\r
+\r
+}\r
--- /dev/null
+package user.jobengine.server.steps;\r
+\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+import java.sql.Timestamp;\r
+import java.time.Instant;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import user.commons.DownloadableMedia;\r
+import user.commons.StoreUri;\r
+import user.jobengine.db.IItemManager;\r
+import user.jobengine.db.Item;\r
+import user.jobengine.db.Media;\r
+import user.jobengine.db.MediaFile;\r
+import user.jobengine.server.steps.shared.EscortFiles;\r
+\r
+public class MetadataPersisterStep extends JobStep {\r
+ private static final String GENERIC = "Generic";\r
+ private static final Logger logger = LogManager.getLogger();\r
+\r
+ @StepEntry\r
+ public Object[] execute(StoreUri targetStoreUri, String escortFile) throws Exception {\r
+ try {\r
+\r
+ Path escortFilePath = Paths.get(escortFile);\r
+ //ha nem ment at a letoltott file az ellenorzesen, akkor már torolve lett\r
+ if (escortFilePath.toFile().exists()) {\r
+ String escortFileName = escortFilePath.getFileName().toString();\r
+ String sourceStoreName = escortFileName.substring(0, escortFileName.indexOf("."));\r
+ DownloadableMedia downloadable = EscortFiles.decode(escortFilePath);\r
+ String title = downloadable.getString("title");\r
+ String fileName = downloadable.getString("fileName");\r
+ long mediaId = downloadable.containsKey("mediaId") ? downloadable.getLong("mediaId") : 0;\r
+ String fileTypeName = fileName.substring(fileName.lastIndexOf(".") + 1).toUpperCase();\r
+\r
+ IItemManager manager = getManager();\r
+\r
+ if (mediaId == 0) {\r
+ mediaId = tryGetMediaId(title, mediaId);\r
+ }\r
+\r
+ //TODO ha van mediaId, akkor update!!!!!!!!!\r
+\r
+ Timestamp modified = downloadable.getTimestamp("modified");\r
+ Timestamp created = downloadable.getTimestamp("created");\r
+ long frames = downloadable.getLong("frames");\r
+\r
+ String targetStoreName = getManager().getStore(targetStoreUri.getStoreId()).getName();\r
+ if (mediaId == 0) {\r
+ //ez elszallhat, mert nincs filetype vagy store\r
+ MediaFile mediaFile = manager.createMediaFile(fileName, fileTypeName, targetStoreName);\r
+ //ez elszallhat, mert nincs itemtype\r
+ Item item = manager.createItem(GENERIC, title, sourceStoreName, null);\r
+ //ez elszallhat, mert nincs itemtype\r
+ Media media = manager.createMedia(GENERIC, title, sourceStoreName, null);\r
+\r
+ //TODO megoldani egy tranzakcioban\r
+ item.add();\r
+ media.setItemId(item.getId());\r
+ media.setLength(frames);\r
+ media.setCreated(created);\r
+ media.setModified(modified);\r
+ media.setArchived(Timestamp.from(Instant.now()));\r
+ media.add();\r
+\r
+ //TODO\r
+ //mediaFile.setFileSize(fileSize);\r
+ mediaFile.setMediaId(media.getId());\r
+ mediaFile.setLastModified(modified);\r
+ mediaFile.add();\r
+ } else {\r
+ Media media = manager.getMedia(mediaId);\r
+ media.setLength(frames);\r
+ media.setCreated(created);\r
+ media.setModified(modified);\r
+ media.setArchived(Timestamp.from(Instant.now()));\r
+ manager.modify(media);\r
+\r
+ //TODO\r
+ //mediaFile.setFileSize(fileSize);\r
+ MediaFile mediaFile = manager.getSystemMediaFile(media);\r
+ if (mediaFile == null) {\r
+ mediaFile = manager.createMediaFile(fileName, fileTypeName, targetStoreName);\r
+ mediaFile.setMediaId(media.getId());\r
+ mediaFile.setLastModified(modified);\r
+ mediaFile.add();\r
+ } else {\r
+ mediaFile.setRelativePath(fileName);\r
+ mediaFile.setLastModified(modified);\r
+ manager.modify(mediaFile);\r
+ }\r
+ }\r
+\r
+ } else\r
+ logger.error(getMarker(), "Status file does not exists {}", escortFilePath);\r
+ } catch (Exception e) {\r
+ logger.error(getSessionMarker(), e.getMessage());\r
+ throw e;\r
+ }\r
+ return null;\r
+ }\r
+\r
+ private long tryGetMediaId(String title, long mediaId) {\r
+ Media media = null;\r
+ //duplikatum miatt\r
+ try {\r
+ media = getManager().getMedia(title);\r
+ if (media != null)\r
+ mediaId = media.getId();\r
+ } catch (Exception e) {\r
+ logger.error(getMarker(), "Media with title {} is not available. System message is: {}", title, e.getMessage());\r
+ }\r
+ return mediaId;\r
+ }\r
+\r
+}\r
--- /dev/null
+package user.jobengine.server.steps;\r
+\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import user.commons.StoreUri;\r
+\r
+public class NEXIO1TransferFromStep extends TransferStep {\r
+ private static final Logger logger = LogManager.getLogger();\r
+\r
+ @Override\r
+ @StepEntry\r
+ public Object[] execute(StoreUri sourceStoreUri, String sourceFileName, StoreUri targetStoreUri, String targetFileName) throws Exception {\r
+ Object[] result = null;\r
+ try {\r
+ Path targetFile = Paths.get(targetStoreUri.toString(true), targetFileName);\r
+ if (targetFile.toFile().exists()) {\r
+ logger.info(getMarker(), "Using previously retrived file {}", targetFile);\r
+ } else {\r
+ result = super.execute(sourceStoreUri, sourceFileName, targetStoreUri, targetFileName);\r
+ }\r
+ } catch (Exception e) {\r
+ logger.error(getMarker(), e.getMessage());\r
+ }\r
+ return result;\r
+ }\r
+}\r
--- /dev/null
+package user.jobengine.server.steps;\r
+\r
+import java.util.Arrays;\r
+import java.util.List;\r
+\r
+import org.apache.commons.net.ftp.FTPClient;\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import user.commons.StoreUri;\r
+import user.commons.remotestore.FtpDirectoryLister;\r
+\r
+public class NEXIO1TransferToStep extends TransferStep {\r
+ private static final Logger logger = LogManager.getLogger();\r
+\r
+ @Override\r
+ @StepEntry\r
+ public Object[] execute(StoreUri sourceStoreUri, String sourceFileName, StoreUri targetStoreUri, String targetFileName) throws Exception {\r
+ //\r
+ // try {\r
+ // String title = targetFileName;\r
+ // if (title.contains("."))\r
+ // title = title.substring(0, title.lastIndexOf("."));\r
+ // RemoteFile remoteFile = targetStoreUri.getFileWithContent(title + ".xml");\r
+ // if (remoteFile != null && remoteFile.getContent() != null) {\r
+ // logger.info("File already exists on NEXIO1 {}", targetFileName);\r
+ // return null;\r
+ // }\r
+ // } catch (Exception e) {\r
+ // logger.error(e.getMessage());\r
+ // } finally {\r
+ // targetStoreUri.cleanUp();\r
+ // }\r
+/*\r
+ try {\r
+ FTPClient client = ((FtpDirectoryLister) targetStoreUri.getLister()).connect();\r
+ logger.info(getMarker(), "Reading target file list");\r
+ List<String> fileNames = Arrays.asList(client.listNames());\r
+ logger.info(getMarker(), "Target file list reading completed, mediabase size is {}", fileNames.size());\r
+ String title = targetFileName.replace(".mxf", ".lxf");\r
+ boolean contains = fileNames.contains(title);\r
+ if (contains) {\r
+ logger.info(getMarker(), "File already exists {} on {}", title, getManager().getStore(targetStoreUri.getStoreId()).getName());\r
+ return null;\r
+ }\r
+ } catch (Exception e) {\r
+ logger.catching(e);\r
+ } finally {\r
+ targetStoreUri.cleanUp();\r
+ }\r
+*/\r
+ return super.execute(sourceStoreUri, sourceFileName, targetStoreUri, targetFileName);\r
+ }\r
+}\r
--- /dev/null
+package user.jobengine.server.steps;\r
+\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import user.commons.StoreUri;\r
+\r
+public class NEXIO2TransferFromStep extends TransferStep {\r
+ private static final Logger logger = LogManager.getLogger();\r
+\r
+ @Override\r
+ @StepEntry\r
+ public Object[] execute(StoreUri sourceStoreUri, String sourceFileName, StoreUri targetStoreUri, String targetFileName) throws Exception {\r
+ Object[] result = null;\r
+ try {\r
+ Path targetFile = Paths.get(targetStoreUri.toString(true), targetFileName);\r
+ if (targetFile.toFile().exists()) {\r
+ logger.info(getMarker(), "Using previously retrived file {}", targetFile);\r
+ } else {\r
+ result = super.execute(sourceStoreUri, sourceFileName, targetStoreUri, targetFileName);\r
+ }\r
+ } catch (Exception e) {\r
+ logger.error(getMarker(), e.getMessage());\r
+ }\r
+ return result;\r
+ }\r
+}\r
--- /dev/null
+package user.jobengine.server.steps;\r
+\r
+import java.util.Arrays;\r
+import java.util.List;\r
+\r
+import org.apache.commons.net.ftp.FTPClient;\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import user.commons.StoreUri;\r
+import user.commons.remotestore.FtpDirectoryLister;\r
+\r
+public class NEXIO2TransferToStep extends TransferStep {\r
+ private static final Logger logger = LogManager.getLogger();\r
+\r
+ @Override\r
+ @StepEntry\r
+ public Object[] execute(StoreUri sourceStoreUri, String sourceFileName, StoreUri targetStoreUri, String targetFileName) throws Exception {\r
+ // try {\r
+ // String title = targetFileName;\r
+ // if (title.contains("."))\r
+ // title = title.substring(0, title.lastIndexOf("."));\r
+ // RemoteFile remoteFile = targetStoreUri.getFileWithContent(title + ".xml");\r
+ // if (remoteFile != null && remoteFile.getContent() != null) {\r
+ // logger.info("File already exists on NEXIO2 {}", targetFileName);\r
+ // return null;\r
+ // }\r
+ // } catch (Exception e) {\r
+ // logger.error(e.getMessage());\r
+ // } finally {\r
+ // targetStoreUri.cleanUp();\r
+ // }\r
+/*\r
+ try {\r
+ FTPClient client = ((FtpDirectoryLister) targetStoreUri.getLister()).connect();\r
+ logger.info(getMarker(), "Reading target file list");\r
+ List<String> fileNames = Arrays.asList(client.listNames());\r
+ logger.info(getMarker(), "Target file list reading completed, mediabase size is {}", fileNames.size());\r
+ String title = targetFileName.replace(".mxf", ".lxf");\r
+ boolean contains = fileNames.contains(title);\r
+ if (contains) {\r
+ logger.info(getMarker(), "File already exists {} on {}", title, getManager().getStore(targetStoreUri.getStoreId()).getName());\r
+ return null;\r
+ }\r
+ } catch (Exception e) {\r
+ logger.catching(e);\r
+ } finally {\r
+ targetStoreUri.cleanUp();\r
+ }\r
+*/\r
+ return super.execute(sourceStoreUri, sourceFileName, targetStoreUri, targetFileName);\r
+ }\r
+}\r
--- /dev/null
+package user.jobengine.server.steps;\r
+\r
+import java.io.IOException;\r
+import java.nio.file.Paths;\r
+import java.sql.Timestamp;\r
+import java.text.SimpleDateFormat;\r
+import java.time.Duration;\r
+import java.time.Instant;\r
+import java.util.Iterator;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import user.commons.DownloadableMedia;\r
+import user.commons.StoreUri;\r
+import user.commons.nexio.api.Clip;\r
+import user.commons.nexio.api.ClipNotFoundException;\r
+import user.commons.nexio.api.Controller;\r
+import user.commons.nexio.api.Mediabase;\r
+import user.commons.nexio.server.protocol.ProtocolException;\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
+import user.jobengine.db.Media;\r
+import user.jobengine.server.steps.shared.EscortFiles;\r
+import user.jobengine.db.MediaFile;\r
+\r
+public class NEXIOArchiveCheckerStep extends JobStep {\r
+ private static final String DOT_MXF = ".mxf";\r
+ private static final Logger logger = LogManager.getLogger();\r
+ private SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd-HHmmss");\r
+\r
+ private boolean check(Timestamp modified, Timestamp created, int duration, Media media, int videoFormat, int lastModifiedHours) {\r
+ String title = media.getTitle();\r
+\r
+ //formatum\r
+ if (!(videoFormat == 3 || videoFormat == 19)) {\r
+ logger.debug(getMarker(), "{} unsupported video format", videoFormat);\r
+ return false;\r
+ }\r
+\r
+ if (!checkModifiedByTime(title, modified, lastModifiedHours))\r
+ return false;\r
+\r
+ //utolso modositas\r
+ MediaFile mediaFile = getManager().getSystemMediaFile(media);\r
+ boolean isModified = true;\r
+ if (mediaFile == null) {\r
+ logger.info(getMarker(), "{} system media file not available", title);\r
+ return false;\r
+ }\r
+\r
+ String mcMod = df.format(mediaFile.getLastModified());\r
+ String nexioMod = df.format(modified);\r
+ isModified = mcMod.compareTo(nexioMod) < 0;\r
+ if (isModified) {\r
+ logger.info(getMarker(), "{} modification time: MC {} < NEXIO {}", title, mcMod, nexioMod);\r
+ return true;\r
+ }\r
+\r
+ boolean isLengthChanged = media.getLength() > 0 && Math.abs(media.getLength() - duration) > 3;\r
+ if (isLengthChanged) {\r
+ logger.info(getMarker(), "{} length: MC {} != NEXIO {}", title, media.getLength(), duration);\r
+ return true;\r
+ }\r
+\r
+ return false;\r
+ }\r
+\r
+ private boolean checkModifiedByTime(String title, Timestamp modified, int lastModifiedHours) {\r
+ //utolso modositas a mosthoz kepest\r
+ //The result of this method can be a negative period if the end is before the start.\r
+ long modifiedHours = Duration.between(modified.toInstant(), Instant.now()).toHours();\r
+ if (modifiedHours < 0) {\r
+ logger.info(getMarker(), "{} modification time greather than now", title);\r
+ return false;\r
+ }\r
+ if (modifiedHours < lastModifiedHours) {\r
+ logger.debug(getMarker(), "{} modification time is too cloose for now", title);\r
+ return false;\r
+ }\r
+\r
+ return true;\r
+ }\r
+\r
+ @StepEntry\r
+ public Object[] execute(String sourceStoreName, String escortStoreName, int lastModifiedHours) throws Exception {\r
+ Controller controller = null;\r
+\r
+ try {\r
+ getJobRuntime().setRelated(sourceStoreName + " archive");\r
+\r
+ StoreUri nexioStoreUri = getManager().getStoreUri(sourceStoreName, RemoteStoreProtocol.NEXIO);\r
+ StoreUri sourceStoreUri = getManager().getStoreUri(sourceStoreName, RemoteStoreProtocol.FTP);\r
+ StoreUri targetStoreUri = getManager().getStoreUri("TSM", RemoteStoreProtocol.TSM);\r
+ StoreUri escortStoreUri = getManager().getStoreUri(escortStoreName, RemoteStoreProtocol.LOCAL);\r
+ String outputPath = Paths.get(escortStoreUri.toString(true)).toString();\r
+\r
+ logger.info(getMarker(), "Connecting mediabase {}", nexioStoreUri.toString());\r
+ if (nexioStoreUri.getPortNumber() == 0)\r
+ controller = new Controller(nexioStoreUri.getUri(), nexioStoreUri.getPortNumber());\r
+ else\r
+ controller = new Controller(nexioStoreUri.getUri());\r
+ controller.connect();\r
+ Mediabase mediabase = controller.getMediabase();\r
+\r
+ Iterator<Clip> clips = mediabase.getClips();\r
+ logger.info(getMarker(), "Processing clips");\r
+\r
+ processClips(sourceStoreName, sourceStoreUri, targetStoreUri, outputPath, clips, lastModifiedHours);\r
+ } catch (Exception e) {\r
+ logger.error(getSessionMarker(), e.getMessage() == null ? "Unknown error" : e.getMessage());\r
+ throw e;\r
+ } finally {\r
+ setProgress(100);\r
+ if (controller != null)\r
+ controller.disconnect();\r
+ }\r
+\r
+ return null;\r
+ }\r
+\r
+ private void processClips(String storeName, StoreUri sourceStoreUri, StoreUri targetStoreUri, String outputPath, Iterator<Clip> clips,\r
+ int lastModifiedHours) throws ClipNotFoundException, IOException, ProtocolException {\r
+ int processed = 0;\r
+ while (clips.hasNext()) {\r
+\r
+ if (getJobRuntime().isWaitingCancel()) {\r
+ cancel();\r
+ break;\r
+ }\r
+\r
+ Clip clip = clips.next();\r
+\r
+ try {\r
+ String title = null;\r
+ Timestamp created = null;\r
+ Timestamp modified = null;\r
+ int frames = 0;\r
+ int videoFormat = 0;\r
+ frames = clip.getDuration();\r
+\r
+ //ures clip\r
+ if (frames == 1)\r
+ continue;\r
+\r
+ title = clip.getXid().get();\r
+ created = Timestamp.from(clip.getRecordDateTimestamp().toInstant());\r
+ modified = Timestamp.from(clip.getModifiedTimestamp().toInstant());\r
+ videoFormat = clip.getVideoFormat();\r
+\r
+ Media media = getManager().getMedia(title);\r
+ logger.debug(getMarker(), "Checking {}", title);\r
+ boolean createEscort = false;\r
+\r
+ long mediaId = 0;\r
+ if (media == null) {\r
+ if (checkModifiedByTime(title, modified, lastModifiedHours)) {\r
+ createEscort = true;\r
+ logger.info(getMarker(), "{} not archived yet", title);\r
+ }\r
+ } else {\r
+ mediaId = media.getId();\r
+ createEscort = check(modified, created, frames, media, videoFormat, lastModifiedHours);\r
+ }\r
+\r
+ if (createEscort && !title.contains("*")) {\r
+ String fileName = title + DOT_MXF;\r
+ DownloadableMedia downloadable = DownloadableMedia.create(title, fileName, modified, created, frames, 0, sourceStoreUri.getId(),\r
+ targetStoreUri.getId(), mediaId);\r
+ String escortFileName = storeName + "." + downloadable.getString("fileName");\r
+ if (EscortFiles.createMetadataIfNotExists(outputPath, escortFileName, downloadable.toPrettyString(""))) {\r
+ logger.info(getMarker(), "Archive status file created for {}", fileName);\r
+ } else {\r
+ logger.info(getMarker(), "Archive status file already exists for {}", fileName);\r
+ }\r
+\r
+ }\r
+\r
+ processed++;\r
+ if (processed % 100 == 0)\r
+ logger.info(getMarker(), "Processed {} records", processed);\r
+ } catch (Exception e) {\r
+ logger.error(getSessionMarker(), e.getMessage());\r
+ continue;\r
+ }\r
+ }\r
+ }\r
+\r
+}\r
--- /dev/null
+package user.jobengine.server.steps;\r
+\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+import java.sql.Timestamp;\r
+import java.text.SimpleDateFormat;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+import org.w3c.dom.Document;\r
+import org.w3c.dom.Node;\r
+import org.w3c.dom.NodeList;\r
+\r
+import user.commons.DownloadableMedia;\r
+import user.commons.RemoteFile;\r
+import user.commons.StoreUri;\r
+import user.jobengine.db.Media;\r
+import user.jobengine.db.MediaFile;\r
+import user.jobengine.server.steps.shared.EscortFiles;\r
+\r
+public class NEXIOMetadataPersisterStep extends JobStep {\r
+ private static final Logger logger = LogManager.getLogger();\r
+ private static final String DOT_XML = ".xml";\r
+\r
+ @StepEntry\r
+ public Object[] execute(StoreUri targetStoreUri, String escortFile) throws Exception {\r
+ try {\r
+ Path escortFilePath = Paths.get(escortFile);\r
+ if (!escortFilePath.toFile().exists()) {\r
+ logger.error(getMarker(), "Status file does not exists {}", escortFilePath);\r
+ return null;\r
+ }\r
+\r
+ DownloadableMedia downloadable = EscortFiles.decode(escortFilePath);\r
+ if (!downloadable.containsKey("isNexio") || !downloadable.getBoolean("isNexio"))\r
+ return null;\r
+\r
+ if (!downloadable.containsKey("mediaId"))\r
+ throw new NullPointerException("No media ID found for " + downloadable.getString("title"));\r
+\r
+ Media media = getManager().getMedia(downloadable.getLong("mediaId"));\r
+ MediaFile mediaFile = getManager().getSystemMediaFile(media);\r
+ if (mediaFile == null)\r
+ throw new NullPointerException("No TSM media file found for " + downloadable.getString("title"));\r
+\r
+ RemoteFile remoteFile = targetStoreUri.getFileWithContent(downloadable.getString("title") + ".xml");\r
+\r
+ //TODO mediafile lastmodified = feltoltott file nexio xml lastmodified\r
+ Timestamp lastModified = getLastModified(remoteFile);\r
+ logger.info("Setting last modification time on {} to {}", downloadable.getString("title"), lastModified);\r
+ mediaFile.setLastModified(lastModified);\r
+ getManager().modify(mediaFile);\r
+\r
+ // if (!RemoteStoreProtocol.FTP.equals(targetStoreUri.getProtocol()))\r
+ // return null;\r
+\r
+ //\r
+ // String title = downloadable.getString("title");\r
+ // String fileName = downloadable.getString("fileName");\r
+ // Date created = downloadable.getDate("created");\r
+ // Date modified = downloadable.getDate("modified");\r
+ // byte[] metadata = EscortFiles.createNEXIODatesMeta(title, created, modified);\r
+ // uploadMeta(targetStoreUri, fileName, metadata);\r
+ } catch (Exception e) {\r
+ logger.error(getSessionMarker(), e.getMessage());\r
+ throw e;\r
+ } finally {\r
+ if (targetStoreUri != null)\r
+ targetStoreUri.cleanUp();\r
+ }\r
+ return null;\r
+ }\r
+\r
+ private Timestamp getLastModified(RemoteFile remoteFile) throws Exception {\r
+ Timestamp result = null;\r
+ Document document = EscortFiles.createNEXIOMeta(remoteFile.getContent());\r
+ Node firstChild = document.getFirstChild();\r
+ NodeList list = firstChild.getChildNodes();\r
+ for (int i = 0; i < list.getLength(); i++) {\r
+ Node item = list.item(i);\r
+ if (item.getNodeName().equals("ModifiedTimeStamp")) {\r
+ SimpleDateFormat df = new SimpleDateFormat("MM-dd-yyyy (HH:mm:ss)");\r
+ result = Timestamp.from(df.parse(item.getTextContent()).toInstant());\r
+ break;\r
+ }\r
+ }\r
+ return result;\r
+ }\r
+\r
+ // private void uploadMeta(StoreUri storeUri, String fileName, byte[] metadata) throws Exception {\r
+ // logger.info(getMarker(), "Uploading metadata for {}", fileName);\r
+ // OutputStream outStream = null;\r
+ // try {\r
+ // FTPClient sourceFtp = ((FtpDirectoryLister) storeUri.getLister()).connect();\r
+ // outStream = sourceFtp.storeFileStream(fileName + DOT_XML);\r
+ // if (outStream == null)\r
+ // throw new NullPointerException("Can not create: " + fileName + DOT_XML + " on FTP. Reply is:" + sourceFtp.getReplyString());\r
+ // outStream.write(metadata);\r
+ // outStream.flush();\r
+ // } catch (Exception e) {\r
+ // logger.catching(e);\r
+ // throw e;\r
+ // } finally {\r
+ // if (outStream != null)\r
+ // outStream.close();\r
+ // storeUri.cleanUp();\r
+ // }\r
+ // }\r
+\r
+}\r
--- /dev/null
+package user.jobengine.server.steps;\r
+\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+import org.apache.logging.log4j.Marker;\r
+import org.apache.logging.log4j.MarkerManager;\r
+\r
+import user.commons.RemoteFile;\r
+import user.commons.StoreUri;\r
+import user.commons.mediaarea.MediaArea;\r
+import user.commons.strings.FileSizeUtils;\r
+\r
+public class PASAPOOLTransferToStep extends TransferStep {\r
+ private static final Logger logger = LogManager.getLogger();\r
+ private static final String CODEC_PROFILE_HIGH = "HIGH";\r
+ private static final String CODEC_PROFILE_MAIN = "MAIN";\r
+ private static final String CODEC_PROFILE_422 = "4:2:2";\r
+ private static final String DISPLAY_ASPECT_16_9 = "16:9";\r
+ private static final String DISPLAY_ASPECT_4_3 = "4:3";\r
+ private StoreUri sourceStoreUri;\r
+ private String sourceFileName;\r
+ private Marker marker = MarkerManager.getMarker("MEDIAPROFILE");\r
+\r
+ @Override\r
+ @StepEntry\r
+ public Object[] execute(StoreUri sourceStoreUri, String sourceFileName, StoreUri targetStoreUri, String targetFileName) throws Exception {\r
+ this.sourceStoreUri = sourceStoreUri;\r
+ this.sourceFileName = sourceFileName;\r
+ long start = System.currentTimeMillis();\r
+ Object[] result = super.execute(sourceStoreUri, sourceFileName, targetStoreUri, targetFileName);\r
+ RemoteFile remoteFile = sourceStoreUri.getRemoteFile(targetFileName);\r
+ if (remoteFile != null && remoteFile.getSize() > 0) {\r
+ long diff = (System.currentTimeMillis() - start) / 1000;\r
+ if (diff > 0) {\r
+ long bytesSpeed = remoteFile.getSize() / diff;\r
+ String speed = FileSizeUtils.sizeAsString(bytesSpeed);\r
+ logger.info(getMarker(), "{} size is {}, upload speed was {}/sec", targetFileName, FileSizeUtils.sizeAsString(remoteFile.getSize()), speed);\r
+ }\r
+ }\r
+ return result;\r
+ }\r
+\r
+ @Override\r
+ protected StoreUri getTargetStoreUri(StoreUri targetStoreUri) {\r
+ StoreUri result = targetStoreUri;\r
+ try {\r
+ Path filePath = Paths.get(sourceStoreUri.toString(true), sourceFileName);\r
+ MediaArea mi = new MediaArea(filePath);\r
+ mi.process();\r
+\r
+ if (isHD(mi)) {\r
+ logger.info(marker, "{} is MOVED_HD", sourceFileName);\r
+ result = getManager().getStoreUri("PEABLEBEACH", targetStoreUri.getProtocol());\r
+ return result;\r
+ }\r
+\r
+ if (isSD_HIGH_16_9(mi)) {\r
+ logger.info(marker, "{} is CONVSD16_9", sourceFileName);\r
+ result = getManager().getStoreUri("SELENIOPOOL_16_9", targetStoreUri.getProtocol());\r
+ return result;\r
+ }\r
+\r
+ if (isSD_HIGH_4_3(mi)) {\r
+ logger.info(marker, "{} is CONVSD4_3", sourceFileName);\r
+ result = getManager().getStoreUri("SELENIOPOOL_4_3", targetStoreUri.getProtocol());\r
+ return result;\r
+ }\r
+\r
+ if (isSD_MAIN_422(mi)) {\r
+ logger.info(marker, "{} is MOVED_SD", sourceFileName);\r
+ result = getManager().getStoreUri("PEABLEBEACH", targetStoreUri.getProtocol());\r
+ return result;\r
+ }\r
+ } catch (Exception e) {\r
+ logger.error(getSessionMarker(), e.getMessage());\r
+ }\r
+ return result;\r
+ }\r
+\r
+ private boolean isHD(MediaArea mi) {\r
+ return mi.getHeight() == 1080;\r
+ }\r
+\r
+ private boolean isSD_HIGH_16_9(MediaArea mi) {\r
+ String formatProfileName = mi.getFormatProfileName();\r
+ return mi.getHeight() < 650 && formatProfileName.contains(CODEC_PROFILE_HIGH) && DISPLAY_ASPECT_16_9.equals(mi.getDisplayAspect());\r
+ }\r
+\r
+ private boolean isSD_HIGH_4_3(MediaArea mi) {\r
+ String formatProfileName = mi.getFormatProfileName();\r
+ return mi.getHeight() < 650 && formatProfileName.contains(CODEC_PROFILE_HIGH) && DISPLAY_ASPECT_4_3.equals(mi.getDisplayAspect());\r
+ }\r
+\r
+ private boolean isSD_MAIN_422(MediaArea mi) {\r
+ String formatProfileName = mi.getFormatProfileName();\r
+ return mi.getHeight() < 650 && (formatProfileName.contains(CODEC_PROFILE_MAIN) || formatProfileName.contains(CODEC_PROFILE_422));\r
+ }\r
+\r
+}\r
--- /dev/null
+package user.jobengine.server.steps;\r
+\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import user.commons.StoreUri;\r
+\r
+public class PBARCHIVETransferFromStep extends TransferStep {\r
+ private static final Logger logger = LogManager.getLogger();\r
+\r
+ @Override\r
+ @StepEntry\r
+ public Object[] execute(StoreUri sourceStoreUri, String sourceFileName, StoreUri targetStoreUri, String targetFileName) throws Exception {\r
+ Object[] result = null;\r
+ result = super.execute(sourceStoreUri, sourceFileName, targetStoreUri, targetFileName);\r
+ return result;\r
+ }\r
+}\r
--- /dev/null
+package user.jobengine.server.steps;\r
+\r
+import java.io.IOException;\r
+import java.nio.file.Paths;\r
+import java.sql.Timestamp;\r
+import java.time.Duration;\r
+import java.time.Instant;\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import org.apache.commons.net.ftp.FTPClient;\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import user.commons.DownloadableMedia;\r
+import user.commons.RemoteFile;\r
+import user.commons.StoreUri;\r
+import user.commons.nexio.api.ClipNotFoundException;\r
+import user.commons.nexio.server.protocol.ProtocolException;\r
+import user.commons.remotestore.FtpDirectoryLister;\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
+import user.jobengine.db.Media;\r
+import user.jobengine.server.steps.shared.EscortFiles;\r
+\r
+public class PBArchiveCheckerStep extends JobStep {\r
+ private static final String DOT_MXF = ".mxf";\r
+ private static final Logger logger = LogManager.getLogger();\r
+\r
+ private boolean checkModifiedByTime(String title, Timestamp modified, int lastModifiedHours) {\r
+ long modifiedHours = Duration.between(modified.toInstant(), Instant.now()).toHours();\r
+ if (modifiedHours < 0) {\r
+ logger.info(getMarker(), "{} modification time greather than now", title);\r
+ return false;\r
+ }\r
+ if (modifiedHours < lastModifiedHours) {\r
+ logger.info(getMarker(), "{} modification time is too cloose for now", title);\r
+ return false;\r
+ }\r
+\r
+ return true;\r
+ }\r
+\r
+ @StepEntry\r
+ public Object[] execute(String sourceStoreName, String escortStoreName, int lastModifiedHours) throws Exception {\r
+ logger.info(getMarker(), "Started {}", sourceStoreName);\r
+ StoreUri sourceStoreUri = null;\r
+ try {\r
+ getJobRuntime().setRelated(sourceStoreName + " archive");\r
+\r
+ sourceStoreUri = getManager().getStoreUri(sourceStoreName, RemoteStoreProtocol.FTP);\r
+\r
+ StoreUri targetStoreUri = getManager().getStoreUri("TSM", RemoteStoreProtocol.TSM);\r
+ StoreUri escortStoreUri = getManager().getStoreUri(escortStoreName, RemoteStoreProtocol.LOCAL);\r
+ String outputPath = Paths.get(escortStoreUri.toString(true)).toString();\r
+\r
+ FtpDirectoryLister lister = (FtpDirectoryLister) sourceStoreUri.getLister();\r
+ FTPClient client = lister.connect();\r
+ //a StoreUri alapu listazas nem mukodik, miota a working directory beallitas fix\r
+ List<RemoteFile> remoteFiles = new ArrayList<>();\r
+\r
+ String[] listNames = client.listNames();\r
+ for (String f : listNames) {\r
+ logger.info(getMarker(), "File name is {}", f);\r
+\r
+ try {\r
+ RemoteFile remoteFile = lister.get(f);\r
+ if (remoteFile == null)\r
+ logger.info(getMarker(), "Remote file for {} is not available", f);\r
+ else\r
+ remoteFiles.add(remoteFile);\r
+\r
+ } catch (Exception iex) {\r
+ logger.error(getMarker(), iex.getMessage());\r
+ }\r
+ }\r
+\r
+ logger.info(getMarker(), "Found {} files in working dir {}", remoteFiles.size(),\r
+ client.printWorkingDirectory());\r
+ processClips(sourceStoreName, sourceStoreUri, targetStoreUri, outputPath, remoteFiles, lastModifiedHours);\r
+\r
+ } catch (Exception e) {\r
+ logger.error(getMarker(), e.getMessage());\r
+ logger.error(getSessionMarker(), e.getMessage() == null ? "Unknown error" : e.getMessage());\r
+ throw e;\r
+ } finally {\r
+ if (sourceStoreUri != null)\r
+ sourceStoreUri.cleanUp();\r
+ setProgress(100);\r
+ }\r
+\r
+ return null;\r
+ }\r
+\r
+ private void processClips(String storeName, StoreUri sourceStoreUri, StoreUri targetStoreUri, String outputPath,\r
+ List<RemoteFile> remoteFiles, int lastModifiedHours)\r
+ throws ClipNotFoundException, IOException, ProtocolException {\r
+ for (RemoteFile remoteFile : remoteFiles) {\r
+\r
+ if (getJobRuntime().isWaitingCancel()) {\r
+ //logger.info("CANCELED");\r
+ cancel();\r
+ break;\r
+ }\r
+ try {\r
+\r
+ String title = null;\r
+ Timestamp created = null;\r
+ Timestamp modified = null;\r
+ title = remoteFile.getName();\r
+\r
+ int dotIdx = title.lastIndexOf(".");\r
+ if (dotIdx > -1)\r
+ title = title.substring(0, dotIdx);\r
+\r
+ created = remoteFile.getCreated();\r
+ modified = remoteFile.getModify();\r
+\r
+ logger.info(getMarker(), "{} created {} modified {}", title, created, modified);\r
+ Media media = getManager().getMedia(title);\r
+ boolean createEscort = false;\r
+\r
+ if (checkModifiedByTime(title, modified, lastModifiedHours))\r
+ createEscort = true;\r
+\r
+ if (!createEscort)\r
+ continue;\r
+\r
+ if (createEscort) {\r
+ long mediaId = 0;\r
+ if (media != null)\r
+ mediaId = media.getId();\r
+ String fileName = title + DOT_MXF;\r
+ DownloadableMedia downloadable = DownloadableMedia.create(title, fileName, modified, created, 0, 0,\r
+ sourceStoreUri.getId(), targetStoreUri.getId(), mediaId);\r
+ String escortFileName = storeName + "." + downloadable.getString("fileName");\r
+ if (EscortFiles.createMetadataIfNotExists(outputPath, escortFileName,\r
+ downloadable.toPrettyString(""))) {\r
+ logger.info(getMarker(), "Archive status file created for {}", fileName);\r
+ } else {\r
+ logger.info(getMarker(), "Archive status file already exists for {}", fileName);\r
+ }\r
+ }\r
+\r
+ } catch (Exception e) {\r
+ logger.error(getSessionMarker(), e.getMessage());\r
+ continue;\r
+ }\r
+ }\r
+ }\r
+\r
+}\r
--- /dev/null
+package user.jobengine.server.steps;\r
+\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.SimpleFileVisitor;\r
+import java.nio.file.attribute.BasicFileAttributes;\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\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
+/* DO NOT REMOVE!\r
+import user.jobengine.server.steps.FileSearchFilterOptions;\r
+*/\r
+public class PathItemsCollectorStep extends JobStep {\r
+ private static final Logger logger = LogManager.getLogger();\r
+\r
+ protected FileSearchFilterOptions createFileFilter(BasicDBObject filter) {\r
+ return new FileSearchFilterOptions(filter);\r
+ }\r
+\r
+ @StepEntry\r
+ public Object[] execute(String sourceFolder, BasicDBObject filter) throws Exception {\r
+ Path sourcePath = Paths.get(sourceFolder);\r
+\r
+ List<String> files = new ArrayList<>();\r
+\r
+ //teljes rekurzivitas szuressel\r
+ FileSearchFilterOptions filterOptions = createFileFilter(filter);\r
+ FileVisitor<Path> visitor = new SimpleFileVisitor<Path>() {\r
+ @Override\r
+ public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {\r
+ if (!filterOptions.preAcceptDirectory(dir))\r
+ return FileVisitResult.SKIP_SUBTREE;\r
+ return FileVisitResult.CONTINUE;\r
+ }\r
+\r
+ @Override\r
+ public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {\r
+ if (filterOptions.acceptFile(file)) {\r
+ files.add(file.toString());\r
+ logger.info(file);\r
+ }\r
+ return FileVisitResult.CONTINUE;\r
+ }\r
+\r
+ @Override\r
+ public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {\r
+ logger.error(exc);\r
+ return FileVisitResult.CONTINUE;\r
+ }\r
+\r
+ };\r
+\r
+ try {\r
+ logger.info(getMarker(), "Visiting {} which exists {}", sourceFolder, sourcePath.toFile().exists());\r
+ Files.walkFileTree(sourcePath, visitor);\r
+ } catch (Exception e) {\r
+ logger.error(getMarker(), "Error processing '{}'. System message: {}", sourcePath, e.getMessage());\r
+ logger.catching(e);\r
+ throw e;\r
+ } finally {\r
+ }\r
+\r
+ logger.info(getMarker(), "Found {} files", files.size());\r
+ setProgress(100);\r
+ return new Object[] { files };\r
+ }\r
+}\r
--- /dev/null
+package user.jobengine.server.steps;\r
+\r
+import java.nio.file.DirectoryStream;\r
+import java.nio.file.Files;\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+import java.util.ArrayList;\r
+import java.util.Arrays;\r
+import java.util.Collection;\r
+import java.util.LinkedHashSet;\r
+import java.util.List;\r
+\r
+import org.apache.commons.lang.StringUtils;\r
+import org.apache.commons.net.ftp.FTPClient;\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import com.ibm.nosql.json.api.BasicDBList;\r
+\r
+import user.commons.DownloadableMedia;\r
+import user.commons.StoreUri;\r
+import user.commons.remotestore.FtpDirectoryLister;\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
+import user.jobengine.db.Media;\r
+import user.jobengine.server.steps.PBQuery.MMMedia;\r
+\r
+public class PeableBeachMissingMaterialCheckerStep extends JobStep {\r
+ private static final Logger logger = LogManager.getLogger();\r
+ private static final String appendExtension = System.getProperty("missingmaterial.appendextension", ".mxf");\r
+\r
+ @StepEntry\r
+ public Object[] execute(String escortStoreName, BasicDBList lookupStoreNames, String targetStoreName, String targetProtocol, String primaryEndPoint,\r
+ String primaryUserName, String primaryPassword, String secondaryEndPoint, String secondaryUserName, String secondaryPassword, int rangeForwardHours)\r
+ throws Exception {\r
+ StoreUri escortStoreUri = null;\r
+ try {\r
+ getJobRuntime().setRelated(targetStoreName + " restore");\r
+\r
+ escortStoreUri = getManager().getStoreUri(escortStoreName, RemoteStoreProtocol.LOCAL);\r
+ StoreUri sourceStoreUri = getManager().getStoreUri("TSM", RemoteStoreProtocol.TSM);\r
+ StoreUri targetStoreUri = getManager().getStoreUri(targetStoreName, Enum.valueOf(RemoteStoreProtocol.class, targetProtocol));\r
+\r
+ LinkedHashSet<String> poolContent = new LinkedHashSet<>();\r
+\r
+ int progress = 0;\r
+ int count = lookupStoreNames.size();\r
+ int processed = 0;\r
+\r
+ for (Object lookup : lookupStoreNames) {\r
+ if (getJobRuntime().isWaitingCancel()) {\r
+ cancel();\r
+ return null;\r
+ }\r
+ String lookupStoreName = String.valueOf(lookup);\r
+\r
+ StoreUri lookupStoreUri = getManager().getStoreUri(lookupStoreName, Enum.valueOf(RemoteStoreProtocol.class, targetProtocol));\r
+ logger.info(getMarker(), "Checking pool {}", lookupStoreName);\r
+ List<String> lookupContent = getPoolContent(lookupStoreName, lookupStoreUri);\r
+ poolContent.addAll(lookupContent);\r
+ processed++;\r
+ progress = processed * 50 / count;\r
+ setProgress(progress);\r
+ }\r
+ /*\r
+ if (1 == 1) {\r
+\r
+ logger.info(getMarker(), "Kikapcsolva");\r
+ return null;\r
+ }\r
+ */\r
+\r
+ PBQuery query = new PBQuery();\r
+ query.init(primaryEndPoint, primaryUserName, primaryPassword, secondaryEndPoint, secondaryUserName, secondaryPassword, rangeForwardHours);\r
+ Collection<MMMedia> medias = query.getPossibelMissingMaterialNames(new ArrayList<>(poolContent));\r
+ logger.info(getMarker(), "API returned {} items", medias == null ? 0 : medias.size());\r
+\r
+ if (medias != null && medias.size() > 0) {\r
+ count = medias.size();\r
+ for (MMMedia media : medias) {\r
+ logger.info(getMarker(), "API response contains {}", media.getName());\r
+ }\r
+\r
+ for (MMMedia media : medias) {\r
+ if (getJobRuntime().isWaitingCancel()) {\r
+ cancel();\r
+ break;\r
+ }\r
+ processRecord(media, sourceStoreUri, targetStoreName, targetStoreUri, escortStoreUri);\r
+ processed++;\r
+ progress = 50 + (processed * 50 / count);\r
+ setProgress(progress);\r
+ }\r
+\r
+ }\r
+ setProgress(100);\r
+ } catch (Exception e) {\r
+ logger.error(getSessionMarker(), e.getMessage());\r
+ throw e;\r
+ } finally {\r
+ if (escortStoreUri != null)\r
+ escortStoreUri.cleanUp();\r
+ }\r
+\r
+ return null;\r
+ }\r
+\r
+ private List<String> getPoolContent(String storeName, StoreUri targetStoreUri) throws Exception {\r
+ List<String> poolContent = new ArrayList<>();\r
+\r
+ FtpDirectoryLister lister = (FtpDirectoryLister) targetStoreUri.getLister();\r
+ FTPClient client = lister.connect();\r
+ logger.info(getMarker(), "Working dir is {}", client.printWorkingDirectory());\r
+ String[] listNames = client.listNames();\r
+ targetStoreUri.cleanUp();\r
+\r
+ if (listNames != null) {\r
+ List<String> remoteFileNames = Arrays.asList(listNames);\r
+ logger.info(getMarker(), "Remote file list size :{}", remoteFileNames.size());\r
+ for (String name : remoteFileNames) {\r
+ try {\r
+ if (name.toLowerCase().endsWith(".mxf")) {\r
+ int pos = name.lastIndexOf(".");\r
+ if (pos > -1) {\r
+ name = name.substring(0, pos);\r
+ //logger.info(getMarker(), "Adding {}", name);\r
+ poolContent.add(name);\r
+ }\r
+ }\r
+ } catch (Exception e) {\r
+ logger.error(e.getMessage());\r
+ }\r
+\r
+ }\r
+ }\r
+\r
+ // List<RemoteFile> remoteFiles = targetStoreUri.getRemoteFiles();\r
+ // if (remoteFiles != null) {\r
+ // logger.info(getMarker(), "Remote file list size :{}", remoteFiles.size());\r
+ // for (RemoteFile rf : remoteFiles) {\r
+ // try {\r
+ // String name = rf.getName();\r
+ // if (name.toLowerCase().endsWith(".mxf")) {\r
+ // int pos = name.lastIndexOf(".");\r
+ // if (pos > -1) {\r
+ // name = name.substring(0, pos);\r
+ // //logger.info(getMarker(), "Adding {}", name);\r
+ // poolContent.add(name);\r
+ // }\r
+ // }\r
+ // } catch (Exception e) {\r
+ // logger.error(e.getMessage());\r
+ // }\r
+ //\r
+ // }\r
+ // }\r
+ logger.info(getMarker(), "Pool {} contains {} items", storeName, poolContent == null ? 0 : poolContent.size());\r
+ return poolContent;\r
+ }\r
+\r
+ //csak visszaterunk\r
+ private String normalizeName(String mediaName) {\r
+ String result = mediaName;\r
+ if (StringUtils.isNotBlank(appendExtension))\r
+ result += appendExtension;\r
+ // if (StringUtils.isNotBlank(mediaName)) {\r
+ // result = mediaName.trim().toLowerCase();\r
+ // }\r
+ return result;\r
+ }\r
+\r
+ private void processRecord(MMMedia mmedia, StoreUri sourceStoreUri, String targetStoreName, StoreUri targetStoreUri, StoreUri escortStoreUri) {\r
+ //TODO kisbetu/nagybetu problema kezelese\r
+\r
+ Media media = null;\r
+ //duplikatum miatt\r
+ try {\r
+ media = getManager().getMedia(mmedia.getName());\r
+ } catch (Exception e) {\r
+ logger.error(getMarker(), "Can't identify missing material {}. System message is: {}", mmedia.getName(), e.getMessage());\r
+ return;\r
+ }\r
+\r
+ String fileName = normalizeName(mmedia.getName());\r
+\r
+ if (media == null) {\r
+ logger.warn(getMarker(), "File {} not archived yet", mmedia.getName());\r
+ return;\r
+ }\r
+\r
+ DownloadableMedia downloadable = DownloadableMedia.create(mmedia.getName(), fileName, media.getModified(), media.getCreated(), media.getLength(), 0L,\r
+ sourceStoreUri.getId(), targetStoreUri.getId(), media.getId());\r
+ downloadable.put("priority", 50);\r
+ String usage = mmedia.getUsage();\r
+ usage = usage.replace("-", "").replace(":", "");\r
+ String escortFileName = usage + "." + targetStoreName + "." + fileName;\r
+ Path outputPath = null;\r
+ try {\r
+ outputPath = Paths.get(escortStoreUri.toString(true));\r
+ boolean exsists = statusFileExists(outputPath, fileName);\r
+ if (exsists)\r
+ return;\r
+ EscortFiles.createMetadata(outputPath.toString(), escortFileName, downloadable.toPrettyString(""));\r
+ logger.info(getMarker(), "Status file created {}", escortFileName);\r
+ } catch (Exception e) {\r
+ logger.error(getSessionMarker(), "Can't create status file {}", Paths.get(outputPath.toString(), escortFileName));\r
+ }\r
+\r
+ }\r
+\r
+ private boolean statusFileExists(Path outputPath, String fileName) {\r
+ boolean exsists = false;\r
+ Path statusPath = Paths.get(outputPath.toString(), EscortFiles.STATUSFOLDER);\r
+ try (DirectoryStream<Path> p = Files.newDirectoryStream(statusPath, "*" + fileName + EscortFiles.DOT_JSON)) {\r
+ if (p.iterator().hasNext()) {\r
+ logger.info(getMarker(), "Status file for {} already exists", fileName);\r
+ exsists = true;\r
+ }\r
+\r
+ } catch (Exception e1) {\r
+ logger.error(getSessionMarker(), e1.getMessage());\r
+ }\r
+ return exsists;\r
+ }\r
+\r
+}\r
--- /dev/null
+package user.jobengine.server.steps;\r
+\r
+import java.nio.file.DirectoryStream;\r
+import java.nio.file.Files;\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+import java.util.ArrayList;\r
+import java.util.Arrays;\r
+import java.util.Collection;\r
+import java.util.LinkedHashSet;\r
+import java.util.List;\r
+\r
+import org.apache.commons.lang.StringUtils;\r
+import org.apache.commons.net.ftp.FTPClient;\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import com.ibm.nosql.json.api.BasicDBList;\r
+\r
+import user.commons.DownloadableMedia;\r
+import user.commons.StoreUri;\r
+import user.commons.remotestore.FtpDirectoryLister;\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
+import user.jobengine.db.Media;\r
+import user.jobengine.server.steps.shared.EscortFiles;\r
+import user.jobengine.server.steps.shared.PBQuery;\r
+import user.jobengine.server.steps.shared.PBQuery.MMMedia;\r
+\r
+public class PeableBeachMissingMaterialCheckerStep extends JobStep {\r
+ private static final Logger logger = LogManager.getLogger();\r
+ private static final String appendExtension = ".mxf";\r
+\r
+ @StepEntry\r
+ public Object[] execute(String escortStoreName, BasicDBList lookupStoreNames, String targetStoreName, String targetProtocol, String primaryEndPoint,\r
+ String primaryUserName, String primaryPassword, String secondaryEndPoint, String secondaryUserName, String secondaryPassword, int rangeForwardHours)\r
+ throws Exception {\r
+ StoreUri escortStoreUri = null;\r
+ try {\r
+ getJobRuntime().setRelated(targetStoreName + " restore");\r
+\r
+ escortStoreUri = getManager().getStoreUri(escortStoreName, RemoteStoreProtocol.LOCAL);\r
+ StoreUri sourceStoreUri = getManager().getStoreUri("TSM", RemoteStoreProtocol.TSM);\r
+ StoreUri targetStoreUri = getManager().getStoreUri(targetStoreName, Enum.valueOf(RemoteStoreProtocol.class, targetProtocol));\r
+\r
+ LinkedHashSet<String> poolContent = new LinkedHashSet<>();\r
+\r
+ int progress = 0;\r
+ int count = lookupStoreNames.size();\r
+ int processed = 0;\r
+\r
+ for (Object lookup : lookupStoreNames) {\r
+ if (getJobRuntime().isWaitingCancel()) {\r
+ cancel();\r
+ return null;\r
+ }\r
+ String lookupStoreName = String.valueOf(lookup);\r
+\r
+ StoreUri lookupStoreUri = getManager().getStoreUri(lookupStoreName, Enum.valueOf(RemoteStoreProtocol.class, targetProtocol));\r
+ logger.info(getMarker(), "Checking pool {}", lookupStoreName);\r
+ List<String> lookupContent = getPoolContent(lookupStoreName, lookupStoreUri);\r
+ poolContent.addAll(lookupContent);\r
+ processed++;\r
+ progress = processed * 50 / count;\r
+ setProgress(progress);\r
+ }\r
+ /*\r
+ if (1 == 1) {\r
+\r
+ logger.info(getMarker(), "Kikapcsolva");\r
+ return null;\r
+ }\r
+ */\r
+\r
+ PBQuery query = new PBQuery();\r
+ query.init(primaryEndPoint, primaryUserName, primaryPassword, secondaryEndPoint, secondaryUserName, secondaryPassword, rangeForwardHours);\r
+ Collection<MMMedia> medias = query.getPossibelMissingMaterialNames(new ArrayList<>(poolContent));\r
+ logger.info(getMarker(), "API returned {} items", medias == null ? 0 : medias.size());\r
+\r
+ if (medias != null && medias.size() > 0) {\r
+ count = medias.size();\r
+ for (MMMedia media : medias) {\r
+ logger.info(getMarker(), "API response contains {}", media.getName());\r
+ }\r
+\r
+ for (MMMedia media : medias) {\r
+ if (getJobRuntime().isWaitingCancel()) {\r
+ cancel();\r
+ break;\r
+ }\r
+ processRecord(media, sourceStoreUri, targetStoreName, targetStoreUri, escortStoreUri);\r
+ processed++;\r
+ progress = 50 + (processed * 50 / count);\r
+ setProgress(progress);\r
+ }\r
+\r
+ }\r
+ setProgress(100);\r
+ } catch (Exception e) {\r
+ logger.error(getSessionMarker(), e.getMessage());\r
+ throw e;\r
+ } finally {\r
+ if (escortStoreUri != null)\r
+ escortStoreUri.cleanUp();\r
+ }\r
+\r
+ return null;\r
+ }\r
+\r
+ private List<String> getPoolContent(String storeName, StoreUri targetStoreUri) throws Exception {\r
+ List<String> poolContent = new ArrayList<>();\r
+\r
+ FtpDirectoryLister lister = (FtpDirectoryLister) targetStoreUri.getLister();\r
+ FTPClient client = lister.connect();\r
+ logger.info(getMarker(), "Working dir is {}", client.printWorkingDirectory());\r
+ String[] listNames = client.listNames();\r
+ targetStoreUri.cleanUp();\r
+\r
+ if (listNames != null) {\r
+ List<String> remoteFileNames = Arrays.asList(listNames);\r
+ logger.info(getMarker(), "Remote file list size :{}", remoteFileNames.size());\r
+ for (String name : remoteFileNames) {\r
+ try {\r
+ if (name.toLowerCase().endsWith(".mxf")) {\r
+ int pos = name.lastIndexOf(".");\r
+ if (pos > -1) {\r
+ name = name.substring(0, pos);\r
+ //logger.info(getMarker(), "Adding {}", name);\r
+ poolContent.add(name);\r
+ }\r
+ }\r
+ } catch (Exception e) {\r
+ logger.error(e.getMessage());\r
+ }\r
+\r
+ }\r
+ }\r
+\r
+ // List<RemoteFile> remoteFiles = targetStoreUri.getRemoteFiles();\r
+ // if (remoteFiles != null) {\r
+ // logger.info(getMarker(), "Remote file list size :{}", remoteFiles.size());\r
+ // for (RemoteFile rf : remoteFiles) {\r
+ // try {\r
+ // String name = rf.getName();\r
+ // if (name.toLowerCase().endsWith(".mxf")) {\r
+ // int pos = name.lastIndexOf(".");\r
+ // if (pos > -1) {\r
+ // name = name.substring(0, pos);\r
+ // //logger.info(getMarker(), "Adding {}", name);\r
+ // poolContent.add(name);\r
+ // }\r
+ // }\r
+ // } catch (Exception e) {\r
+ // logger.error(e.getMessage());\r
+ // }\r
+ //\r
+ // }\r
+ // }\r
+ logger.info(getMarker(), "Pool {} contains {} items", storeName, poolContent == null ? 0 : poolContent.size());\r
+ return poolContent;\r
+ }\r
+\r
+ //csak visszaterunk\r
+ private String normalizeName(String mediaName) {\r
+ String result = mediaName;\r
+ if (StringUtils.isNotBlank(appendExtension))\r
+ result += appendExtension;\r
+ // if (StringUtils.isNotBlank(mediaName)) {\r
+ // result = mediaName.trim().toLowerCase();\r
+ // }\r
+ return result;\r
+ }\r
+\r
+ private void processRecord(MMMedia mmedia, StoreUri sourceStoreUri, String targetStoreName, StoreUri targetStoreUri, StoreUri escortStoreUri) {\r
+ //TODO kisbetu/nagybetu problema kezelese\r
+ \r
+ Media media = null;\r
+ //duplikatum miatt\r
+ try {\r
+ media = getManager().getMedia(mmedia.getName());\r
+ } catch (Exception e) {\r
+ logger.error(getMarker(), "Can't identify missing material {}. System message is: {}", mmedia.getName(), e.getMessage());\r
+ return;\r
+ }\r
+\r
+ String fileName = normalizeName(mmedia.getName());\r
+\r
+ if (media == null) {\r
+ logger.warn(getMarker(), "File {} not archived yet", mmedia.getName());\r
+ return;\r
+ }\r
+\r
+ DownloadableMedia downloadable = DownloadableMedia.create(mmedia.getName(), fileName, media.getModified(), media.getCreated(), media.getLength(), 0L,\r
+ sourceStoreUri.getId(), targetStoreUri.getId(), media.getId());\r
+ downloadable.put("priority", 50);\r
+ String usage = mmedia.getUsage();\r
+ usage = usage.replace("-", "").replace(":", "");\r
+ String escortFileName = usage + "." + targetStoreName + "." + fileName;\r
+ Path outputPath = null;\r
+ try {\r
+ outputPath = Paths.get(escortStoreUri.toString(true));\r
+ boolean exsists = statusFileExists(outputPath, fileName);\r
+ if (exsists)\r
+ return;\r
+ EscortFiles.createMetadata(outputPath.toString(), escortFileName, downloadable.toPrettyString(""));\r
+ logger.info(getMarker(), "Status file created {}", escortFileName);\r
+ } catch (Exception e) {\r
+ logger.error(getSessionMarker(), "Can't create status file {}", Paths.get(outputPath.toString(), escortFileName));\r
+ }\r
+\r
+ }\r
+\r
+ private boolean statusFileExists(Path outputPath, String fileName) {\r
+ boolean exsists = false;\r
+ Path statusPath = Paths.get(outputPath.toString(), EscortFiles.STATUSFOLDER);\r
+ try (DirectoryStream<Path> p = Files.newDirectoryStream(statusPath, "*" + fileName + EscortFiles.DOT_JSON)) {\r
+ if (p.iterator().hasNext()) {\r
+ logger.info(getMarker(), "Status file for {} already exists", fileName);\r
+ exsists = true;\r
+ }\r
+\r
+ } catch (Exception e1) {\r
+ logger.error(getSessionMarker(), e1.getMessage());\r
+ }\r
+ return exsists;\r
+ }\r
+\r
+}\r
--- /dev/null
+package user.jobengine.server.steps;\r
+\r
+import java.nio.file.Paths;\r
+import java.util.List;\r
+\r
+import org.apache.commons.lang.StringUtils;\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import user.commons.DownloadableMedia;\r
+import user.commons.StoreUri;\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
+import user.jobengine.db.ArchivedMedia;\r
+import user.jobengine.db.Media;\r
+import user.jobengine.server.steps.shared.EscortFiles;\r
+\r
+public class RegisterUserRestoreStep extends JobStep {\r
+ private static final Logger logger = LogManager.getLogger();\r
+ private static final String appendExtension = System.getProperty("missingmaterial.appendextension", ".mxf");\r
+\r
+ @StepEntry\r
+ public Object[] execute(String escortStoreName, String targetStoreName, List<ArchivedMedia> basket, String recipient) throws Exception {\r
+ StoreUri escortStoreUri = null;\r
+ try {\r
+ escortStoreUri = getManager().getStoreUri(escortStoreName, RemoteStoreProtocol.LOCAL);\r
+ StoreUri targetStoreUri = getManager().getStore(targetStoreName).getTargetStoreUri();\r
+ StoreUri sourceStoreUri = getManager().getStoreUri("TSM", RemoteStoreProtocol.TSM);\r
+ int processed = 0;\r
+ for (ArchivedMedia media : basket) {\r
+ processRecord(media, targetStoreName, sourceStoreUri, targetStoreUri, escortStoreUri, recipient);\r
+ processed++;\r
+ int progress = processed * 100 / basket.size();\r
+ setProgress(progress);\r
+ }\r
+ } catch (Exception e) {\r
+ logger.error(getSessionMarker(), e.getMessage());\r
+ throw e;\r
+ } finally {\r
+ if (escortStoreUri != null)\r
+ escortStoreUri.cleanUp();\r
+ }\r
+\r
+ return null;\r
+ }\r
+\r
+ private void processRecord(ArchivedMedia archivedMedia, String targetStoreName, StoreUri sourceStoreUri, StoreUri targetStoreUri, StoreUri escortStoreUri,\r
+ String recipient) {\r
+ Media media = archivedMedia.getMedia();\r
+\r
+ String fileName = media.getTitle();\r
+ if (StringUtils.isNotBlank(appendExtension))\r
+ fileName += appendExtension;\r
+\r
+ DownloadableMedia downloadable = DownloadableMedia.create(media.getTitle(), fileName, media.getModified(), media.getCreated(), media.getLength(), 0L,\r
+ sourceStoreUri.getId(), targetStoreUri.getId(), media.getId());\r
+ downloadable.put("recipient", recipient);\r
+ downloadable.put("skipValidation", true);\r
+ String escortFileName = targetStoreName + "." + downloadable.getString("fileName");\r
+ String outputPath = null;\r
+ try {\r
+ outputPath = Paths.get(escortStoreUri.toString(true)).toString();\r
+ if (EscortFiles.createMetadataIfNotExists(outputPath, escortFileName, downloadable.toPrettyString("")))\r
+ logger.info(getSessionMarker(), "Status file created {}", escortFileName);\r
+ else\r
+ logger.info(getSessionMarker(), "Status file already exists {}", escortFileName);\r
+ } catch (Exception e) {\r
+ logger.error("Can't create escort file {}", Paths.get(outputPath.toString(), escortFileName));\r
+ }\r
+\r
+ }\r
+\r
+}\r
--- /dev/null
+package user.jobengine.server.steps;\r
+\r
+import java.nio.file.Paths;\r
+\r
+import org.apache.commons.lang.StringUtils;\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import com.ibm.nosql.json.api.BasicDBList;\r
+import com.ibm.nosql.json.api.BasicDBObject;\r
+\r
+import user.commons.DownloadableMedia;\r
+import user.commons.StoreUri;\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
+import user.jobengine.db.Media;\r
+import user.jobengine.server.steps.shared.EscortFiles;\r
+\r
+public class RegisterVODRestoreStep extends JobStep {\r
+ private static final Logger logger = LogManager.getLogger();\r
+ private static final String appendExtension = System.getProperty("missingmaterial.appendextension", ".mxf");\r
+\r
+ @StepEntry\r
+ public Object[] execute(String targetStoreName, BasicDBList basket) throws Exception {\r
+ try {\r
+ StoreUri sourceStoreUri = getManager().getStoreUri("TSM", RemoteStoreProtocol.TSM);\r
+\r
+ StoreUri targetStoreUri = getManager().getStore(targetStoreName).getTargetStoreUri();\r
+ StoreUri escortStoreUri = getManager().getStoreUri("MEDIACUBE_UPLOADS", RemoteStoreProtocol.LOCAL);\r
+ int processed = 0;\r
+ for (int i = 0; i < basket.size(); i++) {\r
+ BasicDBObject item = (BasicDBObject) basket.get(i);\r
+ //logger.info(item.toPrettyString());\r
+ processRecord(targetStoreName, sourceStoreUri, targetStoreUri, escortStoreUri, item);\r
+ processed++;\r
+ int progress = processed * 100 / basket.size();\r
+ setProgress(progress);\r
+ }\r
+ } catch (Exception e) {\r
+ logger.error(getSessionMarker(), e.getMessage());\r
+ throw e;\r
+ } finally {\r
+ }\r
+\r
+ return null;\r
+ }\r
+\r
+ private void processRecord(String targetStoreName, StoreUri sourceStoreUri, StoreUri targetStoreUri, StoreUri escortStoreUri, BasicDBObject item) {\r
+ String mediaTitle = item.getString("title");\r
+ String relativeTargetPath = item.getString("path");\r
+\r
+ Media media = getManager().getMedia(mediaTitle);\r
+ \r
+ if (media == null) {\r
+ logger.error("Media {} is not available", mediaTitle);\r
+ return;\r
+ }\r
+ \r
+ String fileName = media.getTitle();\r
+ if (StringUtils.isNotBlank(appendExtension))\r
+ fileName += appendExtension;\r
+\r
+ DownloadableMedia downloadable = DownloadableMedia.create(media.getTitle(), fileName, media.getModified(), media.getCreated(), media.getLength(), 0L,\r
+ sourceStoreUri.getId(), targetStoreUri.getId(), media.getId());\r
+ //downloadable.put("skipValidation", true);\r
+ downloadable.put("relativeTargetPath", relativeTargetPath);\r
+ String escortFileName = targetStoreName + "." + downloadable.getString("fileName");\r
+ String outputPath = null;\r
+ try {\r
+ outputPath = Paths.get(escortStoreUri.toString(true)).toString();\r
+ if (EscortFiles.createMetadataIfNotExists(outputPath, escortFileName, downloadable.toPrettyString("")))\r
+ logger.info(getSessionMarker(), "Status file created {}", escortFileName);\r
+ else\r
+ logger.info(getSessionMarker(), "Status file already exists {}", escortFileName);\r
+ } catch (Exception e) {\r
+ logger.error("Can't create escort file {}", Paths.get(outputPath.toString(), escortFileName));\r
+ }\r
+\r
+ }\r
+\r
+}\r
--- /dev/null
+package user.jobengine.server.steps;\r
+\r
+import java.nio.file.Path;\r
+import java.text.SimpleDateFormat;\r
+import java.util.Calendar;\r
+\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
+/* DO NOT REMOVE!\r
+import user.jobengine.server.steps.FileSearchFilterOptions;\r
+*/\r
+public class RundownFilesCollectorStep extends PathItemsCollectorStep {\r
+ private static final Logger logger = LogManager.getLogger();\r
+\r
+ @Override\r
+ protected FileSearchFilterOptions createFileFilter(BasicDBObject filter) {\r
+ SimpleDateFormat df = new SimpleDateFormat("yyyy\\MM");\r
+ Calendar thisMonthCal = Calendar.getInstance();\r
+ Calendar nextMonthCal = Calendar.getInstance();\r
+ nextMonthCal.add(Calendar.MONTH, 1);\r
+\r
+ FileSearchFilterOptions result = new FileSearchFilterOptions(filter) {\r
+ @Override\r
+ public boolean acceptFile(Path file) {\r
+ if (file.toString().contains(df.format(thisMonthCal.getTime())) || file.toString().contains(df.format(nextMonthCal.getTime())))\r
+ return super.acceptFile(file);\r
+\r
+ return false;\r
+ }\r
+ };\r
+ return result;\r
+ }\r
+\r
+ @Override\r
+ @StepEntry\r
+ public Object[] execute(String sourceFolder, BasicDBObject filter) throws Exception {\r
+ return super.execute(sourceFolder, filter);\r
+ }\r
+}\r
--- /dev/null
+package user.jobengine.server.steps;\r
+\r
+import java.time.Instant;\r
+import java.util.Map;\r
+import java.util.Set;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import user.commons.JobStatus;\r
+import user.commons.MediaCubeMarker;\r
+import user.jobengine.server.IJobEngine;\r
+import user.jobengine.server.IJobRuntime;\r
+\r
+public class ServerStatusReportStep extends JobStep {\r
+ private static final Logger logger = LogManager.getLogger();\r
+\r
+ @StepEntry\r
+ public Object[] execute() throws Exception {\r
+ IJobEngine engine = getEngine();\r
+ int jobCount = 0;\r
+ StringBuilder sb = new StringBuilder();\r
+ Map<Long, IJobRuntime> jobs = engine.getJobs();\r
+ if (jobs != null) {\r
+ Set<Long> keys = jobs.keySet();\r
+ jobCount = keys.size();\r
+ for (Long key : keys) {\r
+ IJobRuntime runtime = jobs.get(key);\r
+ if (JobStatus.SUSPENDED.equals(runtime.getStatus()))\r
+ sb.append(runtime.getRelated() + " felfüggesztve: " + runtime.getDescription() + "</br>");\r
+ }\r
+ }\r
+ MediaCubeMarker marker = new MediaCubeMarker();\r
+\r
+ marker.setSubject(String.format("%s [%d db] AMC MediaCube feldolgozás", Instant.now(), jobCount));\r
+ logger.info(marker, sb.toString());\r
+ return null;\r
+ }\r
+}\r
--- /dev/null
+package user.jobengine.server.steps;\r
+\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.SimpleFileVisitor;\r
+import java.nio.file.attribute.BasicFileAttributes;\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+import java.util.regex.Matcher;\r
+import java.util.regex.Pattern;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+public class SubtitleFilesCollectorStep extends JobStep {\r
+ private static final Logger logger = LogManager.getLogger();\r
+\r
+ @StepEntry\r
+ public Object[] execute(String sourceFolder, String fileNamePattern) throws Exception {\r
+ Path sourcePath = Paths.get(sourceFolder);\r
+ List<String> files = new ArrayList<>();\r
+\r
+ Pattern pattern = Pattern.compile(fileNamePattern, Pattern.CASE_INSENSITIVE);\r
+\r
+ FileVisitor<Path> visitor = new SimpleFileVisitor<Path>() {\r
+ @Override\r
+ public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {\r
+ if (!file.getFileName().toString().contains("_DONE")) {\r
+ Matcher matcher = pattern.matcher(file.getFileName().toString());\r
+ if (matcher.find())\r
+ files.add(file.toString());\r
+ }\r
+ return FileVisitResult.CONTINUE;\r
+ }\r
+\r
+ @Override\r
+ public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {\r
+ return FileVisitResult.CONTINUE;\r
+ }\r
+\r
+ };\r
+\r
+ try {\r
+ Files.walkFileTree(sourcePath, visitor);\r
+ } catch (Exception e) {\r
+ logger.error(getMarker(), "Error processing '{}'. System message: {}", sourcePath, e.getMessage());\r
+ logger.catching(e);\r
+ throw e;\r
+ } finally {\r
+ }\r
+\r
+ logger.info(getMarker(), "Found {} files", files.size());\r
+ return new Object[] { files };\r
+ }\r
+\r
+}\r
--- /dev/null
+package user.jobengine.server.steps;\r
+\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import user.commons.StoreUri;\r
+\r
+public class TSMTransferFromStep extends TransferStep {\r
+ private static final Logger logger = LogManager.getLogger();\r
+\r
+ @Override\r
+ @StepEntry\r
+ public Object[] execute(StoreUri sourceStoreUri, String sourceFileName, StoreUri targetStoreUri, String targetFileName) throws Exception {\r
+ Object[] result = null;\r
+ Path targetFile = Paths.get(targetStoreUri.toString(true), targetFileName);\r
+ if (targetFile.toFile().exists()) {\r
+ logger.info(getMarker(), "Using previously retrived file {}", targetFile);\r
+ } else {\r
+ result = super.execute(sourceStoreUri, sourceFileName, targetStoreUri, targetFileName);\r
+ }\r
+ return result;\r
+ }\r
+\r
+}\r
--- /dev/null
+package user.jobengine.server.steps;\r
+\r
+import user.commons.StoreUri;\r
+\r
+public class TSMTransferToStep extends TransferStep {\r
+ @Override\r
+ @StepEntry\r
+ public Object[] execute(StoreUri sourceStoreUri, String sourceFileName, StoreUri targetStoreUri, String targetFileName) throws Exception {\r
+ return super.execute(sourceStoreUri, sourceFileName, targetStoreUri, targetFileName);\r
+ }\r
+}\r
--- /dev/null
+package user.jobengine.server.steps;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import user.commons.IJob;\r
+import user.commons.JobStatus;\r
+import user.commons.ListUtils;\r
+import user.jobengine.server.IJobEngine;\r
+import user.jobengine.server.IJobRuntime;\r
+\r
+public class TestForkCancelableStep extends JobStep {\r
+ private static final String CHILD_TITLE = "Párhuzamosított alfolyamat";\r
+ private static final String CHILD_TEMPLATE = "cancelable.xml";\r
+ private static final Logger logger = LogManager.getLogger();\r
+ int count = 20;\r
+\r
+ @StepEntry\r
+ public Object[] execute(IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
+ for (int i = 0; i < count; i++) {\r
+ IJobRuntime runtime = getEngine().submit(null, e -> {\r
+ if (e.getStatus().equals(JobStatus.CANCELED) || e.getStatus().equals(JobStatus.SUSPENDED))\r
+ logger.info("Cleanup occured because status is {} {}", e.getStatus(), ((IJob) e.getSource()).getId());\r
+ }, CHILD_TEMPLATE, "JOB " + i, 0, IJobEngine.DEFAULT_OWNER, ListUtils.asMap("param", i));\r
+\r
+ runtime.setRelated("TEST" + runtime.getId());\r
+ }\r
+\r
+ // jobRuntime.forkWaitComplete();\r
+ logger.info("Done");\r
+ return null;\r
+ }\r
+}\r
--- /dev/null
+package user.jobengine.server.steps;\r
+\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+\r
+import org.apache.commons.net.ftp.FTPClient;\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import user.commons.StoreUri;\r
+import user.commons.remotestore.FtpDirectoryLister;\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
+import user.jobengine.db.Store;\r
+\r
+public class TransferStep extends JobStep {\r
+ private static final String DOT_PART = ".part";\r
+ private static final Logger logger = LogManager.getLogger();\r
+\r
+ @StepEntry\r
+ public Object[] execute(StoreUri sourceStoreUri, String sourceFileName, StoreUri targetStoreUri, String targetFileName) throws Exception {\r
+ try {\r
+ getJobRuntime().setCancelable(false);\r
+\r
+ Store sourceStore = getManager().getStore(sourceStoreUri.getStoreId());\r
+ Store targetStore = getManager().getStore(targetStoreUri.getStoreId());\r
+\r
+ String description = String.format("%s -> %s : %s", sourceStore.getName(), targetStore.getName(), sourceFileName);\r
+ getJobRuntime().setDescription(description);\r
+\r
+ sourceStoreUri.addProgressListener(e -> setProgress(e.getProgress()));\r
+\r
+ StoreUri currentTargetStoreUri = getTargetStoreUri(targetStoreUri);\r
+ tryCopy(sourceStoreUri, sourceFileName, currentTargetStoreUri, targetFileName);\r
+ } catch (Exception e) {\r
+ logger.error(getMarker(), "Error in transfer of {} when copying from {} to {}.", sourceFileName, sourceStoreUri, targetStoreUri);\r
+ throw e;\r
+ } finally {\r
+ if (sourceStoreUri != null)\r
+ sourceStoreUri.cleanUp();\r
+ if (targetStoreUri != null)\r
+ targetStoreUri.cleanUp();\r
+ }\r
+ return null;\r
+ }\r
+\r
+ protected StoreUri getTargetStoreUri(StoreUri targetStoreUri) {\r
+ return targetStoreUri;\r
+ }\r
+\r
+ protected String getTmpExtension() {\r
+ return DOT_PART;\r
+ }\r
+\r
+ private void tryCopy(StoreUri sourceStoreUri, String sourceFileName, StoreUri targetStoreUri, String targetFileName) throws Exception {\r
+ String currentTargetFileName = targetFileName;\r
+\r
+ boolean renameAfterCopy = false;\r
+ boolean renameAfterFTP = false;\r
+ if (getTmpExtension() != null) {\r
+ if (RemoteStoreProtocol.LOCAL.equals(targetStoreUri.getProtocol())) {\r
+ currentTargetFileName += getTmpExtension();\r
+ renameAfterCopy = true;\r
+ }\r
+ Store targetStore = getManager().getStore(targetStoreUri.getStoreId());\r
+\r
+ if (RemoteStoreProtocol.FTP.equals(targetStoreUri.getProtocol()) && !"NEXIO1".equals(targetStore.getName())\r
+ && !"NEXIO2".equals(targetStore.getName())) {\r
+ currentTargetFileName += getTmpExtension();\r
+ renameAfterFTP = true;\r
+ }\r
+ }\r
+\r
+ sourceStoreUri.transferFrom(targetStoreUri, sourceFileName, currentTargetFileName);\r
+\r
+ logger.info(getMarker(), "Transfer of {} completed from {} to {}", sourceFileName, sourceStoreUri, currentTargetFileName);\r
+\r
+ if (renameAfterCopy) {\r
+ Path tmpTargetFile = Paths.get(targetStoreUri.toString(true), currentTargetFileName);\r
+ Path targetFile = Paths.get(targetStoreUri.toString(true), targetFileName);\r
+ try {\r
+ logger.info(getMarker(), "Renaming LOCAL file from {} to {} on {}", currentTargetFileName, targetFileName, sourceStoreUri);\r
+ tmpTargetFile.toFile().renameTo(targetFile.toFile());\r
+ } catch (Exception e) {\r
+ logger.error(getMarker(), e.getMessage());\r
+ }\r
+ }\r
+ if (renameAfterFTP) {\r
+ try {\r
+ FtpDirectoryLister lister = (FtpDirectoryLister) targetStoreUri.getLister();\r
+ FTPClient client = lister.connect();\r
+ logger.info(getMarker(), "Renaming FTP file from {} to {} on {}", currentTargetFileName, targetFileName, sourceStoreUri);\r
+ client.rename(currentTargetFileName, targetFileName);\r
+ } catch (Exception e) {\r
+ logger.error(getMarker(), e.getMessage());\r
+ } finally {\r
+ targetStoreUri.cleanUp();\r
+ }\r
+ }\r
+ }\r
+}\r
--- /dev/null
+package user.jobengine.server.steps;\r
+\r
+import user.commons.StoreUri;\r
+\r
+public class TransferToFTPStep extends TransferStep {\r
+ @Override\r
+ @StepEntry\r
+ public Object[] execute(StoreUri sourceStoreUri, String sourceFileName, StoreUri targetStoreUri, String targetFileName) throws Exception {\r
+ return super.execute(sourceStoreUri, sourceFileName, targetStoreUri, targetFileName);\r
+ }\r
+}\r
--- /dev/null
+package user.jobengine.server.steps;\r
+\r
+import user.commons.StoreUri;\r
+\r
+public class VODTransferToStep extends TransferStep {\r
+ private String relativeTargetPath;\r
+\r
+ @StepEntry\r
+ public Object[] execute(StoreUri sourceStoreUri, String sourceFileName, StoreUri targetStoreUri, String relativeTargetPath, String targetFileName)\r
+ throws Exception {\r
+ this.relativeTargetPath = relativeTargetPath;\r
+ return super.execute(sourceStoreUri, sourceFileName, targetStoreUri, targetFileName);\r
+ }\r
+\r
+ @Override\r
+ protected StoreUri getTargetStoreUri(StoreUri targetStoreUri) {\r
+ StoreUri result = getManager().getStoreUri(targetStoreUri.getId());\r
+ result.setRootPath(relativeTargetPath);\r
+ return result;\r
+ }\r
+\r
+}\r
--- /dev/null
+package user.jobengine.server.steps.shared;\r
+\r
+import java.io.ByteArrayInputStream;\r
+import java.io.File;\r
+import java.io.IOException;\r
+import java.io.InputStream;\r
+import java.io.OutputStream;\r
+import java.io.StringWriter;\r
+import java.io.UnsupportedEncodingException;\r
+import java.nio.file.Files;\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+import java.nio.file.attribute.FileAttribute;\r
+import java.nio.file.attribute.PosixFilePermission;\r
+import java.nio.file.attribute.PosixFilePermissions;\r
+import java.text.SimpleDateFormat;\r
+import java.util.Calendar;\r
+import java.util.Date;\r
+import java.util.Set;\r
+\r
+import javax.xml.parsers.DocumentBuilder;\r
+import javax.xml.parsers.DocumentBuilderFactory;\r
+import javax.xml.transform.OutputKeys;\r
+import javax.xml.transform.Transformer;\r
+import javax.xml.transform.TransformerConfigurationException;\r
+import javax.xml.transform.TransformerException;\r
+import javax.xml.transform.TransformerFactory;\r
+import javax.xml.transform.TransformerFactoryConfigurationError;\r
+import javax.xml.transform.dom.DOMSource;\r
+import javax.xml.transform.stream.StreamResult;\r
+\r
+import org.apache.commons.lang.StringUtils;\r
+import org.apache.commons.net.ftp.FTPClient;\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+import org.apache.logging.log4j.Marker;\r
+import org.apache.logging.log4j.message.Message;\r
+import org.w3c.dom.DOMImplementation;\r
+import org.w3c.dom.Document;\r
+import org.w3c.dom.Element;\r
+\r
+import com.ibm.nosql.json.api.BasicDBObject;\r
+import com.ibm.nosql.json.util.JSON;\r
+\r
+import user.commons.CalendarUtils;\r
+import user.commons.MediaCubeMarker;\r
+import user.commons.StoreUri;\r
+import user.commons.remotestore.FtpDirectoryLister;\r
+\r
+public class EscortFiles {\r
+ private static final String RECORDTIMESTAMP = "RecordTimeStamp";\r
+ private static final String MODIFIEDTIMESTAMP = "ModifiedTimeStamp";\r
+ public static final String DOT_CATCHED = ".catched";\r
+ public static final String DOT_JSON = ".json";\r
+ private static final Logger logger = LogManager.getLogger();\r
+ private static final String EXTENDEDAGENCY = "ExtendedAgency";\r
+ private static final String EXTENDEDDESCRIPTION = "ExtendedDescription";\r
+ private static final String KILLDATE = "KillDate";\r
+ private static final String FORMAT_KILLDATE = "MM-dd-yyyy";\r
+ private static final String EXTENDEDID = "extendedId";\r
+ private static final String ID = "ID";\r
+ private static final String KILLDATE_FILENAME = "%s.%s.killdate";\r
+ private static final String FORMAT_KILLDATENAME = "yyyyMMdd";\r
+ public static final String STATUSFOLDER = ".STATUS";\r
+ public static final String CONFLICTFOLDER = ".CONFLICT";\r
+\r
+ public static String composeKillDate(int days) {\r
+ Calendar killDate = Calendar.getInstance();\r
+ killDate.add(Calendar.DAY_OF_YEAR, days);\r
+ SimpleDateFormat dateFormat = new SimpleDateFormat(FORMAT_KILLDATENAME);\r
+ return dateFormat.format(killDate.getTime());\r
+ }\r
+ /*\r
+ * <?xml version="1.0" encoding="UTF-16"?> <ID extendedId="aaaaaaa">\r
+ * <KillDate>02-02-2018</KillDate> <ExtendedDescription>TEST\r
+ * TEST</ExtendedDescription> <ExtendedAgency>AGENT AGENT</ExtendedAgency>\r
+ * </ID>\r
+ */\r
+\r
+ private static String composeKillDateFileName(String fileName, int days) {\r
+ return String.format(KILLDATE_FILENAME, fileName, composeKillDate(days));\r
+ }\r
+\r
+ public static void createCatchedFile(Path escortFile) throws IOException {\r
+ Path catchedFilePath = Paths.get(escortFile.toString() + DOT_CATCHED);\r
+ Files.createFile(catchedFilePath);\r
+ }\r
+\r
+ public static void createFellow(String escortFile, String extension) throws IOException {\r
+ Files.copy(Paths.get(escortFile), Paths.get(escortFile + "." + extension));\r
+ }\r
+\r
+ /***\r
+ * A media eleresi utjan alapjan a .STATUS almappaban letrehozza a .catch fajlt.\r
+ *\r
+ * @param mediaFile\r
+ * @throws IOException\r
+ */\r
+ public static void createMediaCatch(Path mediaFile) throws IOException {\r
+ Path catchedFile = createMediaCathFilePath(mediaFile);\r
+ ensureUNCFolder(catchedFile.getParent());\r
+ Files.createFile(catchedFile);\r
+ }\r
+\r
+ private static Path createMediaCathFilePath(Path mediaFile) {\r
+ return Paths.get(mediaFile.getParent().toString(), STATUSFOLDER, mediaFile.getFileName() + DOT_CATCHED);\r
+ }\r
+\r
+ public static void createMetadata(String filePath, String fileName, String metadata) throws IOException {\r
+ ensureUNCFolder(filePath, STATUSFOLDER);\r
+ String metadataFileName = fileName + DOT_JSON;\r
+ Path metadataPath = Paths.get(filePath, STATUSFOLDER, metadataFileName);\r
+ Files.write(metadataPath, metadata.getBytes());\r
+ }\r
+\r
+ public static boolean createMetadataIfNotExists(String filePath, String fileName, String metadata) throws IOException {\r
+ boolean result = false;\r
+ if (!EscortFiles.isMetadataExists(filePath, fileName)) {\r
+ EscortFiles.createMetadata(filePath, fileName, metadata);\r
+ result = true;\r
+ }\r
+ return result;\r
+ }\r
+\r
+ public static void createMorpheusXML(String filePath, String fileName, String content) throws IOException {\r
+ ensureUNCFolder(filePath, STATUSFOLDER);\r
+ Path xmlPath = Paths.get(filePath, fileName);\r
+ if (Files.exists(xmlPath))\r
+ throw new IOException(String.format("Az '%s' állomány már létezik.", xmlPath));\r
+ Files.write(xmlPath, content.getBytes());\r
+ }\r
+\r
+ public static byte[] createNEXIODatesMeta(String fileName, Date recorded, Date modified) throws Exception {\r
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();\r
+ DocumentBuilder db = dbf.newDocumentBuilder();\r
+ DOMImplementation impl = db.getDOMImplementation();\r
+ Document xmlDocument = impl.createDocument(null, null, null);\r
+\r
+ Element root = xmlDocument.createElement(ID);\r
+ root.setAttribute(EXTENDEDID, fileName);\r
+ // <ModifiedTimeStamp>07-13-2020 (19:36:52)</ModifiedTimeStamp>\r
+ // <RecordTimeStamp>05-18-2013 (18:52:24)</RecordTimeStamp>\r
+ SimpleDateFormat df = new SimpleDateFormat("MM-dd-yyyy (HH:mm:ss)");\r
+ root.appendChild(xmlDocument.createElement(MODIFIEDTIMESTAMP)).appendChild(xmlDocument.createTextNode(df.format(modified)));\r
+ root.appendChild(xmlDocument.createElement(RECORDTIMESTAMP)).appendChild(xmlDocument.createTextNode(df.format(recorded)));\r
+ xmlDocument.appendChild(root);\r
+\r
+ return xmDocumentToString(xmlDocument);\r
+ }\r
+\r
+ public static byte[] createNEXIOKillDateFile(String fileName, Date killDate, String description, String agency) throws Exception {\r
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();\r
+ DocumentBuilder db = dbf.newDocumentBuilder();\r
+ DOMImplementation impl = db.getDOMImplementation();\r
+ Document xmlDocument = impl.createDocument(null, null, null);\r
+\r
+ Element root = xmlDocument.createElement(ID);\r
+ root.setAttribute(EXTENDEDID, fileName);\r
+ if (killDate != null) {\r
+ String sKillDate = CalendarUtils.toString(CalendarUtils.createCalendar(killDate), FORMAT_KILLDATE);\r
+ root.appendChild(xmlDocument.createElement(KILLDATE)).appendChild(xmlDocument.createTextNode(sKillDate));\r
+ }\r
+\r
+ if (StringUtils.isNotBlank(description))\r
+ root.appendChild(xmlDocument.createElement(EXTENDEDDESCRIPTION)).appendChild(xmlDocument.createTextNode(description));\r
+ if (StringUtils.isNotBlank(agency))\r
+ root.appendChild(xmlDocument.createElement(EXTENDEDAGENCY)).appendChild(xmlDocument.createTextNode(agency));\r
+ xmlDocument.appendChild(root);\r
+\r
+ return xmDocumentToString(xmlDocument);\r
+ }\r
+\r
+ public static Document createNEXIOMeta(byte[] content) throws Exception {\r
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();\r
+ DocumentBuilder db = dbf.newDocumentBuilder();\r
+ DOMImplementation impl = db.getDOMImplementation();\r
+ Document xmlDocument = null;\r
+\r
+ try (InputStream is = new ByteArrayInputStream(content)) {\r
+ xmlDocument = db.parse(is);\r
+ } catch (Exception e) {\r
+ logger.catching(e);\r
+ }\r
+\r
+ return xmlDocument;\r
+ }\r
+\r
+ public static void createUNCKillDate(String filePath, String fileName, int days, Marker marker) throws IOException {\r
+ ensureUNCFolder(filePath, STATUSFOLDER);\r
+ String killDateFileName = composeKillDateFileName(fileName, days);\r
+ Path killDatePath = Paths.get(filePath, STATUSFOLDER, killDateFileName);\r
+ if (Files.exists(killDatePath))\r
+ logger.warn(marker, "Az '{}' állomány már létezik.", killDatePath);\r
+ else\r
+ Files.createFile(killDatePath);\r
+ }\r
+\r
+ @SuppressWarnings("unchecked")\r
+ public static <T> T decode(Path escortFile) {\r
+ T result = null;\r
+ try {\r
+ byte[] bytes = Files.readAllBytes(escortFile);\r
+ String content = new String(bytes);\r
+ result = (T) JSON.parse(content);\r
+ } catch (Exception e) {\r
+ logger.error("Decode error. System message is: ", e.getMessage());\r
+ }\r
+ return result;\r
+ }\r
+\r
+ public static void ensureUNCFolder(Path filePath) throws IOException {\r
+ File folder = filePath.toFile();\r
+ if (!folder.exists() || !folder.isDirectory()) {\r
+ try {\r
+ Set<PosixFilePermission> perms = PosixFilePermissions.fromString("rwxrwxrwx");\r
+ FileAttribute<Set<PosixFilePermission>> attr = PosixFilePermissions.asFileAttribute(perms);\r
+ Files.createDirectories(filePath, attr);\r
+ } catch (Exception e) {\r
+ //logger.catching(e);\r
+ try {\r
+ Files.createDirectories(filePath);\r
+ } catch (Exception e1) {\r
+ logger.catching(e1);\r
+ throw e1;\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ public static void ensureUNCFolder(String filePath, String folderName) throws IOException {\r
+ Path statusPath = Paths.get(filePath, folderName);\r
+ ensureUNCFolder(statusPath);\r
+ }\r
+\r
+ public static boolean isCatchedFileExists(Path escortFile) {\r
+ Path catchedFilePath = Paths.get(escortFile.toString() + DOT_CATCHED);\r
+ return catchedFilePath.toFile().exists();\r
+ }\r
+\r
+ /***\r
+ * A media eleresi utjan alapjan a .STATUS almappaban vizsgalja .catch fajl letezeset.\r
+ *\r
+ * @param mediaFile\r
+ * @return\r
+ */\r
+ public static boolean isMediaCatched(Path mediaFile) {\r
+ Path catchedFile = createMediaCathFilePath(mediaFile);\r
+ return catchedFile.toFile().exists();\r
+ }\r
+\r
+ public static boolean isMetadataExists(String filePath, String fileName) throws IOException {\r
+ boolean result = false;\r
+ String metadataFileName = fileName + DOT_JSON;\r
+ Path metadataPath = Paths.get(filePath, STATUSFOLDER, metadataFileName);\r
+ result = metadataPath.toFile().exists();\r
+ return result;\r
+ }\r
+\r
+ public static void notifyRecipient(Path escortFile, Logger logger, Message msg) {\r
+ if (escortFile.toFile().exists()) {\r
+ try {\r
+ BasicDBObject downloadable = EscortFiles.decode(escortFile);\r
+ String recipientKey = "recipient";\r
+ if (downloadable.containsKey(recipientKey)) {\r
+ String recipient = downloadable.getString(recipientKey);\r
+ logger.info(new MediaCubeMarker(recipient, "MediaCube rendszerüzenet"), msg);\r
+ }\r
+ } catch (Exception e) {\r
+ logger.catching(e);\r
+ }\r
+\r
+ }\r
+ }\r
+\r
+ public static void remove(Path file) {\r
+ try {\r
+ file.toFile().delete();\r
+ } catch (Exception e) {\r
+ logger.error("Unable to delete {}", file.toAbsolutePath().toString());\r
+ }\r
+ }\r
+\r
+ public static void removeCatchedFile(Path escortFile) {\r
+ remove(Paths.get(escortFile.toString() + DOT_CATCHED));\r
+ }\r
+\r
+ /***\r
+ * A media eleresi utjan alapjan a .STATUS almappabol torli a .catch fajlt.\r
+ *\r
+ * @param mediaFile\r
+ * @throws IOException\r
+ */\r
+ public static void removeMediaCatch(Path mediaFile) {\r
+ Path catchedFile = createMediaCathFilePath(mediaFile);\r
+ remove(catchedFile);\r
+ }\r
+\r
+ public static void setNEXIOKillDate(int killDateDays, String targetFileName, String nexioAgency, StoreUri targetUri) throws Exception {\r
+ OutputStream outStream = null;\r
+ try {\r
+ FTPClient targetFTP = ((FtpDirectoryLister) targetUri.getLister()).connect();\r
+ Calendar killDate = CalendarUtils.createCalendar(new Date());\r
+ killDate.add(Calendar.DAY_OF_YEAR, killDateDays);\r
+ if (targetFileName.toLowerCase().contains(".mxf"))\r
+ targetFileName = targetFileName.substring(0, targetFileName.lastIndexOf('.'));\r
+ byte[] killDateFile = EscortFiles.createNEXIOKillDateFile(targetFileName, killDate.getTime(), null, nexioAgency);\r
+ String xml = targetFileName + ".xml";\r
+ outStream = targetFTP.storeFileStream(xml);\r
+ if (outStream == null) {\r
+ throw new NullPointerException("Can not open: " + targetFileName.substring(0, targetFileName.lastIndexOf('.')) + ".xml" + " Reply:"\r
+ + targetFTP.getReplyString());\r
+ }\r
+ outStream.write(killDateFile);\r
+ outStream.flush();\r
+ } catch (Exception e) {\r
+ throw e;\r
+ } finally {\r
+ if (outStream != null)\r
+ outStream.close();\r
+ targetUri.cleanUp();\r
+ }\r
+ }\r
+\r
+ private static byte[] xmDocumentToString(Document xmlDocument)\r
+ throws TransformerFactoryConfigurationError, TransformerConfigurationException, TransformerException, IOException, UnsupportedEncodingException {\r
+ DOMSource domSource = new DOMSource(xmlDocument);\r
+ TransformerFactory tf = TransformerFactory.newInstance();\r
+ Transformer transformer = tf.newTransformer();\r
+ transformer.setOutputProperty(OutputKeys.METHOD, "xml");\r
+ transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-16");\r
+ transformer.setOutputProperty(OutputKeys.INDENT, "yes");\r
+ StringWriter sw = new StringWriter();\r
+ StreamResult sr = new StreamResult(sw);\r
+ transformer.transform(domSource, sr);\r
+ String result = sw.toString();\r
+ sw.close();\r
+ return result.getBytes("UTF-16");\r
+ }\r
+}\r
--- /dev/null
+package user.jobengine.server.steps.shared;\r
+\r
+import java.io.DataInputStream;\r
+import java.io.FileNotFoundException;\r
+import java.io.IOException;\r
+import java.io.StringReader;\r
+import java.net.URL;\r
+import java.nio.file.CopyOption;\r
+import java.nio.file.DirectoryStream;\r
+import java.nio.file.Files;\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+import java.nio.file.StandardCopyOption;\r
+import java.text.SimpleDateFormat;\r
+import java.util.Arrays;\r
+import java.util.Calendar;\r
+import java.util.Collection;\r
+import java.util.Date;\r
+import java.util.HashMap;\r
+import java.util.HashSet;\r
+import java.util.Iterator;\r
+import java.util.List;\r
+import java.util.Map;\r
+import java.util.Set;\r
+import java.util.TreeMap;\r
+\r
+import javax.xml.parsers.DocumentBuilder;\r
+import javax.xml.parsers.DocumentBuilderFactory;\r
+\r
+import org.apache.commons.lang.StringUtils;\r
+import org.apache.http.HttpEntity;\r
+import org.apache.http.HttpResponse;\r
+import org.apache.http.auth.AuthScope;\r
+import org.apache.http.auth.UsernamePasswordCredentials;\r
+import org.apache.http.client.methods.HttpPost;\r
+import org.apache.http.entity.StringEntity;\r
+import org.apache.http.impl.client.DefaultHttpClient;\r
+import org.apache.http.params.BasicHttpParams;\r
+import org.apache.http.params.HttpConnectionParams;\r
+import org.apache.http.params.HttpParams;\r
+import org.apache.http.protocol.HTTP;\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+import org.apache.logging.log4j.Marker;\r
+import org.apache.logging.log4j.MarkerManager;\r
+import org.w3c.dom.Document;\r
+import org.w3c.dom.NamedNodeMap;\r
+import org.w3c.dom.Node;\r
+import org.w3c.dom.NodeList;\r
+import org.xml.sax.InputSource;\r
+\r
+import user.commons.configuration.SystemConfiguration;\r
+\r
+public class PBQuery {\r
+ public class MMMedia {\r
+ private final String name;\r
+ private final String usage;\r
+\r
+ MMMedia(String name, String usage) {\r
+ this.name = name;\r
+ this.usage = usage;\r
+\r
+ }\r
+\r
+ public String getName() {\r
+ return name;\r
+ }\r
+\r
+ public String getUsage() {\r
+ return usage;\r
+ }\r
+ }\r
+\r
+ private static final Logger logger = LogManager.getLogger();\r
+ private Marker subtitleMarker = MarkerManager.getMarker("MISSING-SUBTITLE");\r
+ private static final int CONNECTION_TIMEOUT = 5000;\r
+ private static final int SOCKET_TIMEOUT = 5000;\r
+ public static final String GETMEDIAUSAGEBYUTRANGE = "/getMediaUsageByUTRange";\r
+ public static final String GETCUSTOMVIEW = "/getCustomView";\r
+\r
+ private static final Path subtitleRoot = Paths.get("X:\\PB_ARCH");\r
+ private static final Path missingSubsRoot = Paths.get("R:\\BeachPool");\r
+ private Set<Path> subsDirectoriesList;\r
+\r
+ private static Document toDocument(String xml) {\r
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();\r
+ DocumentBuilder builder = null;\r
+ try {\r
+ builder = factory.newDocumentBuilder();\r
+ Document doc = builder.parse(new InputSource(new StringReader(xml)));\r
+ return doc;\r
+ } catch (Exception e) {\r
+ logger.error(e.getMessage());\r
+ }\r
+ return null;\r
+ }\r
+\r
+ private SimpleDateFormat sdf_range = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss:'00'");\r
+ private String primaryEndPoint;\r
+ private String primaryUserName;\r
+ private String primaryPassword;\r
+ private String secondaryEndPoint;\r
+ private String secondaryUserName;\r
+\r
+ private String secondaryPassword;\r
+\r
+ private int rangeForwardHours;\r
+\r
+ private String getAttribute(Node node, String name) {\r
+ String result = null;\r
+ if (node != null && node.hasAttributes()) {\r
+ NamedNodeMap attributes = node.getAttributes();\r
+ if (attributes != null) {\r
+ Node mediaNameNode = attributes.getNamedItem(name);\r
+ if (mediaNameNode != null)\r
+ result = mediaNameNode.getNodeValue();\r
+ }\r
+ }\r
+ return result;\r
+ }\r
+\r
+ public Collection<MMMedia> getPossibelMissingMaterialNames(List<String> poolContent) throws Exception {\r
+ Map<String, MMMedia> result = querySortableMedias(poolContent);\r
+ queryOtherMedias(poolContent, result);\r
+\r
+ TreeMap<String, MMMedia> sortedUsages = new TreeMap<>();\r
+ for (MMMedia m : result.values()) {\r
+ // a TreeMap lehetove teszi: nincs duplikatum + a korabbi musorok elore kerulnek\r
+ sortedUsages.put(m.getUsage() + "." + m.getName(), m);\r
+ }\r
+\r
+ return sortedUsages.values();\r
+\r
+ }\r
+\r
+ private Path getSOAPTemplate(String viewName) throws FileNotFoundException {\r
+ String configDir = SystemConfiguration.getInstance().getConfig("settings/soap");\r
+ logger.info("Loading template {} from {}", viewName, configDir);\r
+ return Paths.get(configDir, viewName);\r
+ }\r
+\r
+ public void init(String primaryEndPoint, String primaryUserName, String primaryPassword, String secondaryEndPoint,\r
+ String secondaryUserName, String secondaryPassword, int rangeForwardHours) throws Exception {\r
+ this.primaryEndPoint = primaryEndPoint;\r
+ this.primaryUserName = primaryUserName;\r
+ this.primaryPassword = primaryPassword;\r
+ this.secondaryEndPoint = secondaryEndPoint;\r
+ this.secondaryUserName = secondaryUserName;\r
+ this.secondaryPassword = secondaryPassword;\r
+ this.rangeForwardHours = rangeForwardHours;\r
+ this.subsDirectoriesList = readSubtileDirectoriesList(subtitleRoot);\r
+ }\r
+\r
+ private void putEarliest(Map<String, MMMedia> result, String mediaName, String usageTime) {\r
+ if (result.containsKey(mediaName)) {\r
+ MMMedia m = result.get(mediaName);\r
+ // az aktualis a korabbi idopont\r
+ if (usageTime.compareTo(m.getUsage()) < 0)\r
+ result.put(mediaName, new MMMedia(mediaName, usageTime));\r
+ } else\r
+ result.put(mediaName, new MMMedia(mediaName, usageTime));\r
+ }\r
+\r
+ public String query(String endPoint, String action, String soap, String user, String pwd) throws Exception {\r
+\r
+ HttpParams httpParameters = new BasicHttpParams();\r
+ HttpConnectionParams.setConnectionTimeout(httpParameters, CONNECTION_TIMEOUT);\r
+ HttpConnectionParams.setSoTimeout(httpParameters, SOCKET_TIMEOUT);\r
+ DefaultHttpClient httpclient = new DefaultHttpClient(httpParameters);\r
+ // http://10.170.100.61:18083\r
+\r
+ String result = null;\r
+ DataInputStream is = null;\r
+ try {\r
+ URL url = new URL(endPoint);\r
+ httpclient.getCredentialsProvider().setCredentials(\r
+ new AuthScope(url.getHost(), url.getPort(), null, "Digest"),\r
+ new UsernamePasswordCredentials(user, pwd));\r
+\r
+ HttpPost httppost = new HttpPost(url.toURI());\r
+ httppost.setHeader("soapaction", action);\r
+ // Content-Type application/soap+xml; charset=utf-8;\r
+ // action="/getMediaUsageByUTRange"\r
+ httppost.setHeader("Content-Type", "text/xml; charset=utf-8");\r
+ HttpEntity entity = new StringEntity(soap.toString(), HTTP.UTF_8);\r
+ httppost.setEntity(entity);\r
+ logger.info("Executing call {}", action);\r
+ HttpResponse response = httpclient.execute(httppost);// calling server\r
+ HttpEntity r_entity = response.getEntity(); // get response\r
+ // Header[] headers = response.getAllHeaders();\r
+ // for (Header h : headers) {\r
+ // logger.info("Reponse Header", h.getName() + ": " + h.getValue());\r
+ // }\r
+ if (r_entity != null) {\r
+ byte[] bytes = new byte[(int) r_entity.getContentLength()];\r
+ if (r_entity.isStreaming()) {\r
+ is = new DataInputStream(r_entity.getContent());\r
+ is.readFully(bytes);\r
+ }\r
+ result = new String(bytes);\r
+ }\r
+ } catch (Exception e) {\r
+ logger.error("Exception while connecting to endpoint {}. System message is: {}", e.getMessage());\r
+ throw e;\r
+ } finally {\r
+ if (is != null) {\r
+ try {\r
+ is.close();\r
+ } catch (IOException e) {\r
+ }\r
+ }\r
+ if (httpclient != null) {\r
+ httpclient.getConnectionManager().shutdown();\r
+ }\r
+ }\r
+\r
+ return result;\r
+ }\r
+\r
+ public void queryOtherMedias(List<String> poolContent, Map<String, MMMedia> result) throws Exception {\r
+ String xml = null;\r
+ String soap = null;\r
+\r
+ Path template = getSOAPTemplate(GETCUSTOMVIEW);\r
+\r
+ if (!template.toFile().exists())\r
+ throw new FileNotFoundException(template.toString());\r
+ try {\r
+ soap = new String(Files.readAllBytes(template));\r
+ xml = query(primaryEndPoint, GETCUSTOMVIEW, soap, primaryUserName, primaryPassword);\r
+ } catch (Exception e1) {\r
+ try {\r
+ xml = query(secondaryEndPoint, GETCUSTOMVIEW, soap, secondaryUserName, secondaryPassword);\r
+ } catch (Exception e2) {\r
+ }\r
+ }\r
+\r
+ if (StringUtils.isBlank(xml)) {\r
+ logger.info("Query result is empty");\r
+ return;\r
+ }\r
+\r
+ Document document = toDocument(xml);\r
+ NodeList mediaNodes = document.getElementsByTagName("media");\r
+\r
+ if (mediaNodes == null || mediaNodes.getLength() == 0)\r
+ return;\r
+\r
+ for (int i = 0; i < mediaNodes.getLength(); i++) {\r
+ Node mediaNode = mediaNodes.item(i);\r
+ String mediaName = getAttribute(mediaNode, "mediaName");\r
+ if (StringUtils.isBlank(mediaName)) {\r
+ continue;\r
+ }\r
+\r
+ String usageType = getAttribute(mediaNode, "UsageType");\r
+ if (!"PrimaryVideo".equals(usageType) && !"Live".equals(usageType))\r
+ logger.info(subtitleMarker, "queryOtherMedias: {}, {}", usageType, mediaName);\r
+\r
+ if (poolContent.contains(mediaName))\r
+ continue;\r
+\r
+ String usageTime = getAttribute(mediaNode, "earliestUsageTime");\r
+ putEarliest(result, mediaName, usageTime);\r
+ }\r
+\r
+ logger.info("Document done, items {}", mediaNodes.getLength());\r
+\r
+ }\r
+\r
+ public Map<String, MMMedia> querySortableMedias(List<String> poolContent) throws Exception {\r
+ Map<String, MMMedia> result = new HashMap<>();\r
+\r
+ String xml = null;\r
+ String soap = null;\r
+\r
+ Path template = getSOAPTemplate(GETMEDIAUSAGEBYUTRANGE);\r
+\r
+ if (!template.toFile().exists())\r
+ throw new FileNotFoundException(template.toString());\r
+\r
+ try {\r
+ long now = System.currentTimeMillis();\r
+ Calendar cal = Calendar.getInstance();\r
+ cal.setTimeInMillis(now);\r
+ cal.add(Calendar.HOUR_OF_DAY, rangeForwardHours);\r
+\r
+ String fromDateStr = sdf_range.format(new Date(now));\r
+ String toDateStr = sdf_range.format(cal.getTime());\r
+\r
+ soap = new String(Files.readAllBytes(template));\r
+ soap = soap.replace("{start}", fromDateStr);\r
+ soap = soap.replace("{end}", toDateStr);\r
+\r
+ xml = query(primaryEndPoint, GETMEDIAUSAGEBYUTRANGE, soap, primaryUserName, primaryPassword);\r
+ } catch (Exception e1) {\r
+ try {\r
+ xml = query(secondaryEndPoint, GETMEDIAUSAGEBYUTRANGE, soap, secondaryUserName, secondaryPassword);\r
+ } catch (Exception e2) {\r
+ }\r
+ }\r
+\r
+ if (StringUtils.isBlank(xml)) {\r
+ logger.info("Query result is empty");\r
+ return result;\r
+ }\r
+\r
+ Document document = toDocument(xml);\r
+ NodeList mediaNodes = document.getElementsByTagName("mediaUsage");\r
+\r
+ if (mediaNodes == null || mediaNodes.getLength() == 0)\r
+ return result;\r
+\r
+ for (int i = 0; i < mediaNodes.getLength(); i++) {\r
+ Node mediaNode = mediaNodes.item(i);\r
+ String mediaName = getAttribute(mediaNode, "mediaName");\r
+ String mediaType = getAttribute(mediaNode, "mediaType");\r
+ if (StringUtils.isBlank(mediaName))\r
+ continue;\r
+\r
+ if (StringUtils.equals("Subtitle", mediaType)) {\r
+ logger.info(this.subtitleMarker, "Missing subtitle: {}", mediaName);\r
+\r
+ try {\r
+ this.copyMissingSubtitle(mediaName + ".stl");\r
+ } catch (Exception e) {\r
+ logger.error(this.subtitleMarker, e.getMessage());\r
+ }\r
+\r
+ continue;\r
+ }\r
+\r
+ if (!StringUtils.equals("Video", mediaType))\r
+ continue;\r
+\r
+ if (poolContent.contains(mediaName))\r
+ continue;\r
+\r
+ Node usageChild = mediaNode.getFirstChild();\r
+ if (usageChild == null) {\r
+ logger.info("Skipping {}, no media usage defined", mediaName);\r
+ continue;\r
+ }\r
+\r
+ NodeList usageNodes = usageChild.getChildNodes();\r
+ if (usageNodes == null || usageNodes.getLength() == 0) {\r
+ logger.info("Skipping {}, no media usage defined", mediaName);\r
+ continue;\r
+ }\r
+\r
+ for (int j = 0; j < usageNodes.getLength(); j++) {\r
+ Node mediaUsageNode = usageNodes.item(j);\r
+ String usageTime = getAttribute(mediaUsageNode, "earliestUsageTime");\r
+ logger.info("{}, {}", mediaName, usageTime);\r
+ putEarliest(result, mediaName, usageTime);\r
+ }\r
+\r
+ }\r
+\r
+ return result;\r
+ }\r
+\r
+ private Set<Path> readSubtileDirectoriesList(Path root) {\r
+ Set<Path> result = new HashSet<>();\r
+ DirectoryStream<Path> stream = null;\r
+ try {\r
+ stream = Files.newDirectoryStream(Paths.get(root.toString()));\r
+ Iterator<Path> dirIterator = stream.iterator();\r
+\r
+ while (dirIterator.hasNext()) {\r
+ Path path = dirIterator.next();\r
+ if (Files.isDirectory(path)) {\r
+ result.add(path);\r
+ logger.info(this.subtitleMarker, "Detected subtitle root {}", path);\r
+ }\r
+ }\r
+ } catch (Exception e) {\r
+ logger.error(this.subtitleMarker, e.getMessage());\r
+ } finally {\r
+ try {\r
+ if (stream != null)\r
+ stream.close();\r
+ } catch (IOException e) {\r
+ }\r
+\r
+ }\r
+ return result;\r
+ }\r
+\r
+ private void copyMissingSubtitle(String subtitleName) throws Exception {\r
+ boolean found = false;\r
+ for (Path subtitleDir : this.subsDirectoriesList) {\r
+ Path source = Paths.get(subtitleDir.toString(), new String[] { subtitleName });\r
+ if (source.toFile().exists()) {\r
+ found = true;\r
+ logger.info(this.subtitleMarker, "Found missing {}", source);\r
+ Path target = Paths.get(missingSubsRoot.toString(), new String[] { subtitleName });\r
+ if (target.toFile().exists())\r
+ logger.info(this.subtitleMarker, "Missing subtitle {} already exists, overriding", target);\r
+ Files.copy(source, target, new CopyOption[] { StandardCopyOption.REPLACE_EXISTING });\r
+ boolean isContentEquals = Arrays.equals(Files.readAllBytes(source), Files.readAllBytes(target));\r
+ if (isContentEquals) {\r
+ logger.info(this.subtitleMarker, "Successfully copied {}", target);\r
+ break;\r
+ }\r
+ logger.error(this.subtitleMarker, "Source {} and target {} content are not equals", source, target);\r
+ break;\r
+ }\r
+ }\r
+ if (!found)\r
+ logger.warn(this.subtitleMarker, "Can't find missing {}", subtitleName);\r
+ }\r
+}\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate multiInstance="true" useSessionLog="false">\r
+ <declarations>\r
+ <parameters>\r
+ <parameter name="sourceStoreUri" type="user.commons.StoreUri"/>\r
+ <parameter name="tsmFileName" type="java.lang.String"/>\r
+ <parameter name="fileName" type="java.lang.String"/>\r
+ <parameter name="tempStoreUri" type="user.commons.StoreUri"/>\r
+ <parameter name="targetStoreUri" type="user.commons.StoreUri"/>\r
+ <parameter name="expectedFrameNumber" type="java.lang.Long"/>\r
+ <parameter name="expectedSize" type="java.lang.Long"/>\r
+ <parameter name="expectedColorSpace" type="java.lang.String"/>\r
+ <parameter name="escortFile" type="java.lang.String"/>\r
+ </parameters>\r
+ </declarations>\r
+ <commands>\r
+ <calljobstep type="TSMTransferFromStep.java" weight="5">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="sourceStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="tsmFileName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="tempStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="fileName" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ <calljobstep type="FileValidatorStep.java" weight="1">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="tempStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="fileName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="expectedFrameNumber" />\r
+ </input>\r
+ <input>\r
+ <parameter name="expectedSize" />\r
+ </input>\r
+ <input>\r
+ <parameter name="expectedColorSpace" />\r
+ </input>\r
+ <input>\r
+ <parameter name="escortFile" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ <calljobstep type="FILEZILLA_AVIDTransferToStep.java" weight="5">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="tempStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="fileName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="targetStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="fileName" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ <calljobstep type="NEXIOMetadataPersisterStep.java" weight="5">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="targetStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="escortFile" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ <calljobstep type="FileCleanupStep.java" weight="1">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="tempStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="fileName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="escortFile" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ </commands>\r
+</jobtemplate>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate multiInstance="true" useSessionLog="false">\r
+ <declarations>\r
+ <parameters>\r
+ <parameter name="sourceStoreUri" type="user.commons.StoreUri"/>\r
+ <parameter name="fileName" type="java.lang.String"/>\r
+ <parameter name="tempStoreUri" type="user.commons.StoreUri"/>\r
+ <parameter name="targetStoreUri" type="user.commons.StoreUri"/>\r
+ <parameter name="expectedFrameNumber" type="java.lang.Long"/>\r
+ <parameter name="expectedSize" type="java.lang.Long"/>\r
+ <parameter name="expectedColorSpace" type="java.lang.String"/>\r
+ <parameter name="escortFile" type="java.lang.String"/>\r
+ </parameters>\r
+ </declarations>\r
+ <commands>\r
+ <calljobstep type="TransferStep.java" weight="5">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="sourceStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="fileName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="tempStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="fileName" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ <calljobstep type="FileValidatorStep.java" weight="1">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="tempStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="fileName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="expectedFrameNumber" />\r
+ </input>\r
+ <input>\r
+ <parameter name="expectedSize" />\r
+ </input>\r
+ <input>\r
+ <parameter name="expectedColorSpace" />\r
+ </input>\r
+ <input>\r
+ <parameter name="escortFile" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ <calljobstep type="TSMTransferToStep.java" weight="5">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="tempStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="fileName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="targetStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="fileName" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ <calljobstep type="MetadataPersisterStep.java" weight="1">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="targetStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="escortFile" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ <calljobstep type="FileCleanupStep.java" weight="1">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="tempStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="fileName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="escortFile" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ </commands>\r
+</jobtemplate>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate multiInstance="true" useSessionLog="false">\r
+ <declarations>\r
+ <parameters>\r
+ <parameter name="sourceStoreUri" type="user.commons.StoreUri"/>\r
+ <parameter name="tsmFileName" type="java.lang.String"/>\r
+ <parameter name="fileName" type="java.lang.String"/>\r
+ <parameter name="tempStoreUri" type="user.commons.StoreUri"/>\r
+ <parameter name="targetStoreUri" type="user.commons.StoreUri"/>\r
+ <parameter name="expectedFrameNumber" type="java.lang.Long"/>\r
+ <parameter name="expectedSize" type="java.lang.Long"/>\r
+ <parameter name="expectedColorSpace" type="java.lang.String"/>\r
+ <parameter name="escortFile" type="java.lang.String"/>\r
+ </parameters>\r
+ </declarations>\r
+ <commands>\r
+ <calljobstep type="TSMTransferFromStep.java" weight="5">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="sourceStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="tsmFileName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="tempStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="fileName" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ <calljobstep type="FileValidatorStep.java" weight="1">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="tempStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="fileName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="expectedFrameNumber" />\r
+ </input>\r
+ <input>\r
+ <parameter name="expectedSize" />\r
+ </input>\r
+ <input>\r
+ <parameter name="expectedColorSpace" />\r
+ </input>\r
+ <input>\r
+ <parameter name="escortFile" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ <calljobstep type="FILEZILLA_PASARESTORETransferToStep.java" weight="5">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="tempStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="fileName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="targetStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="fileName" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ <calljobstep type="NEXIOMetadataPersisterStep.java" weight="5">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="targetStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="escortFile" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ <calljobstep type="FileCleanupStep.java" weight="1">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="tempStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="fileName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="escortFile" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ </commands>\r
+</jobtemplate>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate multiInstance="true" useSessionLog="false">\r
+ <declarations>\r
+ <parameters>\r
+ <parameter name="sourceStoreUri" type="user.commons.StoreUri"/>\r
+ <parameter name="fileName" type="java.lang.String"/>\r
+ <parameter name="tempStoreUri" type="user.commons.StoreUri"/>\r
+ <parameter name="targetStoreUri" type="user.commons.StoreUri"/>\r
+ <parameter name="expectedFrameNumber" type="java.lang.Long"/>\r
+ <parameter name="expectedSize" type="java.lang.Long"/>\r
+ <parameter name="expectedColorSpace" type="java.lang.String"/>\r
+ <parameter name="escortFile" type="java.lang.String"/>\r
+ </parameters>\r
+ </declarations>\r
+ <commands>\r
+ <calljobstep type="NEXIO1TransferFromStep.java" weight="5">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="sourceStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="fileName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="tempStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="fileName" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ <calljobstep type="FileValidatorStep.java" weight="1">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="tempStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="fileName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="expectedFrameNumber" />\r
+ </input>\r
+ <input>\r
+ <parameter name="expectedSize" />\r
+ </input>\r
+ <input>\r
+ <parameter name="expectedColorSpace" />\r
+ </input>\r
+ <input>\r
+ <parameter name="escortFile" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ <calljobstep type="TSMTransferToStep.java" weight="5">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="tempStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="fileName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="targetStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="fileName" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ <calljobstep type="MetadataPersisterStep.java" weight="5">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="targetStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="escortFile" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ <calljobstep type="FileCleanupStep.java" weight="5">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="tempStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="fileName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="escortFile" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ </commands>\r
+</jobtemplate>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate multiInstance="true" useSessionLog="false">\r
+ <declarations>\r
+ <parameters>\r
+ <parameter name="sourceStoreUri" type="user.commons.StoreUri"/>\r
+ <parameter name="tsmFileName" type="java.lang.String"/>\r
+ <parameter name="fileName" type="java.lang.String"/>\r
+ <parameter name="tempStoreUri" type="user.commons.StoreUri"/>\r
+ <parameter name="targetStoreUri" type="user.commons.StoreUri"/>\r
+ <parameter name="expectedFrameNumber" type="java.lang.Long"/>\r
+ <parameter name="expectedSize" type="java.lang.Long"/>\r
+ <parameter name="expectedColorSpace" type="java.lang.String"/>\r
+ <parameter name="escortFile" type="java.lang.String"/>\r
+ </parameters>\r
+ </declarations>\r
+ <commands>\r
+ <calljobstep type="TSMTransferFromStep.java" weight="5">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="sourceStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="tsmFileName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="tempStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="fileName" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ <calljobstep type="FileValidatorStep.java" weight="1">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="tempStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="fileName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="expectedFrameNumber" />\r
+ </input>\r
+ <input>\r
+ <parameter name="expectedSize" />\r
+ </input>\r
+ <input>\r
+ <parameter name="expectedColorSpace" />\r
+ </input>\r
+ <input>\r
+ <parameter name="escortFile" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ <calljobstep type="NEXIO1TransferToStep.java" weight="5">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="tempStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="fileName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="targetStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="fileName" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ <calljobstep type="NEXIOMetadataPersisterStep.java" weight="5">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="targetStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="escortFile" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ <calljobstep type="FileCleanupStep.java" weight="1">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="tempStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="fileName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="escortFile" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ </commands>\r
+</jobtemplate>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate multiInstance="true" useSessionLog="false">\r
+ <declarations>\r
+ <parameters>\r
+ <parameter name="sourceStoreUri" type="user.commons.StoreUri"/>\r
+ <parameter name="fileName" type="java.lang.String"/>\r
+ <parameter name="tempStoreUri" type="user.commons.StoreUri"/>\r
+ <parameter name="targetStoreUri" type="user.commons.StoreUri"/>\r
+ <parameter name="expectedFrameNumber" type="java.lang.Long"/>\r
+ <parameter name="expectedSize" type="java.lang.Long"/>\r
+ <parameter name="expectedColorSpace" type="java.lang.String"/>\r
+ <parameter name="escortFile" type="java.lang.String"/>\r
+ </parameters>\r
+ </declarations>\r
+ <commands>\r
+ <calljobstep type="NEXIO2TransferFromStep.java" weight="5">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="sourceStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="fileName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="tempStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="fileName" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ <calljobstep type="FileValidatorStep.java" weight="1">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="tempStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="fileName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="expectedFrameNumber" />\r
+ </input>\r
+ <input>\r
+ <parameter name="expectedSize" />\r
+ </input>\r
+ <input>\r
+ <parameter name="expectedColorSpace" />\r
+ </input>\r
+ <input>\r
+ <parameter name="escortFile" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ <calljobstep type="TSMTransferToStep.java" weight="5">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="tempStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="fileName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="targetStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="fileName" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ <calljobstep type="MetadataPersisterStep.java" weight="5">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="targetStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="escortFile" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ <calljobstep type="FileCleanupStep.java" weight="5">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="tempStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="fileName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="escortFile" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ </commands>\r
+</jobtemplate>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate multiInstance="true" useSessionLog="false">\r
+ <declarations>\r
+ <parameters>\r
+ <parameter name="sourceStoreUri" type="user.commons.StoreUri"/>\r
+ <parameter name="tsmFileName" type="java.lang.String"/>\r
+ <parameter name="fileName" type="java.lang.String"/>\r
+ <parameter name="tempStoreUri" type="user.commons.StoreUri"/>\r
+ <parameter name="targetStoreUri" type="user.commons.StoreUri"/>\r
+ <parameter name="expectedFrameNumber" type="java.lang.Long"/>\r
+ <parameter name="expectedSize" type="java.lang.Long"/>\r
+ <parameter name="expectedColorSpace" type="java.lang.String"/>\r
+ <parameter name="escortFile" type="java.lang.String"/>\r
+ </parameters>\r
+ </declarations>\r
+ <commands>\r
+ <calljobstep type="TSMTransferFromStep.java" weight="5">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="sourceStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="tsmFileName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="tempStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="fileName" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ <calljobstep type="FileValidatorStep.java" weight="1">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="tempStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="fileName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="expectedFrameNumber" />\r
+ </input>\r
+ <input>\r
+ <parameter name="expectedSize" />\r
+ </input>\r
+ <input>\r
+ <parameter name="expectedColorSpace" />\r
+ </input>\r
+ <input>\r
+ <parameter name="escortFile" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ <calljobstep type="NEXIO2TransferToStep.java" weight="5">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="tempStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="fileName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="targetStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="fileName" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ <calljobstep type="NEXIOMetadataPersisterStep.java" weight="5">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="targetStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="escortFile" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ <calljobstep type="FileCleanupStep.java" weight="1">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="tempStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="fileName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="escortFile" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ </commands>\r
+</jobtemplate>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate multiInstance="true" useSessionLog="false">\r
+ <declarations>\r
+ <parameters>\r
+ <parameter name="sourceStoreUri" type="user.commons.StoreUri"/>\r
+ <parameter name="tsmFileName" type="java.lang.String"/>\r
+ <parameter name="fileName" type="java.lang.String"/>\r
+ <parameter name="tempStoreUri" type="user.commons.StoreUri"/>\r
+ <parameter name="targetStoreUri" type="user.commons.StoreUri"/>\r
+ <parameter name="expectedFrameNumber" type="java.lang.Long"/>\r
+ <parameter name="expectedSize" type="java.lang.Long"/>\r
+ <parameter name="expectedColorSpace" type="java.lang.String"/>\r
+ <parameter name="escortFile" type="java.lang.String"/>\r
+ </parameters>\r
+ </declarations>\r
+ <commands>\r
+ <calljobstep type="TSMTransferFromStep.java" weight="5">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="sourceStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="tsmFileName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="tempStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="fileName" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ <calljobstep type="FileValidatorStep.java" weight="1">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="tempStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="fileName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="expectedFrameNumber" />\r
+ </input>\r
+ <input>\r
+ <parameter name="expectedSize" />\r
+ </input>\r
+ <input>\r
+ <parameter name="expectedColorSpace" />\r
+ </input>\r
+ <input>\r
+ <parameter name="escortFile" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ <calljobstep type="PASAPOOLTransferToStep.java" weight="5">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="tempStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="fileName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="targetStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="fileName" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ <calljobstep type="NEXIOMetadataPersisterStep.java" weight="5">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="targetStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="escortFile" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ <calljobstep type="FileCleanupStep.java" weight="1">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="tempStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="fileName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="escortFile" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ </commands>\r
+</jobtemplate>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<!-- A PB ARCHIVE mappat vizsgalva, megkeresi azokat a fajlokat, amik archivalhatoak. Ezekre archivalasi bejegyzest keszit. -->\r
+<jobtemplate useSessionLog="false">\r
+<declarations>\r
+ <parameters>\r
+ <parameter name="sourceStoreName" type="java.lang.String"/>\r
+ <parameter name="escortStoreName" type="java.lang.String"/>\r
+ <parameter name="lastModifiedHours" type="java.lang.Integer"/>\r
+ </parameters>\r
+</declarations>\r
+<commands>\r
+ <calljobstep type="PBArchiveCheckerStep.java" weight="1">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="sourceStoreName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="escortStoreName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="lastModifiedHours" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+</commands>\r
+</jobtemplate>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate multiInstance="true" useSessionLog="false">\r
+ <declarations>\r
+ <parameters>\r
+ <parameter name="sourceStoreUri" type="user.commons.StoreUri"/>\r
+ <parameter name="fileName" type="java.lang.String"/>\r
+ <parameter name="tempStoreUri" type="user.commons.StoreUri"/>\r
+ <parameter name="targetStoreUri" type="user.commons.StoreUri"/>\r
+ <parameter name="expectedFrameNumber" type="java.lang.Long"/>\r
+ <parameter name="expectedSize" type="java.lang.Long"/>\r
+ <parameter name="expectedColorSpace" type="java.lang.String"/>\r
+ <parameter name="escortFile" type="java.lang.String"/>\r
+ </parameters>\r
+ </declarations>\r
+ <commands>\r
+ <calljobstep type="PBARCHIVETransferFromStep.java" weight="5">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="sourceStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="fileName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="tempStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="fileName" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ <calljobstep type="EscortFileUpdaterStep.java" weight="1">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="tempStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="fileName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="escortFile" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ <calljobstep type="TSMTransferToStep.java" weight="5">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="tempStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="fileName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="targetStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="fileName" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ <calljobstep type="MetadataPersisterStep.java" weight="5">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="targetStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="escortFile" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ <calljobstep type="FileCleanupStep.java" weight="5">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="tempStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="fileName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="escortFile" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ </commands>\r
+</jobtemplate>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate multiInstance="true" useSessionLog="false">\r
+ <declarations>\r
+ <parameters>\r
+ <parameter name="sourceStoreUri" type="user.commons.StoreUri"/>\r
+ <parameter name="tsmFileName" type="java.lang.String"/>\r
+ <parameter name="fileName" type="java.lang.String"/>\r
+ <parameter name="tempStoreUri" type="user.commons.StoreUri"/>\r
+ <parameter name="targetStoreUri" type="user.commons.StoreUri"/>\r
+ <parameter name="relativeTargetPath" type="java.lang.String"/>\r
+ <parameter name="expectedFrameNumber" type="java.lang.Long"/>\r
+ <parameter name="expectedSize" type="java.lang.Long"/>\r
+ <parameter name="expectedColorSpace" type="java.lang.String"/>\r
+ <parameter name="escortFile" type="java.lang.String"/>\r
+ </parameters>\r
+ </declarations>\r
+ <commands>\r
+ <calljobstep type="TSMTransferFromStep.java" weight="5">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="sourceStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="tsmFileName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="tempStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="fileName" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ <calljobstep type="FileValidatorStep.java" weight="1">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="tempStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="fileName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="expectedFrameNumber" />\r
+ </input>\r
+ <input>\r
+ <parameter name="expectedSize" />\r
+ </input>\r
+ <input>\r
+ <parameter name="expectedColorSpace" />\r
+ </input>\r
+ <input>\r
+ <parameter name="escortFile" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ <calljobstep type="VODTransferToStep.java" weight="5">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="tempStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="fileName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="targetStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="relativeTargetPath" />\r
+ </input>\r
+ <input>\r
+ <parameter name="fileName" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ <calljobstep type="FileCleanupStep.java" weight="1">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="tempStoreUri" />\r
+ </input>\r
+ <input>\r
+ <parameter name="fileName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="escortFile" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ </commands>\r
+</jobtemplate>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate multiInstance="true" useSessionLog="false">\r
+ <declarations>\r
+ <parameters>\r
+ <parameter name="param" type="java.lang.Integer" />\r
+ </parameters>\r
+ </declarations>\r
+ <commands>\r
+ <calljobstep remote="true" type="CancelableStep.java" weight="1" >\r
+ <inputs>\r
+ <input>\r
+ <parameter name="param" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ </commands>\r
+</jobtemplate>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate useSessionLog="false">\r
+ <declarations>\r
+ <parameters>\r
+ <parameter name="mediaCubeMedia" type="user.jobengine.db.Media" />\r
+ <parameter name="deleteSource" type="java.lang.Boolean"/>\r
+ <parameter name="killDateDays" type="java.lang.Integer"/>\r
+ <parameter name="successRecipient" type="java.lang.String" />\r
+ <parameter name="localHiresPath" type="java.lang.String" />\r
+ <parameter name="globalHiresPath" type="java.lang.String" />\r
+ <parameter name="localLowresPath" type="java.lang.String" />\r
+ <parameter name="transcoderAddress" type="java.lang.String" />\r
+ <parameter name="transcoderTemplateName" type="java.lang.String" />\r
+ <parameter name="localRetrievePath" type="java.lang.String" />\r
+ <parameter name="globalRetrievePath" type="java.lang.String" />\r
+ <parameter name="targetNamePattern" type="java.lang.String" />\r
+ </parameters>\r
+ <variables>\r
+ <variable name="archiveItem" type="user.jobengine.server.steps.ArchiveItem" />\r
+ </variables>\r
+ </declarations>\r
+ <commands>\r
+ <calljobstep type="user.jobengine.server.steps.CreateArchiveItemStep" weight="1">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="mediaCubeMedia" />\r
+ </input>\r
+ <input>\r
+ <parameter name="localHiresPath" />\r
+ </input>\r
+ </inputs>\r
+ <outputs>\r
+ <output>\r
+ <variable name="archiveItem" />\r
+ </output>\r
+ </outputs>\r
+ </calljobstep>\r
+ <calljobstep type="user.jobengine.server.steps.TSMRestoreStep" weight="1">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="mediaCubeMedia" />\r
+ </input>\r
+ <input>\r
+ <parameter name="localHiresPath" />\r
+ </input>\r
+ <input>\r
+ <parameter name="targetNamePattern" />\r
+ </input>\r
+ <input>\r
+ <parameter name="successRecipient" />\r
+ </input>\r
+ <input>\r
+ <parameter name="killDateDays" />\r
+ </input>\r
+ <input>\r
+ <parameter name="localRetrievePath" />\r
+ </input>\r
+ <input>\r
+ <parameter name="globalRetrievePath" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ <calljobstep type="user.jobengine.server.steps.MediaToolStep" weight="1">\r
+ <inputs>\r
+ <input>\r
+ <variable name="archiveItem" />\r
+ </input>\r
+ <input>\r
+ <parameter name="mediaCubeMedia" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ <calljobstep type="user.jobengine.server.steps.TranscodeFFAStranStep" weight="1">\r
+ <inputs>\r
+ <input>\r
+ <variable name="archiveItem" />\r
+ </input>\r
+ <input>\r
+ <parameter name="mediaCubeMedia" />\r
+ </input>\r
+ <input>\r
+ <parameter name="transcoderAddress" />\r
+ </input>\r
+ <input>\r
+ <parameter name="transcoderTemplateName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="globalHiresPath" />\r
+ </input>\r
+ <input>\r
+ <parameter name="localLowresPath" />\r
+ </input>\r
+ <input>\r
+ <parameter name="deleteSource" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ <calljobstep type="user.jobengine.server.steps.UpdateGhostMediaData" weight="1">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="mediaCubeMedia" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ </commands>\r
+</jobtemplate>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate useSessionLog="false">\r
+ <declarations>\r
+ <parameters>\r
+ <parameter name="sourceStoreName" type="java.lang.String" />\r
+ <parameter name="template" type="java.lang.String"/>\r
+ <parameter name="expectedColorSpace" type="java.lang.String"/>\r
+ <parameter name="limit" type="java.lang.Integer" />\r
+ </parameters>\r
+ </declarations>\r
+ <commands>\r
+ <calljobstep type="ForkDownloadStep.java" weight="1">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="sourceStoreName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="template" />\r
+ </input>\r
+ <input>\r
+ <parameter name="expectedColorSpace"/>\r
+ </input>\r
+ <input>\r
+ <parameter name="limit" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ </commands>\r
+</jobtemplate>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate useSessionLog="false">\r
+ <declarations>\r
+ <parameters>\r
+ <parameter name="sourceStoreName" type="java.lang.String" />\r
+ <parameter name="template" type="java.lang.String"/>\r
+ <parameter name="expectedColorSpace" type="java.lang.String"/>\r
+ <parameter name="limit" type="java.lang.Integer" />\r
+ </parameters>\r
+ </declarations>\r
+ <commands>\r
+ <calljobstep type="ForkUploadStep.java" weight="1">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="sourceStoreName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="template" />\r
+ </input>\r
+ <input>\r
+ <parameter name="expectedColorSpace" />\r
+ </input>\r
+ <input>\r
+ <parameter name="limit" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ </commands>\r
+</jobtemplate>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<!-- Egy server egy mappajat vegigolvasva, megkeresi azokat a fajlokat amik valtoztak, es a tarolo valamint a fajl nevebol kepez egy statusz fajlt. -->\r
+<jobtemplate multiInstance="true" useSessionLog="false">\r
+<declarations>\r
+ <parameters>\r
+ <parameter name="sourceStoreName" type="java.lang.String"/>\r
+ <parameter name="protocol" type="java.lang.String"/>\r
+ <parameter name="wildCard" type="java.lang.String"/>\r
+ <parameter name="escortStoreName" type="java.lang.String"/>\r
+ <parameter name="limit" type="java.lang.Integer"/>\r
+ </parameters>\r
+</declarations>\r
+<commands>\r
+ <calljobstep type="GenericArchiveCheckerStep.java" weight="1">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="sourceStoreName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="protocol" />\r
+ </input>\r
+ <input>\r
+ <parameter name="wildCard" />\r
+ </input>\r
+ <input>\r
+ <parameter name="escortStoreName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="limit" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+</commands>\r
+</jobtemplate>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<!-- A VIC fajlok tartalma alapjan a hianyzo media fajlok nevebol kepez statusz fajlokat. -->\r
+<jobtemplate useSessionLog="false">\r
+<declarations>\r
+ <parameters>\r
+ <parameter name="vicFiles" type="com.ibm.nosql.json.api.BasicDBList"/>\r
+ <parameter name="escortStoreName" type="java.lang.String"/>\r
+ <parameter name="targetStoreName" type="java.lang.String"/>\r
+ <parameter name="targetProtocol" type="java.lang.String"/>\r
+ </parameters>\r
+</declarations>\r
+<commands>\r
+ <calljobstep type="HarrisMissingMaterialCheckerStep.java" weight="1">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="vicFiles" />\r
+ </input>\r
+ <input>\r
+ <parameter name="escortStoreName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="targetStoreName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="targetProtocol" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+</commands>\r
+</jobtemplate>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<!-- A VIC fajlok tartalma alapjan a hianyzo media fajlok nevebol kepez statusz fajlokat. -->\r
+<jobtemplate useSessionLog="false">\r
+<declarations>\r
+ <parameters>\r
+ <parameter name="vicFiles" type="com.ibm.nosql.json.api.BasicDBList"/>\r
+ <parameter name="escortStoreName" type="java.lang.String"/>\r
+ <parameter name="targetStoreName" type="java.lang.String"/>\r
+ <parameter name="targetProtocol" type="java.lang.String"/>\r
+ </parameters>\r
+</declarations>\r
+<commands>\r
+ <calljobstep type="HarrisMissingMaterialCheckerStep.java" weight="1">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="vicFiles" />\r
+ </input>\r
+ <input>\r
+ <parameter name="escortStoreName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="targetStoreName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="targetProtocol" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+</commands>\r
+</jobtemplate>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<!-- A NEXIO server-t lekerdezve, megkeresi azokat a fajlokat amik valtoztak, es a tarolo valamint a fajl nevebol kepez egy statusz fajlt. -->\r
+<jobtemplate useSessionLog="false">\r
+<declarations>\r
+ <parameters>\r
+ <parameter name="sourceStoreName" type="java.lang.String"/>\r
+ <parameter name="escortStoreName" type="java.lang.String"/>\r
+ <parameter name="lastModifiedHours" type="java.lang.Integer"/>\r
+ </parameters>\r
+</declarations>\r
+<commands>\r
+ <calljobstep type="NEXIOArchiveCheckerStep.java" weight="1">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="sourceStoreName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="escortStoreName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="lastModifiedHours" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+</commands>\r
+</jobtemplate>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<!-- A NEXIO server-t lekerdezve, megkeresi azokat a fajlokat amik valtoztak, es a tarolo valamint a fajl nevebol kepez egy statusz fajlt. -->\r
+<jobtemplate useSessionLog="false">\r
+<declarations>\r
+ <parameters>\r
+ <parameter name="sourceStoreName" type="java.lang.String"/>\r
+ <parameter name="escortStoreName" type="java.lang.String"/>\r
+ <parameter name="lastModifiedHours" type="java.lang.Integer"/>\r
+ </parameters>\r
+</declarations>\r
+<commands>\r
+ <calljobstep type="NEXIOArchiveCheckerStep.java" weight="1">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="sourceStoreName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="escortStoreName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="lastModifiedHours" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+</commands>\r
+</jobtemplate>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<!-- A PB API hivasok alapjan a hianyzo media fajlok nevebol kepez statusz fajlokat. -->\r
+<jobtemplate useSessionLog="false">\r
+<declarations>\r
+ <parameters>\r
+ <parameter name="escortStoreName" type="java.lang.String"/>\r
+ <parameter name="lookupStoreNames" type="com.ibm.nosql.json.api.BasicDBList"/>\r
+ <parameter name="targetStoreName" type="java.lang.String"/>\r
+ <parameter name="targetProtocol" type="java.lang.String"/>\r
+ <parameter name="primaryEndPoint" type="java.lang.String"/>\r
+ <parameter name="primaryUserName" type="java.lang.String"/>\r
+ <parameter name="primaryPassword" type="java.lang.String"/>\r
+ <parameter name="secondaryEndPoint" type="java.lang.String"/>\r
+ <parameter name="secondaryUserName" type="java.lang.String"/>\r
+ <parameter name="secondaryPassword" type="java.lang.String"/>\r
+ <parameter name="rangeForwardHours" type="java.lang.Integer"/>\r
+ </parameters>\r
+</declarations>\r
+<commands>\r
+ <calljobstep type="PeableBeachMissingMaterialCheckerStep.java" weight="1">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="escortStoreName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="lookupStoreNames" />\r
+ </input>\r
+ <input>\r
+ <parameter name="targetStoreName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="targetProtocol" />\r
+ </input>\r
+ <input>\r
+ <parameter name="primaryEndPoint" />\r
+ </input>\r
+ <input>\r
+ <parameter name="primaryUserName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="primaryPassword" />\r
+ </input>\r
+ <input>\r
+ <parameter name="secondaryEndPoint" />\r
+ </input>\r
+ <input>\r
+ <parameter name="secondaryUserName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="secondaryPassword" />\r
+ </input>\r
+ <input>\r
+ <parameter name="rangeForwardHours" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+</commands>\r
+</jobtemplate>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate multiInstance="true" useSessionLog="false">\r
+ <declarations>\r
+ <parameters>\r
+ <parameter name="escortStoreName" type="java.lang.String" />\r
+ <parameter name="targetStoreName" type="java.lang.String"/>\r
+ <parameter name="basket" type="java.util.ArrayList" />\r
+ <parameter name="recipient" type="java.lang.String" />\r
+ </parameters>\r
+ </declarations>\r
+ <commands>\r
+ <calljobstep type="RegisterUserRestoreStep.java" weight="1">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="escortStoreName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="targetStoreName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="basket"/>\r
+ </input>\r
+ <input>\r
+ <parameter name="recipient" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ </commands>\r
+</jobtemplate>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate useSessionLog="false">\r
+ <declarations>\r
+ <parameters>\r
+ <parameter name="targetStoreName" type="java.lang.String" />\r
+ <parameter name="basket" type="com.ibm.nosql.json.api.BasicDBList" />\r
+ </parameters>\r
+ </declarations>\r
+ <commands>\r
+ <calljobstep type="RegisterVODRestoreStep.java" weight="1">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="targetStoreName"/>\r
+ </input>\r
+ <input>\r
+ <parameter name="basket"/>\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ </commands>\r
+</jobtemplate>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate useSessionLog="false">\r
+ <commands>\r
+ <calljobstep type="ServerStatusReportStep.java" weight="1" />\r
+ </commands>\r
+</jobtemplate>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate>\r
+ <declarations>\r
+ <parameters>\r
+ <parameter name="sourceFolder" type="java.lang.String" />\r
+ <parameter name="filter" type="java.lang.String" />\r
+ <parameter name="syncTarget" type="java.lang.String" />\r
+ </parameters>\r
+ <variables>\r
+ <variable name="files" type="java.util.List" />\r
+ </variables>\r
+ </declarations>\r
+ <commands>\r
+ <calljobstep remote="true" type="SubtitleFilesCollectorStep.java" weight="1" >\r
+ <inputs>\r
+ <input>\r
+ <parameter name="sourceFolder" />\r
+ </input>\r
+ <input>\r
+ <parameter name="filter" />\r
+ </input>\r
+ </inputs>\r
+ <outputs>\r
+ <output>\r
+ <variable name="files" />\r
+ </output>\r
+ </outputs>\r
+ </calljobstep>\r
+ <calljobstep remote="true" type="ArchiveSubtitlesStep.java" weight="4" >\r
+ <inputs>\r
+ <input>\r
+ <variable name="files" />\r
+ </input>\r
+ <input>\r
+ <parameter name="syncTarget" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ </commands>\r
+</jobtemplate>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate multiInstance="true" useSessionLog="false">\r
+<commands>\r
+ <calljobstep type="TestForkCancelableStep.java" weight="1" />\r
+</commands>\r
+</jobtemplate>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate>\r
+ <declarations>\r
+ <parameters>\r
+ <parameter name="source" type="java.lang.String"/>\r
+ </parameters>\r
+ </declarations>\r
+ <commands>\r
+ <calljobstep type="DirMXFValidatorStep.java" weight="1">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="source" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ </commands>\r
+</jobtemplate>
\ No newline at end of file
--- /dev/null
+datasource:\r
+ mediacube:\r
+ url: jdbc:db2://192.168.0.15:50000/mc\r
+ user: db2admin\r
+ password: password\r
+ external-indexer: false\r
+ simple-search: true\r
+ login-timeout: 3\r
+ pool-size: 10\r
+ mediacube-nosql:\r
+ url: jdbc:db2://192.168.0.15:50000/mc\r
+ user: db2admin\r
+ password: password\r
+ schema: test\r
+ login-timeout: 3\r
+services:\r
+ ffmpeg:\r
+ execurable-location: /opt/ffmpeg/ffmpeg \r
+ mediacube:\r
+ proxy-root: /opt\r
+ nexio:\r
+ host: 10.10.1.55\r
+ collection-name: nexioclips\r
+ use-mos-gateway: true\r
+ disabled: true\r
+jobs:\r
+ validate-transfers: false\r
+ copy-buffer-size: 32768\r
+ scheduled-execution-disabled: false\r
+tsm:\r
+ randomize-archives: false \r
+ delimiter: \\r
+ node-name: PASANODE\r
+ fs-name: NEXIO\r
+ alternate-fs-name: PASA\r
+ hl-name: \\r
+
\ No newline at end of file
--- /dev/null
+NODENAME pasanode\r
+TCPSERVERADDRESS 192.168.0.9\r
+passwordaccess generate\r
+\r
+commmethod TCPIP\r
+tcpport 1500\r
--- /dev/null
+<?xml version="1.0"?>
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">
+
+<Configure id="Server" class="org.eclipse.jetty.server.Server">
+ <Call name="addConnector">
+ <Arg>
+ <New class="org.eclipse.jetty.server.ServerConnector">
+ <Arg name="server">
+ <Ref refid="Server" />
+ </Arg>
+ <Set name="port">
+ <Property name="jetty.http.port" default="80" />
+ </Set>
+ </New>
+ </Arg>
+ </Call>
+
+ <Set name="handler">
+ <New id="Handlers"
+ class="org.eclipse.jetty.server.handler.HandlerCollection">
+ <Set name="handlers">
+ <Array type="org.eclipse.jetty.server.Handler">
+ <Item>
+ <New id="Contexts"
+ class="org.eclipse.jetty.server.handler.ContextHandlerCollection" />
+ </Item>
+ <Item>
+ <New id="DefaultHandler"
+ class="org.eclipse.jetty.server.handler.DefaultHandler" />
+ </Item>
+ </Array>
+ </Set>
+ </New>
+ </Set>
+</Configure>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<Configuration status="ERROR" monitorInterval="10" packages="user.commons.log4j2.appender">\r
+ <Properties>\r
+ <Property name="logPath">log</Property>\r
+ <Property name="fileName">${logPath}/mediacube.log</Property>\r
+ <Property name="filePattern">${logPath}/$${date:yyyy-MM}/mediacube-%d{MM-dd-yyyy}-%i.log.gz</Property>\r
+ <Property name="markeredFileName">${logPath}/markered-mediacube.log</Property>\r
+ <Property name="markeredFilePattern">${logPath}/$${date:yyyy-MM}/markered-mediacube-%d{MM-dd-yyyy}-%i.log.gz</Property>\r
+ <Property name="fileName.err">${logPath}/mediacube-err.log</Property>\r
+ <Property name="filePattern.err">${logPath}/$${date:yyyy-MM}/mediacube-err-%d{MM-dd-yyyy}-%i.log.gz</Property>\r
+ </Properties>\r
+ <Appenders>\r
+ <File name="MediaProfile" fileName="${logPath}/mediaprofile.log">\r
+ <Filters>\r
+ <MarkerFilter marker="MEDIAPROFILE" onMatch="ACCEPT" onMismatch="DENY" />\r
+ </Filters>\r
+ <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %msg%n" />\r
+ </File>\r
+ <File name="MissingSubtitle" fileName="${logPath}/missingsubtitle.log">\r
+ <Filters>\r
+ <MarkerFilter marker="MISSING-SUBTITLE" onMatch="ACCEPT" onMismatch="DENY" />\r
+ </Filters>\r
+ <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %msg%n" />\r
+ </File>\r
+ \r
+ <Console name="Console" target="SYSTEM_OUT">\r
+ <Filters>\r
+ <MarkerFilter marker="MEDIACUBE" onMatch="DENY" onMismatch="NEUTRAL" />\r
+ </Filters>\r
+ <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{1}.%M - %msg (%F:%L) %n" />\r
+ </Console>\r
+ <Console name="MarkeredConsole" target="SYSTEM_ERR">\r
+ <Filters>\r
+ <MarkerFilter marker="MEDIACUBE" onMatch="ACCEPT" onMismatch="DENY" />\r
+ </Filters>\r
+ <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{1}.%M - %markerSimpleName - %msg (%F:%L)%n" />\r
+ </Console>\r
+ <HTMLMailAppender name="MarkeredMail" subject="MediaCube rendszerüzenet" to="vasary@elgekko.net" from="broadcast.service-ce@amcnetworks.com" smtpHost="10.160.60.165"\r
+ smtpPort="125" smtpProtocol="smtp" smtpDebug="false" ignoreExceptions="false" bufferSize="1">\r
+ <Filters>\r
+ <MarkerFilter marker="MEDIACUBE" onMatch="ACCEPT" onMismatch="DENY" />\r
+ </Filters>\r
+ <PatternLayout pattern="%d{HH:mm:ss} %-5level - %msg %n" />\r
+ </HTMLMailAppender>\r
+ <RollingFile name="MarkeredRollingFile" fileName="${markeredFileName}" filePattern="${markeredFilePattern}">\r
+ <Filters>\r
+ <MarkerFilter marker="MEDIACUBE FILELOG" onMatch="ACCEPT" onMismatch="DENY" />\r
+ </Filters>\r
+ <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{1}.%M - %msg (%F:%L)%n %throwable" />\r
+ <Policies>\r
+ <TimeBasedTriggeringPolicy />\r
+ </Policies>\r
+ </RollingFile>\r
+ <RollingFile name="MarkeredRollingFile1" fileName="${logPath}/nexio1-archive-checker.log" filePattern="${markeredFilePattern}">\r
+ <Filters>\r
+ <MarkerFilter marker="NEXIO1 archiválás előkészítése" onMatch="ACCEPT" onMismatch="DENY" />\r
+ </Filters>\r
+ <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %msg %n %throwable" />\r
+ <Policies>\r
+ <TimeBasedTriggeringPolicy />\r
+ </Policies>\r
+ </RollingFile>\r
+ <RollingFile name="MarkeredRollingFile2" fileName="${logPath}/nexio2-archive-checker.log" filePattern="${markeredFilePattern}">\r
+ <Filters>\r
+ <MarkerFilter marker="NEXIO2 archiválás előkészítése" onMatch="ACCEPT" onMismatch="DENY" />\r
+ </Filters>\r
+ <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %msg %n %throwable" />\r
+ <Policies>\r
+ <TimeBasedTriggeringPolicy />\r
+ </Policies>\r
+ </RollingFile>\r
+ <RollingFile name="MarkeredRollingFile3" fileName="${logPath}/fork-validate-and-archive.log" filePattern="${markeredFilePattern}">\r
+ <Filters>\r
+ <MarkerFilter marker="Kötegelt validálás és archiválás" onMatch="ACCEPT" onMismatch="DENY" />\r
+ </Filters>\r
+ <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{1}.%M - %msg (%F:%L)%n %throwable" />\r
+ <Policies>\r
+ <TimeBasedTriggeringPolicy />\r
+ </Policies>\r
+ </RollingFile>\r
+ <RollingFile name="MarkeredRollingFile4" fileName="${logPath}/harris1-missingmaterial-checker.log" filePattern="${markeredFilePattern}">\r
+ <Filters>\r
+ <MarkerFilter marker="HARRIS1 missing material lekérdezés" onMatch="ACCEPT" onMismatch="DENY" />\r
+ </Filters>\r
+ <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %msg %n %throwable" />\r
+ <Policies>\r
+ <TimeBasedTriggeringPolicy />\r
+ </Policies>\r
+ </RollingFile>\r
+ <RollingFile name="MarkeredRollingFile5" fileName="${logPath}/harris2-missingmaterial-checker.log" filePattern="${markeredFilePattern}">\r
+ <Filters>\r
+ <MarkerFilter marker="HARRIS2 missing material lekérdezés" onMatch="ACCEPT" onMismatch="DENY" />\r
+ </Filters>\r
+ <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %msg %n %throwable" />\r
+ <Policies>\r
+ <TimeBasedTriggeringPolicy />\r
+ </Policies>\r
+ </RollingFile>\r
+ <RollingFile name="MarkeredRollingFile6" fileName="${logPath}/peablebeach-missingmaterial-checker.log" filePattern="${markeredFilePattern}">\r
+ <Filters>\r
+ <MarkerFilter marker="PEABLEBEACH missing material lekérdezés" onMatch="ACCEPT" onMismatch="DENY" />\r
+ </Filters>\r
+ <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{1}.%M - %msg (%F:%L)%n %throwable" />\r
+ <Policies>\r
+ <TimeBasedTriggeringPolicy />\r
+ </Policies>\r
+ </RollingFile>\r
+ <RollingFile name="MarkeredRollingFile7" fileName="${logPath}/fork-validate-and-restore.log" filePattern="${markeredFilePattern}">\r
+ <Filters>\r
+ <MarkerFilter marker="Kötegelt validálás és visszatöltés" onMatch="ACCEPT" onMismatch="DENY" />\r
+ </Filters>\r
+ <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{1}.%M - %msg (%F:%L)%n %throwable" />\r
+ <Policies>\r
+ <TimeBasedTriggeringPolicy />\r
+ </Policies>\r
+ </RollingFile>\r
+ <RollingFile name="MarkeredRollingFile8" fileName="${logPath}/validate-and-archive.log" filePattern="${markeredFilePattern}">\r
+ <Filters>\r
+ <MarkerFilter marker="Archiválás" onMatch="ACCEPT" onMismatch="DENY" />\r
+ </Filters>\r
+ <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{1}.%M - %msg (%F:%L)%n %throwable" />\r
+ <Policies>\r
+ <TimeBasedTriggeringPolicy />\r
+ </Policies>\r
+ </RollingFile>\r
+ <RollingFile name="MarkeredRollingFile9" fileName="${logPath}/validate-and-restore.log" filePattern="${markeredFilePattern}">\r
+ <Filters>\r
+ <MarkerFilter marker="Visszatöltés" onMatch="ACCEPT" onMismatch="DENY" />\r
+ </Filters>\r
+ <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{1}.%M - %msg (%F:%L)%n %throwable" />\r
+ <Policies>\r
+ <TimeBasedTriggeringPolicy />\r
+ </Policies>\r
+ </RollingFile>\r
+ <RollingFile name="MarkeredRollingFile10" fileName="${logPath}/sync-subtitles.log" filePattern="${markeredFilePattern}">\r
+ <Filters>\r
+ <MarkerFilter marker="Feliratok szinkronizálása" onMatch="ACCEPT" onMismatch="DENY" />\r
+ </Filters>\r
+ <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{1}.%M - %msg (%F:%L)%n %throwable" />\r
+ <Policies>\r
+ <TimeBasedTriggeringPolicy />\r
+ </Policies>\r
+ </RollingFile>\r
+ <RollingFile name="MarkeredRollingFile11" fileName="${logPath}/pb-archive-checker.log" filePattern="${markeredFilePattern}">\r
+ <Filters>\r
+ <MarkerFilter marker="PEABLEBEACH archiválás előkészítése" onMatch="ACCEPT" onMismatch="DENY" />\r
+ </Filters>\r
+ <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{1}.%M - %msg (%F:%L)%n %throwable" />\r
+ <Policies>\r
+ <TimeBasedTriggeringPolicy />\r
+ </Policies>\r
+ </RollingFile>\r
+ <RollingFile name="RollingFile" fileName="${fileName}" filePattern="${filePattern}">\r
+ <Filters>\r
+ <!-- <MarkerFilter marker="MEDIACUBE" onMatch="DENY" onMismatch="NEUTRAL" /> -->\r
+ <MarkerFilter marker="MEDIACUBE FILELOG" onMatch="DENY" onMismatch="NEUTRAL" />\r
+ </Filters>\r
+ <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %level %logger{1}.%M %msg (%F:%L)%n %throwable" />\r
+ <Policies>\r
+ <TimeBasedTriggeringPolicy />\r
+ </Policies>\r
+ </RollingFile>\r
+ <RollingFile name="RollingFileExceptions" fileName="${fileName.err}" filePattern="${filePattern.err}">\r
+ <PatternLayout pattern="%d{HH:mm:ss.SSS} %logger{1}.%M %msg (%F:%L)%n %throwable" />\r
+ <Filters>\r
+ <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY" />\r
+ </Filters>\r
+ <Policies>\r
+ <TimeBasedTriggeringPolicy />\r
+ </Policies>\r
+ </RollingFile>\r
+ \r
+ </Appenders>\r
+ <Loggers>\r
+ <Root level="INFO">\r
+ <AppenderRef ref="MediaProfile" />\r
+ <AppenderRef ref="MissingSubtitle" />\r
+ <AppenderRef ref="Console" />\r
+ <AppenderRef ref="MarkeredConsole" />\r
+ <AppenderRef ref="RollingFile" />\r
+ <AppenderRef ref="RollingFileExceptions" />\r
+ <AppenderRef ref="MarkeredRollingFile" />\r
+ <AppenderRef ref="MarkeredRollingFile1" />\r
+ <AppenderRef ref="MarkeredRollingFile2" />\r
+ <AppenderRef ref="MarkeredRollingFile3" />\r
+ <AppenderRef ref="MarkeredRollingFile4" />\r
+ <AppenderRef ref="MarkeredRollingFile5" />\r
+ <AppenderRef ref="MarkeredRollingFile6" />\r
+ <AppenderRef ref="MarkeredRollingFile7" />\r
+ <AppenderRef ref="MarkeredRollingFile8" />\r
+ <AppenderRef ref="MarkeredRollingFile9" />\r
+ <AppenderRef ref="MarkeredRollingFile10" />\r
+ <AppenderRef ref="MarkeredRollingFile11" />\r
+ <AppenderRef ref="MarkeredRollingFile11" />\r
+ <AppenderRef ref="MarkeredMail" />\r
+ </Root>\r
+ <Logger name="org.zkoss" level="ERROR" additivity="false" />\r
+ <Logger name="org.quartz" level="ERROR" additivity="false" />\r
+ <Logger name="org.eclipse.jetty.osgi.boot" level="ERROR" additivity="false" />\r
+ <Logger name="user.commons.pool" level="DEBUG" additivity="false" />\r
+ </Loggers>\r
+</Configuration>\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<Configuration status="ERROR" monitorInterval="10" packages="user.commons.log4j2.appender">\r
+ <Properties>\r
+ <Property name="logPath">log</Property>\r
+ <Property name="fileName">${logPath}/mediacube.log</Property>\r
+ <Property name="filePattern">${logPath}/$${date:yyyy-MM}/mediacube-%d{MM-dd-yyyy}-%i.log.gz</Property>\r
+ <Property name="markeredFileName">${logPath}/markered-mediacube.log</Property>\r
+ <Property name="markeredFilePattern">${logPath}/$${date:yyyy-MM}/markered-mediacube-%d{MM-dd-yyyy}-%i.log.gz</Property>\r
+ <Property name="fileName.err">${logPath}/mediacube-err.log</Property>\r
+ <Property name="filePattern.err">${logPath}/$${date:yyyy-MM}/mediacube-err-%d{MM-dd-yyyy}-%i.log.gz</Property>\r
+ </Properties>\r
+ <Appenders>\r
+ <Console name="Console" target="SYSTEM_OUT">\r
+ <Filters>\r
+ <MarkerFilter marker="MEDIACUBE" onMatch="DENY" onMismatch="NEUTRAL" />\r
+ </Filters>\r
+ <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{1}.%M - %msg (%F:%L) %n" />\r
+ </Console>\r
+ <Console name="MarkeredConsole" target="SYSTEM_ERR">\r
+ <Filters>\r
+ <MarkerFilter marker="MEDIACUBE" onMatch="ACCEPT" onMismatch="DENY" />\r
+ </Filters>\r
+ <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{1}.%M - %markerSimpleName - %msg (%F:%L)%n" />\r
+ </Console>\r
+ <HTMLMailAppender name="MarkeredMail" subject="MediaCube rendszerüzenet" to="vasary@elgekko.net" from="broadcast.service-ce@amcnetworks.com" smtpHost="10.160.60.165"\r
+ smtpPort="125" smtpProtocol="smtp" smtpDebug="false" ignoreExceptions="false" bufferSize="1">\r
+ <Filters>\r
+ <MarkerFilter marker="MEDIACUBE" onMatch="ACCEPT" onMismatch="DENY" />\r
+ </Filters>\r
+ <PatternLayout pattern="%d{HH:mm:ss} %-5level - %msg %n" />\r
+ </HTMLMailAppender>\r
+ <RollingFile name="MarkeredRollingFile" fileName="${markeredFileName}" filePattern="${markeredFilePattern}">\r
+ <Filters>\r
+ <MarkerFilter marker="MEDIACUBE FILELOG" onMatch="ACCEPT" onMismatch="DENY" />\r
+ </Filters>\r
+ <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{1}.%M - %msg (%F:%L)%n %throwable" />\r
+ <Policies>\r
+ <TimeBasedTriggeringPolicy />\r
+ </Policies>\r
+ </RollingFile>\r
+ <RollingFile name="MarkeredRollingFile1" fileName="${logPath}/nexio1-archive-checker.log" filePattern="${logPath}/$${date:yyyy-MM}/nexio1-archive-checker-%d{MM-dd-yyyy}-%i.log.gz">\r
+ <Filters>\r
+ <MarkerFilter marker="NEXIO1 archiválás előkészítése" onMatch="ACCEPT" onMismatch="DENY" />\r
+ </Filters>\r
+ <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %msg %n %throwable" />\r
+ <Policies>\r
+ <TimeBasedTriggeringPolicy />\r
+ </Policies>\r
+ </RollingFile>\r
+ <RollingFile name="MarkeredRollingFile2" fileName="${logPath}/nexio2-archive-checker.log" filePattern="${logPath}/$${date:yyyy-MM}/nexio2-archive-checker-%d{MM-dd-yyyy}-%i.log.gz">\r
+ <Filters>\r
+ <MarkerFilter marker="NEXIO2 archiválás előkészítése" onMatch="ACCEPT" onMismatch="DENY" />\r
+ </Filters>\r
+ <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %msg %n %throwable" />\r
+ <Policies>\r
+ <TimeBasedTriggeringPolicy />\r
+ </Policies>\r
+ </RollingFile>\r
+ <RollingFile name="MarkeredRollingFile3" fileName="${logPath}/fork-validate-and-archive.log" filePattern="${logPath}/$${date:yyyy-MM}/fork-validate-and-archive-%d{MM-dd-yyyy}-%i.log.gz">\r
+ <Filters>\r
+ <MarkerFilter marker="Kötegelt validálás és archiválás" onMatch="ACCEPT" onMismatch="DENY" />\r
+ </Filters>\r
+ <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{1}.%M - %msg (%F:%L)%n %throwable" />\r
+ <Policies>\r
+ <TimeBasedTriggeringPolicy />\r
+ </Policies>\r
+ </RollingFile>\r
+ <RollingFile name="MarkeredRollingFile4" fileName="${logPath}/harris1-missingmaterial-checker.log" filePattern="${logPath}/$${date:yyyy-MM}/harris1-missingmaterial-checker-%d{MM-dd-yyyy}-%i.log.gz">\r
+ <Filters>\r
+ <MarkerFilter marker="HARRIS1 missing material lekérdezés" onMatch="ACCEPT" onMismatch="DENY" />\r
+ </Filters>\r
+ <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %msg %n %throwable" />\r
+ <Policies>\r
+ <TimeBasedTriggeringPolicy />\r
+ </Policies>\r
+ </RollingFile>\r
+ <RollingFile name="MarkeredRollingFile5" fileName="${logPath}/harris2-missingmaterial-checker.log" filePattern="${logPath}/$${date:yyyy-MM}/harris2-missingmaterial-checker-%d{MM-dd-yyyy}-%i.log.gz">\r
+ <Filters>\r
+ <MarkerFilter marker="HARRIS2 missing material lekérdezés" onMatch="ACCEPT" onMismatch="DENY" />\r
+ </Filters>\r
+ <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %msg %n %throwable" />\r
+ <Policies>\r
+ <TimeBasedTriggeringPolicy />\r
+ </Policies>\r
+ </RollingFile>\r
+ <RollingFile name="MarkeredRollingFile6" fileName="${logPath}/peablebeach-missingmaterial-checker.log" filePattern="${logPath}/$${date:yyyy-MM}/peablebeach-missingmaterial-checker-%d{MM-dd-yyyy}-%i.log.gz">\r
+ <Filters>\r
+ <MarkerFilter marker="PEABLEBEACH missing material lekérdezés" onMatch="ACCEPT" onMismatch="DENY" />\r
+ </Filters>\r
+ <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{1}.%M - %msg (%F:%L)%n %throwable" />\r
+ <Policies>\r
+ <TimeBasedTriggeringPolicy />\r
+ </Policies>\r
+ </RollingFile>\r
+ <RollingFile name="MarkeredRollingFile7" fileName="${logPath}/fork-validate-and-restore.log" filePattern="${logPath}/$${date:yyyy-MM}/fork-validate-and-restore-%d{MM-dd-yyyy}-%i.log.gz">\r
+ <Filters>\r
+ <MarkerFilter marker="Kötegelt validálás és visszatöltés" onMatch="ACCEPT" onMismatch="DENY" />\r
+ </Filters>\r
+ <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{1}.%M - %msg (%F:%L)%n %throwable" />\r
+ <Policies>\r
+ <TimeBasedTriggeringPolicy />\r
+ </Policies>\r
+ </RollingFile>\r
+ <RollingFile name="MarkeredRollingFile8" fileName="${logPath}/validate-and-archive.log" filePattern="${logPath}/$${date:yyyy-MM}/validate-and-archive-%d{MM-dd-yyyy}-%i.log.gz">\r
+ <Filters>\r
+ <MarkerFilter marker="Archiválás" onMatch="ACCEPT" onMismatch="DENY" />\r
+ </Filters>\r
+ <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{1}.%M - %msg (%F:%L)%n %throwable" />\r
+ <Policies>\r
+ <TimeBasedTriggeringPolicy />\r
+ </Policies>\r
+ </RollingFile>\r
+ <RollingFile name="MarkeredRollingFile9" fileName="${logPath}/validate-and-restore.log" filePattern="${logPath}/$${date:yyyy-MM}/validate-and-restore-%d{MM-dd-yyyy}-%i.log.gz">\r
+ <Filters>\r
+ <MarkerFilter marker="Visszatöltés" onMatch="ACCEPT" onMismatch="DENY" />\r
+ </Filters>\r
+ <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{1}.%M - %msg (%F:%L)%n %throwable" />\r
+ <Policies>\r
+ <TimeBasedTriggeringPolicy />\r
+ </Policies>\r
+ </RollingFile>\r
+ <RollingFile name="MarkeredRollingFile10" fileName="${logPath}/sync-subtitles.log" filePattern="${logPath}/$${date:yyyy-MM}/sync-subtitles-%d{MM-dd-yyyy}-%i.log.gz">\r
+ <Filters>\r
+ <MarkerFilter marker="Feliratok szinkronizálása" onMatch="ACCEPT" onMismatch="DENY" />\r
+ </Filters>\r
+ <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{1}.%M - %msg (%F:%L)%n %throwable" />\r
+ <Policies>\r
+ <TimeBasedTriggeringPolicy />\r
+ </Policies>\r
+ </RollingFile>\r
+ <RollingFile name="MarkeredRollingFile11" fileName="${logPath}/pb-archive-checker.log" filePattern="${logPath}/$${date:yyyy-MM}/pb-archive-checker-%d{MM-dd-yyyy}-%i.log.gz">\r
+ <Filters>\r
+ <MarkerFilter marker="PEABLEBEACH archiválás előkészítése" onMatch="ACCEPT" onMismatch="DENY" />\r
+ </Filters>\r
+ <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{1}.%M - %msg (%F:%L)%n %throwable" />\r
+ <Policies>\r
+ <TimeBasedTriggeringPolicy />\r
+ </Policies>\r
+ </RollingFile>\r
+ \r
+ <RollingFile name="MediaProfile" fileName="${logPath}/mediaprofile.log" filePattern="${logPath}/$${date:yyyy-MM}/mediaprofile-%d{MM-dd-yyyy}-%i.log.gz">\r
+ <Filters>\r
+ <MarkerFilter marker="MEDIAPROFILE" onMatch="ACCEPT" onMismatch="DENY" />\r
+ </Filters>\r
+ <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %msg%n" />\r
+ <Policies>\r
+ <TimeBasedTriggeringPolicy />\r
+ </Policies>\r
+ </RollingFile>\r
+ <RollingFile name="MissingSubtitle" fileName="${logPath}/missingsubtitle.log" filePattern="${logPath}/$${date:yyyy-MM}/missingsubtitle-%d{MM-dd-yyyy}-%i.log.gz">\r
+ <Filters>\r
+ <MarkerFilter marker="MISSING-SUBTITLE" onMatch="ACCEPT" onMismatch="DENY" />\r
+ </Filters>\r
+ <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %msg%n" />\r
+ <Policies>\r
+ <TimeBasedTriggeringPolicy />\r
+ </Policies>\r
+ </RollingFile>\r
+ \r
+ <RollingFile name="RollingFile" fileName="${fileName}" filePattern="${filePattern}">\r
+ <Filters>\r
+ <!-- <MarkerFilter marker="MEDIACUBE" onMatch="DENY" onMismatch="NEUTRAL" /> -->\r
+ <MarkerFilter marker="MEDIACUBE FILELOG" onMatch="DENY" onMismatch="NEUTRAL" />\r
+ </Filters>\r
+ <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %level %logger{1}.%M %msg (%F:%L)%n %throwable" />\r
+ <Policies>\r
+ <TimeBasedTriggeringPolicy />\r
+ </Policies>\r
+ </RollingFile>\r
+ <RollingFile name="RollingFileExceptions" fileName="${fileName.err}" filePattern="${filePattern.err}">\r
+ <PatternLayout pattern="%d{HH:mm:ss.SSS} %logger{1}.%M %msg (%F:%L)%n %throwable" />\r
+ <Filters>\r
+ <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY" />\r
+ </Filters>\r
+ <Policies>\r
+ <TimeBasedTriggeringPolicy />\r
+ </Policies>\r
+ </RollingFile>\r
+ \r
+ </Appenders>\r
+ <Loggers>\r
+ <Root level="INFO">\r
+ <AppenderRef ref="Console" />\r
+ <AppenderRef ref="MarkeredConsole" />\r
+ <AppenderRef ref="RollingFile" />\r
+ <AppenderRef ref="RollingFileExceptions" />\r
+ <AppenderRef ref="MarkeredRollingFile" />\r
+ <AppenderRef ref="MarkeredRollingFile1" />\r
+ <AppenderRef ref="MarkeredRollingFile2" />\r
+ <AppenderRef ref="MarkeredRollingFile3" />\r
+ <AppenderRef ref="MarkeredRollingFile4" />\r
+ <AppenderRef ref="MarkeredRollingFile5" />\r
+ <AppenderRef ref="MarkeredRollingFile6" />\r
+ <AppenderRef ref="MarkeredRollingFile7" />\r
+ <AppenderRef ref="MarkeredRollingFile8" />\r
+ <AppenderRef ref="MarkeredRollingFile9" />\r
+ <AppenderRef ref="MarkeredRollingFile10" />\r
+ <AppenderRef ref="MarkeredRollingFile11" />\r
+ <AppenderRef ref="MarkeredRollingFile11" />\r
+ <AppenderRef ref="MediaProfile" />\r
+ <AppenderRef ref="MissingSubtitle" />\r
+ <AppenderRef ref="MarkeredMail" />\r
+ </Root>\r
+ <Logger name="org.zkoss" level="ERROR" additivity="false" />\r
+ <Logger name="org.quartz" level="ERROR" additivity="false" />\r
+ <Logger name="org.eclipse.jetty.osgi.boot" level="ERROR" additivity="false" />\r
+ <Logger name="user.commons.pool" level="DEBUG" additivity="false" />\r
+ </Loggers>\r
+</Configuration>\r
--- /dev/null
+sourceStoreUri:
+ name: Default
+ protocol: LOCAL
+ uri: "/mnt/NLE"
+ fileFilter: "*.mxf"
+ showDirectories: true
+alternateSourceStoreUris:
+- name: NLE1
+ protocol: LOCAL
+ uri: "/mnt/NLE/NLE1"
+ fileFilter: "*.mxf"
+ showDirectories: true
+- name: NLE2
+ protocol: LOCAL
+ uri: "/mnt/NLE/NLE2"
+ fileFilter: "*.mxf"
+ showDirectories: true
+- name: NLE3
+ protocol: LOCAL
+ uri: "/mnt/NLE/NLE3"
+ fileFilter: "*.mxf"
+ showDirectories: true
+- name: NLE4
+ protocol: LOCAL
+ uri: "/mnt/NLE/NLE4"
+ fileFilter: "*.mxf"
+ showDirectories: true
+- name: POLC
+ protocol: LOCAL
+ uri: "/mnt/POLC"
+ fileFilter: "*.mxf"
+ showDirectories: true
+targets:
+- name: FINISHED_SHOWS
+ killDateDays: 7
+ storeUri:
+ protocol: LOCAL
+ uri: "/mnt/PROMISE/FINISHED_SHOWS"
--- /dev/null
+jobQueuePollInterval: 1000\r
+disableHelp: true\r
+maestroDisabled: true\r
+alternateRetrieveSelector: true\r
+disableStatistics: true\r
+disableEditor: false\r
+targetRestoreFilters:\r
+- FILEZILLA_AVID\r
+- FILEZILLA_PASARESTORE\r
+topTypeFilters:\r
+- name: Hír bejátszó\r
+- name: Hír nyers\r
+- name: Visszarögzített\r
+- name: Egyéb\r
+bottomTypeFilters:\r
+- name: Műsor\r
+- name: Műsor nyers\r
+- name: Promo\r
+- name: Promo nyers\r
+- name: Reklám\r
+- name: Reklám nyers\r
+authentication:\r
+ authEnabled: true\r
+ adHost: intra.amc.hu\r
+ adNonSecurePort: 3268\r
+ adBaseDn: DC=intra,DC=amc,DC=hu\r
+ adAdminMap:\r
+ - INFORMATIKUSOK\r
+ - MUSZAKVEZETOK\r
+ adSubmitterMap:\r
+ - INFORMATIKUSOK\r
+ - MUSZAKVEZETOK\r
+ adEditorMap:\r
+ - INFORMATIKUSOK\r
+ - MUSZAKVEZETOK\r
+ localAccounts:\r
+ - user: user\r
+ password: 5F4DCC3B5AA765D61D8327DEB882CF99\r
+ email:\r
+ - user: user1\r
+ password: 5F4DCC3B5AA765D61D8327DEB882CF99\r
+ email:\r
+ - user: lebony\r
+ password: 4E25B117B14D86D7DCECB4E433CF932C\r
+ email:\r
+ - user: root\r
+ password: 5F4DCC3B5AA765D61D8327DEB882CF99\r
+ email: vasary@elgekko.net\r
+ localAdmins:\r
+ - root\r
+ - admin\r
+ localSubmitters:\r
+ - lebony\r
+ localEditors:\r
+ - editor\r