예제 #1
0
 /// <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);
 }
예제 #2
0
 /// <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;
 }
예제 #3
0
        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);
        }
예제 #4
0
        /// <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
            });
        }
예제 #5
0
        /// <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,
            });
        }
예제 #6
0
 /// <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));
 }