git-tfs-id: [http://tfs.userrendszerhaz.hu:8080/tfs/DefaultCollection]$/MediaCube...
authorVásáry Dániel <daniel.vasary@userrendszerhaz.hu>
Wed, 11 Jul 2018 11:13:23 +0000 (11:13 +0000)
committerVásáry Dániel <daniel.vasary@userrendszerhaz.hu>
Wed, 11 Jul 2018 11:13:23 +0000 (11:13 +0000)
22 files changed:
client/Maestro/Configuration/UJ-configuration-tqc-check.json
client/Maestro/MaestroForm.Metadata.cs
client/Maestro/Properties/AssemblyInfo.cs
client/MaestroShared/Targets/FTPTargetProcessor.cs
client/MaestroShared/Targets/FXPTargetProcessor.cs
client/MaestroShared/Targets/UNCTargetProcessor.cs
client/PlanAIRClient/Reader.cs
server/user.jobengine.executors/config/config.xml
server/user.jobengine.executors/config/scheduledjobs.json
server/user.jobengine.executors/jobtemplates/sys-retrieve-missing-material.xml
server/user.jobengine.executors/src/user/jobengine/server/steps/CopyForArchiveNEXIOMaterialsStep.java
server/user.jobengine.executors/src/user/jobengine/server/steps/GenerateMorpheusMetadataStep.java [new file with mode: 0644]
server/user.jobengine.executors/src/user/jobengine/server/steps/MetadataTypeDetector.java
server/user.jobengine.executors/src/user/jobengine/server/steps/OctopusDataMiner.java
server/user.jobengine.executors/src/user/jobengine/server/steps/OutputPathAndNameSelectorStep.java
server/user.jobengine.executors/src/user/jobengine/server/steps/PlanAirExtensions.java [new file with mode: 0644]
server/user.jobengine.osgi.commons/src/user/commons/mediatool/Timecode.java [new file with mode: 0644]
server/user.jobengine.osgi.db/src/user/jobengine/db/IItemManager.java
server/user.jobengine.osgi.db/src/user/jobengine/db/ItemManager.java
server/user.jobengine.osgi.server/src/user/jobengine/server/steps/EscortFiles.java
server/user.jobengine.osgi.server/src/user/jobengine/zk/model/MissingMaterialsModel.java
server/user.jobengine.osgi.server/test/user/jobengine/server/IT/Support.java

index d408da9df3b65e00a3b9eb1b33850a2f53f59684..112396ab80314c8a4c5398785f6ccda69cd98830 100644 (file)
     "$type": "UNCSource",\r
     "filter": "avi,wav,mxf",\r
     "local": {\r
-      "address": "file://c:\\x",\r
+      "address": "file://10.10.1.100/BRAAVOS/TQC/CHECK",\r
+      "userName": "mediacube",\r
+      "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
+      "timeout": 1000\r
+    },\r
+    "remote": {\r
+      "address": "ftp://10.10.1.100/TQC/CHECK",\r
       "userName": "mediacube",\r
       "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
       "timeout": 1000\r
@@ -76,7 +82,7 @@
     },\r
     {\r
       "label": "Archiválás",\r
-      "processor": "FXPTargetProcessor",\r
+      "processor": "UNCTargetProcessor",\r
       "outputFormat": "%ID%",\r
       "tag": "Archiválás",\r
       "saveArchiveMetadata": true,\r
index dec1fb4edf4363c7c581816cf6d64399b20abd33..fd68bd59cd4e8f80aac601e65ad4f1a894872c19 100644 (file)
@@ -202,7 +202,7 @@ namespace Maestro {
                 case MetadataType.OctopusStory:\r
                 case MetadataType.OctopusPlaceHolder:\r
                     result = GetOctopusMetadata(metadataType);\r
-                    result.mediaType = "Octopus nyersanyag";\r
+                    result.mediaType = "Hír nyers";\r
                     break;\r
                 case MetadataType.TrafficMaterial:\r
                     result = GetTrafficMetadata(metadataType);\r
@@ -222,13 +222,13 @@ namespace Maestro {
                 metadataType = MetadataTypeUtil.Guess(SelectedSource.Prefix);\r
                 switch (metadataType) {\r
                     case MetadataType.TrafficMaterial:\r
-                        result.mediaType = "Műsor nyersanyag";\r
+                        result.mediaType = "Műsor nyers";\r
                         break;\r
                     case MetadataType.TrafficPromo:\r
-                        result.mediaType = "Promo nyersanyag";\r
+                        result.mediaType = "Promo nyers";\r
                         break;\r
                     case MetadataType.TrafficAD:\r
-                        result.mediaType = "Reklám nyersanyag";\r
+                        result.mediaType = "Reklám nyers";\r
                         break;\r
                 }\r
             }\r
index 8a35b64cdec93ba596ec1f1a6082ed77bb059901..f1fcb969447b3128dc8d609683906a13966e91a2 100644 (file)
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
 // You can specify all the values or you can default the Build and Revision Numbers\r
 // by using the '*' as shown below:\r
 // [assembly: AssemblyVersion("1.0.*")]\r
-[assembly: AssemblyVersion("2.0.8.1")]\r
-[assembly: AssemblyFileVersion("2.0.8.1")]\r
+[assembly: AssemblyVersion("2.0.8.2")]\r
+[assembly: AssemblyFileVersion("2.0.8.2")]\r
index d4ba5da2b7b429285cb47e6744eca00128a55445..5c3048954c1b9849c3d611236644e6ef04fbdd8a 100644 (file)
@@ -14,6 +14,7 @@ namespace MaestroShared.Targets {
         private const string PATTERN_CONCAT = "{0}{1}";\r
         private const string _226 = "226";\r
         private const string UPLOAD_ERROR = "Feltöltési hiba.";\r
+        protected const string UPLOAD_SIZE_ERROR = "Feltöltési hiba, a feltöltött fájl mérete nem egyezik a forrásfájl méretével.";\r
         private readonly Logger logger = LogManager.GetCurrentClassLogger();\r
         protected FtpClient targetFTP;\r
 \r
@@ -86,9 +87,12 @@ namespace MaestroShared.Targets {
                 }\r
             }\r
             FtpReply reply = targetFTP.GetReply();\r
-            if (!reply.Success || !_226.Equals(reply.Code)) {\r
+            if (!reply.Success || !_226.Equals(reply.Code))\r
                 throw new Exception(UPLOAD_ERROR);\r
-            }\r
+            long sourceSize = inputFile.Length;\r
+            long uploadedSize = targetFTP.GetFileSize(OutputName);\r
+            if (sourceSize != uploadedSize)\r
+                throw new Exception(UPLOAD_SIZE_ERROR);\r
         }\r
 \r
         protected override void UploadContent(string outputPath, byte[] content) {\r
index 88bf98d2305dcdf9263c1eda2ab62a2bbd3f3b21..6e235a0e43e3c3771c7ad648bddcbb47f88bf46e 100644 (file)
@@ -123,6 +123,14 @@ namespace MaestroShared.Targets {
                     Thread.Sleep(1000);\r
                 }\r
 \r
+                /* Ezen még agyalni kell               \r
+                if (!Parameters.TargetConfig.NexioServer) {\r
+                    //-1 -et ad???\r
+                    long uploadedSize = targetFTP.GetFileSize(OutputName);\r
+                    if (ilength != uploadedSize)\r
+                        throw new Exception(UPLOAD_SIZE_ERROR);\r
+                }\r
+                */\r
             }\r
             catch (Exception e) {\r
                 throw e;\r
index 547f782c6de3d0eb2d31dbcf45e62426b65585b3..455fafbce01c848239941b5a14920cadff7e7076 100644 (file)
@@ -37,6 +37,7 @@ namespace MaestroShared.Targets {
         protected const string HYPHEN = "-";\r
         protected const string SLASH = "/";\r
         protected const string BACKSLASH = @"\";\r
+        private const string COPY_SIZE_ERROR = "Másolási hiba, a másolt fájl mérete nem egyezik a forrásfájl méretével.";\r
         private const string STAR = "*";\r
         protected FileInfo inputFile;\r
         protected string workingDir;\r
@@ -381,6 +382,10 @@ namespace MaestroShared.Targets {
         protected virtual void UploadFile() {\r
             int pbCancel = 0;\r
             Win32File.CopyFileEx(Input, Output, new CopyProgressRoutine(this.CopyProgressHandler), IntPtr.Zero, ref pbCancel, CopyFileFlags.COPY_FILE_RESTARTABLE);\r
+            long sourceSize = inputFile.Length;\r
+            long uploadedSize = new FileInfo(Output).Length;\r
+            if (sourceSize != uploadedSize)\r
+                throw new Exception(COPY_SIZE_ERROR);\r
         }\r
 \r
         protected virtual string GetOutputFilePath(string path, string fileName) {\r
index 68be041d5228aeecca54be20d250c6f7e512c1b0..1b9cf432b2c49c2f0c6327f81dbca45a56078cb6 100644 (file)
@@ -112,7 +112,6 @@ namespace TrafficClient {
             clIFsp_EC_SegmentResult item = new clIFsp_EC_SegmentResult();\r
             int f = 0;\r
             item.v_SegID = (int)ReadInt(reader, ref f);\r
-            //item.v_ClipID = ReadString(reader, ref f);\r
             item.v_VariantID = ReadInt(reader, ref f);\r
             item.v_SegTitle = ReadString(reader, ref f);\r
             item.v_SegKeyWords = ReadString(reader, ref f);\r
index be5e7ef0d19d6cd56c5410a3d38dac14c83fe2a0..216ae54ff84f9430c89f8e1a7f93783d3df0946a 100644 (file)
@@ -16,6 +16,7 @@
        <executor className="user.jobengine.server.steps.DownloadRecordingFromNexioStep" maxConcurrent="1"/>\r
        <executor className="user.jobengine.server.steps.FakeNoParamsStep" maxConcurrent="20"/>\r
        <executor className="user.jobengine.server.steps.FakeStep" maxConcurrent="20"/>\r
+       <executor className="user.jobengine.server.steps.GenerateMorpheusMetadataStep" maxConcurrent="10"/>\r
        <executor className="user.jobengine.server.steps.ImportMORPHEUSMissingMaterialsStep" maxConcurrent="1"/>\r
        <executor className="user.jobengine.server.steps.ImportStatisticsStep" maxConcurrent="7"/>\r
        <executor className="user.jobengine.server.steps.MetadataTransformStep" maxConcurrent="1"/>\r
index 765919efaf2079902beaf64465ee74e4f860db29..4577c6061f849d360b78f56e3eef0c41aaab0167 100644 (file)
       ]\r
        },\r
        {\r
-      "active": false,\r
-      "executeimmediate": false,\r
          "name" : "sys: MORPHEUS 'missing materials' importálása",\r
-      "template": "import-morpheus-missing-materials.xml",\r
-      "cronexpression": "0 0 0/1 1/1 * ? *",\r
+      "template": "sys-import-morpheus-missing-materials.xml",\r
       "parameters": [ \r
        {"name": "csvFilePath", "value": "/mnt/MORPHEUS", "type": "java.lang.String"},\r
        {"name": "processedFolder", "value": "DONE", "type": "java.lang.String"},\r
-       {"name": "targetPath", "value": "/mnt/ISILON/ARCHIVE_RESTORE", "type": "java.lang.String"}\r
+       {"name": "targetPath", "value": "/mnt/ISILON/PLAYOUT/Video", "type": "java.lang.String"}\r
+      ]\r
+       },\r
+       {\r
+         "name" : "sys: MORPHEUS 'missing material' visszatöltése",\r
+      "template": "sys-retrieve-missing-material.xml",\r
+      "parameters": [ \r
+       {"name": "targetPath", "value": "/mnt/ISILON/PLAYOUT/Video", "type": "java.lang.String"},\r
+       {"name": "globalRetrievePath", "value": "\\\\10.10.1.100\\BRAAVOS\\PLAYOUT\\Video", "type": "java.lang.String"},\r
+       {"name": "morpheusDeviceID", "value": "ISILON", "type": "java.lang.String"},\r
+       {"name": "dbUrl", "value": "jdbc:sqlserver://10.10.1.45;databaseName=PA_Echo;", "type": "java.lang.String"},\r
+       {"name": "userName", "value": "MAM", "type": "java.lang.String"},\r
+       {"name": "password", "value": "Echotv.hu", "type": "java.lang.String"},\r
+       {"name": "targetMetadataPath", "value": "/mnt/ISILON/PLAYOUT/MorpheusGateway/Input", "type": "java.lang.String"}\r
       ]\r
        },\r
        {\r
index afff5429486e8ffe28164c1e36f4036e76ec5c6b..35b4436e7356ef9df8a1080e00b62296a06de973 100644 (file)
@@ -1,10 +1,15 @@
 <?xml version="1.0" encoding="UTF-8"?>\r
-<jobtemplate name="Archivált anyag visszatöltése" multiInstance="true">\r
+<jobtemplate name="MORPHEUS 'missing material' visszatöltése" multiInstance="true">\r
        <declarations>\r
                <parameters>\r
                        <parameter name="material" type="com.ibm.nosql.json.api.BasicDBObject" />\r
                        <parameter name="targetPath" type="java.lang.String" />\r
                        <parameter name="globalRetrievePath" type="java.lang.String" />\r
+                       <parameter name="morpheusDeviceID" type="java.lang.String" />\r
+                       <parameter name="dbUrl" type="java.lang.String" />\r
+                       <parameter name="userName" type="java.lang.String" />\r
+                       <parameter name="password" type="java.lang.String" />\r
+                       <parameter name="targetMetadataPath" type="java.lang.String" />\r
                </parameters>\r
        </declarations>\r
        <commands>\r
                                </input>\r
                        </inputs>\r
                </calljobstep>\r
+               <calljobstep type="user.jobengine.server.steps.GenerateMorpheusMetadataStep" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="material" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="morpheusDeviceID" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="dbUrl" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="userName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="password" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="targetMetadataPath" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
        </commands>\r
 </jobtemplate>
\ No newline at end of file
index 916cd88b48c375812a9a6154d567b418e22edd88..518beb9864bd84491200132fd2d65a13eb7fcf29 100644 (file)
@@ -185,7 +185,7 @@ public class CopyForArchiveNEXIOMaterialsStep extends JobStep {
 \r
        private FileArchive processMosObject(BasicDBObject rundown, BasicDBObject story, BasicDBObject mosObject) throws Exception {\r
                String mosID = mosObject.getString(IOctopusAPI.OBJ_ID);\r
-               if (MetadataTypeDetector.GuessMetadataType(mosID) != MetadataType.OCTOPUSPLACEHOLDER) {\r
+               if (MetadataTypeDetector.GuessMetadataType(mosID) != MetadataType.OctopusPlaceholder) {\r
                        logger.trace("Skipping MOS object {}", mosID);\r
                        return null;\r
                }\r
diff --git a/server/user.jobengine.executors/src/user/jobengine/server/steps/GenerateMorpheusMetadataStep.java b/server/user.jobengine.executors/src/user/jobengine/server/steps/GenerateMorpheusMetadataStep.java
new file mode 100644 (file)
index 0000000..c1ab0af
--- /dev/null
@@ -0,0 +1,30 @@
+package user.jobengine.server.steps;\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
+import user.commons.morpheus.MorpheusStrings;\r
+import user.jobengine.server.IJobEngine;\r
+import user.jobengine.server.IJobRuntime;\r
+\r
+public class GenerateMorpheusMetadataStep extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+\r
+       @StepEntry\r
+       public Object[] execute(BasicDBObject material, String morpheusDeviceID, String dbUrl, String userName, String password, String targetMetadataPath,\r
+                       IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
+               try {\r
+                       String name = material.getString(MorpheusStrings.MATERIALID);\r
+                       String content = PlanAirExtensions.getMorpeusXML(jobEngine.getItemManager(), dbUrl, userName, password, name, morpheusDeviceID);\r
+                       EscortFiles.createMorpheusXML(targetMetadataPath, name + ".xml", content);\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
+                       logger.error(jobRuntime.getMarker(), "Hiba a Morpheus kísérő XML létrehozásakor. A rendszer üzenete: {}", e.getMessage());\r
+                       throw e;\r
+               }\r
+               return null;\r
+       }\r
+\r
+}\r
index bfa97f50f45f9f5dbb53fdf02787debe13ab5b22..f5b1b0fb4a272f233be7dbf46f476eb1144b73ba 100644 (file)
@@ -4,26 +4,32 @@ import org.apache.commons.lang.StringUtils;
 \r
 public class MetadataTypeDetector {\r
        public enum MetadataType {\r
-               TRAFFIC, OCTOPUSSTORY, OCTOPUSPLACEHOLDER, GENERIC\r
+               TrafficMaterial, TrafficPromo, TrafficAD, OctopusStory, OctopusPlaceholder, Generic\r
        }\r
 \r
-       private static final String REGEXP_TRAFFIC = "^[MRP]{1}[0-9]{6}[A-Z]{1}$";\r
+       private static final String REGEXP_TRAFFICMATERIALID = "^M{1}[0-9]{6}[A-Z]{1}$";\r
+       private static final String REGEXP_TRAFFICADID = "^R{1}[0-9]{6}[A-Z]{1}$";\r
+       private static final String REGEXP_TRAFFICPROMOID = "^P{1}[0-9]{6}[A-Z]{1}$";\r
        private static final String REGEXP_OCTOPUSSTORYID = "^[0-9]+$";\r
        private static final String REGEXP_OCTOPUSPLACEHOLDERID = "^[0-9]+_[0-9]+$";\r
        private static final String REGEXP_OCTOPUSPLACEHOLDERVERSIONEDID = "^[0-9]+_[0-9]+-[0-9]{3}$";\r
 \r
        public static MetadataType GuessMetadataType(String id) {\r
                if (StringUtils.isBlank(id))\r
-                       return MetadataType.GENERIC;\r
-               if (id.matches(REGEXP_TRAFFIC))\r
-                       return MetadataType.TRAFFIC;\r
+                       return MetadataType.Generic;\r
+               if (id.matches(REGEXP_TRAFFICMATERIALID))\r
+                       return MetadataType.TrafficMaterial;\r
+               if (id.matches(REGEXP_TRAFFICPROMOID))\r
+                       return MetadataType.TrafficPromo;\r
+               if (id.matches(REGEXP_TRAFFICADID))\r
+                       return MetadataType.TrafficAD;\r
                if (id.matches(REGEXP_OCTOPUSSTORYID))\r
-                       return MetadataType.OCTOPUSSTORY;\r
+                       return MetadataType.OctopusStory;\r
                if (id.matches(REGEXP_OCTOPUSPLACEHOLDERID))\r
-                       return MetadataType.OCTOPUSPLACEHOLDER;\r
+                       return MetadataType.OctopusPlaceholder;\r
                if (id.matches(REGEXP_OCTOPUSPLACEHOLDERVERSIONEDID))\r
-                       return MetadataType.OCTOPUSPLACEHOLDER;\r
-               return MetadataType.GENERIC;\r
+                       return MetadataType.OctopusPlaceholder;\r
+               return MetadataType.Generic;\r
        }\r
 \r
 }\r
index 49aa17a26aba006cd0b24e5dc0cffe178316c163..6aa8a3843ba29fd216012529034c063b48e83349 100644 (file)
@@ -306,7 +306,7 @@ public class OctopusDataMiner {
                                continue;\r
 \r
                        MetadataType metadataType = MetadataTypeDetector.GuessMetadataType(objId);\r
-                       if (!MetadataType.OCTOPUSPLACEHOLDER.equals(metadataType) && !MetadataType.OCTOPUSSTORY.equals(metadataType))\r
+                       if (!MetadataType.OctopusPlaceholder.equals(metadataType) && !MetadataType.OctopusStory.equals(metadataType))\r
                                continue;\r
                        if (result == null)\r
                                result = new BasicDBList();\r
index 6e1a7f8d119e824e21f067c4e7cfa91015588d5a..c44132494e13e67064daeac84571af45e5c532be 100644 (file)
@@ -55,14 +55,16 @@ public class OutputPathAndNameSelectorStep extends JobStep {
                MetadataType mdType = MetadataTypeDetector.GuessMetadataType(id);\r
                String targetPath = null;\r
                switch (mdType) {\r
-               case GENERIC:\r
+               case Generic:\r
                        targetPath = Paths.get(localRetrievePath, genericOutputFolder, id).toString();\r
                        break;\r
-               case OCTOPUSPLACEHOLDER:\r
-               case OCTOPUSSTORY:\r
+               case OctopusPlaceholder:\r
+               case OctopusStory:\r
                        targetPath = getPossiblePath(id, Paths.get(localRetrievePath, octopusOutputFolder, id)).toString();\r
                        break;\r
-               case TRAFFIC:\r
+               case TrafficMaterial:\r
+               case TrafficPromo:\r
+               case TrafficAD:\r
                        targetPath = getPossiblePath(id, Paths.get(localRetrievePath, trafficOutputFolder, id)).toString();\r
                        break;\r
                }\r
diff --git a/server/user.jobengine.executors/src/user/jobengine/server/steps/PlanAirExtensions.java b/server/user.jobengine.executors/src/user/jobengine/server/steps/PlanAirExtensions.java
new file mode 100644 (file)
index 0000000..7a7bd40
--- /dev/null
@@ -0,0 +1,263 @@
+package user.jobengine.server.steps;\r
+\r
+import java.io.StringWriter;\r
+import java.sql.Connection;\r
+import java.sql.DriverManager;\r
+import java.text.SimpleDateFormat;\r
+import java.util.ArrayList;\r
+import java.util.Date;\r
+import java.util.List;\r
+\r
+import javax.xml.parsers.DocumentBuilder;\r
+import javax.xml.parsers.DocumentBuilderFactory;\r
+import javax.xml.parsers.ParserConfigurationException;\r
+import javax.xml.transform.OutputKeys;\r
+import javax.xml.transform.Transformer;\r
+import javax.xml.transform.TransformerException;\r
+import javax.xml.transform.TransformerFactory;\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.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+import org.w3c.dom.DOMImplementation;\r
+import org.w3c.dom.Document;\r
+import org.w3c.dom.Node;\r
+\r
+import user.commons.mediatool.Timecode;\r
+import user.commons.mediatool.Timecode.Type;\r
+import user.jobengine.db.IItemManager;\r
+import user.jobengine.db.IResultSetConsumer;\r
+import user.jobengine.server.steps.MetadataTypeDetector.MetadataType;\r
+\r
+public class PlanAirExtensions {\r
+       private static final Logger logger = LogManager.getLogger();\r
+       //      @Operation int, @@@Options int, @@ItemID int, @@IntParam1 int=Null, @@IntParam2 int=Null, @@IntParam3 int=Null,\r
+       //                      @@StrParam1 varchar(200)=Null, @@StrParam2 varchar(max)=Null, @@DateParam1 datetime=Null, @@DateParam2 datetime=Null\r
+       private static final String MATERIAL_SQL = "{call dbo.clIFsp_EC_MAM(1002, Null, Null, Null, Null, Null, ?)}";//musorid\r
+       //    item.v_ProgrammeID = (int)ReadInt(reader, ref f);\r
+       //    item.v_Live = (bool)ReadBool(reader, ref f);\r
+       //    item.v_EpisodeID = ReadString(reader, ref f);\r
+       //    item.v_VariantID = ReadInt(reader, ref f);\r
+       //    item.v_MediaID = ReadString(reader, ref f);\r
+       //    item.v_VariantTypeID = ReadInt(reader, ref f);\r
+       //    item.v_ProgTitle = ReadString(reader, ref f);\r
+       //    item.v_EpTitle = ReadString(reader, ref f);\r
+       //    item.v_Episode = ReadShort(reader, ref f);\r
+       //    item.v_VariantType = ReadString(reader, ref f);\r
+       //    item.v_VariantKeywords = ReadString(reader, ref f);\r
+       //    item.v_VariantLengthTC = ReadString(reader, ref f);\r
+       //    item.v_VariantLengthFrame = ReadInt(reader, ref f);\r
+       //    item.v_VariantNrSegments = ReadInt(reader, ref f);\r
+       //    item.v_FirstBroadcastDate = ReadDateTime(reader, ref f);\r
+       //    item.v_NextBroadcastDate = ReadDateTime(reader, ref f);\r
+       //    item.v_OkForAir = ReadBool(reader, ref f);\r
+       //    item.v_ForTransm = ReadBool(reader, ref f);\r
+\r
+       private static final String MATERIAL_SEGMENTS_SQL = "{call dbo.clIFsp_EC_MAM(1010, Null, ?)}";//variantid\r
+       //    item.v_SegID = (int)ReadInt(reader, ref f);\r
+       //    item.v_VariantID = ReadInt(reader, ref f);\r
+       //    item.v_SegTitle = ReadString(reader, ref f);\r
+       //    item.v_SegKeyWords = ReadString(reader, ref f);\r
+       //    item.v_SegNumber = ReadInt(reader, ref f);\r
+       //    item.v_TcIn = ReadInt(reader, ref f);\r
+       //    item.v_TcOut = ReadInt(reader, ref f);\r
+       //    item.v_Duration = ReadInt(reader, ref f);\r
+       //    item.v_TcInTC = ReadString(reader, ref f);\r
+       //    item.v_TcOutTC = ReadString(reader, ref f);\r
+       //    item.v_DurationTC = ReadString(reader, ref f);\r
+       //    item.v_Dropable = ReadBool(reader, ref f);\r
+\r
+       private static final String PROMO_SQL = "{call dbo.clIFsp_EC_MAM(2002, Null, Null, Null, Null, Null, ?)}";\r
+       //    item.t_SpotID = (int)ReadInt(reader, ref f);\r
+       //    item.t_MediaID = ReadString(reader, ref f);\r
+       //    item.v_Title = ReadString(reader, ref f);\r
+       //    item.v_PromoType = ReadString(reader, ref f);\r
+       //    item.v_ProgTitle = ReadString(reader, ref f);\r
+       //    item.v_Episode = ReadShort(reader, ref f);\r
+       //    item.t_PSStart = ReadDateTime(reader, ref f);\r
+       //    item.t_PSEnd = ReadDateTime(reader, ref f);\r
+       //    item.v_EstimatedDuration = ReadInt(reader, ref f);\r
+       //    item.t_TcIn = ReadInt(reader, ref f);\r
+       //    item.t_TcOut = ReadInt(reader, ref f);\r
+       //    item.t_Duration = ReadInt(reader, ref f);\r
+       //    item.v_TcIn = ReadString(reader, ref f);\r
+       //    item.v_TcOut = ReadString(reader, ref f);\r
+       //    item.v_Duration = ReadString(reader, ref f);\r
+       //    item.v_Stations = ReadString(reader, ref f);\r
+       //    item.t_OkForAir = ReadBool(reader, ref f);\r
+       //    item.v_OkForAirs = ReadString(reader, ref f);\r
+       //    item.v_IsInactive = ReadBool(reader, ref f);\r
+       private static final String AD_SQL = "{call dbo.clIFsp_EC_MAM(3002, Null, Null, Null, Null, Null, ?)}";\r
+       //    item.t_SpotID = (int)ReadInt(reader, ref f);\r
+       //    item.t_MediaID = ReadString(reader, ref f);\r
+       //    item.v_Title = ReadString(reader, ref f);\r
+       //    item.t_Advertiser = ReadString(reader, ref f);\r
+       //    item.v_EstimatedDuration = ReadInt(reader, ref f);\r
+       //    item.t_TcIn = ReadInt(reader, ref f);\r
+       //    item.t_TcOut = ReadInt(reader, ref f);\r
+       //    item.t_Duration = ReadInt(reader, ref f);\r
+       //    item.v_TcIn = ReadString(reader, ref f);\r
+       //    item.v_TcOut = ReadString(reader, ref f);\r
+       //    item.v_Duration = ReadString(reader, ref f);\r
+       //    item.t_OkForAir = ReadBool(reader, ref f);\r
+       //    item.v_OkForAirs = ReadString(reader, ref f);\r
+\r
+       private static final String SQLSERVER_JDBC_SQL_SERVER_DRIVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver";\r
+       private static final String HYPHEN_SPACES = " - ";\r
+\r
+       private static void appendInstanceData(Document doc, Node node, String name, String deviceID, Timecode tcIn, Timecode tcOut) {\r
+               node.appendChild(doc.createElement("Long_File_Id")).setNodeValue(name);\r
+               node.appendChild(doc.createElement("Device_Id")).setNodeValue(deviceID);\r
+               node.appendChild(doc.createElement("Timecode_In")).setNodeValue(tcIn.toString(""));\r
+               node.appendChild(doc.createElement("Timecode_Out")).setNodeValue(tcOut.toString(""));\r
+               node.appendChild(doc.createElement("Quality_Check")).setNodeValue(new SimpleDateFormat("dd/MM/yyyy").format(new Date()));\r
+       }\r
+\r
+       private static void appendItemData(Document doc, Node node, String name, String title, Timecode duration, String type) {\r
+               node.appendChild(doc.createElement("Material_Id")).setNodeValue(name);\r
+               node.appendChild(doc.createElement("Title")).setNodeValue(title);\r
+               node.appendChild(doc.createElement("On_Air_Duration")).setNodeValue(duration.toString(""));\r
+               node.appendChild(doc.createElement("Material_Type")).setNodeValue(type);\r
+       }\r
+\r
+       private static Document createXMLDocument() throws ParserConfigurationException {\r
+               DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();\r
+               DocumentBuilder db = dbf.newDocumentBuilder();\r
+               DOMImplementation impl = db.getDOMImplementation();\r
+               Document xmlDocument = impl.createDocument(null, null, null);\r
+               return xmlDocument;\r
+       }\r
+\r
+       public static long getExistingRundownMedia(IItemManager manager, String houseid) {\r
+               final long[] result = { 0 };\r
+               StringBuilder query = new StringBuilder();\r
+               query.append("select mediaid, mediafilehouseid, filename");\r
+               query.append(" ");\r
+               query.append(String.format("from vw_rundown_items where mediafilehouseid like '%s%%'", houseid));\r
+               query.append(" ");\r
+               query.append("order by filename, mediaid");\r
+               IResultSetConsumer consumer = rs -> {\r
+                       String fileName = rs.getString("filename");\r
+                       if (houseid.equals(fileName)) {\r
+                               result[0] = rs.getLong("mediaid");\r
+                               return false;\r
+                       } else\r
+                               return true;\r
+               };\r
+               manager.executeQuery(query.toString(), consumer, null);\r
+               return result[0];\r
+       }\r
+\r
+       /*\r
+       <?xml version="1.0" encoding="UTF-8"?>\r
+       <ImportItems>\r
+         <ImportItem>\r
+           <Item>\r
+             <Material_Id>XMLTEST011</Material_Id>\r
+             <Title>Teszt Mozi</Title>\r
+             <On_Air_Duration>00000914</On_Air_Duration>\r
+             <Material_Type>PROGRAMME</Material_Type> //PROGRAMME, COMMERCIAL, JUNCTION\r
+           </Item>\r
+           <Instance>\r
+             <Device_Id>ISILON</Device_Id>\r
+             <Quality_Check>09/11/2017</Quality_Check>\r
+             <Long_File_Id>XMLTEST011</Long_File_Id>\r
+           </Instance>\r
+         </ImportItem>\r
+       </ImportItems>\r
+       */\r
+       public static String getMorpeusXML(IItemManager manager, String dbUrl, String userName, String password, String name, String deviceID) throws Exception {\r
+               String result = null;\r
+               final Connection connection = DriverManager.getConnection(dbUrl, userName, password);\r
+               try {\r
+                       MetadataType type = MetadataTypeDetector.GuessMetadataType(name);\r
+\r
+                       Document doc = createXMLDocument();\r
+                       Node rootNode = doc.appendChild(doc.createElement("ImportItems"));\r
+                       Node importItemNode = rootNode.appendChild(doc.createElement("ImportItem"));\r
+                       Node itemNode = importItemNode.appendChild(doc.createElement("Item"));\r
+                       Node instanceNode = importItemNode.appendChild(doc.createElement("Instance"));\r
+\r
+                       //TODO hiba esetén exception\r
+                       switch (type) {\r
+                       case TrafficMaterial:\r
+                               manager.executeQuery(connection, MATERIAL_SQL, rs -> {\r
+                                       String progTitle = rs.getString("v_ProgTitle");\r
+                                       String epTitle = rs.getString("v_EpTitle");\r
+                                       String title = progTitle;\r
+                                       if (StringUtils.isNotBlank(epTitle))\r
+                                               title += HYPHEN_SPACES + epTitle;\r
+                                       int variantID = rs.getInt("v_VariantID");\r
+                                       List<int[]> segments = new ArrayList<>();\r
+                                       manager.executeQuery(connection, MATERIAL_SEGMENTS_SQL, rs1 -> {\r
+                                               int[] segment = { rs.getInt("v_TcIn"), rs.getInt("v_TcOut") };\r
+                                               segments.add(segment);\r
+                                               return true;\r
+                                       }, st -> {\r
+                                               st.setInt(1, variantID);\r
+                                       });\r
+                                       int out = segments.get(segments.size() - 1)[1];\r
+                                       int in = segments.get(0)[0];\r
+                                       appendItemData(doc, itemNode, name, title, new Timecode(out - in, Type.PAL), "PROGRAMME");\r
+                                       appendInstanceData(doc, instanceNode, name, deviceID, new Timecode(in, Type.PAL), new Timecode(out, Type.PAL));\r
+                                       return false;\r
+                               }, st -> {\r
+                                       st.setString(1, name);\r
+                               });\r
+                               break;\r
+                       case TrafficPromo:\r
+                               manager.executeQuery(connection, PROMO_SQL, rs -> {\r
+                                       String title = rs.getString("v_Title");\r
+                                       int in = rs.getInt("v_TcIn");\r
+                                       int out = rs.getInt("v_TcOut");\r
+                                       appendItemData(doc, itemNode, name, title, new Timecode(out - in, Type.PAL), "COMMERCIAL");\r
+                                       appendInstanceData(doc, instanceNode, name, deviceID, new Timecode(in, Type.PAL), new Timecode(out, Type.PAL));\r
+                                       return false;\r
+                               }, st -> {\r
+                                       st.setString(1, name);\r
+                               });\r
+                               break;\r
+                       case TrafficAD:\r
+                               manager.executeQuery(connection, AD_SQL, rs -> {\r
+                                       String title = rs.getString("v_Title");\r
+                                       int in = rs.getInt("v_TcIn");\r
+                                       int out = rs.getInt("v_TcOut");\r
+                                       appendItemData(doc, itemNode, name, title, new Timecode(out - in, Type.PAL), "JUNCTION");\r
+                                       appendInstanceData(doc, instanceNode, name, deviceID, new Timecode(in, Type.PAL), new Timecode(out, Type.PAL));\r
+                                       return false;\r
+                               }, st -> {\r
+                                       st.setString(1, name);\r
+                               });\r
+                               break;\r
+                       default:\r
+                               return null;\r
+                       }\r
+                       result = XMLtoString(doc);\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
+                       throw e;\r
+               } finally {\r
+                       if (connection != null)\r
+                               connection.close();\r
+               }\r
+               return result;\r
+       }\r
+\r
+       private static String XMLtoString(Document doc) throws TransformerException {\r
+               DOMSource domSource = new DOMSource(doc);\r
+               TransformerFactory tf = TransformerFactory.newInstance();\r
+               Transformer transformer = tf.newTransformer();\r
+               //transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");\r
+               transformer.setOutputProperty(OutputKeys.METHOD, "xml");\r
+               transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");\r
+               //transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");\r
+               transformer.setOutputProperty(OutputKeys.INDENT, "yes");\r
+               StringWriter sw = new StringWriter();\r
+               StreamResult sr = new StreamResult(sw);\r
+               transformer.transform(domSource, sr);\r
+               return sw.toString();\r
+       }\r
+\r
+}\r
diff --git a/server/user.jobengine.osgi.commons/src/user/commons/mediatool/Timecode.java b/server/user.jobengine.osgi.commons/src/user/commons/mediatool/Timecode.java
new file mode 100644 (file)
index 0000000..1d0b192
--- /dev/null
@@ -0,0 +1,444 @@
+package user.commons.mediatool;\r
+\r
+public class Timecode {\r
+       public class TimecodeException extends Exception {\r
+               private static final long serialVersionUID = 1L;\r
+\r
+               public TimecodeException(String message) {\r
+                       super(message);\r
+               }\r
+       }\r
+\r
+       public static class Type {\r
+               /** 29.97 frames/sec, 29,970 samples/sec */\r
+               public static final Type NTSC = new Type(29.970F);\r
+               /** 25 frames/sec, 25,000 samples/sec */\r
+               public static final Type PAL = new Type(25.000F);\r
+               /** 24 frames/sec, 24,000 samples/sec */\r
+               public static final Type FILM = new Type(24.000F);\r
+               /** 75 frames/sec, 44,100 samples/sec */\r
+               public static final Type CD = new Type(75.000F, 44100.000F);\r
+\r
+               public static Type getInstance(float framesPerSecond) throws NumberFormatException {\r
+                       float maxDelta = .031f;\r
+                       if (Math.abs(framesPerSecond - NTSC.getFramesPerSecond()) < maxDelta)\r
+                               return NTSC;\r
+                       if (Math.abs(framesPerSecond - PAL.getFramesPerSecond()) < maxDelta)\r
+                               return PAL;\r
+                       if (Math.abs(framesPerSecond - FILM.getFramesPerSecond()) < maxDelta)\r
+                               return FILM;\r
+                       if (Math.abs(framesPerSecond - CD.getFramesPerSecond()) < maxDelta)\r
+                               return CD;\r
+                       throw new NumberFormatException("Cannot map " + framesPerSecond + " frames/sec to a defined timecode format.");\r
+               }\r
+\r
+               private float framesPerSecond;\r
+               private float samplesPerSecond;\r
+\r
+               private boolean usesSamples = false;\r
+\r
+               private Type(float framesPerSecond) {\r
+                       this.framesPerSecond = framesPerSecond;\r
+                       this.samplesPerSecond = framesPerSecond * 1000;\r
+               }\r
+\r
+               private Type(float framesPerSecond, float samplesPerSecond) {\r
+                       this.framesPerSecond = framesPerSecond;\r
+                       this.samplesPerSecond = samplesPerSecond;\r
+                       this.usesSamples = true;\r
+               }\r
+\r
+               public float getFramesPerSecond() {\r
+                       return framesPerSecond;\r
+               }\r
+\r
+               public float getSamplesPerSecond() {\r
+                       return samplesPerSecond;\r
+               }\r
+\r
+               public boolean usesSamples() {\r
+                       return usesSamples;\r
+               }\r
+       }\r
+\r
+       private int hours = 0;\r
+       private int minutes = 0;\r
+       private int seconds = 0;\r
+       private int frames = 0;\r
+       private float framesPerSecond = 25;\r
+       private long samples = -1;\r
+\r
+       private float samplesPerSecond = 44100;\r
+\r
+       private boolean useSamples = true;\r
+\r
+       /** Creates a new timecode of the given type based on seconds. */\r
+       public Timecode(float seconds, Type type) {\r
+               setType(type);\r
+               setCode(seconds);\r
+       }\r
+\r
+       public Timecode(int frames, Type type) {\r
+               setType(type);\r
+               float reminder = frames;\r
+               float frameRate = framesPerSecond;\r
+               int hour = (int) (reminder / (60 * 60 * frameRate));\r
+               setHours(hour);\r
+               reminder = reminder % (60 * 60 * frameRate);\r
+               int minute = (int) (reminder / (60 * frameRate));\r
+               setMinutes(minute);\r
+               reminder = reminder % (60 * frameRate);\r
+               int sec = (int) (reminder / frameRate);\r
+               setSeconds(sec);\r
+               reminder = reminder % frameRate;\r
+               int frame = (int) reminder;\r
+               setFrames(frame);\r
+       }\r
+\r
+       /** Creates a new CD timecode based on a string in the form HH:MM:SS:FF */\r
+       public Timecode(String timecode) throws Timecode.TimecodeException {\r
+               this(timecode, Type.CD);\r
+       }\r
+\r
+       /**\r
+        * Creates a new timecode of the given type based on a string in the form HH:MM:SS:FF\r
+        */\r
+       public Timecode(String timecode, Type type) throws Timecode.TimecodeException {\r
+               setType(type);\r
+               setCode(timecode);\r
+       }\r
+\r
+       /** Creates a new blank timecode of the given type set at 00:00:00:00 */\r
+       public Timecode(Type type) {\r
+               setType(type);\r
+               setCode(0);\r
+       }\r
+\r
+       public void clear() {\r
+               setHours(0);\r
+               setMinutes(0);\r
+               setSeconds(0);\r
+               setFrames(0);\r
+               setSamples(-1);\r
+       }\r
+\r
+       @Override\r
+       public boolean equals(Object obj) {\r
+               return this.getCode().equals(obj.toString());\r
+       }\r
+\r
+       public String getCode() {\r
+               String outString = "";\r
+               outString += (getHours() < 10 ? "0" + getHours() : "" + getHours()) + ":";\r
+               outString += (getMinutes() < 10 ? "0" + getMinutes() : "" + getMinutes()) + ":";\r
+               outString += (getSeconds() < 10 ? "0" + getSeconds() : "" + getSeconds()) + ":";\r
+               outString += (getFrames() < 10 ? "0" + getFrames() : "" + getFrames());\r
+               return outString;\r
+       }\r
+\r
+       public String getCodeWithSamples() {\r
+               String outString = "";\r
+               outString += (getHours() < 10 ? "0" + getHours() : "" + getHours()) + "|";\r
+               outString += (getMinutes() < 10 ? "0" + getMinutes() : "" + getMinutes()) + "|";\r
+               outString += (getSeconds() < 10 ? "0" + getSeconds() : "" + getSeconds()) + "|";\r
+               outString += (getFrames() < 10 ? "0" + getFrames() : "" + getFrames()) + "|";\r
+               if (getSamples() < 0) {\r
+                       outString += "0000";\r
+               } else {\r
+                       String _samples = "000" + getSamples();\r
+                       outString += _samples.substring(_samples.length() - 4);\r
+               }\r
+               return outString;\r
+       }\r
+\r
+       public int getFrames() {\r
+               return frames;\r
+       }\r
+\r
+       public float getFramesPerSecond() {\r
+               return framesPerSecond;\r
+       }\r
+\r
+       public int getHours() {\r
+               return hours;\r
+       }\r
+\r
+       public int getMinutes() {\r
+               return minutes;\r
+       }\r
+\r
+       public long getSamples() {\r
+               return samples;\r
+       }\r
+\r
+       public float getSamplesPerSecond() {\r
+               return samplesPerSecond;\r
+       }\r
+\r
+       public int getSeconds() {\r
+               return seconds;\r
+       }\r
+\r
+       /**\r
+        * Breaks a string on any non-numeric character and returns the index token, zero indexed\r
+        */\r
+       private int getToken(String inString, int index) throws Timecode.TimecodeException {\r
+               inString = inString.trim();\r
+               String valid = "0123456789";\r
+               String token = "";\r
+               int count = 0;\r
+               for (int i = 0; i < inString.length(); i++) {\r
+                       char current = inString.charAt(i);\r
+                       if (valid.indexOf(current) > -1) {\r
+                               token += current;\r
+                       } else {\r
+                               count++;\r
+                               if (count > index)\r
+                                       break; // Found the token.\r
+                               token = ""; // Start reading the next token\r
+                       }\r
+               }\r
+               if (count < index || token.equals(""))\r
+                       throw new Timecode.TimecodeException("Malformed timecode '" + inString + "', can't get index=" + index);\r
+               try {\r
+                       return Integer.parseInt(token);\r
+               } catch (NumberFormatException ex) {\r
+                       throw new Timecode.TimecodeException("Malformed timecode '" + inString + "', '" + token + "' is not an integer");\r
+               }\r
+       }\r
+\r
+       /**\r
+        * Goes through the system and sanitizes badly formed values : 00:00:60:00 will become 00:01:00:00, etc.\r
+        */\r
+       @SuppressWarnings("all")\r
+       public void normalize() {\r
+               // Start on samples\r
+               int samplesPerFrame = (int) (getSamplesPerSecond() / getFramesPerSecond());\r
+               setFrames(getFrames() + (int) (getSamples() * (1.0f / samplesPerFrame)));\r
+               setSamples(getSamples() % samplesPerFrame);\r
+\r
+               setSeconds(getSeconds() + (int) (getFrames() / getFramesPerSecond()));\r
+               setFrames((int) (getFrames() % getFramesPerSecond()));\r
+\r
+               while (getSeconds() >= 60) {\r
+                       setSeconds(getSeconds() - 60);\r
+                       setMinutes(getMinutes() + 1);\r
+               }\r
+               while (getMinutes() >= 60) {\r
+                       setMinutes(getMinutes() - 60);\r
+                       setHours(getHours() + 1);\r
+               }\r
+       }\r
+\r
+       @SuppressWarnings("all")\r
+       public void setCode(double seconds) {\r
+               clear();\r
+               setSamples((long) (seconds * getSamplesPerSecond()));\r
+               normalize();\r
+       }\r
+\r
+       /**\r
+        * Sets the object up based on seconds... Will be an approximation as the code will default to 1/75 second accuracy or that set by\r
+        * <code>setFramesPerSecond()</code>.)\r
+        */\r
+       public void setCode(float seconds) {\r
+               setCode((double) seconds);\r
+       }\r
+\r
+       /**\r
+        * Set the code based on frames, framesPerSecond defaults to 75. For example, setCode(100) would be '00:00:01:25'\r
+        */\r
+       public void setCode(int frames) {\r
+               clear();\r
+               setFrames(frames);\r
+               normalize();\r
+       }\r
+\r
+       /** Sets the object based on a string in the form HH:MM:SS:FF */\r
+       public void setCode(String timecode) throws Timecode.TimecodeException {\r
+               clear();\r
+               setHours(getToken(timecode, 0));\r
+               setMinutes(getToken(timecode, 1));\r
+               setSeconds(getToken(timecode, 2));\r
+               setFrames(getToken(timecode, 3));\r
+               if (useSamples()) {\r
+                       try {\r
+                               setSamples(getToken(timecode, 4));\r
+                               // If we got here, we're parsing a AES31-formatted string... Set our\r
+                               // frames per sec to 30 instead of 75\r
+                               setFramesPerSecond(30);\r
+                       } catch (Timecode.TimecodeException ignored) {\r
+                       } // If this fails, it just means the code didn't have samples appended\r
+               }\r
+               // fix badly formed values : 00:00:60:00 will become 00:01:00:00, etc.\r
+               normalize();\r
+       }\r
+\r
+       public void setFrames(int value) {\r
+               frames = value;\r
+       }\r
+\r
+       public void setFramesPerSecond(float value) {\r
+               framesPerSecond = value;\r
+       }\r
+\r
+       public void setHours(int value) {\r
+               hours = value;\r
+       }\r
+\r
+       public void setMinutes(int value) {\r
+               minutes = value;\r
+       }\r
+\r
+       public void setSamples(long value) {\r
+               samples = value;\r
+       }\r
+\r
+       public void setSamplesPerSecond(float value) {\r
+               samplesPerSecond = value;\r
+       }\r
+\r
+       public void setSeconds(int value) {\r
+               seconds = value;\r
+       }\r
+\r
+       /**\r
+        * Sets this timecodes samplesPerSecond and framesPerSecond based on the given type\r
+        */\r
+       private void setType(Type type) {\r
+               setSamplesPerSecond(type.getSamplesPerSecond());\r
+               setFramesPerSecond(type.getFramesPerSecond());\r
+               setUseSamples(type.usesSamples());\r
+       }\r
+\r
+       /**\r
+        * If true, samples per second will be used in computing fractions of frames. If false, frames is the smallest unit.\r
+        */\r
+       public void setUseSamples(boolean b) {\r
+               useSamples = b;\r
+       }\r
+\r
+       public double toDoubleSeconds() {\r
+               double value = 0;\r
+               value += getHours() * 3600;\r
+               value += getMinutes() * 60;\r
+               value += getSeconds();\r
+               value += getFrames() * (1.0 / getFramesPerSecond());\r
+               if (useSamples() && getSamples() > -1)\r
+                       value += getSamples() * (1.0 / getSamplesPerSecond());\r
+               return value;\r
+       }\r
+\r
+       /**\r
+        * @return the total number of frames this object represents, so for a 1 second ntsc video timecode, this would return 29.97.\r
+        */\r
+       public double toFrames() {\r
+               double value = 0;\r
+               value += getHours() * 3600 * getFramesPerSecond();\r
+               value += getMinutes() * 60 * getFramesPerSecond();\r
+               value += getSeconds() * getFramesPerSecond();\r
+               value += getFrames();\r
+               if (getSamples() > -1)\r
+                       value += getSamples() / (getSamplesPerSecond() / getFramesPerSecond());\r
+               return value;\r
+       }\r
+\r
+       /**\r
+        * Uses the default ":" delimiter\r
+        *\r
+        * @return the code as "HH:MM:SS"\r
+        */\r
+       public String toHHMMSS() {\r
+               return toHHMMSS(":");\r
+       }\r
+\r
+       /**\r
+        * Units smaller than seconds are ignored completely. For example the HH:MM:SS:FF string "01:03:05:07" would return "01:03:05"\r
+        *\r
+        * @param delimiter\r
+        * @return the total time in hh:mm:ss format where ":" is specified by the delimiter parameter.\r
+        */\r
+       public String toHHMMSS(String delimiter) {\r
+               String outString = "";\r
+               outString += (getHours() < 10 ? "0" + getHours() : "" + getHours()) + delimiter;\r
+               outString += (getMinutes() < 10 ? "0" + getMinutes() : "" + getMinutes()) + delimiter;\r
+               outString += (getSeconds() < 10 ? "0" + getSeconds() : "" + getSeconds());\r
+               return outString;\r
+       }\r
+\r
+       /**\r
+        * Hours are added to the minutes and minutes are added to the seconds value so seconds could be larger than 60. Units smaller than seconds are ignored\r
+        * completely.\r
+        *\r
+        * @return the total time in seconds.\r
+        */\r
+       public int toIntSeconds() {\r
+               int _minutes = getHours() * 60;\r
+               _minutes += getMinutes();\r
+               int _seconds = _minutes * 60;\r
+               _seconds += getSeconds();\r
+               return _seconds;\r
+       }\r
+\r
+       /**\r
+        * Uses the default ":" delimiter\r
+        *\r
+        * @return the code as "MM:SS"\r
+        */\r
+       public String toMMSS() {\r
+               return toMMSS(":");\r
+       }\r
+\r
+       /**\r
+        * Hours are added to the minutes value so minutes could be larger than 60. Units smaller than seconds are ignored completely. For example the HH:MM:SS:FF\r
+        * string "01:03:05:07" would return "63:05"\r
+        *\r
+        * @param delimiter\r
+        * @return the total time in mm:ss format where ":" is specified by the delimiter parameter.\r
+        */\r
+       public String toMMSS(String delimiter) {\r
+               String outString = "";\r
+               int _minutes = getHours() * 60;\r
+               _minutes += getMinutes();\r
+               outString += (_minutes < 10 ? "0" + _minutes : "" + _minutes) + delimiter;\r
+               outString += (getSeconds() < 10 ? "0" + getSeconds() : "" + getSeconds());\r
+               return outString;\r
+       }\r
+\r
+       /**\r
+        * @return the total number of samples this object represents, so for a 1 second timecode, this would return 44100.\r
+        */\r
+       public long toSamples() {\r
+               long value = 0;\r
+               if (getSamples() > -1)\r
+                       value += getSamples();\r
+               value += getFrames() * (getSamplesPerSecond() / getFramesPerSecond());\r
+               value += getSeconds() * getSamplesPerSecond();\r
+               value += getMinutes() * 60 * getSamplesPerSecond();\r
+               value += getHours() * 60 * 60 * getSamplesPerSecond();\r
+               return value;\r
+       }\r
+\r
+       public float toSeconds() {\r
+               return (float) toDoubleSeconds();\r
+       }\r
+\r
+       @Override\r
+       public String toString() {\r
+               return getCode();\r
+       }\r
+\r
+       public String toString(String delimiter) {\r
+               String outString = "";\r
+               outString += (getHours() < 10 ? "0" + getHours() : "" + getHours()) + delimiter;\r
+               outString += (getMinutes() < 10 ? "0" + getMinutes() : "" + getMinutes()) + delimiter;\r
+               outString += (getSeconds() < 10 ? "0" + getSeconds() : "" + getSeconds()) + delimiter;\r
+               outString += (getFrames() < 10 ? "0" + getFrames() : "" + getFrames());\r
+               return outString;\r
+       }\r
+\r
+       public boolean useSamples() {\r
+               return useSamples;\r
+       }\r
+\r
+}
\ No newline at end of file
index 0b5f655fb34f36cad804dbdfe19d32705702d773..a33535370ab7802bcffe7ff6d31454ab2e40f3f8 100644 (file)
@@ -1,6 +1,7 @@
 package user.jobengine.db;\r
 \r
 import java.net.URI;\r
+import java.sql.Connection;\r
 import java.sql.Timestamp;\r
 import java.util.Calendar;\r
 import java.util.Date;\r
@@ -98,6 +99,8 @@ public interface IItemManager extends IEntityPersister {
 \r
        void disconnect();\r
 \r
+       void executeQuery(Connection connection, String query, IResultSetConsumer consumer, IStatementDecorator decorator);\r
+\r
        void executeQuery(String query, IResultSetConsumer consumer, IStatementDecorator decorator);\r
 \r
        /**\r
@@ -139,6 +142,8 @@ public interface IItemManager extends IEntityPersister {
 \r
        DefaultContext getDbContext();\r
 \r
+       //      long getExistingRundownMedia(String houseid);\r
+\r
        /**\r
         * Elkéri az összes dinamikus anyag típust.\r
         *\r
@@ -146,8 +151,6 @@ public interface IItemManager extends IEntityPersister {
         */\r
        List<ItemType> getDynamicItemTypes();\r
 \r
-       //      long getExistingRundownMedia(String houseid);\r
-\r
        /**\r
         * Elkéri a FileTypeDAO-tól a bemeneti paraméterként kapott névvel rendelekző FileType-ot.\r
         *\r
index 26854aca3d63814a15197c46651fb39784719e6f..0d0514aa57c2f9074f90f30dc937d75b06772260 100644 (file)
@@ -410,11 +410,9 @@ public class ItemManager extends MemoryCache implements IItemManager {
        }\r
 \r
        @Override\r
-       public void executeQuery(String query, IResultSetConsumer consumer, IStatementDecorator decorator) {\r
+       public void executeQuery(Connection connection, String query, IResultSetConsumer consumer, IStatementDecorator decorator) {\r
                ResultSet rs = null;\r
                PreparedStatement st = null;\r
-               DefaultContext context = getDbContext();\r
-               Connection connection = context.getConnection();\r
                try {\r
                        st = connection.prepareStatement(query);\r
                        if (decorator != null)\r
@@ -443,6 +441,17 @@ public class ItemManager extends MemoryCache implements IItemManager {
                                        st.close();\r
                        } catch (Exception e1) {\r
                        }\r
+               }\r
+       }\r
+\r
+       @Override\r
+       public void executeQuery(String query, IResultSetConsumer consumer, IStatementDecorator decorator) {\r
+               DefaultContext context = getDbContext();\r
+               Connection connection = context.getConnection();\r
+               try {\r
+                       executeQuery(connection, query, consumer, decorator);\r
+               } catch (Exception e) {\r
+               } finally {\r
                        putDbContext(context);\r
                }\r
        }\r
index 48f99b61fc1bd4f5bd57f2ffd36adc40ac790927..4ad4442cebc6c5d5e59a842f4b9ae231da3ff2bc 100644 (file)
@@ -63,6 +63,14 @@ public class EscortFiles {
                return String.format(KILLDATE_FILENAME, fileName, composeKillDate(days));\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[] createNEXIOKillDateFile(String fileName, Date killDate, String description, String agency) throws Exception {\r
                DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();\r
                DocumentBuilder db = dbf.newDocumentBuilder();\r
index 735b3dfe216c6c4cc79b99e3d233a341046793be..ba744c56f51bfb4d9a922ff69b90b1b3441d0f05 100644 (file)
@@ -94,7 +94,6 @@ public class MissingMaterialsModel extends AsyncBaseModel implements IJobChanged
                                        ScheduledJob retriveJob = jobEngine.getScheduledJob(RETRIEVE_TEMPLATE);\r
                                        Map<String, Object> parameters = retriveJob.getJobParameters();\r
                                        parameters.put(MorpheusStrings.MATERIAL, material);\r
-                                       parameters.put(TARGETPATH, String.valueOf(targetPath));\r
                                        jobEngine.submit(RETRIEVE_TEMPLATE, String.format("%s hiányzó anyag visszatöltése", name), parameters);\r
                                } catch (Exception e) {\r
                                        logger.catching(e);\r
index 1240c31b8b6ffe04bab2ce357e05c14a4234848d..e807b30ac6ea6d705ced0c9ecc1acd4ffc8b2339 100644 (file)
@@ -31,7 +31,6 @@ import org.junit.AfterClass;
 import org.junit.BeforeClass;\r
 import org.junit.Test;\r
 \r
-import com.ibm.nosql.json.JSONUtil;\r
 import com.ibm.nosql.json.api.BasicDBObject;\r
 import com.ibm.nosql.json.api.DB;\r
 import com.ibm.nosql.json.api.DBCollection;\r
@@ -592,11 +591,6 @@ public class Support {
 \r
        @Test\r
        public void test1() throws IOException {\r
-               byte[] content = Files.readAllBytes(Paths.get("//10.10.1.100/BRAAVOS/ARCHIVE/.STATUS/!!!!!76952087-76828571-CAM02_2070-20180517082324.MXF.json"));\r
-\r
-               DBObject o = JSONUtil.jsonToDbObject(new String(content));\r
-\r
-               System.out.println(o);\r
 \r
        }\r
 \r