Exemplo n.º 1
0
        /// <inheritdoc/>
        public async Task <BrowseNextResponseApiModel> NodeBrowseNextAsync(string endpointId,
                                                                           BrowseNextRequestApiModel content, CancellationToken ct)
        {
            if (string.IsNullOrEmpty(endpointId))
            {
                throw new ArgumentNullException(nameof(endpointId));
            }
            if (content == null)
            {
                throw new ArgumentNullException(nameof(content));
            }
            if (content.ContinuationToken == null)
            {
                throw new ArgumentNullException(nameof(content.ContinuationToken));
            }
            var path = new UriBuilder($"{_serviceUri}/v2/browse/{endpointId}/next")
            {
                Query = $"continuationToken={content.ContinuationToken}"
            };
            var request = _httpClient.NewRequest(path.ToString());

            _serializer.SetAcceptHeaders(request);
            var response = await _httpClient.GetAsync(request, ct).ConfigureAwait(false);

            response.Validate();
            return(_serializer.DeserializeResponse <BrowseNextResponseApiModel>(response));
        }
        /// <inheritdoc/>
        public async Task <BrowseNextResponseApiModel> NodeBrowseNextAsync(EndpointApiModel endpoint,
                                                                           BrowseNextRequestApiModel request, CancellationToken ct)
        {
            if (endpoint == null)
            {
                throw new ArgumentNullException(nameof(endpoint));
            }
            if (string.IsNullOrEmpty(endpoint.Url))
            {
                throw new ArgumentNullException(nameof(endpoint.Url));
            }
            if (request == null)
            {
                throw new ArgumentNullException(nameof(request));
            }
            if (request.ContinuationToken == null)
            {
                throw new ArgumentNullException(nameof(request.ContinuationToken));
            }
            var response = await _methodClient.CallMethodAsync(_deviceId, _moduleId,
                                                               "BrowseNext_V2", _serializer.SerializeToString(new {
                endpoint,
                request
            }), null, ct);

            return(_serializer.Deserialize <BrowseNextResponseApiModel>(response));
        }
Exemplo n.º 3
0
 /// <summary>
 /// Browse next references on endpoint
 /// </summary>
 /// <param name="api"></param>
 /// <param name="endpointUrl"></param>
 /// <param name="request"></param>
 /// <param name="ct"></param>
 /// <returns></returns>
 public static Task <BrowseNextResponseApiModel> NodeBrowseNextAsync(
     this ITwinModuleApi api, string endpointUrl, BrowseNextRequestApiModel request,
     CancellationToken ct = default)
 {
     return(api.NodeBrowseNextAsync(new EndpointApiModel {
         Url = endpointUrl,
         SecurityMode = SecurityMode.None
     }, request, ct));
 }
Exemplo n.º 4
0
        /// <summary>
        /// Browse next
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public async Task <BrowseNextResponseApiModel> BrowseNextAsync(
            BrowseNextRequestApiModel request)
        {
            if (request == null)
            {
                throw new ArgumentNullException(nameof(request));
            }
            var result = await _browse.NodeBrowseNextAsync(
                _twin.Endpoint, request.ToServiceModel());

            return(new BrowseNextResponseApiModel(result));
        }
Exemplo n.º 5
0
        /// <summary>
        /// Get tree next page
        /// </summary>
        /// <param name="endpointId"></param>
        /// <param name="parentId"></param>
        /// <param name="discovererId"></param>
        /// <param name="credential"></param>
        /// <param name="previousPage"></param>
        /// <returns>ListNode</returns>
        public async Task <PagedResult <ListNode> > GetTreeNextAsync(string endpointId, List <string> parentId, string discovererId,
                                                                     CredentialModel credential = null, PagedResult <ListNode> previousPage = null)
        {
            var pageResult = new PagedResult <ListNode>();
            var header     = Elevate(new RequestHeaderApiModel(), credential);
            var modelNext  = new BrowseNextRequestApiModel {
                ContinuationToken  = previousPage.ContinuationToken,
                TargetNodesOnly    = true,
                ReadVariableValues = true
            };

            modelNext.Header = header;

            try {
                var browseDataNext = await _twinService.NodeBrowseNextAsync(endpointId, modelNext);

                if (browseDataNext.References != null)
                {
                    foreach (var nodeReference in browseDataNext.References)
                    {
                        previousPage.Results.Add(new ListNode {
                            Id            = nodeReference.Target.NodeId.ToString(),
                            NodeClass     = nodeReference.Target.NodeClass ?? 0,
                            NodeName      = nodeReference.Target.DisplayName.ToString(),
                            Children      = (bool)nodeReference.Target.Children,
                            ParentIdList  = parentId,
                            DiscovererId  = discovererId,
                            AccessLevel   = nodeReference.Target.AccessLevel ?? 0,
                            ParentName    = _displayName,
                            DataType      = nodeReference.Target.DataType,
                            Value         = nodeReference.Target.Value?.ToJson()?.TrimQuotes(),
                            Publishing    = false,
                            PublishedItem = null
                        });
                    }
                }

                pageResult.Results           = previousPage.Results;
                pageResult.ContinuationToken = browseDataNext.ContinuationToken;
            }
            catch (UnauthorizedAccessException) {
                pageResult.Error = "Unauthorized access: Bad User Access Denied.";
            }
            catch (Exception e) {
                var message = "Cannot browse";
                _logger.Error(e, message);
                pageResult.Error = message;
            }
            return(pageResult);
        }
Exemplo n.º 6
0
 /// <summary>
 /// Convert back to service model
 /// </summary>
 /// <returns></returns>
 public static BrowseNextRequestModel ToServiceModel(
     this BrowseNextRequestApiModel model)
 {
     if (model == null)
     {
         return(null);
     }
     return(new BrowseNextRequestModel {
         Abort = model.Abort,
         TargetNodesOnly = model.TargetNodesOnly,
         ReadVariableValues = model.ReadVariableValues,
         ContinuationToken = model.ContinuationToken,
         Header = model.Header.ToServiceModel()
     });
 }
        public async Task <BrowseNextResponseApiModel> BrowseNextAsync(
            string endpointId, [FromBody][Required] BrowseNextRequestApiModel request)
        {
            if (request == null)
            {
                throw new ArgumentNullException(nameof(request));
            }
            if (request.ContinuationToken == null)
            {
                throw new ArgumentNullException(nameof(request.ContinuationToken));
            }
            var browseresult = await _broser.NodeBrowseNextAsync(endpointId,
                                                                 request.ToServiceModel());

            return(new BrowseNextResponseApiModel(browseresult));
        }
        /// <inheritdoc/>
        public async Task <BrowseNextResponseApiModel> NodeBrowseNextAsync(string endpointId,
                                                                           BrowseNextRequestApiModel content, CancellationToken ct)
        {
            if (string.IsNullOrEmpty(endpointId))
            {
                throw new ArgumentNullException(nameof(endpointId));
            }
            if (content == null)
            {
                throw new ArgumentNullException(nameof(content));
            }
            if (content.ContinuationToken == null)
            {
                throw new ArgumentNullException(nameof(content.ContinuationToken));
            }
            var request = _httpClient.NewRequest($"{_serviceUri}/v2/browse/{endpointId}/next",
                                                 _resourceId);

            request.SetContent(content);
            var response = await _httpClient.PostAsync(request, ct).ConfigureAwait(false);

            response.Validate();
            return(response.GetContent <BrowseNextResponseApiModel>());
        }
Exemplo n.º 9
0
        /// <summary>
        /// Get tree next page
        /// </summary>
        /// <param name="endpointId"></param>
        /// <param name="parentId"></param>
        /// <param name="discovererId"></param>
        /// <param name="credential"></param>
        /// <param name="previousPage"></param>
        /// <returns>ListNode</returns>
        public async Task <PagedResult <ListNode> > GetTreeNextAsync(string endpointId, List <string> parentId, string discovererId,
                                                                     CredentialModel credential = null, PagedResult <ListNode> previousPage = null)
        {
            var pageResult = new PagedResult <ListNode>();
            var header     = Elevate(new RequestHeaderApiModel(), credential);
            var modelNext  = new BrowseNextRequestApiModel {
                ContinuationToken  = previousPage.ContinuationToken,
                TargetNodesOnly    = true,
                ReadVariableValues = true
            };

            modelNext.Header = header;

            try {
                var browseDataNext = await _twinService.NodeBrowseNextAsync(endpointId, modelNext);

                if (string.IsNullOrEmpty(browseDataNext.ContinuationToken))
                {
                    pageResult.PageCount = previousPage.PageCount;
                }
                else
                {
                    pageResult.PageCount = previousPage.PageCount + 1;
                }

                if (browseDataNext.References != null)
                {
                    foreach (var nodeReference in browseDataNext.References)
                    {
                        previousPage.Results.Add(new ListNode {
                            Id            = nodeReference.Target.NodeId.ToString(),
                            NodeClass     = nodeReference.Target.NodeClass ?? 0,
                            NodeName      = nodeReference.Target.DisplayName.ToString(),
                            Children      = (bool)nodeReference.Target.Children,
                            ParentIdList  = parentId,
                            DiscovererId  = discovererId,
                            AccessLevel   = nodeReference.Target.AccessLevel ?? 0,
                            ParentName    = _displayName,
                            DataType      = nodeReference.Target.DataType,
                            Value         = nodeReference.Target.Value?.ToJson()?.TrimQuotes(),
                            Publishing    = false,
                            PublishedItem = null
                        });
                    }
                }

                pageResult.Results           = previousPage.Results;
                pageResult.ContinuationToken = browseDataNext.ContinuationToken;
                pageResult.PageSize          = _commonHelper.PageLength;
                pageResult.RowCount          = pageResult.Results.Count;
            }
            catch (UnauthorizedAccessException) {
                pageResult.Error = "Unauthorized access: Bad User Access Denied.";
            }
            catch (Exception e) {
                // skip this node
                var errorMessage = string.Concat(e.Message, e.InnerException?.Message ?? "--", e?.StackTrace ?? "--");
                pageResult.Error = errorMessage;
            }
            return(pageResult);
        }
Exemplo n.º 10
0
        /// <summary>
        /// Get tree
        /// </summary>
        /// <param name="endpointId"></param>
        /// <param name="id"></param>
        /// <param name="parentId"></param>
        /// <param name="discovererId"></param>
        /// <param name="direction"></param>
        /// <returns>ListNode</returns>
        public async Task <PagedResult <ListNode> > GetTreeAsync(string endpointId,
                                                                 string id, List <string> parentId, string discovererId, BrowseDirection direction)
        {
            var pageResult = new PagedResult <ListNode>();
            var model      = new BrowseRequestApiModel {
                TargetNodesOnly = true
            };

            if (direction == BrowseDirection.Forward)
            {
                model.MaxReferencesToReturn = _MAX_REFERENCES;
                model.NodeId = id;
                if (id == string.Empty)
                {
                    Path = string.Empty;
                }
            }
            else
            {
                model.NodeId = parentId.ElementAt(parentId.Count - 2);
            }

            try {
                var browseData = await _twinService.NodeBrowseAsync(endpointId, model);

                var continuationToken = browseData.ContinuationToken;
                var references        = browseData.References;
                var browseDataNext    = new BrowseNextResponseApiModel();

                if (direction == BrowseDirection.Forward)
                {
                    parentId.Add(browseData.Node.NodeId);
                    Path += "/" + browseData.Node.DisplayName;
                }
                else
                {
                    parentId.RemoveAt(parentId.Count - 1);
                    Path = Path.Substring(0, Path.LastIndexOf("/"));
                }

                do
                {
                    if (references != null)
                    {
                        foreach (var nodeReference in references)
                        {
                            pageResult.Results.Add(new ListNode {
                                Id            = nodeReference.Target.NodeId.ToString(),
                                NodeClass     = nodeReference.Target.NodeClass ?? 0,
                                NodeName      = nodeReference.Target.DisplayName.ToString(),
                                Children      = (bool)nodeReference.Target.Children,
                                ParentIdList  = parentId,
                                DiscovererId  = discovererId,
                                AccessLevel   = nodeReference.Target.AccessLevel ?? 0,
                                ParentName    = browseData.Node.DisplayName,
                                DataType      = nodeReference.Target.DataType,
                                Value         = string.Empty,
                                Publishing    = false,
                                PublishedItem = null
                            });
                        }
                    }

                    if (!string.IsNullOrEmpty(continuationToken))
                    {
                        var modelNext = new BrowseNextRequestApiModel {
                            ContinuationToken = continuationToken
                        };
                        browseDataNext = await _twinService.NodeBrowseNextAsync(endpointId, modelNext);

                        references        = browseDataNext.References;
                        continuationToken = browseDataNext.ContinuationToken;
                    }
                    else
                    {
                        browseDataNext.References = null;
                    }
                } while (!string.IsNullOrEmpty(continuationToken) || browseDataNext.References != null);
            }
            catch (Exception e) {
                // skip this node
                Trace.TraceError("Can not browse node '{0}'", id);
                var errorMessage = string.Concat(e.Message, e.InnerException?.Message ?? "--", e?.StackTrace ?? "--");
                Trace.TraceError(errorMessage);
                pageResult.Results.Add(new ListNode {
                    NodeName     = e.Message,
                    DiscovererId = discovererId,
                    ParentName   = "Root"
                });
            }

            pageResult.PageSize  = 10;
            pageResult.RowCount  = pageResult.Results.Count;
            pageResult.PageCount = (int)Math.Ceiling((decimal)pageResult.RowCount / 10);
            return(pageResult);
        }
 /// <summary>
 /// Browse next set of references
 /// </summary>
 /// <remarks>
 /// Browse next set of references on the endpoint. The endpoint must be
 /// activated and connected and the module client and server must trust each
 /// other.
 /// </remarks>
 /// <param name='operations'>
 /// The operations group for this extension method.
 /// </param>
 /// <param name='endpointId'>
 /// The identifier of the activated endpoint.
 /// </param>
 /// <param name='body'>
 /// The request body with continuation token.
 /// </param>
 /// <param name='cancellationToken'>
 /// The cancellation token.
 /// </param>
 public static async Task <BrowseNextResponseApiModel> BrowseNextAsync(this IAzureOpcTwinClient operations, string endpointId, BrowseNextRequestApiModel body, CancellationToken cancellationToken = default(CancellationToken))
 {
     using (var _result = await operations.BrowseNextWithHttpMessagesAsync(endpointId, body, null, cancellationToken).ConfigureAwait(false))
     {
         return(_result.Body);
     }
 }
 /// <summary>
 /// Browse next set of references
 /// </summary>
 /// <remarks>
 /// Browse next set of references on the endpoint. The endpoint must be
 /// activated and connected and the module client and server must trust each
 /// other.
 /// </remarks>
 /// <param name='operations'>
 /// The operations group for this extension method.
 /// </param>
 /// <param name='endpointId'>
 /// The identifier of the activated endpoint.
 /// </param>
 /// <param name='body'>
 /// The request body with continuation token.
 /// </param>
 public static BrowseNextResponseApiModel BrowseNext(this IAzureOpcTwinClient operations, string endpointId, BrowseNextRequestApiModel body)
 {
     return(operations.BrowseNextAsync(endpointId, body).GetAwaiter().GetResult());
 }
Exemplo n.º 13
0
        /// <summary>
        /// Get tree
        /// </summary>
        /// <param name="endpointId"></param>
        /// <param name="id"></param>
        /// <param name="parentId"></param>
        /// <param name="discovererId"></param>
        /// <param name="direction"></param>
        /// <returns>ListNode</returns>
        public async Task <PagedResult <ListNode> > GetTreeAsync(string endpointId, string id,
                                                                 List <string> parentId, string discovererId, BrowseDirection direction, int index,
                                                                 CredentialModel credential = null)
        {
            var pageResult = new PagedResult <ListNode>();
            var model      = new BrowseRequestApiModel {
                TargetNodesOnly    = true,
                ReadVariableValues = true
            };

            if (direction == BrowseDirection.Forward)
            {
                model.MaxReferencesToReturn = _MAX_REFERENCES;
                model.NodeId = id;
                if (id == string.Empty)
                {
                    Path = new List <string>();
                }
            }
            else
            {
                model.NodeId = parentId.ElementAt(index - 1);
            }

            model.Header = Elevate(new RequestHeaderApiModel(), credential);

            try {
                var browseData = await _twinService.NodeBrowseAsync(endpointId, model);

                var continuationToken = browseData.ContinuationToken;
                var references        = browseData.References;
                var browseDataNext    = new BrowseNextResponseApiModel();

                if (direction == BrowseDirection.Forward)
                {
                    parentId.Add(browseData.Node.NodeId);
                    Path.Add(browseData.Node.DisplayName);
                }
                else
                {
                    parentId.RemoveAt(parentId.Count - 1);
                    Path.RemoveRange(index, Path.Count - index);
                }

                do
                {
                    if (references != null)
                    {
                        foreach (var nodeReference in references)
                        {
                            pageResult.Results.Add(new ListNode {
                                Id            = nodeReference.Target.NodeId.ToString(),
                                NodeClass     = nodeReference.Target.NodeClass ?? 0,
                                NodeName      = nodeReference.Target.DisplayName.ToString(),
                                Children      = (bool)nodeReference.Target.Children,
                                ParentIdList  = parentId,
                                DiscovererId  = discovererId,
                                AccessLevel   = nodeReference.Target.AccessLevel ?? 0,
                                ParentName    = browseData.Node.DisplayName,
                                DataType      = nodeReference.Target.DataType,
                                Value         = nodeReference.Target.Value?.ToString(),
                                Publishing    = false,
                                PublishedItem = null
                            });
                        }
                    }

                    if (!string.IsNullOrEmpty(continuationToken))
                    {
                        bool?abort = null;
                        if (pageResult.Results.Count > 5)
                        {
                            // TODO: !!! Implement real paging - need to make ux responsive for large # tags !!!
                            abort = true;
                        }
                        var modelNext = new BrowseNextRequestApiModel {
                            ContinuationToken = continuationToken,
                            Abort             = abort
                        };
                        browseDataNext = await _twinService.NodeBrowseNextAsync(endpointId, modelNext);

                        if (abort == true)
                        {
                            break;
                        }
                        references        = browseDataNext.References;
                        continuationToken = browseDataNext.ContinuationToken;
                    }
                    else
                    {
                        browseDataNext.References = null;
                    }
                } while (!string.IsNullOrEmpty(continuationToken) || browseDataNext.References != null);
            }
            catch (Exception e) {
                // skip this node
                _logger.Error($"Can not browse node '{id}'");
                var errorMessage = string.Concat(e.Message, e.InnerException?.Message ?? "--", e?.StackTrace ?? "--");
                _logger.Error(errorMessage);
                string error = JToken.Parse(e.Message).ToString(Formatting.Indented);
                if (error.Contains(StatusCodes.Status401Unauthorized.ToString()))
                {
                    pageResult.Error = "Unauthorized access: Bad User Access Denied.";
                }
                else
                {
                    pageResult.Error = error;
                }
            }

            pageResult.PageSize  = 10;
            pageResult.RowCount  = pageResult.Results.Count;
            pageResult.PageCount = (int)Math.Ceiling((decimal)pageResult.RowCount / 10);
            return(pageResult);
        }