git-tfs-id: [http://tfs.userrendszerhaz.hu:8080/tfs/DefaultCollection]$/MediaCube...
authorVásáry Dániel <daniel.vasary@userrendszerhaz.hu>
Fri, 26 Jan 2018 16:21:16 +0000 (16:21 +0000)
committerVásáry Dániel <daniel.vasary@userrendszerhaz.hu>
Fri, 26 Jan 2018 16:21:16 +0000 (16:21 +0000)
client/Maestro/Configuration/configuration-studio.json [moved from client/Maestro/Configuration/-configuration-studio.json with 100% similarity]
client/Maestro/Maestro.csproj
client/Maestro/Program.cs
client/Maestro/Sources/FileSystemSource.cs
client/Maestro/Sources/NexioRESTSource.cs
client/Maestro/Sources/NexioSourceItem.cs
server/user.jobengine.executors/src/user/jobengine/server/steps/TranscodeSELENIOStep.java
server/user.jobengine.osgi.commons/src/user/commons/ffastrans/FFAStransAPI.java [new file with mode: 0644]
server/user.jobengine.osgi.commons/src/user/commons/ffastrans/IFFAStransAPI.java [new file with mode: 0644]
server/user.jobengine.osgi.server/src/user/jobengine/server/steps/EscortFiles.java

index edf46e53201ae0488d71b9ab9c57527426f8080a..2ec0bc5a9d8f08e54cae7b0d216e90f34fc7f798 100644 (file)
     <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 b0e97ce922190eb2ce3cca3b180957c68289bbb8..b1913c4c9399ebfcb49e68696cb41a659b8b620f 100644 (file)
@@ -20,7 +20,7 @@ using System.Windows.Forms;
 namespace Maestro {\r
 \r
     static class Program {\r
-        private static Logger logger = LogManager.GetCurrentClassLogger();\r
+        private static readonly Logger logger = LogManager.GetCurrentClassLogger();\r
 \r
         /// <summary>\r
         /// The main entry point for the application.\r
@@ -76,7 +76,7 @@ namespace Maestro {
     }\r
 \r
     public class TrayApplicationContext : ApplicationContext {\r
-        private static Logger logger = LogManager.GetCurrentClassLogger();\r
+        private static readonly Logger logger = LogManager.GetCurrentClassLogger();\r
         private const string GLOBAL_JSON = "global.json";\r
         private const string AUDIORECORDER_JSON = "audiorecorder.json";\r
         private const string JSON_WILDCARD = "*.json";\r
index 71a5cd9f82f7aa58936d5b0aa1a4756d9218fde0..3a380fba87b38d53546e4b4eb80f028722bebea6 100644 (file)
@@ -9,13 +9,12 @@ using Maestro.Sources.Messages;
 using System.Drawing;\r
 using NLog;\r
 using MaestroShared.Commons;\r
-using System.Diagnostics;\r
 \r
 namespace Maestro.Sources {\r
     public delegate void ClearAndInitialize();\r
 \r
     class FileSystemSource : BindingList<FileSourceItem>, ISource, IBindingListView {\r
-        private readonly Logger logger = LogManager.GetCurrentClassLogger();\r
+        private static readonly Logger logger = LogManager.GetCurrentClassLogger();\r
         private IMessageBus messageBus;\r
         private List<CreatedFileMonitor> createdFileMonitors = new List<CreatedFileMonitor>();\r
         private Control parent;\r
@@ -23,7 +22,6 @@ namespace Maestro.Sources {
         private List<String> acceptableExtensions = new List<string>();\r
         private List<FileSourceItem> cache;\r
         private BackgroundWorker pathWatcherWorker = new BackgroundWorker();\r
-        private string path;\r
         private string rootPath;\r
         FileSystemWatcher watcher;\r
 \r
@@ -77,9 +75,11 @@ namespace Maestro.Sources {
         public bool IsSorted => true;\r
 \r
         public void ApplySort(PropertyDescriptor property, ListSortDirection direction) {\r
+            logger.Trace("Entry");\r
             SortProperty = property;\r
             SortDirection = direction;\r
             Refresh();\r
+            logger.Trace("Exit");\r
         }\r
 \r
         public string Filter {\r
@@ -97,6 +97,7 @@ namespace Maestro.Sources {
         public string Path { get; private set; }\r
 \r
         private void Refresh() {\r
+            logger.Trace("Entry");\r
             if (cache == null)\r
                 cache = new List<FileSourceItem>(this);\r
             Clear();\r
@@ -114,6 +115,7 @@ namespace Maestro.Sources {
                     filteredItems.OrderByDescending(i => getValue(i)).ToList().ForEach(i => Add(i));\r
                     break;\r
             }\r
+            logger.Trace("Exit");\r
         }\r
 \r
         private object getValue(FileSourceItem i) {\r
@@ -137,12 +139,14 @@ namespace Maestro.Sources {
         }\r
 \r
         public bool Reset(string path) {\r
+            logger.Trace("Entry");\r
             if (Path.Equals(path))\r
                 return false;\r
             Path = path == null ? rootPath : path;\r
             Clear();\r
             cache = null;\r
             Shutdown();\r
+            logger.Trace("Exit");\r
             return true;\r
         }\r
 \r
@@ -169,15 +173,16 @@ namespace Maestro.Sources {
                 }\r
                 System.Threading.Thread.Sleep(100);\r
             }\r
-\r
         }\r
 \r
         private void Shutdown() {\r
+            logger.Trace("Entry");\r
             parent.SafeCall(() => Clear());\r
             if (watcher != null) {\r
                 watcher.Dispose();\r
                 watcher = null;\r
-            } \r
+            }\r
+            logger.Trace("Exit");\r
         }\r
 \r
         private void SetAcceptableExtensions(string fileExtensionFilter) {\r
@@ -186,14 +191,18 @@ namespace Maestro.Sources {
         }\r
 \r
         public void Startup(Uri address) {\r
+            logger.Trace("Entry");\r
             Path = address.LocalPath;\r
             rootPath = Path;\r
             pathWatcherWorker.RunWorkerAsync();\r
+            logger.Trace("Exit");\r
         }\r
 \r
         private void InnerStartUp() {\r
+            logger.Trace("Entry");\r
             createWatch(Path);\r
             initializeList(Path);\r
+            logger.Trace("Exit");\r
         }\r
 \r
         private FileSourceItem CreateItem(FileInfo fi, bool highlight) {\r
@@ -338,11 +347,13 @@ namespace Maestro.Sources {
         private void OnDeleted(object sender, FileSystemEventArgs e) {\r
             if (!String.IsNullOrEmpty(filter))\r
                 return;\r
+            logger.Trace("Entry");\r
             logger.Debug("{0} {1}", e.ChangeType, e.Name);\r
             FileSourceItem item = this.Where(i => i.Name.Equals(e.Name)).FirstOrDefault();\r
             if (item == null || !item.CanHandle(acceptableExtensions))\r
                 return;\r
             SafeDeleteItem(item);\r
+            logger.Trace("Exit");\r
         }\r
 \r
         private void SafeCreateItem(FileSourceItem item) {\r
index 1a2bec955eebf12bf0483e3f0de6d1d310de331e..bca5dea7d0c713ce27af54490bfcef9ff5ad4610 100644 (file)
@@ -224,15 +224,17 @@ namespace Maestro.Sources {
                 item.ID = token[ID].ToString();\r
                 item.Name = token[LONGNAMEID].ToString() + MXFEXT;\r
                 item.Agency = token[EXTAGENCY]?.ToString();\r
-                item.Created = token.Value<DateTime>(RECORDDATE);\r
-                item.Modified = token.Value<DateTime>(MODIFIED);\r
+                DateTime? created = token.Value<DateTime?>(RECORDDATE);\r
+                item.Created =  created ?? DateTime.MinValue;\r
+                DateTime? modified = token.Value<DateTime?>(MODIFIED);\r
+                item.Modified = modified ?? DateTime.MinValue;\r
                 int d = token.Value<int>(DURATION);\r
                 item.Duration = new Timecode(d).ToString();\r
             }\r
             catch (Exception e) {\r
                 logger.Error(e.Message);\r
             }\r
\r
+\r
         }\r
 \r
 \r
index 80d0ce53a921101bdfb71f42b49b19166a7e5986..cbc0800f03fb584e3ab25c76e6d78f85a8be8891 100644 (file)
@@ -1,6 +1,5 @@
 using System;\r
 using System.ComponentModel;\r
-using System.IO;\r
 using System.Runtime.CompilerServices;\r
 using System.Collections.Generic;\r
 namespace Maestro.Sources {\r
index b1cb470167b1d59a72b899cef2795d988e704d31..c548e980b9d3c1d335d62c6e0be872a1dcf99955 100644 (file)
@@ -187,8 +187,9 @@ public class TranscodeSELENIOStep extends JobStep {
                        if (outFile.indexOf(".") > 2) {\r
                                Path subdir = Paths.get(outFile.substring(0, 1), outFile.substring(1, 2), outFile.substring(2, 3));\r
                                manager.createMediaFile(Paths.get(subdir.toString(), outFile).toString(), fileType, store, mediaCubeMedia).add();\r
+                               EscortFiles.ensureUNCFolder(webPath, subdir.toString());\r
                                subdir = Paths.get(webPath, subdir.toString());\r
-                               subdir.toFile().mkdirs();\r
+                               //subdir.toFile().mkdirs();\r
                                Files.move(Paths.get(transcoderTargetPath, outFile), Paths.get(subdir.toString(), outFile), StandardCopyOption.REPLACE_EXISTING);\r
                        } else {\r
                                manager.createMediaFile(outFile, fileType, store, mediaCubeMedia).add();\r
diff --git a/server/user.jobengine.osgi.commons/src/user/commons/ffastrans/FFAStransAPI.java b/server/user.jobengine.osgi.commons/src/user/commons/ffastrans/FFAStransAPI.java
new file mode 100644 (file)
index 0000000..99f420e
--- /dev/null
@@ -0,0 +1,134 @@
+package user.commons.ffastrans;\r
+\r
+import java.util.List;\r
+\r
+import javax.ws.rs.client.Entity;\r
+import javax.ws.rs.core.MediaType;\r
+import javax.ws.rs.core.Response;\r
+\r
+import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder;\r
+import org.jboss.resteasy.client.jaxrs.ResteasyWebTarget;\r
+\r
+import com.ibm.nosql.json.JSONUtil;\r
+import com.ibm.nosql.json.api.BasicDBObject;\r
+\r
+import user.commons.nosql.NoSQLUtils;\r
+\r
+public class FFAStransAPI implements IFFAStransAPI {\r
+\r
+       public static void main(String[] args) throws Exception {\r
+\r
+               IFFAStransAPI api = new FFAStransAPI("http://10.10.1.74:65445/api/json/v1/");\r
+               List<BasicDBObject> workflows = api.getWorkflows();\r
+               for (BasicDBObject workflow : workflows) {\r
+                       //System.out.println(workflow.toPrettyString(null));\r
+                       if (!"MAM-Proxy".equals(workflow.getString("wf_name")))\r
+                               continue;\r
+                       long wfID = workflow.getLong("wf_id");\r
+                       System.out.println("MAM-Proxy wf_id: " + wfID);\r
+\r
+                       String path = "\\\\PROXY-TRANSCODER-01\\MAM-Proxy_input\\test_09.mxf";\r
+                       String jobID = api.submit(wfID, path);\r
+                       System.out.println("Submited: " + jobID);\r
+\r
+                       String jobStart = null;\r
+                       while (true) {\r
+                               Thread.sleep(1000);\r
+                               BasicDBObject status = api.getStatus(jobID);\r
+                               if (status != null) {\r
+                                       System.out.println("Status: " + status.toPrettyString(null));\r
+                                       if (jobStart == null)\r
+                                               jobStart = status.getString("job_start");\r
+                               } else {\r
+                                       BasicDBObject history = api.getHistory(jobStart);\r
+                                       System.out.println("History: " + history.toPrettyString(null));\r
+                                       break;\r
+                               }\r
+\r
+                       }\r
+               }\r
+       }\r
+\r
+       private ResteasyWebTarget webTarget;\r
+\r
+       public FFAStransAPI(String apiAddress) {\r
+               webTarget = new ResteasyClientBuilder().build().target(apiAddress);\r
+       }\r
+\r
+       @Override\r
+       public BasicDBObject getHistory(String jobStart) {\r
+               ResteasyWebTarget target = webTarget.path("history");\r
+               BasicDBObject result = null;\r
+               try {\r
+                       Response apiResponse = target.request().get();\r
+                       if (apiResponse.getStatus() != 200)\r
+                               return null;\r
+                       String json = apiResponse.readEntity(String.class);\r
+                       BasicDBObject resultObject = (BasicDBObject) JSONUtil.jsonToDbObject(json);\r
+                       List<BasicDBObject> jobs = NoSQLUtils.asList(resultObject, "history");\r
+                       for (BasicDBObject job : jobs) {\r
+                               if (job == null)\r
+                                       continue;\r
+                               if (jobStart.equals(job.getString("job_start"))) {\r
+                                       result = job;\r
+                                       break;\r
+                               }\r
+                       }\r
+               } catch (Exception e) {\r
+                       System.out.println(e.getMessage());\r
+               }\r
+\r
+               return result;\r
+       }\r
+\r
+       @Override\r
+       public BasicDBObject getStatus(String jobID) {\r
+               ResteasyWebTarget target = webTarget.path("jobs");\r
+\r
+               BasicDBObject result = null;\r
+               try {\r
+                       Response apiResponse = target.request().get();\r
+                       if (apiResponse.getStatus() != 200)\r
+                               return null;\r
+                       String json = apiResponse.readEntity(String.class);\r
+                       BasicDBObject resultObject = (BasicDBObject) JSONUtil.jsonToDbObject(json);\r
+                       List<BasicDBObject> jobs = NoSQLUtils.asList(resultObject, "jobs");\r
+                       if (jobs == null)\r
+                               return null;\r
+                       for (BasicDBObject job : jobs) {\r
+                               if (jobID.equals(job.getString("job_id"))) {\r
+                                       result = job;\r
+                                       break;\r
+                               }\r
+                       }\r
+\r
+               } catch (Exception e) {\r
+                       System.out.println(e.getClass() + " " + e.getMessage());\r
+               }\r
+\r
+               return result;\r
+       }\r
+\r
+       @Override\r
+       public List<BasicDBObject> getWorkflows() {\r
+               ResteasyWebTarget target = webTarget.path("workflows");\r
+               Response apiResponse = target.request().get();\r
+               if (apiResponse.getStatus() != 200)\r
+                       return null;\r
+               String json = apiResponse.readEntity(String.class);\r
+               BasicDBObject resultObject = (BasicDBObject) JSONUtil.jsonToDbObject(json);\r
+               return NoSQLUtils.asList(resultObject, "workflows");\r
+       }\r
+\r
+       @Override\r
+       public String submit(long wfID, String path) {\r
+               BasicDBObject job = new BasicDBObject("wf_id", wfID).append("inputfile", path);\r
+               ResteasyWebTarget target = webTarget.path("jobs");\r
+               Response apiResponse = target.request().post(Entity.entity(job.toString(), MediaType.APPLICATION_JSON));\r
+               if (apiResponse.getStatus() != 202)\r
+                       return null;\r
+               String json = apiResponse.readEntity(String.class);\r
+               BasicDBObject resultObject = (BasicDBObject) JSONUtil.jsonToDbObject(json);\r
+               return resultObject.getString("job_id");\r
+       }\r
+}\r
diff --git a/server/user.jobengine.osgi.commons/src/user/commons/ffastrans/IFFAStransAPI.java b/server/user.jobengine.osgi.commons/src/user/commons/ffastrans/IFFAStransAPI.java
new file mode 100644 (file)
index 0000000..1bb9ca1
--- /dev/null
@@ -0,0 +1,16 @@
+package user.commons.ffastrans;\r
+\r
+import java.util.List;\r
+\r
+import com.ibm.nosql.json.api.BasicDBObject;\r
+\r
+public interface IFFAStransAPI {\r
+\r
+       BasicDBObject getHistory(String jobStart);\r
+\r
+       BasicDBObject getStatus(String jobID);\r
+\r
+       List<BasicDBObject> getWorkflows();\r
+\r
+       String submit(long wfID, String path);\r
+}\r
index 57509664eb664edd6a677b426debb1ff0710ecd8..fb73bd9a621682d2d058e686b5bc314ac6457e90 100644 (file)
@@ -92,7 +92,7 @@ public class EscortFiles {
        }\r
 \r
        public static void createUNCKillDate(String filePath, String fileName, int days, Marker marker) throws IOException {\r
-               ensureUNCFolder(filePath, STATUSFOLDER, marker);\r
+               ensureUNCFolder(filePath, STATUSFOLDER);\r
                String killDateFileName = composeKillDateFileName(fileName, days);\r
                Path killDatePath = Paths.get(filePath, STATUSFOLDER, killDateFileName);\r
                if (Files.exists(killDatePath))\r
@@ -101,13 +101,13 @@ public class EscortFiles {
                        Files.createFile(killDatePath);\r
        }\r
 \r
-       public static void ensureUNCFolder(String filePath, String folderName, Marker marker) throws IOException {\r
+       public static void ensureUNCFolder(String filePath, String folderName) throws IOException {\r
                Path statusPath = Paths.get(filePath, folderName);\r
                File statusFolder = statusPath.toFile();\r
                if (!statusFolder.exists() || !statusFolder.isDirectory()) {\r
                        Set<PosixFilePermission> perms = PosixFilePermissions.fromString("rwxrwxrwx");\r
                        FileAttribute<Set<PosixFilePermission>> attr = PosixFilePermissions.asFileAttribute(perms);\r
-                       Files.createDirectory(statusPath, attr);\r
+                       Files.createDirectories(statusPath, attr);\r
                }\r
        }\r
 }\r