/// <summary> /// Create api model from service model /// </summary> /// <param name="model"></param> public PublishedItemApiModel(PublishedItemModel model) { if (model == null) { throw new ArgumentNullException(nameof(model)); } NodeId = model.NodeId; BrowsePath = model.BrowsePath; NodeAttribute = model.NodeAttribute; SamplingInterval = model.SamplingInterval; PublishingInterval = model.PublishingInterval; }
/// <summary> /// Create api model from service model /// </summary> /// <param name="model"></param> public static PublishedItemApiModel ToApiModel( this PublishedItemModel model) { if (model == null) { return(null); } return(new PublishedItemApiModel { NodeId = model.NodeId, SamplingInterval = model.SamplingInterval, PublishingInterval = model.PublishingInterval }); }
/// <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, }); }