/// <summary>
        /// Convert a list of WebSpeciesFact instances
        /// to a SpeciesFactList.
        /// </summary>
        /// <param name="userContext">
        /// Information about the user that makes this method call.
        /// </param>
        /// <param name="webSpeciesFacts">List of WebSpeciesFact instances.</param>
        /// <returns>List of SpeciesFact instances.</returns>
        protected override SpeciesFactList GetSpeciesFacts(
            IUserContext userContext,
            List <WebSpeciesFact> webSpeciesFacts)
        {
            SpeciesFactList        speciesFacts;
            FactorList             factors = CoreData.FactorManager.GetFactors(userContext);
            IndividualCategoryList individualCategories = CoreData.FactorManager.GetIndividualCategories(userContext);
            PeriodList             periods = CoreData.FactorManager.GetPeriods(userContext);

            speciesFacts = null;
            if (webSpeciesFacts.IsNotEmpty())
            {
                speciesFacts = new SpeciesFactList();
                foreach (WebSpeciesFact webSpeciesFact in webSpeciesFacts)
                {
                    if (webSpeciesFact.QualityId <= (int)SpeciesFactQualityId.Acceptable)
                    {
                        speciesFacts.Add(GetSpeciesFact(webSpeciesFact, factors, individualCategories, periods));
                    }
                    // else: Bad quality, do not use this species fact.
                }
            }

            return(speciesFacts);
        }
        /// <summary>
        /// Method that returns a filtered version of this species fact list.
        /// The filtering is done on individual categories.
        /// </summary>
        /// <param name="individualCategories">Individual categories for the requested species facts.</param>
        /// <returns>A filtered species fact list.</returns>
        public SpeciesFactList GetSpeciesFacts(IndividualCategoryList individualCategories)
        {
            if (individualCategories == null)
            {
                throw new ArgumentException("CategoryList is null", "individualCategories");
            }

            SpeciesFactList filteredList = new SpeciesFactList();

            if (this.IsNotEmpty())
            {
                foreach (ISpeciesFact fact in this)
                {
                    foreach (IIndividualCategory category in individualCategories)
                    {
                        if (fact.IndividualCategory.Id == category.Id)
                        {
                            filteredList.Add(fact);
                            break;
                        }
                    }
                }
            }

            return(filteredList);
        }
Exemple #3
0
        /// <summary>
        /// Convert a list of WebSpeciesFact instances
        /// to a SpeciesFactList.
        /// </summary>
        /// <param name="userContext">
        /// Information about the user that makes this method call.
        /// </param>
        /// <param name="webSpeciesFacts">List of WebSpeciesFact instances.</param>
        /// <returns>List of SpeciesFact instances.</returns>
        protected virtual SpeciesFactList GetSpeciesFacts(IUserContext userContext, List <WebSpeciesFact> webSpeciesFacts)
        {
            SpeciesFactList        speciesFacts;
            FactorList             factors = CoreData.FactorManager.GetFactors(userContext);
            IndividualCategoryList individualCategories = CoreData.FactorManager.GetIndividualCategories(userContext);
            PeriodList             periods = CoreData.FactorManager.GetPeriods(userContext);
            ReferenceList          references;
            SpeciesFactQualityList speciesFactQualities = CoreData.SpeciesFactManager.GetSpeciesFactQualities(userContext);
            List <Int32>           referenceIds, taxonIds;
            TaxonList taxa;

            speciesFacts = null;
            if (webSpeciesFacts.IsNotEmpty())
            {
                referenceIds = GetReferenceIds(webSpeciesFacts);
                references   = CoreData.ReferenceManager.GetReferences(userContext, referenceIds);
                taxonIds     = GetTaxonIds(webSpeciesFacts);
                taxa         = CoreData.TaxonManager.GetTaxa(userContext, taxonIds);
                speciesFacts = new SpeciesFactList();
                foreach (WebSpeciesFact webSpeciesFact in webSpeciesFacts)
                {
                    speciesFacts.Add(GetSpeciesFact(userContext, webSpeciesFact, factors, individualCategories, periods, references, speciesFactQualities, taxa));
                }
            }

            return(speciesFacts);
        }
Exemple #4
0
 /// <summary>
 /// Set individual categories for specified locale.
 /// </summary>
 /// <param name="individualCategories">Individual categories.</param>
 /// <param name="locale">Locale.</param>
 protected override void SetIndividualCategories(IndividualCategoryList individualCategories,
                                                 ILocale locale)
 {
     lock (IndividualCategories)
     {
         IndividualCategories[locale.ISOCode] = individualCategories;
     }
 }
        /// <summary>
        /// Add individual category to search criteria.
        /// </summary>
        /// <param name="individualCategory">The individual category.</param>
        public void Add(IIndividualCategory individualCategory)
        {
            if (IndividualCategories.IsNull())
            {
                IndividualCategories = new IndividualCategoryList();
            }

            IndividualCategories.Add(individualCategory);
        }
        /// <summary>
        /// Remove individual categories from current species fact data set scope.
        /// The species facts in the data set are updated
        /// to the new species fact data set scope.
        /// </summary>
        /// <param name="userContext">
        /// Information about the user that makes this method call.
        /// </param>
        /// <param name="selection">Changed scope of the data set.</param>
        public virtual void RemoveSelection(IUserContext userContext,
                                            IndividualCategoryList selection)
        {
            ISpeciesFactDataSetSelection newSelection;

            newSelection = new SpeciesFactDataSetSelection();
            newSelection.IndividualCategories.Merge(selection);
            RemoveSelection(userContext, newSelection);
        }
Exemple #7
0
 /// <summary>
 /// Create a species fact data set selection instance.
 /// </summary>
 public SpeciesFactDataSetSelection()
 {
     _factors = new FactorList(true);
     _hosts   = new TaxonList(true);
     _individualCategories = new IndividualCategoryList(true);
     _periods    = new PeriodList(true);
     _references = new ReferenceList(true);
     _taxa       = new TaxonList(true);
 }
        /// <summary>
        /// Get individual categories for specified locale.
        /// </summary>
        /// <param name="locale">Locale.</param>
        /// <returns>Individual categories for specified locale.</returns>
        protected virtual IndividualCategoryList GetIndividualCategories(ILocale locale)
        {
            IndividualCategoryList individualCategories = null;

            if (IndividualCategories.ContainsKey(locale.ISOCode))
            {
                individualCategories = (IndividualCategoryList)(IndividualCategories[locale.ISOCode]);
            }
            return(individualCategories);
        }
 /// <summary>
 /// Default constructor
 /// </summary>
 public SpeciesFactSearchCriteria()
 {
     FactorDataTypes     = new FactorDataTypeList();
     Factors             = new FactorList();
     FieldSearchCriteria = new SpeciesFactFieldSearchCriteriaList();
     Hosts = new TaxonList();
     IndividualCategories = new IndividualCategoryList();
     Periods    = new PeriodList();
     References = new ReferenceList();
     Taxa       = new TaxonList();
 }
 /// <summary>
 /// Create a species fact data set instance.
 /// </summary>
 public SpeciesFactDataSet()
 {
     Factors = new FactorList(true);
     Hosts   = new TaxonList(true);
     IndividualCategories = new IndividualCategoryList(true);
     Periods        = new PeriodList(true);
     References     = new ReferenceList(true);
     _selection     = new SpeciesFactDataSetSelection();
     _selectionCopy = new SpeciesFactDataSetSelection();
     SpeciesFacts   = new SpeciesFactList();
     Taxa           = new TaxonList(true);
 }
Exemple #11
0
        /// <summary>
        /// Get individual categories for specified locale.
        /// </summary>
        /// <param name="locale">Locale.</param>
        /// <returns>Individual categories for specified locale.</returns>
        protected override IndividualCategoryList GetIndividualCategories(ILocale locale)
        {
            IndividualCategoryList individualCategories = null;

            lock (IndividualCategories)
            {
                if (IndividualCategories.ContainsKey(locale.ISOCode))
                {
                    individualCategories = (IndividualCategoryList)(IndividualCategories[locale.ISOCode]);
                }
            }
            return(individualCategories);
        }
        /// <summary>
        /// Remove factors, hosts, individual categories, periods or
        /// taxa from current species fact data set scope.
        /// The species facts in the data set are updated
        /// to the new species fact data set scope.
        /// </summary>
        /// <param name="userContext">
        /// Information about the user that makes this method call.
        /// </param>
        /// <param name="selection">Changed scope of the data set.</param>
        public virtual void RemoveSelection(IUserContext userContext,
                                            ISpeciesFactDataSetSelection selection)
        {
            FactorList             factors;
            IndividualCategoryList individualCategories;
            PeriodList             periods;
            ReferenceList          references;
            TaxonList hosts, taxa;

            // Check arguments.
            selection.CheckNotNull("selection");

            // Update selection with existing scope.
            factors = new FactorList();
            factors.Merge(_selection.Factors);
            factors.Remove(selection.Factors);
            selection.Factors = factors;

            hosts = new TaxonList();
            hosts.Merge(_selection.Hosts);
            hosts.Remove(selection.Hosts);
            selection.Hosts = hosts;

            individualCategories = new IndividualCategoryList();
            individualCategories.Merge(_selection.IndividualCategories);
            individualCategories.Remove(selection.IndividualCategories);
            selection.IndividualCategories = individualCategories;

            periods = new PeriodList();
            periods.Merge(_selection.Periods);
            periods.Remove(selection.Periods);
            selection.Periods = periods;

            references = new ReferenceList();
            references.Merge(_selection.References);
            references.Remove(selection.References);
            selection.References = references;

            taxa = new TaxonList();
            taxa.Merge(_selection.Taxa);
            taxa.Remove(selection.Taxa);
            selection.Taxa = taxa;

            // Update species fact data set.
            UpdateSelection(userContext, selection);
        }
        /// <summary>
        /// Read rows from the excel xml format.
        /// Overridden by each class that inherits this class.
        /// </summary>
        /// <param name="userContext">
        /// Information about the user that makes this method call.
        /// </param>
        /// <param name='xmlDoc'>The xml document that the row node will be read from.</param>
        /// <param name="nsmgr">Namespacemanager containing all namespaces used by the excel compatible xml format</param>
        protected override void ReadExcelXmlRows(IUserContext userContext,
                                                 XmlDocument xmlDoc,
                                                 XmlNamespaceManager nsmgr)
        {
            IndividualCategoryList individualCategories;
            XmlNode     dataNode;
            XmlNodeList rowNodes;

            rowNodes             = xmlDoc.SelectNodes("/ss:Workbook/ss:Worksheet/ss:Table/ss:Row", nsmgr);
            individualCategories = new IndividualCategoryList();
            foreach (XmlNode rowNode in rowNodes)
            {
                dataNode = rowNode.SelectSingleNode("ss:Cell/ss:Data", nsmgr);
                individualCategories.Add(CoreData.FactorManager.GetIndividualCategory(userContext, dataNode.InnerText.WebParseInt32()));
            }

            IndividualCategories = individualCategories;
        }
        /// <summary>
        /// Convert a list of WebIndividualCategory instances
        /// to a IndividualCategoryList.
        /// </summary>
        /// <param name="userContext">
        /// Information about the user that makes this method call.
        /// </param>
        /// <param name="webIndividualCategories">List of WebIndividualCategory instances.</param>
        /// <returns>Individual categories.</returns>
        private IndividualCategoryList GetIndividualCategories(IUserContext userContext,
                                                               List <WebIndividualCategory> webIndividualCategories)
        {
            IndividualCategoryList individualCategories;

            individualCategories = null;
            if (webIndividualCategories.IsNotEmpty())
            {
                individualCategories = new IndividualCategoryList();
                foreach (WebIndividualCategory webIndividualCategory in webIndividualCategories)
                {
                    individualCategories.Add(GetIndividualCategory(userContext, webIndividualCategory));
                }

                individualCategories.Sort();
            }

            return(individualCategories);
        }
        /// <summary>
        /// Reset species fact data set to no species facts.
        /// This method is used when species fact data set selection
        /// does not contain both factors and taxa.
        /// </summary>
        /// <param name="selection">
        /// Scope of the data set is defined by this
        /// species fact data set selection.
        /// </param>
        private void Reset(ISpeciesFactDataSetSelection selection)
        {
            Factors = new FactorList(true);
            Factors.Merge(selection.Factors);
            Hosts = new TaxonList(true);
            Hosts.Merge(selection.Hosts);
            IndividualCategories = new IndividualCategoryList(true);
            IndividualCategories.Merge(selection.IndividualCategories);
            Periods = new PeriodList(true);
            Periods.Merge(selection.Periods);
            References = new ReferenceList(true);
            References.Merge(selection.References);
            SpeciesFacts = new SpeciesFactList(true);
            Taxa         = new TaxonList();
            Taxa.Merge(selection.Taxa);

            // Save selection information.
            _selection     = (ISpeciesFactDataSetSelection)(selection.Clone());
            _selectionCopy = (ISpeciesFactDataSetSelection)(selection.Clone());
        }
Exemple #16
0
        public void RemoveSelectionIndividualCategories()
        {
            FactorList             factors;
            IFactor                factor1, factor2;
            IndividualCategoryList individualCategories1, individualCategories2;
            Int32     speciesFactCount;
            ITaxon    taxon1, taxon2;
            TaxonList taxa;

            factor1 = CoreData.FactorManager.GetFactor(GetUserContext(), FactorId.SwedishHistory);
            factor2 = CoreData.FactorManager.GetFactor(GetUserContext(), FactorId.SwedishOccurrence);
            taxon1  = CoreData.TaxonManager.GetTaxon(GetUserContext(), TaxonId.DrumGrasshopper);
            taxon2  = CoreData.TaxonManager.GetTaxon(GetUserContext(), TaxonId.Wolverine);
            factors = new FactorList();
            factors.Add(factor1);
            factors.Add(factor2);
            taxa = new TaxonList();
            taxa.Add(taxon1);
            taxa.Add(taxon2);
            GetDataSet(true).AddSelection(GetUserContext(), factors);
            GetDataSet().AddSelectionTaxa(GetUserContext(), taxa);

            individualCategories1 = CoreData.FactorManager.GetIndividualCategories(GetUserContext());
            GetDataSet().AddSelection(GetUserContext(), individualCategories1);
            Assert.IsFalse(GetDataSet().Factors.IsEmpty());
            Assert.IsFalse(GetDataSet().SpeciesFacts.IsEmpty());
            speciesFactCount = GetDataSet().SpeciesFacts.Count;

            individualCategories2 = new IndividualCategoryList();
            individualCategories2.Add(individualCategories1[1]);
            individualCategories2.Add(individualCategories1[2]);
            GetDataSet().RemoveSelection(GetUserContext(), individualCategories2);
            Assert.IsTrue(speciesFactCount > GetDataSet().SpeciesFacts.Count);
            individualCategories2 = null;
            GetDataSet().RemoveSelection(GetUserContext(), individualCategories2);
        }
 /// <summary>
 /// Set individual categories for specified locale.
 /// </summary>
 /// <param name="individualCategories">Individual categories.</param>
 /// <param name="locale">Locale.</param>
 protected virtual void SetIndividualCategories(IndividualCategoryList individualCategories,
                                                ILocale locale)
 {
     IndividualCategories[locale.ISOCode] = individualCategories;
 }
        /// <summary>
        /// Convert a WebSpeciesFact instance into
        /// an ISpeciesFact instance.
        /// </summary>
        /// <param name="webSpeciesFact">A WebSpeciesFact instance.</param>
        /// <param name="factors">List of factors.</param>
        /// <param name="individualCategories">List of individual categories.</param>
        /// <param name="periods">List of periods.</param>
        /// <returns>An ISpeciesFact instance.</returns>
        private ISpeciesFact GetSpeciesFact(
            WebSpeciesFact webSpeciesFact,
            FactorList factors,
            IndividualCategoryList individualCategories,
            PeriodList periods)
        {
            IFactor      factor;
            IPeriod      period;
            ISpeciesFact speciesFact;
            ITaxon       host, taxon;

            factor = factors.Get(webSpeciesFact.FactorId);
            if (webSpeciesFact.IsHostSpecified)
            {
                host    = new Data.Taxon();
                host.Id = webSpeciesFact.HostId;
            }
            else
            {
                if (factor.IsTaxonomic)
                {
                    host = new Data.Taxon {
                        Id = (int)TaxonId.Life
                    };
                }
                else
                {
                    host = null;
                }
            }

            if (webSpeciesFact.IsPeriodSpecified)
            {
                period = periods.Get(webSpeciesFact.PeriodId);
            }
            else
            {
                period = null;
            }

            taxon       = new Data.Taxon();
            taxon.Id    = webSpeciesFact.TaxonId;
            speciesFact = new SpeciesFact(
                webSpeciesFact.Id,
                taxon,
                individualCategories.Get(webSpeciesFact.IndividualCategoryId),
                factor,
                host,
                period,
                webSpeciesFact.FieldValue1,
                webSpeciesFact.IsFieldValue1Specified,
                webSpeciesFact.FieldValue2,
                webSpeciesFact.IsFieldValue2Specified,
                webSpeciesFact.FieldValue3,
                webSpeciesFact.IsFieldValue3Specified,
                webSpeciesFact.FieldValue4,
                webSpeciesFact.IsFieldValue4Specified,
                webSpeciesFact.FieldValue5,
                webSpeciesFact.IsFieldValue5Specified,
                null,
                null,
                webSpeciesFact.ModifiedBy,
                webSpeciesFact.ModifiedDate);

            return(speciesFact);
        }
Exemple #19
0
        /// <summary>
        /// Convert a WebSpeciesFact instance into
        /// an ISpeciesFact instance.
        /// </summary>
        /// <param name="userContext">
        /// Information about the user that makes this method call.
        /// </param>
        /// <param name="webSpeciesFact">A WebSpeciesFact instance.</param>
        /// <param name="factors">List of factors.</param>
        /// <param name="individualCategories">List of individual categories.</param>
        /// <param name="periods">List of periods.</param>
        /// <param name="references">List of references.</param>
        /// <param name="speciesFactQualities">List of species fact qualities.</param>
        /// <param name="taxa">Taxa that are used in the species facts.</param>
        /// <returns>An ISpeciesFact instance.</returns>
        private ISpeciesFact GetSpeciesFact(IUserContext userContext,
                                            WebSpeciesFact webSpeciesFact,
                                            FactorList factors,
                                            IndividualCategoryList individualCategories,
                                            PeriodList periods,
                                            ReferenceList references,
                                            SpeciesFactQualityList speciesFactQualities,
                                            TaxonList taxa)
        {
            IFactor      factor;
            IPeriod      period;
            ISpeciesFact speciesFact;
            ITaxon       host, taxon;

            factor = factors.Get(webSpeciesFact.FactorId);
            if (webSpeciesFact.IsHostSpecified)
            {
#if EXAMINE_PROBLEM
                if (!(taxa.Contains(webSpeciesFact.HostId)))
                {
                    throw new Exception("Host with id = " + webSpeciesFact.HostId + " is not in taxon list." + webSpeciesFact.GetString());
                }
#endif

                host = taxa.Get(webSpeciesFact.HostId);
            }
            else
            {
                if (factor.IsTaxonomic)
                {
                    host = CoreData.TaxonManager.GetTaxon(userContext, 0);
                }
                else
                {
                    host = null;
                }
            }

            if (webSpeciesFact.IsPeriodSpecified)
            {
#if EXAMINE_PROBLEM
                if (!(periods.Contains(webSpeciesFact.PeriodId)))
                {
                    throw new Exception("Period with id = " + webSpeciesFact.PeriodId + " is not in period list." + webSpeciesFact.GetString());
                }
#endif

                period = periods.Get(webSpeciesFact.PeriodId);
            }
            else
            {
                period = null;
            }

#if EXAMINE_PROBLEM
            if (!(taxa.Contains(webSpeciesFact.TaxonId)))
            {
                throw new Exception("Taxon with id = " + webSpeciesFact.TaxonId + " is not in taxon list." + webSpeciesFact.GetString());
            }
#endif

            taxon = taxa.Get(webSpeciesFact.TaxonId);
#if EXAMINE_PROBLEM
            if (!(individualCategories.Contains(webSpeciesFact.IndividualCategoryId)))
            {
                throw new Exception("Individual category with id = " + webSpeciesFact.IndividualCategoryId + " is not in individual category list." + webSpeciesFact.GetString());
            }

            if (!(speciesFactQualities.Contains(webSpeciesFact.QualityId)))
            {
                throw new Exception("Quality with id = " + webSpeciesFact.QualityId + " is not in quality list." + webSpeciesFact.GetString());
            }

            if (!(references.Contains(webSpeciesFact.ReferenceId)))
            {
                throw new Exception("Reference with id = " + webSpeciesFact.ReferenceId + " is not in reference list." + webSpeciesFact.GetString());
            }
#endif

            speciesFact = CoreData.SpeciesFactManager.GetSpeciesFact(userContext,
                                                                     webSpeciesFact.Id,
                                                                     taxon,
                                                                     individualCategories.Get(webSpeciesFact.IndividualCategoryId),
                                                                     factor,
                                                                     host,
                                                                     period,
                                                                     webSpeciesFact.FieldValue1,
                                                                     webSpeciesFact.IsFieldValue1Specified,
                                                                     webSpeciesFact.FieldValue2,
                                                                     webSpeciesFact.IsFieldValue2Specified,
                                                                     webSpeciesFact.FieldValue3,
                                                                     webSpeciesFact.IsFieldValue3Specified,
                                                                     webSpeciesFact.FieldValue4,
                                                                     webSpeciesFact.IsFieldValue4Specified,
                                                                     webSpeciesFact.FieldValue5,
                                                                     webSpeciesFact.IsFieldValue5Specified,
                                                                     speciesFactQualities.Get(webSpeciesFact.QualityId),
                                                                     references.Get(webSpeciesFact.ReferenceId),
                                                                     webSpeciesFact.ModifiedBy,
                                                                     webSpeciesFact.ModifiedDate);

            return(speciesFact);
        }
        /// <summary>
        /// Update information about which factors, hosts,
        /// individual categories, periods, references and taxa
        /// that are used in the species facts.
        /// </summary>
        /// <param name="userContext">
        /// Information about the user that makes this method call.
        /// </param>
        /// <param name="selection">
        /// Scope of the data set is defined by this
        /// species fact data set selection.
        /// </param>
        /// <param name="speciesFacts">Species facts.</param>
        private void UpdateScope(IUserContext userContext,
                                 ISpeciesFactDataSetSelection selection,
                                 SpeciesFactList speciesFacts)
        {
            Factors = new FactorList(true);
            Factors.AddRange(selection.Factors);
            Hosts = new TaxonList(true);
            Hosts.AddRange(selection.Hosts);
            IndividualCategories = new IndividualCategoryList(true);
            IndividualCategories.AddRange(selection.IndividualCategories);
            Periods = new PeriodList(true);
            Periods.AddRange(selection.Periods);
            References = new ReferenceList(true);
            Taxa       = new TaxonList(true);
            Taxa.AddRange(selection.Taxa);

            if (speciesFacts.IsNotEmpty())
            {
                foreach (ISpeciesFact speciesFact in speciesFacts)
                {
                    Factors.Merge(speciesFact.Factor);
                    if (speciesFact.HasHost)
                    {
                        Hosts.Merge(speciesFact.Host);
                    }

                    IndividualCategories.Merge(speciesFact.IndividualCategory);
                    if (speciesFact.HasPeriod)
                    {
                        Periods.Merge(speciesFact.Period);
                    }

                    if (speciesFact.HasReference)
                    {
                        References.Merge(speciesFact.Reference);
                    }

                    Taxa.Merge(speciesFact.Taxon);
                }
            }

            // Set default values if no values are entered.
            if (Hosts.IsEmpty())
            {
                Hosts.Add(CoreData.TaxonManager.GetTaxon(userContext, TaxonId.Life));
            }

            if (IndividualCategories.IsEmpty())
            {
                IndividualCategories.Add(CoreData.FactorManager.GetDefaultIndividualCategory(userContext));
            }

            if (Periods.IsEmpty())
            {
                Periods.AddRange(CoreData.FactorManager.GetPeriods(userContext));
            }

            // Sort all lists.
            Factors.Sort();
            Hosts.Sort();
            IndividualCategories.Sort();
            Periods.Sort();
            References.Sort();
            Taxa.Sort();
        }
        /// <summary>
        /// Method that returns a filtered version of this species fact list. The filtering is done on several parameters.
        /// </summary>
        /// <param name="individualCategories">Individual categories for the requested species facts.</param>
        /// <param name="periods">Periods for the requested species facts.</param>
        /// <param name="hosts">Hosts for the requested species facts.</param>
        /// <param name="taxa">Taxa for the requested species facts.</param>
        /// <param name="factors">Factors for the requested species facts.</param>
        /// <returns>A species fact list.</returns>
        public SpeciesFactList GetSpeciesFacts(IndividualCategoryList individualCategories,
                                               PeriodList periods,
                                               TaxonList hosts,
                                               TaxonList taxa,
                                               FactorList factors)
        {
            SpeciesFactList filteredList = new SpeciesFactList();

            if (this.IsNotEmpty())
            {
                foreach (ISpeciesFact fact in this)
                {
                    bool go = true;

                    if (fact.IndividualCategory != null)
                    {
                        if ((individualCategories != null) && (individualCategories.Count > 0))
                        {
                            if (!individualCategories.Exists(fact.IndividualCategory))
                            {
                                go = false;
                            }
                        }
                    }

                    if (go)
                    {
                        if (fact.Period != null)
                        {
                            if ((periods != null) && (periods.Count > 0))
                            {
                                if (!periods.Exists(fact.Period))
                                {
                                    go = false;
                                }
                            }
                        }
                    }

                    if (go)
                    {
                        if (fact.Host != null)
                        {
                            // For the time being we only accept species facts that dont have a host.
                            go = false;

                            //if ((hosts != null) && (hosts.Count > 0))
                            //{
                            //    if (!hosts.Exists(fact.Host))
                            //        go = false;
                            //}
                        }
                    }

                    if (go)
                    {
                        if (fact.Taxon != null)
                        {
                            if ((taxa != null) && (taxa.Count > 0))
                            {
                                if (!taxa.Exists(fact.Taxon))
                                {
                                    go = false;
                                }
                            }
                        }
                    }

                    if (go)
                    {
                        if (fact.Factor != null)
                        {
                            if ((factors != null) && (factors.Count > 0))
                            {
                                if (!factors.Exists(fact.Factor))
                                {
                                    go = false;
                                }
                            }
                        }
                    }

                    if (go)
                    {
                        filteredList.Add(fact);
                    }
                }
            }

            return(filteredList);
        }