<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
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
}\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
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
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
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
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
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
}\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
}\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
}\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
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
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
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
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
--- /dev/null
+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
--- /dev/null
+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
}\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
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