git-tfs-id: [http://tfs.userrendszerhaz.hu:8080/tfs/DefaultCollection]$/MediaCube...
authorVásáry Dániel <daniel.vasary@userrendszerhaz.hu>
Sun, 3 Dec 2017 23:03:36 +0000 (23:03 +0000)
committerVásáry Dániel <daniel.vasary@userrendszerhaz.hu>
Sun, 3 Dec 2017 23:03:36 +0000 (23:03 +0000)
24 files changed:
client/Maestro/Configuration/-configuration-playout-ingest.json
client/Maestro/Configuration/-configuration-tqc-check.json [moved from client/Maestro/Configuration/configuration-tqc-check.json with 100% similarity]
client/Maestro/Configuration/configuration-studio.json [moved from client/Maestro/Configuration/-configuration-studio.json with 100% similarity]
client/Maestro/Installer/installforge-installer-project.ifp
client/Maestro/Maestro.csproj
client/Maestro/MaestroForm.Metadata.cs
client/Maestro/MaestroForm.Source.cs
client/Maestro/Properties/AssemblyInfo.cs
client/MaestroShared/Metadata/ArchiveMetadata.cs
client/MaestroShared/Targets/UNCTargetProcessor.cs
client/PlanAIRClient/TrafficIDSelector.cs
client/PlanAIRClient/Workers/MaterialWorker.cs
server/-configuration/log4j2.xml
server/-configuration/scheduledjobs.json
server/user.jobengine.executors/META-INF/MANIFEST.MF
server/user.jobengine.executors/config/config.xml
server/user.jobengine.executors/jobtemplates/delete-materials.xml
server/user.jobengine.executors/src/user/jobengine/server/steps/CleanupMountedLocationStep.java [new file with mode: 0644]
server/user.jobengine.executors/src/user/jobengine/server/steps/DeleteMaterialsStep.java
server/user.jobengine.osgi.commons/src/user/commons/nexio/NexioClipEventDispatcher.java
server/user.jobengine.osgi.commons/src/user/commons/octopus/OctopusDataMiner.java
server/user.jobengine.osgi.server/pages/index.zul
server/user.jobengine.osgi.server/src/user/jobengine/server/JobEngine.java
server/user.jobengine.osgi.server/src/user/jobengine/server/steps/JobStep.java

index ddd13040318565787876b4f4db0d6b43d9a535d9..aa818ef78d9a56e12fce43f666f94ee12d06375c 100644 (file)
@@ -1,6 +1,6 @@
 {\r
   "title": "Lebony betöltő",\r
-  "active": false,\r
+  "active": true,\r
   "startInTray": false,\r
   "enableCustomMetadataId": true,\r
   "player": {\r
index 9ab745e643e9665ce2d5ca30f1a2cac0f59867f2..8d9290ea08728c880a4cb5e5a4afb047a2a6bc0f 100644 (file)
Binary files a/client/Maestro/Installer/installforge-installer-project.ifp and b/client/Maestro/Installer/installforge-installer-project.ifp differ
index 22f34e5c6349611f268b952a269da2c6bed7e16e..55f38c46fddaeebcef25bf724573832d89b1b5a2 100644 (file)
     <None Include="Configuration\-configuration-playout-ingest.json">\r
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
     </None>\r
-    <None Include="Configuration\configuration-tqc-check.json">\r
+    <None Include="Configuration\-configuration-tqc-check.json">\r
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
     </None>\r
     <None Include="Connected Services\packages.config" />\r
     <None Include="Configuration\-configuration-sxs.json">\r
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
     </None>\r
-    <None Include="Configuration\-configuration-studio.json">\r
+    <None Include="Configuration\configuration-studio.json">\r
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
     </None>\r
   </ItemGroup>\r
index b7f43ee6bb335e0b9f9554ccfbf4fed0f0ab7514..73e069b6bb5c71e2cf3be4c427f6d93285fa1599 100644 (file)
@@ -13,6 +13,7 @@ using Model;
 using MaestroShared.Configuration;\r
 using MaestroShared.Metadata;\r
 using MaestroShared.Targets;\r
+using MaestroShared.Commons;\r
 \r
 namespace Maestro {\r
     public partial class MaestroForm {\r
@@ -157,17 +158,26 @@ namespace Maestro {
                 return;\r
             Cursor = Cursors.WaitCursor;\r
             if (movieSegments == null || movieSegments.Count == 0)\r
-                QuerySegments();\r
+                movieSegments = QuerySegments();\r
             if (movieSegments == null)\r
                 movieSegments = new BindingList<MovieSegment>();\r
-            OpenFile(SelectedSource.FileInfo, true);\r
+            bool readOnly = true;\r
+            if (archiveMetadata == null)\r
+                MsgBox.Error("A metaadatok nem elérhetők, a szegmens definiálás nem engedélyezett.");\r
+            else {\r
+                readOnly = archiveMetadata.ok;\r
+                MsgBox.Warning("Az anyag már el van fogadva, a szegmens módosítás nem kerül mentésre. A szegmensek módosításához vissza kell vonni az anyag elfogadását az adástervező rendszerben.");\r
+            }\r
+            OpenFile(SelectedSource.FileInfo, true, readOnly);\r
             UpdateDefineSegmentsStatus();\r
         }\r
 \r
-        private void QuerySegments() {\r
+        private BindingList<MovieSegment> QuerySegments() {\r
+            BindingList<MovieSegment> result = null;\r
             List<MovieSegment> storedSegments = GetSegments();\r
             if (storedSegments != null && storedSegments.Count > 0)\r
-                movieSegments = new BindingList<MovieSegment>(storedSegments);\r
+                result = new BindingList<MovieSegment>(storedSegments);\r
+            return result;\r
         }\r
 \r
         private void UpdateDefineSegmentsStatus() {\r
@@ -269,6 +279,7 @@ namespace Maestro {
             result.mediaHouseId = actualResult.EpisodeID;\r
             result.mediaTitle = !String.IsNullOrEmpty(actualResult.EpisodeTitle) ? actualResult.EpisodeTitle : actualResult.ProgTitle;\r
             result.mediaDescription = actualResult.EpisodeDescription;\r
+            result.ok = actualResult.OK;\r
             return result;\r
         }\r
 \r
@@ -323,8 +334,23 @@ namespace Maestro {
                 }\r
             }\r
 \r
-            movieSegments = null;\r
-            archiveMetadata = null;\r
+            switch (SelectedMetadata?.Kind) {\r
+                case MetadataType.OctopusStory:\r
+                case MetadataType.OctopusPlaceHolder:\r
+                    archiveMetadata = GetArchiveMetadata();\r
+                    break;\r
+                case MetadataType.TrafficAD:\r
+                case MetadataType.TrafficMaterial:\r
+                case MetadataType.TrafficPromo:\r
+                    archiveMetadata = GetArchiveMetadata();\r
+                    movieSegments = null;\r
+                    movieSegments = QuerySegments();\r
+                    break;\r
+                default:\r
+                    movieSegments = null;\r
+                    archiveMetadata = null;\r
+                    break;\r
+            }\r
 \r
             UpdateProcessorButtonsEnabled();\r
             UpdateDefineSegmentEnabled();\r
index ae7a66ae4c4b23eaca053c364c245f5cd2cd7fe5..4657a1f2b676bbe81314e7351f9ecc097a05d63b 100644 (file)
@@ -227,12 +227,12 @@ namespace Maestro {
                 if (fileSourceItem == null)\r
                     return;\r
                 dgSource.Enabled = false;\r
-                OpenFile(fileSourceItem.FileInfo, false);\r
+                OpenFile(fileSourceItem.FileInfo, false, false);\r
                 dgSource.Enabled = true;\r
             }\r
         }\r
 \r
-        private void OpenFile(FileInfo fileInfo, bool segmentEditor) {\r
+        private void OpenFile(FileInfo fileInfo, bool segmentEditor, bool readOnly) {\r
             Cursor = Cursors.WaitCursor;\r
             try {\r
                 string[] extensions = Configuration.Player?.Extensions;\r
index ecb854a274345eabd8ad61b3b20794efa85bdc61..76d8cb5247f55a68c2a943f4367ee53f121075af 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.6.1")]\r
-[assembly: AssemblyFileVersion("2.0.6.1")]\r
+[assembly: AssemblyVersion("2.0.6.2")]\r
+[assembly: AssemblyFileVersion("2.0.6.2")]\r
index 15e42ece1d889269fe18cd0e6e64b5f75916a036..0aa11252dee8280d02ad12bbafd1098015f0965a 100644 (file)
@@ -15,6 +15,7 @@ namespace MaestroShared.Metadata {
         public string mediaHouseId { get; set; }\r
         public string mediaTitle { get; set; }\r
         public string mediaDescription { get; set; }\r
+        public bool ok { get; set; }\r
 \r
         public override string ToString() {\r
             return JsonConvert.SerializeObject(this);\r
index 01c68cc2439b1f17bae9d10cbdeb29f6767391a4..b57e04a2ec26e9964152f45cfde1eda2cc73fa6d 100644 (file)
@@ -110,18 +110,24 @@ namespace MaestroShared.Targets {
 \r
         private bool DeleteExisting(string currentFile) {\r
             bool result = true;\r
-            if (FileExists(currentFile) && (Parameters.TargetConfig.DisableFileVersioning || Parameters.TargetConfig.EnableOverride)) {\r
+            if (FileExists(currentFile) && (Parameters.TargetConfig.DisableFileVersioning || Parameters.TargetConfig.EnableOverride || Parameters.ArchiveMetadata.ok)) {\r
                 if (Parameters.TargetConfig.NexioServer) {\r
                     Status = REVOKED;\r
                     ShowNexioFileExistsMessage();\r
                     result = false;\r
                 } else {\r
-                    if (Parameters.TargetConfig.EnableOverride)\r
-                        DeleteFile(currentFile);\r
+                    if (Parameters.TargetConfig.EnableOverride) {\r
+                        if (Parameters.ArchiveMetadata.ok) {\r
+                            Message = "A célállomány már létezik és el van fogadva, felülírása nem lehetséges.";\r
+                            result = false;\r
+                            return false;\r
+                        } else \r
+                            DeleteFile(currentFile);\r
+                    }\r
                     else {\r
-                        Status = SKIPPED;\r
                         Message = "A célállomány létezik, felülírása a konfiuráció alapján nem lehetséges.";\r
                         result = false;\r
+                        result = false;\r
                     }\r
                 }\r
             }\r
index 3776caaa2eb7b718f2beb698a4f2b08a231d12c9..daab33d9af3bb2748f5b195bdbc012f9ba093d64 100644 (file)
@@ -256,6 +256,7 @@ namespace TrafficClient {
         public string EpisodeTitle { get; set; }\r
         public string EpisodeDescription { get; set; }\r
         public string EpisodeID { get; set; }\r
+        public bool OK { get; set; }\r
     }\r
 \r
     public class TrafficAPIMessage : IMessage {\r
index 0833e76594b326a9c07914cbc39aa8d5fc957436..ac5bfb6c2812c5af9c23d01f1001f47a296fba9b 100644 (file)
@@ -38,6 +38,7 @@ namespace TrafficClient.Workers {
                 EpisodeTitle = data.v_EpTitle,\r
                 ProgID = data.v_ProgrammeID.ToString(),\r
                 ProgTitle = data.v_ProgTitle,\r
+                OK = data.v_OkForAir != null && true.Equals(data.v_OkForAir)\r
             };\r
         }\r
 \r
index 0471c37452f121a446b975a684a2e6711902a898..9e0ab538c2542ad8fe7fc576ed7a5f48c06d9b7f 100644 (file)
@@ -45,7 +45,7 @@
        <Loggers>\r
                <Root level="INFO">\r
                        <AppenderRef ref="Console" />\r
-<!--                   <AppenderRef ref="MarkeredConsole" /> -->\r
+                       <AppenderRef ref="MarkeredConsole" />\r
 <!--                   <AppenderRef ref="RollingFile" /> -->\r
 <!--                   <AppenderRef ref="MarkeredMail" /> -->\r
                </Root>\r
index 875e874f8527e8baa7c45567c46a3ef020f7dba5..f69349ae47a889137c8a40b043f9e497a0632ca0 100644 (file)
@@ -61,9 +61,7 @@
       "executeimmediate": true,\r
       "cronexpression": "0 0 0/1 1/1 * ? *",\r
       "parameters": [ \r
-       {"name": "sourcePath", "value": "\\\\10.10.1.100\\BRAAVOS\\ARCHIVE", "type": "java.lang.String"},\r
-       {"name": "userName", "value": "mediacube", "type": "java.lang.String"},\r
-       {"name": "password", "value": "Broadca5T", "type": "java.lang.String"}\r
+       {"name": "sourcePath", "value": "o:\\_OLD", "type": "java.lang.String"}\r
       ]\r
        },      \r
        {\r
@@ -90,7 +88,7 @@
       ]\r
        },      \r
        {\r
-      "active": true,\r
+      "active": false,\r
          "name" : "OCTOPUS adatok teljes szinkronizálása",\r
       "template": "sync-octopus.xml",\r
       "executeimmediate": true,\r
index 0cb3cc3a40c38e29ba88f810bd9b7a683284ff91..a27b7ba9823baaaceba53273c01ef4d1d96f58c3 100644 (file)
@@ -13,3 +13,4 @@ Require-Bundle: user.jobengine.osgi.commons;bundle-version="1.0.0",
  org.apache.logging.log4j.api;bundle-version="2.8.2"
 Bundle-ClassPath: .
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Import-Package: org.apache.commons.io;version="2.2.0"
index 58d87ef9df58d92283f5f0369ff64cb5d0c7f068..98f7388c9b89e9d6c89c787e7c4c9a248f3523e3 100644 (file)
@@ -5,7 +5,7 @@
        <executor className="user.jobengine.server.steps.ArchiveListBuilderStep" maxConcurrent="1"/>\r
        <executor className="user.jobengine.server.steps.CheckTRAFFICMissingMaterialsStep" maxConcurrent="1"/>\r
        <executor className="user.jobengine.server.steps.CheckMORPHEUSMissingMaterialsStep" maxConcurrent="1"/>\r
-       <executor className="user.jobengine.server.steps.DeleteMaterialsStep" maxConcurrent="1"/>\r
+       <executor className="user.jobengine.server.steps.CleanupMountedLocationStep" maxConcurrent="10"/>\r
        <executor className="user.jobengine.server.steps.DeleteNEXIOMaterialsStep" maxConcurrent="1"/>\r
        <executor className="user.jobengine.server.steps.MetadataTransformStep" maxConcurrent="1"/>\r
        <executor className="user.jobengine.server.steps.SyncOCTOPUSDataStep" maxConcurrent="1"/>\r
index 86f5c8ef7b7f3867d546bc48f29eb1f5ce805536..87a695ec90be5068483e7cd4f3672facce1089aa 100644 (file)
@@ -3,22 +3,14 @@
        <declarations>\r
                <parameters>\r
                        <parameter name="sourcePath" type="java.lang.String"/>\r
-                       <parameter name="userName" type="java.lang.String"/>\r
-                       <parameter name="password" type="java.lang.String"/>\r
                </parameters>\r
        </declarations>\r
        <commands>\r
-               <calljobstep id="id1" type="user.jobengine.server.steps.DeleteMaterialsStep" weight="1">\r
+               <calljobstep id="id1" type="user.jobengine.server.steps.CleanupMountedLocationStep" weight="1">\r
                        <inputs>\r
                                <input>\r
                                        <parameter name="sourcePath" />\r
                                </input>\r
-                               <input>\r
-                                       <parameter name="userName" />\r
-                               </input>\r
-                               <input>\r
-                                       <parameter name="password" />\r
-                               </input>\r
                        </inputs>\r
                </calljobstep>\r
        </commands>\r
diff --git a/server/user.jobengine.executors/src/user/jobengine/server/steps/CleanupMountedLocationStep.java b/server/user.jobengine.executors/src/user/jobengine/server/steps/CleanupMountedLocationStep.java
new file mode 100644 (file)
index 0000000..aee7cff
--- /dev/null
@@ -0,0 +1,251 @@
+package user.jobengine.server.steps;\r
+\r
+import java.io.File;\r
+import java.io.IOException;\r
+import java.nio.file.DirectoryStream;\r
+import java.nio.file.FileVisitResult;\r
+import java.nio.file.FileVisitor;\r
+import java.nio.file.Files;\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+import java.nio.file.SimpleFileVisitor;\r
+import java.nio.file.attribute.BasicFileAttributes;\r
+import java.text.ParseException;\r
+import java.text.SimpleDateFormat;\r
+import java.util.ArrayList;\r
+import java.util.Collections;\r
+import java.util.Date;\r
+import java.util.List;\r
+\r
+import org.apache.commons.io.FileUtils;\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.jobengine.server.IJobEngine;\r
+import user.jobengine.server.IJobRuntime;\r
+\r
+public class CleanupMountedLocationStep extends JobStep implements FileVisitor<Path> {\r
+\r
+       private static final Logger logger = LogManager.getLogger();\r
+       private static final String PROJECTFOLDER = "PROJECT";\r
+       private static final String DATEFORMAT = "yyyyMMdd";\r
+       private static final String DOT = ".";\r
+       private static final String STATUSFOLDER = ".STATUS";\r
+       private static final String EWC2EXT = ".ewc2";\r
+       private static final String CATCHEDEXT = ".catched";\r
+       private static final String KILLDATEEXT = ".killdate";\r
+       private static final String JSONEXT = ".json";\r
+\r
+       private static boolean isEmpty(final Path directory) throws IOException {\r
+               try (DirectoryStream<Path> dirStream = Files.newDirectoryStream(directory)) {\r
+                       final int[] count = { 0 };\r
+                       final int[] specialCount = { 0 };\r
+                       dirStream.forEach(p -> {\r
+                               count[0]++;\r
+                               if (p.getFileName().toString().toLowerCase().equals(PROJECTFOLDER.toLowerCase()))\r
+                                       specialCount[0]++;\r
+                               if (p.getFileName().toString().toLowerCase().equals(STATUSFOLDER.toLowerCase()))\r
+                                       specialCount[0]++;\r
+\r
+                       });\r
+                       if (specialCount[0] == count[0])\r
+                               return true;\r
+               }\r
+               return false;\r
+       }\r
+\r
+       final int[] allCount = { 0 };\r
+       final int[] currentCount = { 0 };\r
+\r
+       private Path sourcePath;\r
+       private SimpleDateFormat dateFormat;\r
+\r
+       private Date checkExpiration(List<Path> killDateFiles) {\r
+               Date killDate = null;\r
+               for (Path killDateFile : killDateFiles) {\r
+                       Date currentKillDate = getKillDate(killDateFile);\r
+                       if (currentKillDate == null)\r
+                               continue;\r
+                       if ((killDate != null && currentKillDate.after(killDate)) || killDate == null)\r
+                               killDate = currentKillDate;\r
+               }\r
+               return new Date().after(killDate) ? killDate : null;\r
+       }\r
+\r
+       @StepEntry\r
+       public Object[] execute(String sourceFolder, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
+               sourcePath = Paths.get(sourceFolder);\r
+               DirectoryStream<Path> directoryStream = null;\r
+               if (StringUtils.isBlank(sourcePath.toString())) {\r
+                       logger.error(getMarker(), "A folyamat 'sourcePath' bemeneti paramétere üres.");\r
+                       throw new NullPointerException("System is not configured properly, 'sourceFolder' input parameter missing.");\r
+               }\r
+\r
+               if (!sourcePath.toFile().exists() || !sourcePath.toFile().isDirectory()) {\r
+                       logger.error(getMarker(), "A {} mappa nem létezik.", sourceFolder);\r
+                       throw new NullPointerException(String.format("Directory %s not exists.", sourceFolder));\r
+               }\r
+               try {\r
+                       setProgress(1);\r
+                       dateFormat = new SimpleDateFormat(DATEFORMAT);\r
+                       Files.walkFileTree(sourcePath, new SimpleFileVisitor<Path>() {\r
+                               @Override\r
+                               public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {\r
+                                       allCount[0]++;\r
+                                       return super.visitFile(file, attrs);\r
+                               }\r
+                       });\r
+                       Files.walkFileTree(sourcePath, this);\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
+                       logger.error(getMarker(), "Az '{}' mappa elérése sikertelen. A rendszer hibaüzenete: {}", sourcePath, e.getMessage());\r
+                       throw e;\r
+               } finally {\r
+                       if (directoryStream != null) {\r
+                               try {\r
+                                       directoryStream.close();\r
+                               } catch (IOException e) {\r
+                               }\r
+                       }\r
+               }\r
+               return null;\r
+       }\r
+\r
+       private Date getKillDate(Path killDateFile) {\r
+               String fileName = killDateFile.getFileName().toString();\r
+               int end = fileName.lastIndexOf(DOT);\r
+               if (end < 1)\r
+                       return null;\r
+               int start = fileName.lastIndexOf(DOT, end - 1);\r
+               if (start < 0)\r
+                       return null;\r
+               String strKillDate = fileName.substring(start + 1, end);\r
+               Date result = null;\r
+               if (StringUtils.isNumeric(strKillDate)) {\r
+                       try {\r
+                               result = dateFormat.parse(strKillDate);\r
+                       } catch (ParseException e) {\r
+                               logger.error(getMarker(), "A {} fájl 'killdate' állománya hibás formátumú, a {} karaktersorozat nem konvertálható dátummá.", fileName,\r
+                                               strKillDate);\r
+                               return null;\r
+                       }\r
+               } else\r
+                       logger.error(getMarker(), "A {} fájl 'killdate' állománya hibás formátumú, az dátum helyett ez áll: '{}'.", fileName, strKillDate);\r
+               return result;\r
+       }\r
+\r
+       private List<Path> getKillDateFiles(Path filePath) {\r
+               String killDateFilePattern = String.format("%s.*%s", filePath.getFileName().toString(), KILLDATEEXT);\r
+               List<Path> result = new ArrayList<>();\r
+               Path statusPath = Paths.get(filePath.getParent().toString(), STATUSFOLDER);\r
+               File statusPathFile = statusPath.toFile();\r
+               if (statusPathFile.exists() && statusPathFile.isDirectory()) {\r
+                       try (DirectoryStream<Path> stream = Files.newDirectoryStream(statusPath, killDateFilePattern)) {\r
+                               stream.forEach(p -> result.add(p));\r
+                       } catch (Exception e) {\r
+                               logger.catching(e);\r
+                       }\r
+               }\r
+               Collections.sort(result);\r
+               return result;\r
+       }\r
+\r
+       @Override\r
+       public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {\r
+               if (!dir.equals(sourcePath) && isEmpty(dir)) {\r
+                       if (!removeExistingSpecialDirectory(dir, PROJECTFOLDER))\r
+                               return FileVisitResult.CONTINUE;\r
+                       if (!removeExistingSpecialDirectory(dir, STATUSFOLDER))\r
+                               return FileVisitResult.CONTINUE;\r
+                       if (removeFile(dir))\r
+                               logger.info(getMarker(), "A {} üres mappa törlése sikeres.", dir);\r
+\r
+               }\r
+               return FileVisitResult.CONTINUE;\r
+       }\r
+\r
+       @Override\r
+       public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {\r
+               return FileVisitResult.CONTINUE;\r
+       }\r
+\r
+       private void processPathItem(Path filePath) {\r
+               currentCount[0]++;\r
+\r
+               setProgress(currentCount[0] * 100 / allCount[0]);\r
+\r
+               logger.debug("Checking {}", filePath);\r
+               List<Path> killDateFiles = getKillDateFiles(filePath);\r
+               if (killDateFiles.size() == 0)\r
+                       return;\r
+\r
+               if (killDateFiles.size() != 1)\r
+                       logger.warn(getMarker(), "A {} fájlhoz több 'killdate' állomány található, a legújabb dátum határozza meg a törlés időpontját.", filePath);\r
+\r
+               Date killDate = checkExpiration(killDateFiles);\r
+               if (killDate == null)\r
+                       return;\r
+\r
+               if (removeFiles(filePath, killDateFiles))\r
+                       logger.info(getMarker(), "A {} fájl és kapcsolódó állományai a {} killdate bejegyzés alapján sikeresen törlődtek.", filePath.getFileName(),\r
+                                       dateFormat.format(killDate));\r
+               else\r
+                       logger.warn(getMarker(), "A {} fájl és kapcsolódó állományai a {} killdate bejegyzés alapján csak részlegesen vagy egyáltalán nem törlődtek.",\r
+                                       filePath.getFileName(), dateFormat.format(killDate));\r
+       }\r
+\r
+       private boolean removeExistingSpecialDirectory(Path dir, String folderName) throws IOException {\r
+               File projectPath = Paths.get(dir.toString(), folderName).toFile();\r
+               if (projectPath.exists() && projectPath.isDirectory()) {\r
+                       FileUtils.deleteDirectory(projectPath);\r
+                       if (projectPath.exists()) {\r
+                               logger.warn(getMarker(), "A {} alatti {} mappa törlése nem sikerült.", dir, folderName);\r
+                               return false;\r
+                       }\r
+               }\r
+               return true;\r
+       }\r
+\r
+       private boolean removeFile(Path filePath) {\r
+               boolean result = false;\r
+               try {\r
+                       //logger.error("REMOVE {}", filePath);\r
+                       File file = filePath.toFile();\r
+                       if (file.exists())\r
+                               result = file.delete();\r
+               } catch (Exception e) {\r
+                       logger.error(getMarker(), "A {} fájl nem törölhető. A rendszer hibaüzenete: {}", filePath, e.getMessage());\r
+               }\r
+               return result;\r
+       }\r
+\r
+       private boolean removeFiles(Path filePath, List<Path> killDateFiles) {\r
+               if (!removeFile(filePath))\r
+                       return false;\r
+\r
+               removeFile(Paths.get(filePath.toString() + EWC2EXT));\r
+               removeFile(Paths.get(Paths.get(filePath.getParent().toString(), STATUSFOLDER, filePath.getFileName().toString()) + CATCHEDEXT));\r
+               removeFile(Paths.get(Paths.get(filePath.getParent().toString(), STATUSFOLDER, filePath.getFileName().toString()) + JSONEXT));\r
+\r
+               boolean result = true;\r
+               for (Path killDateFile : killDateFiles) {\r
+                       if (removeFile(killDateFile))\r
+                               result = false;\r
+               }\r
+\r
+               return result;\r
+       }\r
+\r
+       @Override\r
+       public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {\r
+               processPathItem(file);\r
+               return FileVisitResult.CONTINUE;\r
+       }\r
+\r
+       @Override\r
+       public FileVisitResult visitFileFailed(Path file, IOException e) throws IOException {\r
+               logger.error(getMarker(), "A {} fájl nem érhető el. A rendszer hibaüzenete: {}", file.toString(), e.getMessage());\r
+               return FileVisitResult.CONTINUE;\r
+       }\r
+}\r
index 9c15de32d3c265bc525d36ce9a0a324a21ab3db7..333f8d0868399808779c54d1a5eb87adda3cf1a9 100644 (file)
@@ -29,6 +29,7 @@ public class DeleteMaterialsStep extends JobStep {
                        logger.error(getMarker(), "A folyamat 'sourceFolder' bemeneti paramétere üres.");\r
                        throw new NullPointerException("System is not configured properly, 'sourceFolder' input parameter missing.");\r
                }\r
+\r
                IItemManager manager = jobEngine.getItemManager();\r
                sourceUri = manager.createStoreUri(RemoteStoreProtocol.SMB, sourceFolder);\r
                sourceUri.setUserName(userName);\r
index 23359c047e52e09fecb2eee699ad999895581f25..851fdd76dd7d5e816d83dcd9b7a2b16258372a55 100644 (file)
@@ -164,9 +164,9 @@ public class NexioClipEventDispatcher implements ClipEventListener {
                                        logger.debug("clipEventPerformed clip: {} {}", evt.getClip().getId(), fileName);\r
                                        //cache???\r
 \r
-                                       HashMap<String, BasicDBObject> clipsForId = new HashMap<String, BasicDBObject>();\r
-                                       Map<String, BasicDBObject> clipsForXID = loadClipsFromMongo(clipsForId);\r
-                                       saveClipIntoMongo(jsClip, clipsForXID, clipsForId);\r
+                                       //                                      HashMap<String, BasicDBObject> clipsForId = new HashMap<String, BasicDBObject>();\r
+                                       //                                      Map<String, BasicDBObject> clipsForXID = loadClipsFromMongo(clipsForId);\r
+                                       saveClipIntoMongo(jsClip);\r
                                } else {\r
                                        logger.debug("clipEventPerformed clip: {}", evt.getClip() == null ? "null" : evt.getClip().getId());\r
                                }\r
@@ -270,7 +270,7 @@ public class NexioClipEventDispatcher implements ClipEventListener {
         */\r
        private void copyClipsIntoMongo() throws Exception {\r
                logger.info("Starting initial NEXIO metadata import.");\r
-               Map<String, BasicDBObject> emptyMap = new HashMap<String, BasicDBObject>();\r
+               //              Map<String, BasicDBObject> emptyMap = new HashMap<String, BasicDBObject>();\r
                Iterator<Clip> clips = controller.getMediabase().getClips();\r
                while (clips.hasNext()) {\r
                        Clip clip = null;\r
@@ -282,7 +282,7 @@ public class NexioClipEventDispatcher implements ClipEventListener {
                                int duration = jsonClip.getInt(DURATION);\r
                                if (fileName != null && !"".equals(fileName)) {\r
                                        logger.debug("Found NEXIO clip: {} duration: {} agency: {}", fileName, duration, agency);\r
-                                       this.saveClipIntoMongo(jsonClip, emptyMap, emptyMap);\r
+                                       this.saveClipIntoMongo(jsonClip);\r
                                } else {\r
                                        logger.debug("Found NEXIO clip: {} XID IS MISSING!!", clip.getId());\r
                                }\r
@@ -338,14 +338,14 @@ public class NexioClipEventDispatcher implements ClipEventListener {
                }\r
 \r
                /*\r
-               \r
+\r
                                int c = connection.read(buffer, 0, 2);\r
                                //2 bytes hosszan az idokozben hozzaadott id-k szamossaga\r
                                if (c < 2) {\r
                                        throw new ProtocolException("c, 2, 2");\r
                                }\r
                                //MSB, LSB\r
-               \r
+\r
                                return nofIds;\r
                        */\r
                return ret;\r
@@ -397,13 +397,13 @@ public class NexioClipEventDispatcher implements ClipEventListener {
                progressListenerList.remove(IProgressEventListener.class, listener);\r
        }\r
 \r
-       private void saveClipIntoMongo(BasicDBObject clip, Map<String, BasicDBObject> clipsForXID, Map<String, BasicDBObject> clipsForID) {\r
+       private void saveClipIntoMongo(BasicDBObject clip) {\r
                DBCollection collection = db.getCollection(CLIP_COLLECTION_NAME);\r
                String xid = clip.getString(LONGNAMEID);\r
                String id = clip.getString(ID);\r
 \r
-               BasicDBObject clipForXID = clipsForXID.get(xid);\r
-               BasicDBObject clipForID = clipsForID.get(id);\r
+               BasicDBObject clipForXID = (BasicDBObject) collection.findOne(new BasicDBObject(LONGNAMEID, xid));\r
+               BasicDBObject clipForID = (BasicDBObject) collection.findOne(new BasicDBObject(ID, id));\r
 \r
                //rename-nel a clipForXID null lesz de a clipForID nem ezert nem kell create\r
                if (clipForXID == null && clipForID == null) {\r
index 72d1d27b661ceddc622dd0ac6a60552abe0ce805..15859e911d56756a4bfa3e7a898cb17b1b6b199f 100644 (file)
@@ -240,42 +240,45 @@ public class OctopusDataMiner implements Runnable {
                        FOLDER_COLLECTION = IOctopusAPI.FOLDER_COLLECTION + _TMP;\r
                        STORY_COLLECTION = IOctopusAPI.STORY_COLLECTION + _TMP;\r
 \r
-                       logger.info("Fetch rundowns");\r
+                       //                      ResteasyWebTarget target = webTarget.path(RUNDOWN);\r
+                       //                      Builder result = target.request().header(OCTOPUS_DEVICE_ID, apiUser).header(OCTOPUS_DEVICE_NAME, apiPwd);\r
+                       //                      Response r = result.get();\r
+                       //                      String x = r.readEntity(String.class);\r
+                       //                      logger.info(x);\r
+                       //                      return;\r
 \r
-                       ResteasyWebTarget target = webTarget.path(RUNDOWN);\r
-                       Builder result = target.request().header(OCTOPUS_DEVICE_ID, apiUser).header(OCTOPUS_DEVICE_NAME, apiPwd);\r
-                       Response r = result.get();\r
-                       String x = r.readEntity(String.class);\r
-                       logger.info(x);\r
-                       return;\r
-                       //                      BasicDBList rundowns = queryRundowns();\r
-                       //                      logger.info("Fetch rundown story references");\r
-                       //                      storyRundowns = buildRundownReferences(rundowns);\r
-                       //                      logger.info("Fetch story folders");\r
-                       //                      BasicDBList storyFolders = queryStoryFolders();\r
-                       //                      logger.info("Fetch folder story references");\r
-                       //                      storyStoryFolders = buildFolderReferences(storyFolders);\r
-                       //\r
-                       //                      if (rundowns == null || rundowns.size() == 0) {\r
-                       //                              progressEvent.setProgress(50);\r
-                       //                              fireProgressEvent(progressEvent);\r
-                       //                      } else {\r
-                       //                              logger.info("Process rundowns");\r
-                       //                              storeRundowns(rundowns, null);\r
-                       //                      }\r
-                       //\r
-                       //                      if (storyFolders == null || storyFolders.size() == 0) {\r
-                       //                              progressEvent.setProgress(100);\r
-                       //                              fireProgressEvent(progressEvent);\r
-                       //                      } else {\r
-                       //                              logger.info("Process story folders");\r
-                       //                              storeStoryFolders(storyFolders, null);\r
-                       //                      }\r
-                       //                      setLastUpdateTime(new Date());\r
-                       //                      logger.info("Activate");\r
-                       //                      db.getCollection(RUNDOWN_COLLECTION).rename(IOctopusAPI.RUNDOWN_COLLECTION, true);\r
-                       //                      db.getCollection(FOLDER_COLLECTION).rename(IOctopusAPI.FOLDER_COLLECTION, true);\r
-                       //                      db.getCollection(STORY_COLLECTION).rename(IOctopusAPI.STORY_COLLECTION, true);\r
+                       BasicDBList rundowns = null;\r
+                       BasicDBList storyFolders = null;\r
+\r
+                       rundowns = queryBuildRefRundowns();\r
+                       storyFolders = queryBuildRefFolders();\r
+\r
+                       if (rundowns == null || rundowns.size() == 0) {\r
+                               progressEvent.setProgress(50);\r
+                               fireProgressEvent(progressEvent);\r
+                       } else {\r
+                               logger.info("Process rundowns");\r
+                               storeRundowns(rundowns, null);\r
+                       }\r
+\r
+                       if (storyFolders == null || storyFolders.size() == 0) {\r
+                               progressEvent.setProgress(100);\r
+                               fireProgressEvent(progressEvent);\r
+                       } else {\r
+                               logger.info("Process story folders");\r
+                               storeStoryFolders(storyFolders, null);\r
+                       }\r
+                       setLastUpdateTime(new Date());\r
+                       logger.info("Activate");\r
+\r
+                       //                      db.getCollection(IOctopusAPI.RUNDOWN_COLLECTION).drop();\r
+                       db.getCollection(RUNDOWN_COLLECTION).rename(IOctopusAPI.RUNDOWN_COLLECTION, true);\r
+\r
+                       //                      db.getCollection(IOctopusAPI.FOLDER_COLLECTION).drop();\r
+                       db.getCollection(FOLDER_COLLECTION).rename(IOctopusAPI.FOLDER_COLLECTION, true);\r
+\r
+                       //                      db.getCollection(IOctopusAPI.STORY_COLLECTION).drop();\r
+                       db.getCollection(STORY_COLLECTION).rename(IOctopusAPI.STORY_COLLECTION, true);\r
 \r
                } catch (Exception e) {\r
                        logger.catching(e);\r
@@ -325,14 +328,6 @@ public class OctopusDataMiner implements Runnable {
                return scriptContent;\r
        }\r
 \r
-       //      private boolean isModified(Date date, BasicDBObject object, String name) {\r
-       //              Date actualModifiedString = toDate(object, name);\r
-       //              if (actualModifiedString == null)\r
-       //                      logger.trace(ACTUAL_MODIFIED_STRING_IS_NULL);\r
-       //              int result = date.compareTo(actualModifiedString);\r
-       //              return result <= 0;\r
-       //      }\r
-\r
        private String extractCustomColumnValue(String columnName, BasicDBObject story) {\r
                List<BasicDBObject> customColumns = NoSQLUtils.asList(story, IOctopusAPI.CUSTOM_COLUMNS);\r
                if (customColumns == null)\r
@@ -372,6 +367,14 @@ public class OctopusDataMiner implements Runnable {
                return result;\r
        }\r
 \r
+       //      private boolean isModified(Date date, BasicDBObject object, String name) {\r
+       //              Date actualModifiedString = toDate(object, name);\r
+       //              if (actualModifiedString == null)\r
+       //                      logger.trace(ACTUAL_MODIFIED_STRING_IS_NULL);\r
+       //              int result = date.compareTo(actualModifiedString);\r
+       //              return result <= 0;\r
+       //      }\r
+\r
        private String extractScriptContent(BasicDBObject story) {\r
                BasicDBObject script = NoSQLUtils.asDBObject(story, IOctopusAPI.SCRIPT);\r
                if (script == null || script.isEmpty())\r
@@ -440,6 +443,24 @@ public class OctopusDataMiner implements Runnable {
                return result;\r
        }\r
 \r
+       private BasicDBList queryBuildRefFolders() {\r
+               BasicDBList storyFolders;\r
+               logger.info("Fetch story folders");\r
+               storyFolders = queryStoryFolders();\r
+               logger.info("Fetch folder story references");\r
+               storyStoryFolders = buildFolderReferences(storyFolders);\r
+               return storyFolders;\r
+       }\r
+\r
+       private BasicDBList queryBuildRefRundowns() {\r
+               BasicDBList rundowns;\r
+               logger.info("Fetch rundowns");\r
+               rundowns = queryRundowns();\r
+               logger.info("Fetch rundown story references");\r
+               storyRundowns = buildRundownReferences(rundowns);\r
+               return rundowns;\r
+       }\r
+\r
        private BasicDBObject queryRundown(long id) {\r
                logger.trace(ENTER);\r
                BasicDBObject result = null;\r
index b19de165e73b2b7e01ca6a9f113e3097cf28eb3c..911d00823a5db88e9db660f48f51e0386e5ce8fd 100644 (file)
@@ -57,7 +57,7 @@
                                                                <image src="/img/mediacube_logo_v2_50x50.png">\r
 <!--                                                           <custom-attributes org.zkoss.zul.image.preload="true" /> -->\r
                                                                </image>\r
-                                                               <label style="color:#e3e3e3;font-size:20px;font-weight:bold">MediaCube v2.1.5.2</label>\r
+                                                               <label style="color:#e3e3e3;font-size:20px;font-weight:bold">MediaCube v2.1.5.3</label>\r
                                                        </div>\r
                                                </west>\r
                                                <center border="0">\r
index e08b3281ddac34d44e8306e44a3124e85f039898..9fa90c541eb2b3a3632ebe39d29ce7441b885038 100644 (file)
@@ -236,7 +236,7 @@ public class JobEngine implements IJobEngine {
        @Override
        public void addToRunQueue(IJobRuntime jobRuntime) {
                try {
-                       logger.info("{} ading to run queue", jobRuntime);
+                       logger.debug("{} adding to run queue", jobRuntime);
                        runQueue.put(jobRuntime);
                } catch (Exception e) {
                        logger.error(e.getMessage(), e);
index fe70ad8ea367a7f0883a9a7e2d2fcd8cd315e14a..6d27e90bec7cd10a94e989935fe10648238097f9 100644 (file)
@@ -40,6 +40,10 @@ public class JobStep implements IJobStep {
        public void cleanup() {\r
        }\r
 \r
+       public IJobRuntime getJobRuntime() {\r
+               return jobRuntime;\r
+       }\r
+\r
        protected Marker getMarker() {\r
                Marker parentMarker = MarkerManager.getMarker("MEDIACUBE");\r
                Marker result = MarkerManager.getMarker(getRuntimeName());\r
@@ -68,4 +72,8 @@ public class JobStep implements IJobStep {
                }\r
                return result;\r
        }\r
+\r
+       protected void setProgress(int progress) {\r
+               jobRuntime.incrementProgress(progress);\r
+       }\r
 }\r