git-tfs-id: [http://tfs.userrendszerhaz.hu:8080/tfs/DefaultCollection]$/MediaCube...
authorVásáry Dániel <daniel.vasary@userrendszerhaz.hu>
Thu, 16 Nov 2017 23:00:43 +0000 (23:00 +0000)
committerVásáry Dániel <daniel.vasary@userrendszerhaz.hu>
Thu, 16 Nov 2017 23:00:43 +0000 (23:00 +0000)
34 files changed:
client/DxPlay/DxPlay.csproj
client/IntegrationTests/IntegrationTests.csproj
client/IntegrationTests/MaestroIT.cs
client/Maestro/Maestro.csproj
client/Maestro/MaestroForm.Metadata.cs
client/Maestro/MaestroForm.Source.cs
client/Maestro/MaestroForm.Target.cs
client/Maestro/MaestroForm.cs
client/Maestro/MeastroFormNotifyIcon.cs
client/Maestro/Program.cs
client/MaestroShared/Configuration/ConfigurationInfo.cs [moved from client/Maestro/Configuration/ConfigurationInfo.cs with 96% similarity]
client/MaestroShared/Configuration/KeysJsonConverter.cs [moved from client/Maestro/Configuration/KeysJsonConverter.cs with 91% similarity]
client/MaestroShared/Configuration/KnownTypesBinder.cs [moved from client/Maestro/Configuration/KnownTypesBinder.cs with 90% similarity]
client/MaestroShared/MaestroShared.csproj [new file with mode: 0644]
client/MaestroShared/Metadata/ArchiveMetadata.cs [new file with mode: 0644]
client/MaestroShared/Metadata/MetadataType.cs [moved from client/Maestro/Metadata/MetadataType.cs with 87% similarity]
client/MaestroShared/Metadata/MovieSegment.cs [moved from client/DxPlay/MovieSegment.cs with 82% similarity]
client/MaestroShared/Metadata/Timecode.cs [moved from client/DxPlay/Timecode.cs with 95% similarity]
client/MaestroShared/Properties/AssemblyInfo.cs [new file with mode: 0644]
client/MaestroShared/Targets/FTPTargetProcessor.cs [new file with mode: 0644]
client/MaestroShared/Targets/FXPTargetProcessor.cs [new file with mode: 0644]
client/MaestroShared/Targets/ITargetProcessor.cs [new file with mode: 0644]
client/MaestroShared/Targets/TargetProcessor.cs [new file with mode: 0644]
client/MaestroShared/Targets/TargetProcessorParameter.cs [new file with mode: 0644]
client/MaestroShared/Targets/UNCTargetProcessor.cs [new file with mode: 0644]
client/MaestroShared/packages.config [new file with mode: 0644]
client/MediaCube.sln
client/MediaCubeClient/Model/Model.cs
server/user.jobengine.osgi.db/build-remote-sqlj.bat
server/user.jobengine.osgi.db/database/structure.sql
server/user.jobengine.osgi.db/settings.bat [deleted file]
server/user.jobengine.osgi.db/sql/2-CreateStructure.db2
server/user.jobengine.osgi.db/src/user/jobengine/db/WorkflowAction.java
server/user.jobengine.osgi.db/src/user/jobengine/db/WorkflowActionDAO.sqlj

index 504dc315d021c7672a175bc844f47bf09a57c96b..e83e3db1e87db41a0532a8d6dbcbb5b8d0cbbd67 100644 (file)
       <SubType>Component</SubType>\r
     </Compile>\r
     <Compile Include="Messages.cs" />\r
-    <Compile Include="MovieSegment.cs" />\r
     <Compile Include="NativeMethods.cs" />\r
     <Compile Include="Program.cs" />\r
     <Compile Include="Properties\Resources.Designer.cs">\r
       <DesignTime>True</DesignTime>\r
       <DependentUpon>StringResource.resx</DependentUpon>\r
     </Compile>\r
-    <Compile Include="Timecode.cs" />\r
     <Compile Include="URCOMLoader.cs" />\r
     <Compile Include="VideoTrackBar.cs">\r
       <SubType>Component</SubType>\r
     </BootstrapperPackage>\r
   </ItemGroup>\r
   <ItemGroup>\r
+    <ProjectReference Include="..\MaestroShared\MaestroShared.csproj">\r
+      <Project>{d4417174-f21e-4ce2-ae5c-8eb30c9a9625}</Project>\r
+      <Name>MaestroShared</Name>\r
+    </ProjectReference>\r
     <ProjectReference Include="..\MXFFileParser\MXFFileParser.csproj">\r
       <Project>{bf494ee9-1e70-44e8-8942-dd726510a766}</Project>\r
       <Name>MXFFileParser</Name>\r
index e086cdb7ef61b21be3321996fe838a20568c637d..0b541ad505e0e4915564ce5d573b8f37ba22eebe 100644 (file)
       <Project>{0b44b3d7-52d7-4c0e-9b1c-f48ceeda36fe}</Project>\r
       <Name>DxPlay</Name>\r
     </ProjectReference>\r
+    <ProjectReference Include="..\MaestroShared\MaestroShared.csproj">\r
+      <Project>{d4417174-f21e-4ce2-ae5c-8eb30c9a9625}</Project>\r
+      <Name>MaestroShared</Name>\r
+    </ProjectReference>\r
     <ProjectReference Include="..\Maestro\Maestro.csproj">\r
       <Project>{baf3e174-5d82-40fa-9e62-8c76adbea1e4}</Project>\r
       <Name>Maestro</Name>\r
index 6615d49eb6d67b779e92a1c5b724fea35efa83d5..ea881c89e76bf1ece24bdae9bb5bb301f93eab08 100644 (file)
@@ -1,21 +1,19 @@
-using Maestro.Configuration;\r
-using Maestro.Targets;\r
-using Maestro;\r
-using Microsoft.VisualStudio.TestTools.UnitTesting;\r
+using Microsoft.VisualStudio.TestTools.UnitTesting;\r
 using System;\r
-using Maestro.Commons;\r
 using System.Diagnostics;\r
 using SharpCifs.Smb;\r
-using Commons;\r
 using System.Runtime.InteropServices;\r
 using Microsoft.Win32.SafeHandles;\r
 using System.Runtime.ConstrainedExecution;\r
 using System.Security;\r
-using BethesdaConsentFormWCFSvc;\r
 using System.IO;\r
 using System.Text.RegularExpressions;\r
 using MySql.Data.MySqlClient;\r
 using System.Text;\r
+using MaestroShared.Configuration;\r
+using MaestroShared.Commons;\r
+using MaestroShared.Targets;\r
+using MaestroShared.Target;\r
 \r
 namespace IntegrationTests {\r
     public sealed class SafeTokenHandle : SafeHandleZeroOrMinusOneIsInvalid {\r
index 18a7638b61f753e43cdb290962bd66e51af17d8a..e38d6009629b50667337aa5909ed22b1f950a022 100644 (file)
       <DependentUpon>ArchiveMetadataForm.cs</DependentUpon>\r
     </Compile>\r
     <Compile Include="Commons\DataGridViewProgressColumn.cs" />\r
-    <Compile Include="Commons\MorpheusXML.cs" />\r
-    <Compile Include="Commons\NexioXML.cs" />\r
-    <Compile Include="Commons\ObjectExtensions.cs" />\r
     <Compile Include="Commons\SambaClient.cs" />\r
-    <Compile Include="Commons\Win32File.cs" />\r
     <Compile Include="Commons\WindowsIdentityMembers.cs" />\r
-    <Compile Include="Configuration\ConfigurationInfo.cs" />\r
-    <Compile Include="Configuration\KeysJsonConverter.cs" />\r
-    <Compile Include="Configuration\KnownTypesBinder.cs" />\r
     <Compile Include="LoginForm.cs">\r
       <SubType>Form</SubType>\r
     </Compile>\r
     <Compile Include="MaestroForm.Metadata.cs">\r
       <SubType>Form</SubType>\r
     </Compile>\r
-    <Compile Include="MaestroForm.Target.cs" />\r
-    <Compile Include="Metadata\ArchiveMetadata.cs" />\r
+    <Compile Include="MaestroForm.Target.cs">\r
+      <SubType>Form</SubType>\r
+    </Compile>\r
     <Compile Include="Metadata\MenuButton.cs">\r
       <SubType>Component</SubType>\r
     </Compile>\r
     <Compile Include="Metadata\MetaDataInfo.cs" />\r
-    <Compile Include="Metadata\MetadataType.cs" />\r
     <Compile Include="Splash.cs">\r
       <SubType>Form</SubType>\r
     </Compile>\r
     <Compile Include="Properties\AssemblyInfo.cs" />\r
     <Compile Include="Sources\Messages\FileActionMsg.cs" />\r
     <Compile Include="SystemMessage.cs" />\r
-    <Compile Include="Targets\UNCTargetProcessor.cs" />\r
-    <Compile Include="Targets\FXPTargetProcessor.cs" />\r
-    <Compile Include="Targets\FTPTargetProcessor.cs" />\r
-    <Compile Include="Targets\SegmentConverter.cs" />\r
-    <Compile Include="Targets\TargetProcessor.cs" />\r
-    <Compile Include="Targets\ITargetProcessor.cs" />\r
     <EmbeddedResource Include="ArchiveMetadataForm.resx">\r
       <DependentUpon>ArchiveMetadataForm.cs</DependentUpon>\r
     </EmbeddedResource>\r
       <Project>{0b44b3d7-52d7-4c0e-9b1c-f48ceeda36fe}</Project>\r
       <Name>DxPlay</Name>\r
     </ProjectReference>\r
+    <ProjectReference Include="..\MaestroShared\MaestroShared.csproj">\r
+      <Project>{d4417174-f21e-4ce2-ae5c-8eb30c9a9625}</Project>\r
+      <Name>MaestroShared</Name>\r
+    </ProjectReference>\r
     <ProjectReference Include="..\MediaCubeClient\MediaCubeClient.csproj">\r
       <Project>{cefd0348-ded4-453e-bf3a-0b52f8890ab3}</Project>\r
       <Name>MediaCubeClient</Name>\r
       <Project>{8cc7c930-9dbf-487b-aed5-776937a649d5}</Project>\r
       <Name>OctopusClient</Name>\r
     </ProjectReference>\r
-    <ProjectReference Include="..\PasswordEncrypter\PasswordEncrypter.csproj">\r
-      <Project>{8c51d508-1759-4c10-84a4-80965fd074ff}</Project>\r
-      <Name>PasswordEncrypter</Name>\r
-    </ProjectReference>\r
     <ProjectReference Include="..\PlanAIRClient\TrafficClient.csproj">\r
       <Project>{a7a21311-cb0e-465f-8ad6-829faf093f00}</Project>\r
       <Name>TrafficClient</Name>\r
index 0b81ad46198a71152d19b5185cc46db9a5432260..48213df3f7b8a19ead0d678fb05bb2b6dce9a116 100644 (file)
@@ -1,5 +1,4 @@
-using Maestro.Configuration;\r
-using Maestro.Metadata;\r
+using Maestro.Metadata;\r
 using OctopusClient;\r
 using System.Linq;\r
 using System;\r
@@ -11,6 +10,8 @@ using System.ComponentModel;
 using System.Text.RegularExpressions;\r
 using MediaCubeClient;\r
 using Model;\r
+using MaestroShared.Configuration;\r
+using MaestroShared.Metadata;\r
 \r
 namespace Maestro {\r
     public partial class MaestroForm {\r
@@ -405,7 +406,8 @@ namespace Maestro {
 \r
         private void Lookup(string id) {\r
             MetadataProvider config = null;\r
-            switch (SelectedMetadata?.Kind) {\r
+            MetadataType metadataType = GuessMetadataType(id);\r
+            switch (metadataType) {\r
                 case MetadataType.TrafficAD:\r
                 case MetadataType.TrafficMaterial:\r
                 case MetadataType.TrafficPromo:\r
@@ -417,13 +419,15 @@ namespace Maestro {
                     config = Configuration.GetMetadataProvider<OctopusMetadata>();\r
                     if (config == null)\r
                         return;\r
-                    octopusIDSelector.LookupByPlaceHolder(id);\r
+                    if (!octopusIDSelector.LookupByPlaceHolder(id))\r
+                        MessageBox.Show("Nincs találat.");\r
                     break;\r
                 case MetadataType.OctopusStory:\r
                     config = Configuration.GetMetadataProvider<OctopusMetadata>();\r
                     if (config == null)\r
                         return;\r
-                    octopusIDSelector.LookupByStory(id);\r
+                    if (!octopusIDSelector.LookupByStory(id))\r
+                        MessageBox.Show("Nincs találat.");\r
                     break;\r
             }\r
         }\r
index b631363bacfe8197af1fb2d3249be09376f42c39..1f0ee28fd7c9dced80d5f961029a2ac261fc66c0 100644 (file)
@@ -1,15 +1,14 @@
 using DxPlay;\r
-using Maestro.Configuration;\r
 using Maestro.Metadata;\r
 using Maestro.Sources;\r
-using Maestro.Sources.Messages;\r
+using MaestroShared.Configuration;\r
+using MaestroShared.Metadata;\r
 using System;\r
 using System.Collections.Generic;\r
 using System.Drawing;\r
 using System.IO;\r
 using System.Linq;\r
 using System.Windows.Forms;\r
-using TrafficClient;\r
 \r
 namespace Maestro {\r
 \r
@@ -90,6 +89,7 @@ namespace Maestro {
             if (selectedrows == null)\r
                 return;\r
             if (e.ColumnIndex == 0) {\r
+                \r
                 UpdateCheckStates(selectedrows);\r
                 return;\r
             }\r
@@ -205,23 +205,7 @@ namespace Maestro {
         }\r
 \r
         private void OnLookupBySource(object sender, EventArgs e) {\r
-            Lookup(SelectedMetadata.ID);\r
-            //Cursor.Current = Cursors.WaitCursor;\r
-            //MetadataType metadataType = GuessMetadataType(SelectedSource?.Prefix);\r
-            //switch (metadataType) {\r
-            //    case MetadataType.TrafficMaterial:\r
-            //    case MetadataType.TrafficPromo:\r
-            //    case MetadataType.TrafficAD:\r
-            //        LookupTraffic(metadataType);\r
-            //        break;\r
-            //    case MetadataType.OctopusPlaceHolder:\r
-            //        LookupOctopus();\r
-            //        break;\r
-            //}\r
-            //trafficIDSelector.ClearSelection();\r
-            //octopusIDSelector.ClearSelection();\r
-\r
-            //Cursor.Current = Cursors.Default;\r
+            Lookup(SelectedSource.Prefix);\r
         }\r
 \r
         private void picClearFilter_Click(object sender, EventArgs e) {\r
index d16c82ce354c5489f43f37a6572a17a79097a582..2ae663c6b952749a641665b147237e1d260c3726 100644 (file)
@@ -1,33 +1,17 @@
-using Maestro.Configuration;\r
-using Maestro.Sources;\r
-using Maestro.Targets;\r
+using Maestro.Sources;\r
 using System;\r
 using System.Linq;\r
 using System.Windows.Forms;\r
 using Maestro.Metadata;\r
 using System.Collections.Generic;\r
 using TrafficClient;\r
-using MediaCubeClient;\r
-using DxPlay;\r
+using MaestroShared.Configuration;\r
+using MaestroShared.Metadata;\r
+using MaestroShared.Targets;\r
+using MaestroShared.Target;\r
 \r
 namespace Maestro {\r
 \r
-    public class TargetProcessorParameter {\r
-        public Source SourceConfig { get; set; }\r
-        public Target TargetConfig { get; set; }\r
-        public string InputFileName { get; set; }\r
-        public string ID { get; set; }\r
-        public string MetadataText { get; set; }\r
-        public List<Segment> Segments { get; set; }\r
-        public List<MovieSegment> MovieSegments { get; set; }\r
-        public MediaCubeApi MediaCubeApi { get; set; }\r
-        public ArchiveMetadata ArchiveMetadata { get; set; }\r
-        public TrafficAPI TrafficApi { get; set; }\r
-        public int VariantID { get; set; }\r
-\r
-        public MetadataType MetadataKind { get; set; }\r
-    }\r
-\r
     public partial class MaestroForm {\r
 \r
         private SegmentConverter segmentConverter;\r
@@ -164,7 +148,8 @@ namespace Maestro {
                 MovieSegments = movieSegments == null ? null : movieSegments.ToList(), \r
                 ArchiveMetadata = ArchiveMetadata.DeepClone(archiveMetadata),\r
                 VariantID = selectedMetadata == null ? 0 : selectedMetadata.VariantID,\r
-                MetadataKind = selectedMetadata == null ? MetadataType.None : selectedMetadata.Kind\r
+                MetadataKind = selectedMetadata == null ? MetadataType.None : selectedMetadata.Kind,\r
+                UserName = TrayApplicationContext.UserName\r
             };\r
         }\r
 \r
index 50081ba6b86101e32b0f5d597111918a04c0349e..8635e3c4e1db783b1099a05fc5c0912aefcbb7a0 100644 (file)
@@ -1,7 +1,4 @@
 using LinkDotNet.MessageHandling.Contracts;\r
-using Maestro.Commons;\r
-using Maestro.Configuration;\r
-using Maestro.Targets;\r
 using NLog;\r
 using System;\r
 using System.Collections.Concurrent;\r
@@ -15,6 +12,9 @@ using OctopusClient;
 using System.IO;\r
 using MediaCubeClient;\r
 using LinkDotNet.MessageHandling;\r
+using MaestroShared.Configuration;\r
+using MaestroShared.Targets;\r
+using MaestroShared.Commons;\r
 \r
 namespace Maestro {\r
 \r
@@ -87,7 +87,7 @@ namespace Maestro {
         private void OnMessage(IMessage message) {\r
             var pi = message.GetType().GetProperty("Content");\r
             string text = pi.GetValue(message) as string;\r
-            ObjectExtensions.SafeCall(dgMessages, () => {\r
+            dgMessages.SafeCall(() => {\r
                 systemMessageBindingSource.Insert(0, new SystemMessage() { Time = DateTime.Now, Message = text });\r
                 ActivateTab(1);\r
             });\r
index 97f8f204e483711dbc10900db149c6dabaddbc4b..8afff418c398e5b92c81927b5022447f26a8e3d8 100644 (file)
@@ -1,6 +1,6 @@
 using LinkDotNet.MessageHandling.Contracts;\r
-using Maestro.Configuration;\r
 using Maestro.Sources.Messages;\r
+using MaestroShared.Configuration;\r
 using System;\r
 using System.Windows.Forms;\r
 \r
index 5746cdb230680e2c4fe6ead6a21c8e512405d0ed..a4c70ac8127978db354b6757fc6759710c302752 100644 (file)
@@ -1,8 +1,7 @@
 using LinkDotNet.MessageHandling;\r
 using LinkDotNet.MessageHandling.Contracts;\r
-using Maestro.Commons;\r
-using Maestro.Configuration;\r
 using Maestro.Properties;\r
+using MaestroShared.Configuration;\r
 using NLog;\r
 using System;\r
 using System.Collections.Concurrent;\r
@@ -87,6 +86,8 @@ namespace Maestro {
         private ConcurrentBag<MeastroFormNotifyIcon> forms = new ConcurrentBag<MeastroFormNotifyIcon>();\r
         private IMessageBus messageBus = new MessageBus();\r
 \r
+        public static string UserName { get; set; }\r
+\r
         public TrayApplicationContext() {\r
             string str = Regex.Replace("Aéá.ú-óüöA", "[^0-9A-Za-z-._]", "_");\r
             Debug.WriteLine(str);\r
@@ -136,10 +137,11 @@ namespace Maestro {
         }\r
 \r
         private bool IsDomainUser(string userName, string domainName) {\r
-            string[] domain = userName.Split('\\');\r
-            if (domain.Length < 2)\r
+            string[] userInfo = userName.Split('\\');\r
+            if (userInfo.Length < 2)\r
                 throw new Exception(DOMAIN_QUERY_ERROR);\r
-            string userDomainName = domain[0];\r
+            string userDomainName = userInfo[0];\r
+            UserName = userInfo[1];\r
             if (userDomainName.Contains("."))\r
                 userDomainName = userDomainName.Split('.')[0];\r
             if (domainName.ToLower().Equals(userDomainName.ToLower()))\r
@@ -164,8 +166,10 @@ namespace Maestro {
                     using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, domainName)) {\r
                         while (true) {\r
                             bool isValid = pc.ValidateCredentials(userName, password);\r
-                            if (isValid)\r
+                            if (isValid) {\r
+                                UserName = userName;\r
                                 break;\r
+                            }\r
 \r
                             if (loginForm == null)\r
                                 loginForm = new LoginForm();\r
similarity index 96%
rename from client/Maestro/Configuration/ConfigurationInfo.cs
rename to client/MaestroShared/Configuration/ConfigurationInfo.cs
index 876ffa75ddf76667937990fb95c31f6fb34b99a5..95b89b0a503ce81c766222b067ac8a6213e1c889 100644 (file)
@@ -4,7 +4,7 @@ using System.Linq;
 using System.Collections.Generic;\r
 using System.IO;\r
 \r
-namespace Maestro.Configuration {\r
+namespace MaestroShared.Configuration {\r
 \r
     public class Loader {\r
         public static T Get<T>(string fileName) {\r
similarity index 91%
rename from client/Maestro/Configuration/KeysJsonConverter.cs
rename to client/MaestroShared/Configuration/KeysJsonConverter.cs
index e24d68724d52709c2b08964acb5f65c1eba9c015..9a712f85ebbee7abd84deff02f617e42d957e34f 100644 (file)
@@ -2,7 +2,7 @@
 using PasswordEncrypter;\r
 using System;\r
 \r
-namespace Maestro.Configuration {\r
+namespace MaestroShared.Configuration {\r
     public class KeysJsonConverter : JsonConverter {\r
         public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) {\r
         }\r
similarity index 90%
rename from client/Maestro/Configuration/KnownTypesBinder.cs
rename to client/MaestroShared/Configuration/KnownTypesBinder.cs
index 19b41f51c0dd2d3ea650db670885a1db63a10111..606bb3392c37d16cb8ec5b6018a1644a437a5f28 100644 (file)
@@ -3,7 +3,7 @@ using System;
 using System.Collections.Generic;\r
 using System.Linq;\r
 \r
-namespace Maestro.Configuration {\r
+namespace MaestroShared.Configuration {\r
     public class KnownTypesBinder : ISerializationBinder {\r
         public IList<Type> KnownTypes { get; set; }\r
 \r
diff --git a/client/MaestroShared/MaestroShared.csproj b/client/MaestroShared/MaestroShared.csproj
new file mode 100644 (file)
index 0000000..27d0798
--- /dev/null
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />\r
+  <PropertyGroup>\r
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>\r
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>\r
+    <ProjectGuid>{D4417174-F21E-4CE2-AE5C-8EB30C9A9625}</ProjectGuid>\r
+    <OutputType>Library</OutputType>\r
+    <AppDesignerFolder>Properties</AppDesignerFolder>\r
+    <RootNamespace>MaestroShared</RootNamespace>\r
+    <AssemblyName>MaestroShared</AssemblyName>\r
+    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>\r
+    <FileAlignment>512</FileAlignment>\r
+    <SccProjectName>SAK</SccProjectName>\r
+    <SccLocalPath>SAK</SccLocalPath>\r
+    <SccAuxPath>SAK</SccAuxPath>\r
+    <SccProvider>SAK</SccProvider>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">\r
+    <DebugSymbols>true</DebugSymbols>\r
+    <DebugType>full</DebugType>\r
+    <Optimize>false</Optimize>\r
+    <OutputPath>bin\Debug\</OutputPath>\r
+    <DefineConstants>DEBUG;TRACE</DefineConstants>\r
+    <ErrorReport>prompt</ErrorReport>\r
+    <WarningLevel>4</WarningLevel>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">\r
+    <DebugType>pdbonly</DebugType>\r
+    <Optimize>true</Optimize>\r
+    <OutputPath>bin\Release\</OutputPath>\r
+    <DefineConstants>TRACE</DefineConstants>\r
+    <ErrorReport>prompt</ErrorReport>\r
+    <WarningLevel>4</WarningLevel>\r
+  </PropertyGroup>\r
+  <ItemGroup>\r
+    <Reference Include="FluentFTP, Version=19.1.2.0, Culture=neutral, PublicKeyToken=f4af092b1d8df44f, processorArchitecture=MSIL">\r
+      <HintPath>..\packages\FluentFTP.19.1.2\lib\net45\FluentFTP.dll</HintPath>\r
+    </Reference>\r
+    <Reference Include="Newtonsoft.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">\r
+      <HintPath>..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>\r
+    </Reference>\r
+    <Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">\r
+      <HintPath>..\packages\NLog.4.4.12\lib\net45\NLog.dll</HintPath>\r
+    </Reference>\r
+    <Reference Include="System" />\r
+    <Reference Include="System.Core" />\r
+    <Reference Include="System.Drawing" />\r
+    <Reference Include="System.IO.Compression.FileSystem" />\r
+    <Reference Include="System.Numerics" />\r
+    <Reference Include="System.Runtime.Serialization" />\r
+    <Reference Include="System.Web" />\r
+    <Reference Include="System.Windows.Forms" />\r
+    <Reference Include="System.Xml.Linq" />\r
+    <Reference Include="System.Data.DataSetExtensions" />\r
+    <Reference Include="Microsoft.CSharp" />\r
+    <Reference Include="System.Data" />\r
+    <Reference Include="System.Net.Http" />\r
+    <Reference Include="System.Xml" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <Compile Include="Commons\MorpheusXML.cs" />\r
+    <Compile Include="Commons\NexioXML.cs" />\r
+    <Compile Include="Commons\ObjectExtensions.cs" />\r
+    <Compile Include="Commons\Win32File.cs" />\r
+    <Compile Include="Configuration\ConfigurationInfo.cs" />\r
+    <Compile Include="Configuration\KeysJsonConverter.cs" />\r
+    <Compile Include="Configuration\KnownTypesBinder.cs" />\r
+    <Compile Include="Metadata\MetadataType.cs" />\r
+    <Compile Include="Metadata\MovieSegment.cs" />\r
+    <Compile Include="Metadata\Timecode.cs" />\r
+    <Compile Include="Properties\AssemblyInfo.cs" />\r
+    <Compile Include="Metadata\ArchiveMetadata.cs" />\r
+    <Compile Include="Targets\FTPTargetProcessor.cs" />\r
+    <Compile Include="Targets\FXPTargetProcessor.cs" />\r
+    <Compile Include="Targets\ITargetProcessor.cs" />\r
+    <Compile Include="Metadata\SegmentConverter.cs" />\r
+    <Compile Include="Targets\TargetProcessor.cs" />\r
+    <Compile Include="Targets\TargetProcessorParameter.cs" />\r
+    <Compile Include="Targets\UNCTargetProcessor.cs" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <None Include="packages.config" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ProjectReference Include="..\MediaCubeClient\MediaCubeClient.csproj">\r
+      <Project>{cefd0348-ded4-453e-bf3a-0b52f8890ab3}</Project>\r
+      <Name>MediaCubeClient</Name>\r
+    </ProjectReference>\r
+    <ProjectReference Include="..\OctopusClient\OctopusClient.csproj">\r
+      <Project>{8cc7c930-9dbf-487b-aed5-776937a649d5}</Project>\r
+      <Name>OctopusClient</Name>\r
+    </ProjectReference>\r
+    <ProjectReference Include="..\PasswordEncrypter\PasswordEncrypter.csproj">\r
+      <Project>{8c51d508-1759-4c10-84a4-80965fd074ff}</Project>\r
+      <Name>PasswordEncrypter</Name>\r
+    </ProjectReference>\r
+    <ProjectReference Include="..\PlanAIRClient\TrafficClient.csproj">\r
+      <Project>{a7a21311-cb0e-465f-8ad6-829faf093f00}</Project>\r
+      <Name>TrafficClient</Name>\r
+    </ProjectReference>\r
+  </ItemGroup>\r
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />\r
+</Project>
\ No newline at end of file
diff --git a/client/MaestroShared/Metadata/ArchiveMetadata.cs b/client/MaestroShared/Metadata/ArchiveMetadata.cs
new file mode 100644 (file)
index 0000000..15e42ec
--- /dev/null
@@ -0,0 +1,47 @@
+using System;\r
+using Newtonsoft.Json;\r
+using System.Runtime.Serialization.Formatters.Binary;\r
+using System.IO;\r
+\r
+namespace MaestroShared.Metadata {\r
+\r
+    [Serializable()]\r
+    public class ArchiveMetadata {\r
+\r
+        //todo rename a Stuffra??\r
+        public string itemHouseId { get; set; }\r
+        public string itemTitle { get; set; }\r
+        public string itemDescription { get; set; }\r
+        public string mediaHouseId { get; set; }\r
+        public string mediaTitle { get; set; }\r
+        public string mediaDescription { get; set; }\r
+\r
+        public override string ToString() {\r
+            return JsonConvert.SerializeObject(this);\r
+            //return String.Format("{{\n \"Anyag azonosító\": \"{0}\",\n, \"Anyag cím\": \"{1}\",\n \"Anyag leírása\": \"{2}\",\n \"Média azonosító\": \"{3}\",\n \"Média cím\": \"{4}\",\n \"Média leírás\": \"{5}\"  \n}}",\r
+            //    StuffID, StuffTitle, StuffDescription, MediaID, MediaTitle, MediaDescription);\r
+        }\r
+\r
+        [JsonIgnore]\r
+        public bool IsFilled {\r
+            get {\r
+                return\r
+                    !String.IsNullOrEmpty(itemHouseId) &&\r
+                    !String.IsNullOrEmpty(itemTitle) &&\r
+                    !String.IsNullOrEmpty(mediaHouseId) &&\r
+                    !String.IsNullOrEmpty(mediaTitle);\r
+            }\r
+        }\r
+\r
+        public static ArchiveMetadata DeepClone(ArchiveMetadata obj) {\r
+            if (obj == null)\r
+                return null;\r
+            using (var ms = new MemoryStream()) {\r
+                var formatter = new BinaryFormatter();\r
+                formatter.Serialize(ms, obj);\r
+                ms.Position = 0;\r
+                return (ArchiveMetadata)formatter.Deserialize(ms);\r
+            }\r
+        }\r
+    }\r
+}\r
similarity index 87%
rename from client/Maestro/Metadata/MetadataType.cs
rename to client/MaestroShared/Metadata/MetadataType.cs
index 67a96adfb0684a16bb499419b908ed85d40bdb6d..5d54ef7a64409435db1242441122c4b6cc154bc6 100644 (file)
@@ -1,6 +1,6 @@
 using TrafficClient;\r
 \r
-namespace Maestro.Metadata {\r
+namespace MaestroShared.Metadata {\r
     public enum MetadataType {\r
         None = 6, MediaCube = 5, OctopusStory = 4, OctopusPlaceHolder = 3, TrafficMaterial = TrafficMetadataType.TrafficMaterial, TrafficPromo = TrafficMetadataType.TrafficPromo, TrafficAD = TrafficMetadataType.TrafficAD \r
     }\r
similarity index 82%
rename from client/DxPlay/MovieSegment.cs
rename to client/MaestroShared/Metadata/MovieSegment.cs
index 935fbe93935920c68230db50d63c7d8a199bb172..92827c0d9d0cc542a5090893f8269e400fb27839 100644 (file)
@@ -1,4 +1,4 @@
-namespace DxPlay {\r
+namespace MaestroShared.Metadata {\r
     public class MovieSegment {\r
         public Timecode TCIn { get; set; }\r
         public Timecode TCOut { get; set; }\r
similarity index 95%
rename from client/DxPlay/Timecode.cs
rename to client/MaestroShared/Metadata/Timecode.cs
index a81427738101402d74d5b0933704678b8f396de8..6d92c1f177e8cc415df0bf9a1eb8a5cccfd65300 100644 (file)
@@ -1,7 +1,6 @@
 using System;\r
-using System.Diagnostics;\r
 \r
-namespace DxPlay {\r
+namespace MaestroShared.Metadata {\r
     public class Timecode {\r
         private const int MEDIATIME_REFERENCE = 10000000;\r
         internal float frameRate = 0;\r
diff --git a/client/MaestroShared/Properties/AssemblyInfo.cs b/client/MaestroShared/Properties/AssemblyInfo.cs
new file mode 100644 (file)
index 0000000..14af195
--- /dev/null
@@ -0,0 +1,36 @@
+using System.Reflection;\r
+using System.Runtime.CompilerServices;\r
+using System.Runtime.InteropServices;\r
+\r
+// General Information about an assembly is controlled through the following\r
+// set of attributes. Change these attribute values to modify the information\r
+// associated with an assembly.\r
+[assembly: AssemblyTitle("MaestroShared")]\r
+[assembly: AssemblyDescription("")]\r
+[assembly: AssemblyConfiguration("")]\r
+[assembly: AssemblyCompany("")]\r
+[assembly: AssemblyProduct("MaestroShared")]\r
+[assembly: AssemblyCopyright("Copyright ©  2017")]\r
+[assembly: AssemblyTrademark("")]\r
+[assembly: AssemblyCulture("")]\r
+\r
+// Setting ComVisible to false makes the types in this assembly not visible\r
+// to COM components.  If you need to access a type in this assembly from\r
+// COM, set the ComVisible attribute to true on that type.\r
+[assembly: ComVisible(false)]\r
+\r
+// The following GUID is for the ID of the typelib if this project is exposed to COM\r
+[assembly: Guid("d4417174-f21e-4ce2-ae5c-8eb30c9a9625")]\r
+\r
+// Version information for an assembly consists of the following four values:\r
+//\r
+//      Major Version\r
+//      Minor Version\r
+//      Build Number\r
+//      Revision\r
+//\r
+// 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("1.0.0.0")]\r
+[assembly: AssemblyFileVersion("1.0.0.0")]\r
diff --git a/client/MaestroShared/Targets/FTPTargetProcessor.cs b/client/MaestroShared/Targets/FTPTargetProcessor.cs
new file mode 100644 (file)
index 0000000..9819fb8
--- /dev/null
@@ -0,0 +1,152 @@
+using FluentFTP;\r
+using MaestroShared.Configuration;\r
+using MaestroShared.Target;\r
+using NLog;\r
+using System;\r
+using System.IO;\r
+using System.Linq;\r
+using System.Net;\r
+using System.Windows.Forms;\r
+\r
+namespace MaestroShared.Targets {\r
+\r
+    public class FTPTargetProcessor : UNCTargetProcessor {\r
+        private const string PATTERN_CONCAT = "{0}{1}";\r
+        private const string _226 = "226";\r
+        private const string UPLOAD_ERROR = "Feltöltési hiba.";\r
+        private readonly Logger logger = LogManager.GetCurrentClassLogger();\r
+        protected FtpClient targetFTP;\r
+\r
+        public FTPTargetProcessor(Control parent, TargetProcessorParameter parameters)\r
+            : base(parent, parameters) {\r
+            FtpTrace.LogFunctions = false;\r
+            if (!(parameters.SourceConfig is UNCSource)) {\r
+                inputFile = null;\r
+                Uri inputUri = new Uri(String.Format(PATTERN_CONCAT, parameters.SourceConfig.Remote.Address, parameters.InputFileName));\r
+                Input = inputUri.ToString();\r
+            }\r
+        }\r
+\r
+        protected override void BeforeExecute() {\r
+            base.BeforeExecute();\r
+            targetFTP = CreateClient(parameters.TargetConfig.Remote);\r
+        }\r
+\r
+        protected override void AfterExecute() {\r
+            base.AfterExecute();\r
+            TerminateClient(targetFTP);\r
+        }\r
+\r
+        protected override void DeleteFile(string currentFile) {\r
+            targetFTP.DeleteFile(currentFile);\r
+        }\r
+\r
+        protected override void UploadFile() {\r
+            using (FileStream istream = File.OpenRead(Input)) {\r
+                using (Stream ostream = targetFTP.OpenWrite(OutputName)) {\r
+                    try {\r
+                        CopyStream(istream, inputFile.Length, ostream);\r
+                    }\r
+                    catch (Exception e) {\r
+                        logger.Error(e.Message);\r
+                        throw e;\r
+                    }\r
+                    finally {\r
+                        ostream.Close();\r
+                    }\r
+                }\r
+            }\r
+            FtpReply reply = targetFTP.GetReply();\r
+            if (!reply.Success || !_226.Equals(reply.Code)) {\r
+                throw new Exception(UPLOAD_ERROR);\r
+            }\r
+        }\r
+\r
+        protected void reconnect() {\r
+            TerminateClient(targetFTP);\r
+            targetFTP = CreateClient(parameters.TargetConfig.Remote);\r
+            EnsureDirectoryExistence(workingDir);\r
+        }\r
+\r
+        protected override void UploadContent(string outputPath, byte[] content) {\r
+            using (Stream ostream = targetFTP.OpenWrite(outputPath, FtpDataType.Binary, false)) {\r
+                try {\r
+                    ostream.Write(content, 0, content.Length);\r
+                }\r
+                catch (Exception e) {\r
+                    logger.Error(e.Message);\r
+                    throw e;\r
+                }\r
+                finally {\r
+                    ostream.Close();\r
+                }\r
+            }\r
+            FtpReply reply = targetFTP.GetReply();\r
+            if (!reply.Success || !_226.Equals(reply.Code)) {\r
+                throw new Exception(UPLOAD_ERROR);\r
+            }\r
+        }\r
+\r
+        protected override bool FileExists(string path) {\r
+            long x = -1;\r
+            try {\r
+                x = targetFTP.GetFileSize(path);\r
+            }\r
+            catch (Exception e) {\r
+                logger.Warn(e.Message);\r
+            }\r
+            return x > -1;\r
+        }\r
+\r
+        protected override string GetOutputFilePath(string path, string fileName) {\r
+            return fileName;\r
+        }\r
+\r
+        protected override void EnsureDirectoryExistence(string path) {\r
+            if (!targetFTP.DirectoryExists(path))\r
+                targetFTP.CreateDirectory(path, true);\r
+            targetFTP.SetWorkingDirectory(path);\r
+        }\r
+\r
+        protected FtpClient CreateClient(Connection connection) {\r
+            Uri address = connection.Address;\r
+            FtpClient result = new FtpClient() {\r
+                Host = address.Host,\r
+                Port = address.Port,\r
+                InternetProtocolVersions = FtpIpVersion.IPv4,\r
+                UploadDataType = FtpDataType.Binary,\r
+                DownloadDataType = FtpDataType.Binary,\r
+                Credentials = new NetworkCredential(connection.UserName, connection.Password)\r
+            };\r
+            result.Connect();\r
+            return result;\r
+        }\r
+\r
+        protected override string DetermineWorkingDirectory(Connection connection) {\r
+            string result = null;\r
+            if (!String.IsNullOrEmpty(parameters.TargetConfig.SubFolderFormat)) {\r
+                string name = GetDynamicName(parameters.TargetConfig.SubFolderFormat);\r
+                //TODO ellenőrizni, hogy mi van placeholder esetén\r
+                if (parameters.TargetConfig.SubFolderFormat.Contains(PATTERN_TEXT)) {\r
+                    string pattern = name.Split(HYPHEN[0])[0] + HYPHEN;\r
+                    targetFTP.SetWorkingDirectory(connection.Address.LocalPath);\r
+                    FtpListItem item = targetFTP.GetListing()?.Where(i => i.Type.Equals(FtpFileSystemObjectType.Directory) && i.Name.StartsWith(pattern)).FirstOrDefault();\r
+                    if (item != null)\r
+                        name = item.Name;\r
+                    targetFTP.SetWorkingDirectory(SLASH);\r
+                }\r
+                result = Path.Combine(connection.Address.LocalPath, name);\r
+            } else\r
+                result = connection.Address.LocalPath;\r
+            return result;\r
+        }\r
+\r
+        protected void TerminateClient(FtpClient ftpClient) {\r
+            if (ftpClient != null) {\r
+                ftpClient.Disconnect();\r
+                ftpClient.Dispose();\r
+            }\r
+        }\r
+\r
+    }\r
+}\r
diff --git a/client/MaestroShared/Targets/FXPTargetProcessor.cs b/client/MaestroShared/Targets/FXPTargetProcessor.cs
new file mode 100644 (file)
index 0000000..89d2ed2
--- /dev/null
@@ -0,0 +1,116 @@
+using FluentFTP;\r
+using MaestroShared.Configuration;\r
+using MaestroShared.Target;\r
+using NLog;\r
+using System;\r
+using System.IO;\r
+using System.Text.RegularExpressions;\r
+using System.Threading;\r
+using System.Windows.Forms;\r
+\r
+namespace MaestroShared.Targets {\r
+\r
+    public class FXPTargetProcessor : FTPTargetProcessor {\r
+        private const string LITERAL_SPACE = "%20";\r
+        private const string SPACE = " ";\r
+        private Logger logger = LogManager.GetCurrentClassLogger();\r
+        private Source sourceConfig;\r
+        Uri inputUri;\r
+\r
+        public FXPTargetProcessor(Control parent, TargetProcessorParameter parameters) :\r
+            base(parent, parameters) {\r
+            sourceConfig = parameters.SourceConfig;\r
+            //inputUri = new Uri(String.Format("{0}/{1}", parameters.SourceConfig.Remote.Address, parameters.InputFileName));\r
+            inputUri = new Uri(Path.Combine(parameters.SourceConfig.Remote.Address.ToString(), parameters.InputFileName));\r
+            Input = inputUri.ToString();\r
+        }\r
+\r
+        protected override void UploadFile() {\r
+            FtpClient sourceFTP = null;\r
+            FtpClient monitorFTP = null;\r
+\r
+            try {\r
+                sourceFTP = CreateClient(sourceConfig.Remote);\r
+\r
+                string input = inputUri.AbsolutePath.Replace(LITERAL_SPACE, SPACE);\r
+                long ilength = sourceFTP.GetFileSize(input);\r
+                if (parameters.TargetConfig.NexioServer)\r
+                    ilength = ilength / 2;\r
+\r
+                FtpReply replyPASV = targetFTP.Execute("PASV");\r
+                if (!replyPASV.Success)\r
+                    throw new Exception(replyPASV.ErrorMessage);\r
+\r
+                Regex regex = new Regex(Regex.Escape("(") + "(.*)" + Regex.Escape(")"));\r
+                var v = regex.Match(replyPASV.Message);\r
+                string port = v.Groups[1].ToString();\r
+\r
+                FtpReply replyPORT = sourceFTP.Execute("PORT " + port);\r
+                if (!replyPORT.Success)\r
+                    throw new Exception(replyPORT.ErrorMessage);\r
+\r
+\r
+                FtpReply sourceReplyTYPE = sourceFTP.Execute("TYPE I");\r
+                if (!sourceReplyTYPE.Success)\r
+                    throw new Exception(sourceReplyTYPE.ErrorMessage);\r
+\r
+                if (input.LastIndexOf("/") == 0)\r
+                    input = input.Replace("/", "");\r
+                FtpReply replyRETR = sourceFTP.Execute("RETR " + input);\r
+\r
+                if (!replyRETR.Success) {\r
+                    input = inputUri.Segments[inputUri.Segments.Length - 1];\r
+                    input = input.Replace("%20", " ");\r
+                    replyRETR = sourceFTP.Execute("RETR " + input);\r
+\r
+                    if (!replyRETR.Success)\r
+                        throw new Exception(replyRETR.ErrorMessage);\r
+                }\r
+\r
+                FtpReply targetReplyTYPE = targetFTP.Execute("TYPE I");\r
+                if (!targetReplyTYPE.Success)\r
+                    throw new Exception(targetReplyTYPE.ErrorMessage);\r
+\r
+                string currentWorkingDir = targetFTP.GetWorkingDirectory();\r
+                logger.Debug("Current target working directory is {0}", currentWorkingDir);\r
+                FtpReply replySTOR = targetFTP.Execute("STOR " + OutputName);\r
+                if (!replySTOR.Success)\r
+                    throw new Exception(replySTOR.ErrorMessage);\r
+\r
+\r
+                monitorFTP = CreateClient(parameters.TargetConfig.Remote);\r
+                monitorFTP.SetWorkingDirectory(workingDir);\r
+                FtpReply monitorReplyTYPE = monitorFTP.Execute("TYPE I");\r
+                if (!monitorReplyTYPE.Success)\r
+                    throw new Exception(targetReplyTYPE.ErrorMessage);\r
+                if (!monitorFTP.FileExists(OutputName))\r
+                    throw new Exception("A cél állomány nem jött létre.");\r
+                long overall = 0;\r
+                long lastSize = 0;\r
+                while (overall != ilength) {\r
+                    overall = monitorFTP.GetFileSize(OutputName);\r
+                    if (overall == lastSize) {\r
+                        Progress = 100;\r
+                        break;\r
+                    } else {\r
+                        int currentProgress = (int)((double)overall / ilength * 100);\r
+                        Progress = currentProgress > 100 ? 100 : currentProgress;\r
+                        lastSize = overall;\r
+                    }\r
+                    Thread.Sleep(1000);\r
+                }\r
+\r
+            }\r
+            catch (Exception e) {\r
+                throw e;\r
+            }\r
+            finally {\r
+                TerminateClient(monitorFTP);\r
+                TerminateClient(sourceFTP);\r
+            }\r
+\r
+            //logger.Debug("Done");\r
+        }\r
+\r
+    }\r
+}\r
diff --git a/client/MaestroShared/Targets/ITargetProcessor.cs b/client/MaestroShared/Targets/ITargetProcessor.cs
new file mode 100644 (file)
index 0000000..d8c1311
--- /dev/null
@@ -0,0 +1,19 @@
+using System;\r
+using System.ComponentModel;\r
+\r
+namespace MaestroShared.Targets {\r
+    public interface ITargetProcessor : INotifyPropertyChanged {\r
+        DateTime Started { get; set; }\r
+        DateTime Finished { get; set; }\r
+        string Input { get; set; }\r
+        string Output { get; set; }\r
+        string Status { get; set; }\r
+        string Message { get; set; }\r
+        string ID { get; set; }\r
+        int Progress { get; set; }\r
+        string KillDate { get; set; }\r
+        string Label { get; set; }\r
+        string KillDatePath { get; set; }\r
+        bool Execute();\r
+    }\r
+}
\ No newline at end of file
diff --git a/client/MaestroShared/Targets/TargetProcessor.cs b/client/MaestroShared/Targets/TargetProcessor.cs
new file mode 100644 (file)
index 0000000..3ada7fa
--- /dev/null
@@ -0,0 +1,196 @@
+using MaestroShared.Commons;\r
+using System;\r
+using System.ComponentModel;\r
+using System.Runtime.CompilerServices;\r
+using System.Windows.Forms;\r
+\r
+namespace MaestroShared.Targets {\r
+    public abstract class TargetProcessor : ITargetProcessor {\r
+        private string status;\r
+        private string message;\r
+        private string id;\r
+        private DateTime started;\r
+        private DateTime finished;\r
+        private string input;\r
+        private string output;\r
+        private string inputName;\r
+        private string outputName;\r
+        private int progress;\r
+        private string killDate;\r
+        private string label;\r
+        private string killDatePath;\r
+        protected Control parent;\r
+\r
+        public TargetProcessor(Control parent) {\r
+            this.parent = parent;\r
+        }\r
+\r
+        public event PropertyChangedEventHandler PropertyChanged;\r
+\r
+        protected void NotifyPropertyChanged([CallerMemberName] String propertyName = "") {\r
+            parent?.SafeCall(() => {\r
+                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));\r
+            });\r
+        }\r
+\r
+        public abstract bool Execute();\r
+\r
+        protected virtual void ExecuteCompleted() {\r
+        }\r
+\r
+        public string Status {\r
+            get {\r
+                return status;\r
+            }\r
+            set {\r
+                if (status != value) {\r
+                    status = value;\r
+                    NotifyPropertyChanged();\r
+                }\r
+            }\r
+        }\r
+\r
+        public DateTime Started {\r
+            get {\r
+                return started;\r
+            }\r
+            set {\r
+                if (started != value) {\r
+                    started = value;\r
+                    NotifyPropertyChanged();\r
+                }\r
+            }\r
+        }\r
+\r
+        public DateTime Finished {\r
+            get {\r
+                return finished;\r
+            }\r
+            set {\r
+                if (finished != value) {\r
+                    finished = value;\r
+                    NotifyPropertyChanged();\r
+                }\r
+            }\r
+        }\r
+\r
+        public string Input {\r
+            get {\r
+                return input;\r
+            }\r
+            set {\r
+                if (input != value) {\r
+                    input = value;\r
+                    NotifyPropertyChanged();\r
+                }\r
+            }\r
+        }\r
+\r
+        public string Output {\r
+            get {\r
+                return output;\r
+            }\r
+            set {\r
+                if (output != value) {\r
+                    output = value;\r
+                    NotifyPropertyChanged();\r
+                }\r
+            }\r
+        }\r
+\r
+        public string InputName {\r
+            get {\r
+                return inputName;\r
+            }\r
+            set {\r
+                if (inputName != value) {\r
+                    inputName = value;\r
+                    NotifyPropertyChanged();\r
+                }\r
+            }\r
+        }\r
+\r
+        public string OutputName {\r
+            get {\r
+                return outputName;\r
+            }\r
+            set {\r
+                if (outputName != value) {\r
+                    outputName = value;\r
+                    NotifyPropertyChanged();\r
+                }\r
+            }\r
+        }\r
+\r
+        public string Message {\r
+            get {\r
+                return message;\r
+            }\r
+            set {\r
+                if (message != value) {\r
+                    message = value;\r
+                    NotifyPropertyChanged();\r
+                }\r
+            }\r
+        }\r
+\r
+        public string ID {\r
+            get {\r
+                return id;\r
+            }\r
+            set {\r
+                if (id != value) {\r
+                    id = value;\r
+                    NotifyPropertyChanged();\r
+                }\r
+            }\r
+        }\r
+\r
+        public int Progress {\r
+            get {\r
+                return progress;\r
+            }\r
+            set {\r
+                if (progress != value) {\r
+                    progress = value;\r
+                    NotifyPropertyChanged();\r
+                }\r
+            }\r
+        }\r
+\r
+        public string KillDate {\r
+            get {\r
+                return killDate;\r
+            }\r
+            set {\r
+                if (killDate != value) {\r
+                    killDate = value;\r
+                    NotifyPropertyChanged();\r
+                }\r
+            }\r
+        }\r
+\r
+\r
+        public string Label {\r
+            get { return label; }\r
+            set {\r
+                //label != value biztos jó stringeknél?\r
+                if (label != value) {\r
+                    label = value;\r
+                    NotifyPropertyChanged();\r
+                }\r
+            }\r
+        }\r
+\r
+        public string KillDatePath {\r
+            get { return killDatePath; }\r
+            set {\r
+                //label != value biztos jó stringeknél?\r
+                if (killDatePath != value) {\r
+                    killDatePath = value;\r
+                    NotifyPropertyChanged();\r
+                }\r
+            }\r
+        }\r
+    }\r
+}
\ No newline at end of file
diff --git a/client/MaestroShared/Targets/TargetProcessorParameter.cs b/client/MaestroShared/Targets/TargetProcessorParameter.cs
new file mode 100644 (file)
index 0000000..d786031
--- /dev/null
@@ -0,0 +1,23 @@
+using System.Collections.Generic;\r
+using TrafficClient;\r
+using MediaCubeClient;\r
+using MaestroShared.Configuration;\r
+using MaestroShared.Metadata;\r
+\r
+namespace MaestroShared.Target {\r
+    public class TargetProcessorParameter {\r
+        public Source SourceConfig { get; set; }\r
+        public Configuration.Target TargetConfig { get; set; }\r
+        public string InputFileName { get; set; }\r
+        public string ID { get; set; }\r
+        public string MetadataText { get; set; }\r
+        public List<Segment> Segments { get; set; }\r
+        public List<MovieSegment> MovieSegments { get; set; }\r
+        public MediaCubeApi MediaCubeApi { get; set; }\r
+        public ArchiveMetadata ArchiveMetadata { get; set; }\r
+        public TrafficAPI TrafficApi { get; set; }\r
+        public int VariantID { get; set; }\r
+        public MetadataType MetadataKind { get; set; }\r
+        public string UserName { get; set; }\r
+    }\r
+}\r
diff --git a/client/MaestroShared/Targets/UNCTargetProcessor.cs b/client/MaestroShared/Targets/UNCTargetProcessor.cs
new file mode 100644 (file)
index 0000000..30a21dc
--- /dev/null
@@ -0,0 +1,357 @@
+using NLog;\r
+using System;\r
+using System.IO;\r
+using System.Windows.Forms;\r
+using TrafficClient;\r
+using Model;\r
+using System.Text;\r
+using System.Globalization;\r
+using System.Text.RegularExpressions;\r
+using MaestroShared.Configuration;\r
+using MaestroShared.Target;\r
+using MaestroShared.Metadata;\r
+using MaestroShared.Commons;\r
+\r
+namespace MaestroShared.Targets {\r
+\r
+    public class UNCTargetProcessor : TargetProcessor {\r
+        private readonly Logger logger = LogManager.GetCurrentClassLogger();\r
+        private const string SUCCESS = "Successfully completed.";\r
+        private const string PROCESSING = "Processing {0}";\r
+        private const string PROCESSING_COMPLETED = "Finished processing {0}";\r
+        private const string FILENAME = "{0}{1}";\r
+        private const string VERSIONED_FILENAME = "{0}-{1}{2}";\r
+        private const string ALREADY_EXISTS = "File {0} already exists, trying {1}";\r
+        private const string STATUS_FOLDER = ".STATUS";\r
+        private const string KILLDATE_FILE = "{0}.{1}.killdate";\r
+        private const string METADATA_FILE = "{0}.json";\r
+        private const string DEFAULT_EXTENSION = ".MXF";\r
+        private const string NORMALIZE_TEXT_PATTERN = "[^0-9A-Za-z-._]";\r
+        protected const string UNDERSCORE = "_";\r
+        protected const string HYPHEN = "-";\r
+        private const string DATE_FORMAT = "yyyy.MM.dd";\r
+        private const string PROGRAMME = "PROGRAMME";\r
+        private const string COMMERCIAL = "COMMERCIAL";\r
+        private const string JUNCTION = "JUNCTION";\r
+        private const string XML_EXT = ".xml";\r
+        private const string PATTERN_TARGETNAME = "%TARGETNAME%";\r
+        protected const string PATTERN_TEXT = "%TEXT%";\r
+        protected const string SLASH = "/";\r
+        private const string INPROGRESS = "Folyamatban";\r
+        private const string ERROR = "Hiba";\r
+        private const string DOT = ".";\r
+        private const string HYPHENSTAR = "-*";\r
+        private const string DATE_FORMAT_NODOTS = "yyyyMMdd";\r
+        private const string READY = "Kész";\r
+        private const string HYPHEN_SPACES = " - ";\r
+        private const string PATTERN_ID = "%ID%";\r
+        private const string PATTERN_IDROOT = "%IDROOT%";\r
+        private const string PATTERN_SOURCENAME = "%SOURCENAME%";\r
+        private const string PATTERN_TIMESTAMP = "%TIMESTAMP%";\r
+        private const string DATETIME_FORMAT = "yyyyMMddhhmmss";\r
+        protected FileInfo inputFile;\r
+        protected string workingDir;\r
+        protected TargetProcessorParameter parameters;\r
+\r
+        public WorkflowAction workFlowAction { get; set; }\r
+\r
+        public UNCTargetProcessor(Control parent, TargetProcessorParameter parameters)\r
+            : base(parent) {\r
+            this.parameters = parameters;\r
+            InputName = parameters.InputFileName;\r
+            Input = Path.Combine(parameters.SourceConfig.Local.Address.LocalPath, parameters.InputFileName);\r
+            inputFile = new FileInfo(Input);\r
+            ID = parameters.ID;\r
+            workFlowAction = new WorkflowAction() {\r
+                houseId = ID,\r
+                tag = parameters.TargetConfig.Tag,\r
+                touched = DateTime.Now,\r
+                userName = parameters.UserName\r
+            };\r
+            Label = parameters.TargetConfig.Label;\r
+        }\r
+\r
+        protected virtual void BeforeExecute() {\r
+            Started = DateTime.Now;\r
+            workFlowAction.started = Started;\r
+        }\r
+\r
+        public override bool Execute() {\r
+            logger.Info(PROCESSING, InputName);\r
+            bool result = false;\r
+            try {\r
+                BeforeExecute();\r
+                workingDir = DetermineWorkingDirectory(parameters.TargetConfig.Remote);\r
+                EnsureDirectoryExistence(workingDir);\r
+                OutputName = CreateOutputFileName();\r
+                OutputName = OutputName.ToUpper();\r
+                Output = "/".Equals(workingDir) ? OutputName : Path.Combine(workingDir, OutputName);\r
+                Output = Output.Replace(@"\", "/");\r
+                workFlowAction.source = Input;\r
+                workFlowAction.destination = Output;\r
+                Status = INPROGRESS;\r
+                //DateTime started = DateTime.Now;\r
+                string currentFile = GetOutputFilePath(workingDir, OutputName);\r
+                if (FileExists(currentFile) && parameters.TargetConfig.DisableFileVersioning)\r
+                    DeleteFile(currentFile);\r
+                UploadFile();\r
+                //logger.Info("Spend (s):" + (DateTime.Now - started).TotalSeconds);\r
+                ExecuteCompleted();\r
+            }\r
+            catch (Exception e) {\r
+                Status = ERROR;\r
+                Message = e.Message;\r
+                workFlowAction.description = Message;\r
+                logger.Error(e);\r
+                if (parameters.TargetConfig.SendEmailOnError && !String.IsNullOrEmpty(parameters.TargetConfig.ErrorEmailRecipient) && !String.IsNullOrEmpty(parameters.TargetConfig.ErrorEmailPattern))\r
+                    SendEmail(parameters.TargetConfig.ErrorEmailRecipient, parameters.TargetConfig.ErrorEmailPattern);\r
+            }\r
+            finally {\r
+                AfterExecute();\r
+            }\r
+            logger.Info(PROCESSING_COMPLETED, InputName);\r
+            return result;\r
+        }\r
+\r
+        protected virtual void DeleteFile(string currentFile) {\r
+            File.Delete(currentFile);\r
+        }\r
+\r
+        private string GetOutputName() {\r
+            if (String.IsNullOrEmpty(OutputName))\r
+                return null;\r
+            string result = OutputName;\r
+            if (result.Contains(DOT))\r
+                result = result.Substring(0, result.LastIndexOf(DOT));\r
+            return result;\r
+        }\r
+\r
+        protected override void ExecuteCompleted() {\r
+            base.ExecuteCompleted();\r
+            workFlowAction.description = SUCCESS;\r
+            workFlowAction.successful = true;\r
+            if (parameters.TargetConfig.NexioServer)\r
+                UploadNexioMetadata();\r
+            else {\r
+                if (parameters.TargetConfig.KillDateDays > 0)\r
+                    UploadKillDateFile();\r
+            }\r
+\r
+            if (parameters.TargetConfig.SaveArchiveMetadata && parameters.ArchiveMetadata != null)\r
+                CreateArchiveMetadata();\r
+            if (parameters.TargetConfig.SaveMorpheusMetadata && parameters.ArchiveMetadata != null && parameters.MovieSegments != null && parameters.MovieSegments.Count > 0)\r
+                UploadMorpheusMetadata();\r
+            if (parameters.TargetConfig.SaveSegments && parameters.Segments != null)\r
+                parameters.TrafficApi.UpdateTrafficInformation(parameters.VariantID, true, (TrafficMetadataType)parameters.MetadataKind, parameters.Segments);\r
+\r
+            if (parameters.TargetConfig.SendEmailOnSuccess && !String.IsNullOrEmpty(parameters.TargetConfig.SuccessEmailRecipient) && !String.IsNullOrEmpty(parameters.TargetConfig.SuccessEmailPattern))\r
+                SendEmail(parameters.TargetConfig.SuccessEmailRecipient, parameters.TargetConfig.SuccessEmailPattern);\r
+            Status = READY;\r
+            Message = SUCCESS;\r
+        }\r
+\r
+        private void UploadNexioMetadata() {\r
+            String xml = null;\r
+            string name = GetOutputName();\r
+            string description = parameters.ArchiveMetadata?.mediaTitle;\r
+            if (parameters.TargetConfig.KillDateDays > 0) {\r
+                DateTime date = GetKillDate();\r
+                KillDate = date.ToString(DATE_FORMAT);\r
+                xml = NexioXML.ToXML(name, date, description, parameters.TargetConfig.Agency);\r
+            } else\r
+                xml = NexioXML.ToXML(name, null, description, parameters.TargetConfig.Agency);\r
+            byte[] content = Encoding.Unicode.GetBytes(xml);\r
+            UploadContent(name + XML_EXT, content);\r
+        }\r
+\r
+        private void UploadMorpheusMetadata() {\r
+            string name = GetOutputName();\r
+            string title = parameters.ArchiveMetadata?.itemTitle;\r
+            if (!title.Equals(parameters.ArchiveMetadata?.mediaTitle))\r
+                title += HYPHEN_SPACES + parameters.ArchiveMetadata?.mediaTitle;\r
+            string type = null;\r
+            switch (parameters.MetadataKind) {\r
+                case MetadataType.TrafficMaterial:\r
+                    type = PROGRAMME;\r
+                    break;\r
+                case MetadataType.TrafficPromo:\r
+                    type = COMMERCIAL;\r
+                    break;\r
+                case MetadataType.TrafficAD:\r
+                    type = JUNCTION;\r
+                    break;\r
+            }\r
+            byte[] content = MorpheusXML.ToXML(title, name, parameters.TargetConfig.DeviceIDMorpheus, type, parameters.MovieSegments);\r
+            EnsureDirectoryExistence(parameters.TargetConfig.PathMorpheusMetadata);\r
+            UploadContent(name + XML_EXT, content);\r
+        }\r
+\r
+        private void SendEmail(string to, string messagePattern) {\r
+            try {\r
+                string message = messagePattern.Replace(PATTERN_TARGETNAME, OutputName);\r
+                parameters.MediaCubeApi.Notify(to, message);\r
+            }\r
+            catch (Exception e) {\r
+                MessageBox.Show(parent, e.Message);\r
+            }\r
+        }\r
+\r
+        protected virtual void AfterExecute() {\r
+            Finished = DateTime.Now;\r
+            workFlowAction.finished = Finished;\r
+            SendWorkFlowAction();\r
+            Progress = 0;\r
+        }\r
+\r
+        protected virtual bool FileExists(string path) {\r
+            return File.Exists(path);\r
+        }\r
+\r
+        private void SendWorkFlowAction() {\r
+            try {\r
+                parameters.MediaCubeApi.Create<WorkflowAction>(workFlowAction);\r
+            }\r
+            catch (Exception e) {\r
+                MessageBox.Show(parent, e.Message);\r
+            }\r
+        }\r
+\r
+        protected virtual string DetermineWorkingDirectory(Connection connection) {\r
+            string result = null;\r
+            if (!String.IsNullOrEmpty(parameters.TargetConfig.SubFolderFormat)) {\r
+                string name = GetDynamicName(parameters.TargetConfig.SubFolderFormat);\r
+                if (parameters.TargetConfig.SubFolderFormat.Contains(PATTERN_TEXT)) {\r
+                    string pattern = name.Split(HYPHEN[0])[0] + HYPHENSTAR;\r
+                    string[] dirs = Directory.GetDirectories(connection.Address.LocalPath, pattern);\r
+                    if (dirs.Length > 0)\r
+                        name = dirs[0];\r
+                }\r
+                result = Path.Combine(connection.Address.LocalPath, name);\r
+            } else\r
+                result = connection.Address.LocalPath;\r
+            return result;\r
+        }\r
+\r
+        private DateTime GetKillDate() {\r
+            DateTime result = DateTime.Now;\r
+            result = result.AddDays(parameters.TargetConfig.KillDateDays);\r
+            return result;\r
+        }\r
+\r
+        private void UploadKillDateFile() {\r
+            Uri address = parameters.TargetConfig.Remote.Address;\r
+            string statusWorkDir = Path.Combine(workingDir, STATUS_FOLDER);\r
+            EnsureDirectoryExistence(statusWorkDir);\r
+            DateTime date = GetKillDate();\r
+            string fileName = String.Format(KILLDATE_FILE, OutputName, date.ToString(DATE_FORMAT_NODOTS));\r
+            //logger.Debug("Creating KILLDATE status file {0}", fileName);\r
+            KillDatePath = GetOutputFilePath(statusWorkDir, fileName);\r
+            UploadContent(KillDatePath, new byte[] { });\r
+            KillDate = date.ToString(DATE_FORMAT);\r
+        }\r
+\r
+        private void CreateArchiveMetadata() {\r
+            Uri address = parameters.TargetConfig.Remote.Address;\r
+            string statusWorkDir = Path.Combine(workingDir, STATUS_FOLDER);\r
+            EnsureDirectoryExistence(statusWorkDir);\r
+            string fileName = String.Format(METADATA_FILE, OutputName);\r
+            //logger.Debug("Creating METADATA file {0}", fileName);\r
+            byte[] content = Encoding.UTF8.GetBytes(parameters.ArchiveMetadata.ToString());\r
+            string ouputPath = GetOutputFilePath(statusWorkDir, fileName);\r
+            UploadContent(ouputPath, content);\r
+        }\r
+\r
+        private void CreateTrafficMetadata() {\r
+            Uri address = parameters.TargetConfig.Remote.Address;\r
+            string statusWorkDir = Path.Combine(workingDir, STATUS_FOLDER);\r
+            EnsureDirectoryExistence(statusWorkDir);\r
+            string fileName = String.Format(METADATA_FILE, OutputName);\r
+            //logger.Debug("Creating METADATA file {0}", fileName);\r
+            byte[] content = Encoding.UTF8.GetBytes(parameters.ArchiveMetadata.ToString());\r
+            string ouputPath = GetOutputFilePath(statusWorkDir, fileName);\r
+            UploadContent(ouputPath, content);\r
+        }\r
+\r
+        protected void CopyStream(Stream istream, long ilength, Stream ostream) {\r
+            byte[] buffer = new byte[32768];\r
+            int read, overall = 0;\r
+            while ((read = istream.Read(buffer, 0, buffer.Length)) > 0) {\r
+                ostream.Write(buffer, 0, read);\r
+                ostream.Flush();\r
+                overall += read;\r
+                Progress = (int)((double)overall / ilength * 100);\r
+            }\r
+        }\r
+\r
+        protected virtual void UploadContent(string outputPath, byte[] content) {\r
+            File.WriteAllBytes(outputPath, content);\r
+        }\r
+\r
+        private CopyProgressResult CopyProgressHandler(long total, long transferred, long streamSize, long StreamByteTrans, uint dwStreamNumber, CopyProgressCallbackReason reason, IntPtr hSourceFile, IntPtr hDestinationFile, IntPtr lpData) {\r
+            if (transferred > 0)\r
+                Progress = (int)((double)transferred * 100 / total);\r
+            return CopyProgressResult.PROGRESS_CONTINUE;\r
+        }\r
+\r
+        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
+        }\r
+\r
+        protected virtual string GetOutputFilePath(string path, string fileName) {\r
+            return "/".Equals(workingDir) ? fileName : Path.Combine(path, fileName);\r
+        }\r
+\r
+        public static String RemoveDiacritics(String s) {\r
+            String normalizedString = s.Normalize(NormalizationForm.FormD);\r
+            StringBuilder stringBuilder = new StringBuilder();\r
+\r
+            for (int i = 0; i < normalizedString.Length; i++) {\r
+                Char c = normalizedString[i];\r
+                if (CharUnicodeInfo.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark)\r
+                    stringBuilder.Append(c);\r
+            }\r
+\r
+            return stringBuilder.ToString();\r
+        }\r
+\r
+        protected string GetDynamicName(string text) {\r
+            string idRoot = ID.Contains(UNDERSCORE) ? ID.Split(UNDERSCORE[0])[0] : ID;\r
+            string result = text\r
+                .Replace(PATTERN_ID, ID)\r
+                .Replace(PATTERN_IDROOT, idRoot)\r
+                .Replace(PATTERN_TEXT, HYPHEN + RemoveDiacritics(parameters.MetadataText))\r
+                .Replace(PATTERN_SOURCENAME, Path.GetFileNameWithoutExtension(InputName))\r
+                .Replace(PATTERN_TIMESTAMP, DateTime.Now.ToString(DATETIME_FORMAT, CultureInfo.InvariantCulture));\r
+            // replace hungarian and special characters\r
+            result = Regex.Replace(result, NORMALIZE_TEXT_PATTERN, UNDERSCORE);\r
+            if (result.Length > 100)\r
+                result = result.Substring(0, 100);\r
+            return result;\r
+        }\r
+\r
+        protected virtual string CreateOutputFileName() {\r
+            string nameWithoutExtension = GetDynamicName(parameters.TargetConfig.OutputFormat);\r
+            string extension = InputName.Contains(DOT) ? InputName.Substring(InputName.LastIndexOf(DOT)) : DEFAULT_EXTENSION;\r
+            extension = extension.ToUpper();\r
+            string result = String.Format(FILENAME, nameWithoutExtension, extension);\r
+            if (!parameters.TargetConfig.DisableFileVersioning) {\r
+                int version = 1;\r
+                while (FileExists(GetOutputFilePath(workingDir, result))) {\r
+                    string versioned = String.Format(VERSIONED_FILENAME, nameWithoutExtension, version, extension);\r
+                    logger.Debug(ALREADY_EXISTS, result, versioned);\r
+                    result = versioned;\r
+                    version++;\r
+                }\r
+            }\r
+            return result;\r
+        }\r
+\r
+        protected virtual void EnsureDirectoryExistence(string path) {\r
+            if (!Directory.Exists(path))\r
+                Directory.CreateDirectory(path);\r
+        }\r
+\r
+\r
+    }\r
+}\r
diff --git a/client/MaestroShared/packages.config b/client/MaestroShared/packages.config
new file mode 100644 (file)
index 0000000..19cd166
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<packages>\r
+  <package id="FluentFTP" version="19.1.2" targetFramework="net461" />\r
+  <package id="Newtonsoft.Json" version="10.0.3" targetFramework="net461" />\r
+  <package id="NLog" version="4.4.12" targetFramework="net461" />\r
+</packages>
\ No newline at end of file
index 573ed156aef8ddfa93ccee51e19d4178d5871e58..f3793813a55071a44f09ed8370e63d7fe1a74063 100644 (file)
@@ -20,6 +20,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PasswordEncrypter", "Passwo
 EndProject\r
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MXFFileParser", "MXFFileParser\MXFFileParser.csproj", "{BF494EE9-1E70-44E8-8942-DD726510A766}"\r
 EndProject\r
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MaestroShared", "MaestroShared\MaestroShared.csproj", "{D4417174-F21E-4CE2-AE5C-8EB30C9A9625}"\r
+EndProject\r
 Global\r
        GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
                Debug|Any CPU = Debug|Any CPU\r
@@ -138,12 +140,24 @@ Global
                {BF494EE9-1E70-44E8-8942-DD726510A766}.Release|x64.Build.0 = Release|x64\r
                {BF494EE9-1E70-44E8-8942-DD726510A766}.Release|x86.ActiveCfg = Release|Any CPU\r
                {BF494EE9-1E70-44E8-8942-DD726510A766}.Release|x86.Build.0 = Release|Any CPU\r
+               {D4417174-F21E-4CE2-AE5C-8EB30C9A9625}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r
+               {D4417174-F21E-4CE2-AE5C-8EB30C9A9625}.Debug|Any CPU.Build.0 = Debug|Any CPU\r
+               {D4417174-F21E-4CE2-AE5C-8EB30C9A9625}.Debug|x64.ActiveCfg = Debug|Any CPU\r
+               {D4417174-F21E-4CE2-AE5C-8EB30C9A9625}.Debug|x64.Build.0 = Debug|Any CPU\r
+               {D4417174-F21E-4CE2-AE5C-8EB30C9A9625}.Debug|x86.ActiveCfg = Debug|Any CPU\r
+               {D4417174-F21E-4CE2-AE5C-8EB30C9A9625}.Debug|x86.Build.0 = Debug|Any CPU\r
+               {D4417174-F21E-4CE2-AE5C-8EB30C9A9625}.Release|Any CPU.ActiveCfg = Release|Any CPU\r
+               {D4417174-F21E-4CE2-AE5C-8EB30C9A9625}.Release|Any CPU.Build.0 = Release|Any CPU\r
+               {D4417174-F21E-4CE2-AE5C-8EB30C9A9625}.Release|x64.ActiveCfg = Release|Any CPU\r
+               {D4417174-F21E-4CE2-AE5C-8EB30C9A9625}.Release|x64.Build.0 = Release|Any CPU\r
+               {D4417174-F21E-4CE2-AE5C-8EB30C9A9625}.Release|x86.ActiveCfg = Release|Any CPU\r
+               {D4417174-F21E-4CE2-AE5C-8EB30C9A9625}.Release|x86.Build.0 = Release|Any CPU\r
        EndGlobalSection\r
        GlobalSection(SolutionProperties) = preSolution\r
                HideSolutionNode = FALSE\r
        EndGlobalSection\r
        GlobalSection(TeamFoundationVersionControl) = preSolution\r
-               SccNumberOfProjects = 10\r
+               SccNumberOfProjects = 11\r
                SccEnterpriseProvider = {4CA58AB2-18FA-4F8D-95D4-32DDF27D184C}\r
                SccTeamFoundationServer = https://tfs.userrendszerhaz.hu/tfs/defaultcollection\r
                SccLocalPath0 = .\r
@@ -174,5 +188,8 @@ Global
                SccProjectUniqueName9 = MXFFileParser\\MXFFileParser.csproj\r
                SccProjectName9 = MXFFileParser\r
                SccLocalPath9 = MXFFileParser\r
+               SccProjectUniqueName10 = MaestroShared\\MaestroShared.csproj\r
+               SccProjectName10 = MaestroShared\r
+               SccLocalPath10 = MaestroShared\r
        EndGlobalSection\r
 EndGlobal\r
index 281e56427d3b79de8f97805ad1edbab5f0c7e889..629e452ef8ee1bdc4eab910b575d4bf2608d35d2 100644 (file)
@@ -7,11 +7,12 @@ namespace Model {
         public DateTime started;\r
         public DateTime finished;\r
         public bool successful;\r
-        public String houseId;\r
-        public String description;\r
-        public String source;\r
-        public String destination;\r
-        public String tag;\r
+        public string houseId;\r
+        public string description;\r
+        public string source;\r
+        public string destination;\r
+        public string tag;\r
+        public string userName;\r
         public long size;\r
     }\r
 \r
index e14046f32e7e77c9ef41b5e924d9a0b434d9e2b3..b8bb479892862c6255f0d31e8d3e1b61758d8c7d 100644 (file)
@@ -1,7 +1,10 @@
 @ECHO OFF\r
-       ECHO *** Begin SQL compile on server %DB_REMOTE_HOST% ***\r
+       ECHO *** Begin SQL compile ***\r
 \r
-       CALL settings.bat\r
+       ::Remote::\r
+       SET REMOTE_LOCATION=/tmp/mediaarch\r
+       SET REMOTE_SERVER_HOSTKEY=ssh-ed25519 256 ea:ab:67:70:79:63:2f:6a:34:81:48:e2:b9:dd:ca:d4\r
+       SET REMOTE_SERVER_ADDRESS=scp://db2admin:password@10.10.1.27\r
        \r
        CALL :deploy_source\r
        if %ERRORLEVEL% neq 0 exit /b %ERRORLEVEL%\r
index 5a42ca02db8ea485719842a759dfa017a5986d25..16fbb01a2a2e1319b50ce807ee63a45f702b2e36 100644 (file)
@@ -1,3 +1,5 @@
+ALTER TABLE WORKFLOWACTION ADD COLUMN USERNAME VARCHAR(50) NOT NULL DEFAULT ''\r
+\r
 DROP INDEX IDX_ITEM_DESCRIPTION \r
 ALTER TABLE ITEM ALTER COLUMN TITLE SET DATA TYPE VARCHAR(1000)\r
 ALTER TABLE ITEM ALTER COLUMN DESCRIPTION SET DATA TYPE VARCHAR(32000)\r
diff --git a/server/user.jobengine.osgi.db/settings.bat b/server/user.jobengine.osgi.db/settings.bat
deleted file mode 100644 (file)
index d2fc734..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-::Database::\r
-\r
-SET DB_INSTANCE=DB2\r
-SET DB_HOST=localhost\r
-SET DB_PORT=50000\r
-SET DB_NAME=JE\r
-SET DB_URL=jdbc:db2://%DB_HOST%:%DB_PORT%/%DB_NAME%:retrieveMessagesFromServerOnGetMessage=true;\r
-SET DB_SCHEMA=DB2ADMIN\r
-SET DB_USER=db2admin\r
-SET DB_PWD=salabakter\r
-SET DB_CMD_OPTIONS=-td@ -f\r
-SET DB2CLP=DB20FADE\r
-\r
-::Remote::\r
-SET DB_REMOTE_HOST=10.228.198.1\r
-SET REMOTE_LOCATION=/tmp/mediaarch\r
-SET REMOTE_SERVER_HOSTKEY=ssh-ed25519 256 86:5b:9b:bc:df:7b:df:90:c6:bf:60:69:d2:c9:61:62\r
-SET REMOTE_SERVER_ADDRESS=scp://db2admin:password@%DB_REMOTE_HOST%\r
-\r
index de77e03b5d3c1085b24fb75dfd19e83319623e63..32c9ca3cd2caf0e882a8d83831fa3f0fe7b8d308 100644 (file)
@@ -377,6 +377,7 @@ CREATE TABLE WORKFLOWACTION
        SOURCE VARCHAR(255) NOT NULL, \r
        DESTINATION VARCHAR(255) NOT NULL, \r
        TAG VARCHAR(40) NOT NULL,\r
+       USERNAME VARCHAR(50) NOT NULL,\r
        SIZE BIGINT NOT NULL,\r
        CONSTRAINT CHK_WORKFLOWACTION_SUCCESSFUL CHECK (SUCCESSFUL in ('Y', 'N'))\r
 )@\r
index 0edde20d95d88be4e08162919228781a4271403d..8d89a664a36cb9e82f28bb44d6ec30d6f45bcbca 100644 (file)
@@ -14,86 +14,95 @@ public class WorkflowAction extends JSONBase implements Serializable {
        private String source;
        private String destination;
        private String tag;
+       private String userName;
        private long size;
 
-       public Timestamp getTouched() {
-               return touched;
-       }
-
-       public void setTouched(Timestamp touched) {
-               this.touched = touched;
-       }
-
-       public Timestamp getStarted() {
-               return started;
+       public String getDescription() {
+               return description;
        }
 
-       public void setStarted(Timestamp started) {
-               this.started = started;
+       public String getDestination() {
+               return destination;
        }
 
        public Timestamp getFinished() {
                return finished;
        }
 
-       public void setFinished(Timestamp finished) {
-               this.finished = finished;
-       }
-
        public String getHouseId() {
                return houseId;
        }
 
-       public void setHouseId(String houseId) {
-               this.houseId = houseId;
+       public long getSize() {
+               return size;
        }
 
-       public String getDescription() {
-               return description;
+       public String getSource() {
+               return source;
        }
 
-       public void setDescription(String description) {
-               this.description = description;
+       public Timestamp getStarted() {
+               return started;
        }
 
-       public String getSource() {
-               return source;
+       public String getTag() {
+               return tag;
        }
 
-       public void setSource(String source) {
-               this.source = source;
+       public Timestamp getTouched() {
+               return touched;
        }
 
-       public String getDestination() {
-               return destination;
+       public String getUserName() {
+               return userName;
+       }
+
+       public boolean isSuccessful() {
+               return successful;
+       }
+
+       public void setDescription(String description) {
+               this.description = description;
        }
 
        public void setDestination(String destination) {
                this.destination = destination;
        }
 
-       public String getTag() {
-               return tag;
+       public void setFinished(Timestamp finished) {
+               this.finished = finished;
        }
 
-       public void setTag(String tag) {
-               this.tag = tag;
+       public void setHouseId(String houseId) {
+               this.houseId = houseId;
        }
 
-       public boolean isSuccessful() {
-               return successful;
+       public void setSize(long size) {
+               this.size = size;
+       }
+
+       public void setSource(String source) {
+               this.source = source;
+       }
+
+       public void setStarted(Timestamp started) {
+               this.started = started;
        }
 
        public void setSuccessful(boolean successful) {
                this.successful = successful;
        }
 
-       public long getSize() {
-               return size;
+       public void setTag(String tag) {
+               this.tag = tag;
        }
 
-       public void setSize(long size) {
-               this.size = size;
+       public void setTouched(Timestamp touched) {
+               this.touched = touched;
+       }
+
+       public void setUserName(String userName) {
+               this.userName = userName;
        }
 
 }
\ No newline at end of file
index d535067775fd6f438a9cf9f661694e163173ee82..79e7c5880bc8b3f246b5b6788842aa89eb970e98 100644 (file)
@@ -8,7 +8,7 @@ import java.util.List;
 import java.util.ArrayList;\r
 \r
 \r
-#sql iterator WorkflowActionIter(long id, Timestamp touched, Timestamp started, Timestamp finished, String successful, String houseId, String description, String source, String destination, String tag, long size);\r
+#sql iterator WorkflowActionIter(long id, Timestamp touched, Timestamp started, Timestamp finished, String successful, String houseId, String description, String source, String destination, String tag, String userName, long size);\r
 \r
 @SuppressWarnings("unused")\r
 class WorkflowActionDAO extends EntityBaseDAO {\r
@@ -33,6 +33,7 @@ class WorkflowActionDAO extends EntityBaseDAO {
                        entity.setSource(iterator.source());\r
                        entity.setDestination(iterator.destination());\r
                        entity.setTag(iterator.tag());\r
+                       entity.setUserName(iterator.userName());\r
                        entity.setSize(iterator.size());\r
                        \r
                        if (result == null)\r
@@ -46,20 +47,20 @@ class WorkflowActionDAO extends EntityBaseDAO {
        @Override\r
        protected ResultSetIterImpl selectByKey(DefaultContext context, long id) throws SQLException{\r
                WorkflowActionIter iter = null;\r
-               #sql [context] iter = { SELECT ID, TOUCHED, STARTED, FINISHED, SUCCESSFUL, HOUSEID, DESCRIPTION, SOURCE, DESTINATION, TAG, SIZE FROM WORKFLOWACTION WHERE ID = :id };\r
+               #sql [context] iter = { SELECT ID, TOUCHED, STARTED, FINISHED, SUCCESSFUL, HOUSEID, DESCRIPTION, SOURCE, DESTINATION, TAG, USERNAME, SIZE FROM WORKFLOWACTION WHERE ID = :id };\r
                return iter;\r
        }\r
 \r
        @Override\r
        protected ResultSetIterImpl selectAll(DefaultContext context) throws SQLException{\r
                WorkflowActionIter iter = null;\r
-               #sql [context] iter = { SELECT ID, TOUCHED, STARTED, FINISHED, SUCCESSFUL, HOUSEID, DESCRIPTION, SOURCE, DESTINATION, TAG, SIZE FROM WORKFLOWACTION };\r
+               #sql [context] iter = { SELECT ID, TOUCHED, STARTED, FINISHED, SUCCESSFUL, HOUSEID, DESCRIPTION, SOURCE, DESTINATION, TAG, USERNAME, SIZE FROM WORKFLOWACTION };\r
                return iter;\r
        }\r
        \r
        private ResultSetIterImpl selectByFinished(DefaultContext context, Timestamp begin, Timestamp end) throws SQLException{\r
                WorkflowActionIter iter = null;\r
-               #sql [context] iter = {  SELECT ID, TOUCHED, STARTED, FINISHED, SUCCESSFUL, HOUSEID, DESCRIPTION, SOURCE, DESTINATION, TAG, SIZE FROM WORKFLOWACTION WHERE FINISHED BETWEEN :begin AND :end ORDER BY HOUSEID };\r
+               #sql [context] iter = {  SELECT ID, TOUCHED, STARTED, FINISHED, SUCCESSFUL, HOUSEID, DESCRIPTION, SOURCE, DESTINATION, TAG, USERNAME, SIZE FROM WORKFLOWACTION WHERE FINISHED BETWEEN :begin AND :end ORDER BY HOUSEID };\r
                return iter;\r
        }\r
        \r
@@ -87,9 +88,10 @@ class WorkflowActionDAO extends EntityBaseDAO {
                String source = obj.getSource();\r
                String destination = obj.getDestination();\r
                String tag = obj.getTag();\r
+               String userName = obj.getUserName();\r
                long size = obj.getSize();\r
 \r
-               #sql [context] { UPDATE WORKFLOWACTION SET TOUCHED = :touched, STARTED = :started, FINISHED = :finished, SUCCESSFUL = :successful, HOUSEID = :houseId, DESCRIPTION = :description, SOURCE = :source, DESTINATION = :destination, TAG = :tag, SIZE = :size WHERE ID = :id };\r
+               #sql [context] { UPDATE WORKFLOWACTION SET TOUCHED = :touched, STARTED = :started, FINISHED = :finished, SUCCESSFUL = :successful, HOUSEID = :houseId, DESCRIPTION = :description, SOURCE = :source, DESTINATION = :destination, TAG = :tag, USERNAME = :userName, SIZE = :size WHERE ID = :id };\r
        }\r
        \r
        @Override\r
@@ -106,9 +108,10 @@ class WorkflowActionDAO extends EntityBaseDAO {
                String source = obj.getSource();\r
                String destination = obj.getDestination();\r
                String tag = obj.getTag();\r
+               String userName = obj.getUserName();\r
                long size = obj.getSize();\r
                \r
-               #sql [context] { INSERT INTO WORKFLOWACTION (TOUCHED, STARTED, FINISHED, SUCCESSFUL, HOUSEID, DESCRIPTION, SOURCE, DESTINATION, TAG, SIZE) VALUES (:touched, :started, :finished, :successful, :houseId, :description, :source, :destination, :tag, :size) };\r
+               #sql [context] { INSERT INTO WORKFLOWACTION (TOUCHED, STARTED, FINISHED, SUCCESSFUL, HOUSEID, DESCRIPTION, SOURCE, DESTINATION, TAG, USERNAME, SIZE) VALUES (:touched, :started, :finished, :successful, :houseId, :description, :source, :destination, :tag, :userName, :size) };\r
        }       \r
 \r
        public List<IEntityBase> getWorkflowActions(Timestamp begin, Timestamp end) {\r