/// <summary>
        /// Get all species facts that are needed to initialize
        /// properties in class TaxonListInformation.
        /// </summary>
        /// <param name="taxa">The taxa.</param>
        /// <returns>Taxon list information about specified taxa.</returns>
        private SpeciesFactList GetSpeciesFacts(IEnumerable <ITaxon> taxa)
        {
            ISpeciesFactSearchCriteria searchCriteria = new SpeciesFactSearchCriteria();

            searchCriteria.Factors = new FactorList();
            FactorList landscapeFactors = CoreData.FactorManager.GetFactorTree(mContext, FactorId.LandscapeFactors).GetAllLeafFactors();

            searchCriteria.Factors.AddRange(landscapeFactors);
            IFactor redlistCategoryFactor = CoreData.FactorManager.GetFactor(mContext, FactorId.RedlistCategory);

            searchCriteria.Factors.Add(redlistCategoryFactor);
            IFactor redlistTaxonTypeFactor = CoreData.FactorManager.GetFactor(mContext, FactorId.Redlist_TaxonType);

            searchCriteria.Factors.Add(redlistTaxonTypeFactor);
            IFactor redlistOrganismLabel1 = CoreData.FactorManager.GetFactor(mContext, FactorId.Redlist_OrganismLabel1);

            searchCriteria.Factors.Add(redlistOrganismLabel1);
            IFactor redlistCriteriaFactor = CoreData.FactorManager.GetFactor(mContext, FactorId.RedlistCriteriaString);

            searchCriteria.Factors.Add(redlistCriteriaFactor);
            searchCriteria.IndividualCategories = new IndividualCategoryList
            {
                CoreData.FactorManager.GetDefaultIndividualCategory(mContext)
            };
            searchCriteria.Periods = new PeriodList {
                CoreData.FactorManager.GetCurrentRedListPeriod(mContext)
            };
            searchCriteria.Taxa = new TaxonList();
            searchCriteria.Taxa.AddRange(taxa);
            ISpeciesFactDataSource speciesFactDataSource = new RedListSpeciesFactDataSource();
            SpeciesFactList        speciesFacts          = speciesFactDataSource.GetSpeciesFacts(mContext, searchCriteria);

            return(speciesFacts);
        }
        /// <summary>
        /// Get swedish occurrence type species facts.
        /// </summary>
        private void GetSwedishOccurrenceSpeciesFactsToCache()
        {
            ISpeciesFactSearchCriteria searchCriteria = new SpeciesFactSearchCriteria();

            searchCriteria.Factors = new FactorList();
            IFactor factor = CoreData.FactorManager.GetFactor(mContext, FactorId.SwedishOccurrence);

            searchCriteria.Factors.Add(factor);
            searchCriteria.IndividualCategories = new IndividualCategoryList
            {
                CoreData.FactorManager.GetDefaultIndividualCategory(mContext)
            };
            ISpeciesFactDataSource speciesFactDataSource = new RedListSpeciesFactDataSource();
            SpeciesFactList        speciesFacts          = speciesFactDataSource.GetSpeciesFacts(mContext, searchCriteria);

            if (speciesFacts.IsNotEmpty())
            {
                foreach (ISpeciesFact speciesFact in speciesFacts)
                {
                    if (TaxonInformationCache.TaxonInformation.ContainsKey(speciesFact.Taxon.Id))
                    {
                        TaxonInformationCache.TaxonInformation[speciesFact.Taxon.Id].SetSpeciesFact(speciesFact);
                    }
                }
            }
        }
        /// <summary>
        /// Get landscape type species facts.
        /// </summary>
        private void GetLandscapeTypeSpeciesFactsToCache()
        {
            ISpeciesFactSearchCriteria searchCriteria = new SpeciesFactSearchCriteria();

            searchCriteria.Factors = new FactorList();
            FactorList factors = CoreData.FactorManager.GetFactorTree(mContext, FactorId.LandscapeFactors).GetAllLeafFactors();

            searchCriteria.Factors.AddRange(factors);
            searchCriteria.IndividualCategories = new IndividualCategoryList
            {
                CoreData.FactorManager.GetDefaultIndividualCategory(mContext)
            };
            ISpeciesFactDataSource speciesFactDataSource = new RedListSpeciesFactDataSource();
            SpeciesFactList        speciesFacts          = speciesFactDataSource.GetSpeciesFacts(mContext, searchCriteria);

            if (speciesFacts.IsNotEmpty())
            {
                foreach (ISpeciesFact speciesFact in speciesFacts)
                {
                    if (TaxonInformationCache.TaxonInformation.ContainsKey(speciesFact.Taxon.Id))
                    {
                        TaxonInformationCache.TaxonInformation[speciesFact.Taxon.Id].SetSpeciesFact(speciesFact);
                    }
                }
            }
        }
        /// <summary>
        /// Initiate the cache with species fact information.
        /// </summary>
        /// <param name="userContext">The user context.</param>
        public void Init(IUserContext userContext)
        {
            FactorList                 factors;
            ISpeciesFactDataSource     speciesFactDataSource;
            ISpeciesFactSearchCriteria searchCriteria;
            SpeciesFactList            speciesFacts;

            speciesFactDataSource = new RedListSpeciesFactDataSource();
            searchCriteria        = new SpeciesFactSearchCriteria();
            searchCriteria.IndividualCategories = new IndividualCategoryList();
            searchCriteria.IndividualCategories.Add(CoreData.FactorManager.GetDefaultIndividualCategory(userContext));
            searchCriteria.Periods = new PeriodList();
            searchCriteria.Periods.Add(CoreData.FactorManager.GetCurrentRedListPeriod(userContext));
            factors = GetFactors(userContext);
            searchCriteria.Factors = new FactorList();
            searchCriteria.Factors.AddRange(factors);
            speciesFacts = speciesFactDataSource.GetSpeciesFacts(userContext, searchCriteria);
            foreach (ISpeciesFact speciesFact in speciesFacts)
            {
                if (speciesFact.IsRedlistCategorySpecified())
                {
                    if (speciesFact.Field1.EnumValue.KeyText.IsEmpty())
                    {
                        var ex = new Exception("Must be an error in the database for speciesFact.Field1.EnumValue.KeyText taxon =" + speciesFact.Taxon.Id);
                        throw ex;
                    }
                    if (speciesFact.Field1.EnumValue.KeyInt != null)
                    {
                        mCategories[(RedListCategory)speciesFact.Field1.EnumValue.KeyInt.Value].Add(new TaxonIdImplementation(speciesFact.Taxon.Id));
                    }
                }
            }

            foreach (var category in mCategories.Keys)
            {
                foreach (var taxon in mCategories[category])
                {
                    if (mTaxonIdCategories.ContainsKey(taxon.Id))
                    {
                        throw new Exception();
                    }

                    mTaxonIdCategories.Add(taxon.Id, category);
                }
            }
        }
        /// <summary>
        /// Get previouly red list categories species facts.
        /// </summary>
        private void GetRedListOldCategorySpeciesFactsToCache()
        {
            ISpeciesFactSearchCriteria searchCriteria = new SpeciesFactSearchCriteria();

            searchCriteria.Factors = new FactorList();
            IFactor factor = CoreData.FactorManager.GetFactor(mContext, FactorId.RedlistCategory);

            searchCriteria.Factors.Add(factor);
            searchCriteria.IndividualCategories = new IndividualCategoryList
            {
                CoreData.FactorManager.GetDefaultIndividualCategory(mContext)
            };
            PeriodList periodsList   = CoreData.FactorManager.GetPublicPeriods(mContext);
            IPeriod    currentPeriod = CoreData.FactorManager.GetCurrentRedListPeriod(mContext);
            var        oldPeriods    = new PeriodList();

            foreach (IPeriod period in periodsList)
            {
                if (period.Id != currentPeriod.Id)
                {
                    oldPeriods.Add(period);
                }
            }
            searchCriteria.Periods = oldPeriods;
            ISpeciesFactDataSource speciesFactDataSource = new RedListSpeciesFactDataSource();
            SpeciesFactList        speciesFacts          = speciesFactDataSource.GetSpeciesFacts(mContext, searchCriteria);

            if (speciesFacts.IsNotEmpty())
            {
                foreach (ISpeciesFact speciesFact in speciesFacts)
                {
                    if (TaxonInformationCache.TaxonInformation.ContainsKey(speciesFact.Taxon.Id))
                    {
                        TaxonInformationCache.TaxonInformation[speciesFact.Taxon.Id].SetSpeciesFact(speciesFact, currentPeriod);
                    }
                }
            }
        }