GetTree() public method

public GetTree ( ) : Task>
return Task>
        private async Task AddChildNode(
            TreeNode <NavigationNode> node,
            XElement xmlNode,
            NavigationTreeBuilderService service
            )
        {
            NavigationNode            navNode  = BuildNavNode(xmlNode, service);
            TreeNode <NavigationNode> navNodeT = node.AddChild(navNode);

            foreach (XElement childrenNode in xmlNode.Elements(XName.Get("Children")))
            {
                foreach (XElement childNode in childrenNode.Elements(XName.Get("NavNode")))
                {
                    var childBuilder = GetNodeBuilderName(childNode);
                    if (string.IsNullOrEmpty(childBuilder))
                    {
                        await AddChildNode(navNodeT, childNode, service).ConfigureAwait(false); //recursion
                    }
                    else
                    {
                        var appendToBuilderNode = AppendToBuilderNode(childNode);
                        var childTreeRoot       = await service.GetTree(childBuilder).ConfigureAwait(false);

                        //if(appendToBuilderNode)
                        //{

                        //}
                        //else
                        //{
                        if (childTreeRoot.Value.ChildContainerOnly)
                        {
                            foreach (var subChild in childTreeRoot.Children)
                            {
                                navNodeT.AddChild(subChild);
                            }
                        }
                        else
                        {
                            navNodeT.AddChild(childTreeRoot);
                        }
                        //}
                    }
                }
            }
        }
        public async Task <IViewComponentResult> InvokeAsync(string viewName, string filterName, string startingNodeKey)
        {
            var rootNode = await builder.GetTree();

            var urlHelper             = urlHelperFactory.GetUrlHelper(actionContextAccesor.ActionContext);
            NavigationViewModel model = new NavigationViewModel(
                startingNodeKey,
                filterName,
                Request.HttpContext,
                urlHelper,
                rootNode,
                permissionResolvers,
                nodeFinders,
                prefixProvider.GetPrefix(),
                log);

            return(View(viewName, model));
        }
        public async Task <TreeNode <NavigationNode> > FromXml(
            XDocument xml,
            NavigationTreeBuilderService service
            )
        {
            if (xml.Root.Name != "NavNode")
            {
                throw new ArgumentException("Expected NavNode");
            }

            TreeNode <NavigationNode> treeRoot;
            var builderName = GetNodeBuilderName(xml.Root);

            if (string.IsNullOrEmpty(builderName))
            {
                NavigationNode rootNav = BuildNavNode(xml.Root, service);
                treeRoot = new TreeNode <NavigationNode>(rootNav);
            }
            else
            {
                var otherBuilderRoot = await service.GetTree(builderName).ConfigureAwait(false);

                if (otherBuilderRoot.Value.ChildContainerOnly)
                {
                    NavigationNode rootNav = BuildNavNode(xml.Root, service);
                    treeRoot = new TreeNode <NavigationNode>(rootNav);
                    foreach (var firstChild in otherBuilderRoot.Children)
                    {
                        treeRoot.AddChild(firstChild);
                    }
                }
                else
                {
                    treeRoot = otherBuilderRoot;
                }
            }

            var childrenNode = xml.Root.Elements(XName.Get("Children"));

            if (childrenNode != null)
            {
                foreach (XElement childNode in childrenNode.Elements(XName.Get("NavNode")))
                {
                    var childBuilder = GetNodeBuilderName(childNode);
                    if (string.IsNullOrEmpty(childBuilder))
                    {
                        await AddChildNode(treeRoot, childNode, service).ConfigureAwait(false);
                    }
                    else
                    {
                        var appendToBuilderNode = AppendToBuilderNode(childNode);
                        var childTreeRoot       = await service.GetTree(childBuilder).ConfigureAwait(false);

                        if (appendToBuilderNode)
                        {
                            var builderNode = BuildNavNode(childNode, service);
                            var bt          = treeRoot.AddChild(builderNode);
                            foreach (var subChild in childTreeRoot.Children)
                            {
                                bt.AddChild(subChild);
                            }
                        }
                        else
                        {
                            if (childTreeRoot.Value.ChildContainerOnly)
                            {
                                foreach (var subChild in childTreeRoot.Children)
                                {
                                    treeRoot.AddChild(subChild);
                                }
                            }
                            else
                            {
                                treeRoot.AddChild(childTreeRoot);
                            }
                        }
                    }
                }
            }



            //foreach (XElement childrenNode in xml.Root.Elements(XName.Get("Children")))
            //{
            //    foreach (XElement childNode in childrenNode.Elements(XName.Get("NavNode")))
            //    {
            //        var childBuilder = GetNodeBuilderName(childNode);
            //        if(string.IsNullOrEmpty(childBuilder))
            //        {
            //            await AddChildNode(treeRoot, childNode, service).ConfigureAwait(false);
            //        }
            //        else
            //        {
            //            var child = await service.GetTree(childBuilder).ConfigureAwait(false);
            //            if(child.Value.ChildContainerOnly)
            //            {
            //                foreach(var subChild in child.Children)
            //                {
            //                    treeRoot.AddChild(subChild);
            //                }
            //            }
            //            else
            //            {
            //                treeRoot.AddChild(child);
            //            }

            //        }


            //    }

            //}

            return(treeRoot);
        }
        private async Task AddChildNode(
            TreeNode<NavigationNode> node, 
            XElement xmlNode,
            NavigationTreeBuilderService service
            )
        {
            NavigationNode navNode = BuildNavNode(xmlNode, service);
            TreeNode<NavigationNode> navNodeT = node.AddChild(navNode);

            foreach (XElement childrenNode in xmlNode.Elements(XName.Get("Children")))
            {
                foreach (XElement childNode in childrenNode.Elements(XName.Get("NavNode")))
                {
                    var childBuilder = GetNodeBuilderName(childNode);
                    if (string.IsNullOrEmpty(childBuilder))
                    {
                        await AddChildNode(navNodeT, childNode, service).ConfigureAwait(false); //recursion
                    }
                    else
                    {
                        var child = await service.GetTree(childBuilder).ConfigureAwait(false);
                        if (child.Value.ChildContainerOnly)
                        {
                            foreach (var subChild in child.Children)
                            {
                                navNodeT.AddChild(subChild);
                            }
                        }
                        else
                        {
                            navNodeT.AddChild(child);
                        }

                        
                    }

                       
                }
            }

            

        }
        public async Task<TreeNode<NavigationNode>> FromXml(
            XDocument xml,
            NavigationTreeBuilderService service
            )
        { 
            if(xml.Root.Name != "NavNode") { throw new ArgumentException("Expected NavNode"); }

            TreeNode<NavigationNode> treeRoot;
            var builderName = GetNodeBuilderName(xml.Root);
            if (string.IsNullOrEmpty(builderName))
            {
                NavigationNode rootNav = BuildNavNode(xml.Root, service);
                treeRoot = new TreeNode<NavigationNode>(rootNav);
               
            }
            else
            {
                var otherBuilderRoot = await service.GetTree(builderName).ConfigureAwait(false);
                if(otherBuilderRoot.Value.ChildContainerOnly)
                {
                    NavigationNode rootNav = BuildNavNode(xml.Root, service);
                    treeRoot = new TreeNode<NavigationNode>(rootNav);
                    foreach(var firstChild in otherBuilderRoot.Children)
                    {
                        treeRoot.AddChild(firstChild);
                    }

                }
                else
                {
                    treeRoot = otherBuilderRoot;
                }
            }

            var childrenNode = xml.Root.Elements(XName.Get("Children"));
            if (childrenNode != null)
            {
                foreach (XElement childNode in childrenNode.Elements(XName.Get("NavNode")))
                {
                    var childBuilder = GetNodeBuilderName(childNode);
                    if (string.IsNullOrEmpty(childBuilder))
                    {
                        await AddChildNode(treeRoot, childNode, service).ConfigureAwait(false);
                    }
                    else
                    {
                        var child = await service.GetTree(childBuilder).ConfigureAwait(false);
                        if (child.Value.ChildContainerOnly)
                        {
                            foreach (var subChild in child.Children)
                            {
                                treeRoot.AddChild(subChild);
                            }
                        }
                        else
                        {
                            treeRoot.AddChild(child);
                        }

                    }
                }
            }



            //foreach (XElement childrenNode in xml.Root.Elements(XName.Get("Children")))
            //{
            //    foreach (XElement childNode in childrenNode.Elements(XName.Get("NavNode")))
            //    {
            //        var childBuilder = GetNodeBuilderName(childNode);
            //        if(string.IsNullOrEmpty(childBuilder))
            //        {
            //            await AddChildNode(treeRoot, childNode, service).ConfigureAwait(false);
            //        }
            //        else
            //        {
            //            var child = await service.GetTree(childBuilder).ConfigureAwait(false);
            //            if(child.Value.ChildContainerOnly)
            //            {
            //                foreach(var subChild in child.Children)
            //                {
            //                    treeRoot.AddChild(subChild);
            //                }
            //            }
            //            else
            //            {
            //                treeRoot.AddChild(child);
            //            }

            //        }


            //    }

            //}

            return treeRoot;
        }