public TaxonomyDetail(FwControllerContext fwControllerContext)
        {
            this.InitializeComponent();
            this.DataContext = this;

            this.GenerateTaxonomyTree(fwControllerContext);
            this.OnPropertyChanged("CategoryTaxonomies");
            this.OnPropertyChanged("SelectedTaxonomyProtocol");
        }
        public void GenerateTaxonomyTree(FwControllerContext fwControllerContext, ConversationVm conversation = null)
        {
            this._taxonomies = new List <TaxonomyCategory>();


            NBAR2TaxonomyProtocol[] nbarTaxonomies;
            if (conversation == null)
            {
                var nbarDb = fwControllerContext.FwController.GetNbarProtocolPortDatabase();
                nbarTaxonomies = nbarDb.Nbar2Taxonomy.NBAR2TaxonomyProtocol;
            }
            else
            {
                nbarTaxonomies = fwControllerContext.FwController.GetNbarTaxonomiesProtocolFromAppTags(conversation.Conversation.ApplicationTags);
            }


            foreach (var nbarTaxonomy in nbarTaxonomies)
            {
                var attributes = nbarTaxonomy.attributes.FirstOrDefault();
                if (attributes != null)
                {
                    var category = this._taxonomies.FirstOrDefault(taxonomyCategory => taxonomyCategory.Name == attributes.category);

                    if (category == null)
                    {
                        category = new TaxonomyCategory
                        {
                            Name          = attributes.category,
                            Protocols     = new List <TaxonomyProtocol>(),
                            SubCategories = new List <TaxonomyCategory>()
                        };

                        this._taxonomies.Add(category);
                    }

                    var subCategory = category.SubCategories.FirstOrDefault(taxonomyCategory => taxonomyCategory.Name == attributes.subcategory);

                    if (subCategory == null)
                    {
                        subCategory = new TaxonomyCategory
                        {
                            Name          = attributes.subcategory,
                            Protocols     = new List <TaxonomyProtocol>(),
                            SubCategories = new List <TaxonomyCategory>()
                        };

                        category.SubCategories.Add(subCategory);
                    }

                    var applicationGroup = subCategory.SubCategories.FirstOrDefault(taxonomyCategory => taxonomyCategory.Name == attributes.applicationgroup);

                    if (applicationGroup == null)
                    {
                        applicationGroup = new TaxonomyCategory
                        {
                            Name          = attributes.applicationgroup,
                            Protocols     = new List <TaxonomyProtocol>(),
                            SubCategories = new List <TaxonomyCategory>()
                        };

                        subCategory.SubCategories.Add(applicationGroup);
                    }

                    var taxProto = new TaxonomyProtocol
                    {
                        Name                = nbarTaxonomy.name,
                        CommonName          = nbarTaxonomy.commonname,
                        Description         = nbarTaxonomy.helpstring,
                        Encrypted           = attributes.encrypted,
                        Tunnel              = attributes.tunnel,
                        UnderLyingProtocols = nbarTaxonomy.underlyingprotocols
                    };


                    foreach (var port in nbarTaxonomy.ports)
                    {
                        if (!string.IsNullOrEmpty(port.tcp))
                        {
                            taxProto.Ports += string.Format("TCP:{0} ", port.tcp);
                        }

                        if (!string.IsNullOrEmpty(port.udp))
                        {
                            taxProto.Ports += string.Format("UDP:{0} ", port.udp);
                        }
                    }

                    applicationGroup.Protocols.Add(taxProto);
                }
            }
        }