/// <summary> /// Add or update subscription /// </summary> /// <param name="publishJob"></param> /// <param name="nodeId"></param> /// <param name="connection"></param> private bool RemoveItemFromJob(WriterGroupJobModel publishJob, string nodeId, ConnectionModel connection) { foreach (var writer in publishJob.WriterGroup.DataSetWriters.ToList()) { if (!writer.DataSet.DataSetSource.Connection.IsSameAs(connection)) { continue; } foreach (var item in writer.DataSet.DataSetSource.PublishedVariables.PublishedData.ToList()) { if (item.PublishedVariableNodeId == nodeId) { writer.DataSet.DataSetSource.PublishedVariables.PublishedData.Remove(item); if (writer.DataSet.DataSetSource.PublishedVariables.PublishedData.Count == 0) { // Trim writer also publishJob.WriterGroup.DataSetWriters.Remove(writer); } return(true); } } } return(false); }
/// <summary> /// Create api model from service model /// </summary> /// <param name="model"></param> public WriterGroupJobApiModel(WriterGroupJobModel model) { if (model?.WriterGroup == null) { throw new ArgumentNullException(nameof(model)); } WriterGroup = new WriterGroupApiModel(model.WriterGroup); ConnectionString = model.ConnectionString; Engine = model.Engine == null ? null : new EngineConfigurationApiModel(model.Engine); MessagingMode = model.MessagingMode; }
private WriterGroupJobModel Flatten(IEnumerable <WriterGroupJobModel> writerGroupJobModels) { if (writerGroupJobModels.Count() == 1) { return(writerGroupJobModels.Single()); } // we use the first item in as template and add the DataSet writers of the subsequent jobs var writerGroupTemplate = writerGroupJobModels.First().WriterGroup.Clone(); writerGroupTemplate.DataSetWriters = writerGroupJobModels.SelectMany(s => s.WriterGroup.DataSetWriters).ToList(); var mergedModel = new WriterGroupJobModel { ConnectionString = null, Engine = writerGroupJobModels.First().Engine, MessagingMode = writerGroupJobModels.First().MessagingMode, WriterGroup = writerGroupTemplate }; return(mergedModel); }
/// <summary> /// Add or update item in job /// </summary> /// <param name="publishJob"></param> /// <param name="publishedItem"></param> /// <param name="endpointId"></param> /// <param name="connection"></param> private void AddOrUpdateItemInJob(WriterGroupJobModel publishJob, PublishedItemModel publishedItem, string endpointId, ConnectionModel connection) { // Simple - first remove - then add. RemoveItemFromJob(publishJob, publishedItem.NodeId, connection); // Find existing subscription we can add node to List <PublishedDataSetVariableModel> variables = null; foreach (var writer in publishJob.WriterGroup.DataSetWriters) { if (writer.DataSet.DataSetSource.Connection.IsSameAs(connection) && writer.DataSet.DataSetSource.SubscriptionSettings?.PublishingInterval == publishedItem.PublishingInterval) { System.Diagnostics.Debug.Assert(writer.DataSet.DataSetSource.PublishedVariables.PublishedData != null); variables = writer.DataSet.DataSetSource.PublishedVariables.PublishedData; writer.DataSet.DataSetMetaData.ConfigurationVersion.MinorVersion++; break; } } if (variables == null) { // No writer found - add new one with a published dataset var dataSetWriter = new DataSetWriterModel { DataSetWriterId = GetDefaultId(endpointId), DataSet = new PublishedDataSetModel { Name = null, DataSetMetaData = new DataSetMetaDataModel { ConfigurationVersion = new ConfigurationVersionModel { MajorVersion = 1, MinorVersion = 0 }, DataSetClassId = Guid.NewGuid(), Name = endpointId }, ExtensionFields = new Dictionary <string, string> { ["EndpointId"] = endpointId }, DataSetSource = new PublishedDataSetSourceModel { Connection = connection, PublishedEvents = null, PublishedVariables = new PublishedDataItemsModel { PublishedData = new List <PublishedDataSetVariableModel>() }, SubscriptionSettings = new PublishedDataSetSettingsModel { PublishingInterval = publishedItem.PublishingInterval, // ... } } }, MessageSettings = null, KeyFrameCount = null, DataSetFieldContentMask = null, DataSetMetaDataSendInterval = null, KeyFrameInterval = null }; variables = dataSetWriter.DataSet.DataSetSource.PublishedVariables.PublishedData; publishJob.WriterGroup.DataSetWriters.Add(dataSetWriter); } // Add to published variable list items variables.Add(new PublishedDataSetVariableModel { SamplingInterval = publishedItem.SamplingInterval, PublishedVariableNodeId = publishedItem.NodeId }); }
/// <summary> /// Add or update item in job /// </summary> /// <param name="publishJob"></param> /// <param name="publishedItem"></param> /// <param name="endpointId"></param> /// <param name="publisherId"></param> /// <param name="connection"></param> /// <param name="dataSetWriterName"></param> private void AddOrUpdateItemInJob(WriterGroupJobModel publishJob, PublishedItemModel publishedItem, string endpointId, string publisherId, ConnectionModel connection, string dataSetWriterName = null) { var dataSetWriterId = (string.IsNullOrEmpty(dataSetWriterName) ? GetDefaultId(endpointId) : dataSetWriterName) + (publishedItem.PublishingInterval.HasValue ? ('_' + publishedItem.PublishingInterval.Value.TotalMilliseconds.ToString()) : String.Empty); // Simple - first remove - then add. RemoveItemFromJob(publishJob, publishedItem.NodeId, connection); // Find existing subscription we can add node to List <PublishedDataSetVariableModel> variables = null; foreach (var writer in publishJob.WriterGroup.DataSetWriters) { if (writer.DataSet.DataSetSource.Connection.IsSameAs(connection) && writer.DataSetWriterId == dataSetWriterId) { System.Diagnostics.Debug.Assert(writer.DataSet.DataSetSource.PublishedVariables.PublishedData != null); variables = writer.DataSet.DataSetSource.PublishedVariables.PublishedData; writer.DataSet.DataSetMetaData.ConfigurationVersion.MinorVersion++; break; } } if (variables == null) { // No writer found - add new one with a published dataset var dataSetWriter = new DataSetWriterModel { DataSetWriterId = dataSetWriterId, DataSet = new PublishedDataSetModel { Name = null, DataSetMetaData = new DataSetMetaDataModel { ConfigurationVersion = new ConfigurationVersionModel { MajorVersion = 1, MinorVersion = 0 }, DataSetClassId = Guid.NewGuid(), Name = endpointId }, ExtensionFields = new Dictionary <string, string> { ["EndpointId"] = endpointId, ["PublisherId"] = publisherId, // todo, probably not needed ["DataSetWriterId"] = dataSetWriterId }, DataSetSource = new PublishedDataSetSourceModel { Connection = connection, PublishedEvents = null, PublishedVariables = new PublishedDataItemsModel { PublishedData = new List <PublishedDataSetVariableModel>() }, SubscriptionSettings = new PublishedDataSetSettingsModel { PublishingInterval = publishedItem.PublishingInterval, ResolveDisplayName = true // ... } } }, DataSetFieldContentMask = DataSetFieldContentMask.StatusCode | DataSetFieldContentMask.SourceTimestamp | DataSetFieldContentMask.ServerTimestamp | DataSetFieldContentMask.NodeId | DataSetFieldContentMask.DisplayName | DataSetFieldContentMask.ApplicationUri | DataSetFieldContentMask.EndpointUrl | DataSetFieldContentMask.ExtensionFields, MessageSettings = new DataSetWriterMessageSettingsModel() { DataSetMessageContentMask = DataSetContentMask.Timestamp | DataSetContentMask.MetaDataVersion | DataSetContentMask.Status | DataSetContentMask.DataSetWriterId | DataSetContentMask.MajorVersion | DataSetContentMask.MinorVersion | DataSetContentMask.SequenceNumber }, // TODO provide default settings KeyFrameCount = null, DataSetMetaDataSendInterval = null, KeyFrameInterval = null }; variables = dataSetWriter.DataSet.DataSetSource.PublishedVariables.PublishedData; publishJob.WriterGroup.DataSetWriters.Add(dataSetWriter); } // Add to published variable list items variables.Add(new PublishedDataSetVariableModel { SamplingInterval = publishedItem.SamplingInterval, PublishedVariableNodeId = publishedItem.NodeId, PublishedVariableDisplayName = publishedItem.DisplayName, HeartbeatInterval = publishedItem.HeartbeatInterval, QueueSize = 1, }); }
/// <summary> /// Create job scope factory /// </summary> /// <param name="jobConfig"></param> /// <param name="clientConfig"></param> public WriterGroupJobContainerFactory(WriterGroupJobModel jobConfig, IModuleConfig clientConfig) { _clientConfig = clientConfig ?? throw new ArgumentNullException(nameof(clientConfig)); _jobConfig = jobConfig ?? throw new ArgumentNullException(nameof(jobConfig)); }