Opc.Ua.ServerTest.BrowseTest.Browse C# (CSharp) Method

Browse() private method

Browses the node and verifies the results.
private Browse ( List nodes, BrowseDescriptionCollection nodesToBrowse, List references ) : bool
nodes List
nodesToBrowse BrowseDescriptionCollection
references List
return bool
        private bool Browse(
            List<Node> nodes,
            BrowseDescriptionCollection nodesToBrowse, 
            List<ReferenceDescriptionCollection> references)
        {            
            BrowseResultCollection results;
            DiagnosticInfoCollection diagnosticInfos;
            
            RequestHeader requestHeader = new RequestHeader();
            requestHeader.ReturnDiagnostics = 0;

            Session.Browse(
                requestHeader,
                m_view,
                m_maxReferencesPerNode,
                nodesToBrowse,
                out results,
                out diagnosticInfos);
            
            ClientBase.ValidateResponse(results, nodesToBrowse);
            ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToBrowse);
            
            // check diagnostics.
            if (diagnosticInfos != null && diagnosticInfos.Count > 0)
            {
                Log("Returned non-empty DiagnosticInfos array during Browse.");
                return false;
            }
            
            List<Node> originalNodes = nodes;
            BrowseDescriptionCollection originalNodesToBrowse = nodesToBrowse;
            List<ReferenceDescriptionCollection> originalReferences = references;

            List<Node> remainingNodes = new List<Node>();
            BrowseDescriptionCollection remainingNodesToBrowse = new BrowseDescriptionCollection();
            List<ReferenceDescriptionCollection> remainingReferences = new List<ReferenceDescriptionCollection>();
            ByteStringCollection continuationPoints = new ByteStringCollection();

            // process results.
            for (int ii = 0; ii < results.Count; ii++)
            {
                // check status code.
                if (StatusCode.IsBad(results[ii].StatusCode))
                {
                    Log(
                        "HierarchicalBrowseTest Failed for Node '{0}'. Status = {2}, NodeId = {1}", 
                        nodes[ii], 
                        nodes[ii].NodeId, 
                        results[ii].StatusCode);

                    return false;
                }

                // check max references.
                if (m_maxReferencesPerNode > 0 && m_maxReferencesPerNode < results[ii].References.Count)
                {
                    Log(
                        "Too many references returned for Node '{0}'. NodeId = {1}, Expected = {2}, Actual = {3}",
                        nodes[ii], 
                        nodes[ii].NodeId, 
                        m_maxReferencesPerNode, 
                        results[ii].References.Count);
                   
                    return false;
                }

                // verify references returned.
                if (!VerifyReferences(nodes[ii], nodesToBrowse[ii], results[ii].References))
                {
                    return false;
                }
                
                // save references.
                references[ii].AddRange(results[ii].References);

                if (results[ii].ContinuationPoint != null)
                {
                    // check max references.
                    if (results[ii].References.Count == 0)
                    {
                        Log(
                            "No references returned with a continuation point for Node '{0}'. NodeId = {1}, Expected = {2}",
                            nodes[ii], 
                            nodes[ii].NodeId, 
                            m_maxReferencesPerNode);
                       
                        return false;
                    }

                    // add to list to rebrowse.
                    remainingNodes.Add(nodes[ii]);
                    remainingNodesToBrowse.Add(nodesToBrowse[ii]);
                    remainingReferences.Add(references[ii]);
                    continuationPoints.Add(results[ii].ContinuationPoint);
                }
            }
            
            // process continuation points.
            while (continuationPoints.Count > 0)
            {                       
                requestHeader = new RequestHeader();
                requestHeader.ReturnDiagnostics = 0;

                Session.BrowseNext(
                    requestHeader,
                    false,
                    continuationPoints,
                    out results,
                    out diagnosticInfos);
                
                ClientBase.ValidateResponse(results, continuationPoints);
                ClientBase.ValidateDiagnosticInfos(diagnosticInfos, continuationPoints);

                // check diagnostics.
                if (diagnosticInfos != null && diagnosticInfos.Count > 0)
                {
                    Log("Returned non-empty DiagnosticInfos array during BrowseNext.");
                    return false;
                }
                
                nodes = remainingNodes;
                nodesToBrowse = remainingNodesToBrowse;
                references = remainingReferences;

                // process results.
                remainingNodes = new List<Node>();
                remainingNodesToBrowse = new BrowseDescriptionCollection();
                remainingReferences = new List<ReferenceDescriptionCollection>();
                continuationPoints = new ByteStringCollection();

                for (int ii = 0; ii < results.Count; ii++)
                {
                    // check status code.
                    if (StatusCode.IsBad(results[ii].StatusCode))
                    {
                        Log(
                            "BrowseNext Failed for Node '{0}'. Status = {2}, NodeId = {1}", 
                            nodes[ii], 
                            nodes[ii].NodeId, 
                            results[ii].StatusCode);

                        return false;
                    }

                    // check max references.
                    if (m_maxReferencesPerNode > 0 && m_maxReferencesPerNode < results[ii].References.Count)
                    {
                        Log(
                            "Too many references returned for Node '{0}'. NodeId = {1}, Expected = {2}, Actual = {3}",
                            nodes[ii], 
                            nodes[ii].NodeId, 
                            m_maxReferencesPerNode, 
                            results[ii].References.Count);
                       
                        return false;
                    }

                    // verify references returned.
                    if (!VerifyReferences(nodes[ii], nodesToBrowse[ii], results[ii].References))
                    {
                        return false;
                    }
                    
                    // save references.
                    references[ii].AddRange(results[ii].References);

                    if (results[ii].ContinuationPoint != null)
                    {
                        // check max references.
                        if (results[ii].References.Count == 0)
                        {
                            Log(
                                "No references returned with a continuation point for Node '{0}'. NodeId = {1}, Expected = {2}",
                                nodes[ii], 
                                nodes[ii].NodeId, 
                                m_maxReferencesPerNode);
                           
                            return false;
                        }

                        // add to list to rebrowse.
                        remainingNodes.Add(nodes[ii]);
                        remainingNodesToBrowse.Add(nodesToBrowse[ii]);
                        remainingReferences.Add(references[ii]);
                        continuationPoints.Add(results[ii].ContinuationPoint);
                    }
                }
            }
            
            // verify filters.
            for (int ii = 0; ii < originalNodes.Count; ii++)
            {
                if (!VerifyFilterResults(originalNodes[ii], originalNodesToBrowse[ii], originalReferences[ii]))
                {
                    return false;
                }
            }

            return true;
        }
        

Same methods

BrowseTest::Browse ( Node node, BrowseDescription nodeToBrowse, ReferenceDescriptionCollection references ) : bool