<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
<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
-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
<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
-using Maestro.Configuration;\r
-using Maestro.Metadata;\r
+using Maestro.Metadata;\r
using OctopusClient;\r
using System.Linq;\r
using System;\r
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
\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
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
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
if (selectedrows == null)\r
return;\r
if (e.ColumnIndex == 0) {\r
+ \r
UpdateCheckStates(selectedrows);\r
return;\r
}\r
}\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
-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
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
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
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
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
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
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
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
}\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
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
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
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
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
--- /dev/null
+<?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
--- /dev/null
+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
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
-namespace DxPlay {\r
+namespace MaestroShared.Metadata {\r
public class MovieSegment {\r
public Timecode TCIn { get; set; }\r
public Timecode TCOut { get; set; }\r
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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+<?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
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
{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
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
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
@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
+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
+++ /dev/null
-::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
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
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
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
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
@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
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
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