/// <summary>
        /// Retrieves all data necessary for the transfer of a DomainOfExpertise
        /// </summary>
        /// <param name="domain">The <see cref="DomainOfExpertise"/></param>
        /// <param name="siteDirectoryData">All SiteDirectory DTOs</param>
        /// <param name="siteDir">The <see cref="SiteDirectory"/> object</param>
        /// <returns>List of things contained by the particular srdl</returns>
        private List <Thing> RetrieveDomainOfExpertiseThings(CDP4Common.DTO.DomainOfExpertise domain, List <Thing> siteDirectoryData, CDP4Common.SiteDirectoryData.SiteDirectory siteDir)
        {
            var returned = new List <Thing>();

            // wipe categories to avoide potential RDL irresolvable loop
            domain.Category.Clear();

            returned.Add(domain);

            foreach (var refThing in domain.Alias.ToList())
            {
                var thingDto = siteDirectoryData.FirstOrDefault(s => s.Iid.Equals(refThing)) as CDP4Common.DTO.Alias;

                if (thingDto != null)
                {
                    thingDto.ExcludedPerson.Clear();
                    thingDto.ExcludedDomain.Clear();
                    returned.Add(thingDto);
                }
                else
                {
                    domain.Alias.Remove(refThing);
                }
            }

            foreach (var refThing in domain.HyperLink.ToList())
            {
                var thingDto = siteDirectoryData.FirstOrDefault(s => s.Iid.Equals(refThing)) as CDP4Common.DTO.HyperLink;

                if (thingDto != null)
                {
                    thingDto.ExcludedPerson.Clear();
                    thingDto.ExcludedDomain.Clear();
                    returned.Add(thingDto);
                }
                else
                {
                    domain.HyperLink.Remove(refThing);
                }
            }

            domain.ExcludedPerson.Clear();
            domain.ExcludedDomain.Clear();

            foreach (var refThing in domain.Definition.ToList())
            {
                var thingDto = siteDirectoryData.FirstOrDefault(s => s.Iid.Equals(refThing)) as CDP4Common.DTO.Definition;

                if (thingDto != null)
                {
                    thingDto.ExcludedDomain.Clear();
                    thingDto.ExcludedPerson.Clear();

                    // remove citation due to possible irresolvable loop of references
                    thingDto.Citation.Clear();

                    returned.Add(thingDto);
                }
                else
                {
                    domain.ExcludedPerson.Remove(refThing);
                }
            }

            return(returned);
        }
        /// <summary>
        /// Instantiate and deserialize the properties of a <paramref name="DomainOfExpertise"/>
        /// </summary>
        /// <param name="jObject">The <see cref="JObject"/> containing the data</param>
        /// <returns>The <see cref="DomainOfExpertise"/> to instantiate</returns>
        public static CDP4Common.DTO.DomainOfExpertise FromJsonObject(JObject jObject)
        {
            var iid               = jObject["iid"].ToObject <Guid>();
            var revisionNumber    = jObject["revisionNumber"].IsNullOrEmpty() ? 0 : jObject["revisionNumber"].ToObject <int>();
            var domainOfExpertise = new CDP4Common.DTO.DomainOfExpertise(iid, revisionNumber);

            if (!jObject["alias"].IsNullOrEmpty())
            {
                domainOfExpertise.Alias.AddRange(jObject["alias"].ToObject <IEnumerable <Guid> >());
            }

            if (!jObject["category"].IsNullOrEmpty())
            {
                domainOfExpertise.Category.AddRange(jObject["category"].ToObject <IEnumerable <Guid> >());
            }

            if (!jObject["definition"].IsNullOrEmpty())
            {
                domainOfExpertise.Definition.AddRange(jObject["definition"].ToObject <IEnumerable <Guid> >());
            }

            if (!jObject["excludedDomain"].IsNullOrEmpty())
            {
                domainOfExpertise.ExcludedDomain.AddRange(jObject["excludedDomain"].ToObject <IEnumerable <Guid> >());
            }

            if (!jObject["excludedPerson"].IsNullOrEmpty())
            {
                domainOfExpertise.ExcludedPerson.AddRange(jObject["excludedPerson"].ToObject <IEnumerable <Guid> >());
            }

            if (!jObject["hyperLink"].IsNullOrEmpty())
            {
                domainOfExpertise.HyperLink.AddRange(jObject["hyperLink"].ToObject <IEnumerable <Guid> >());
            }

            if (!jObject["isDeprecated"].IsNullOrEmpty())
            {
                domainOfExpertise.IsDeprecated = jObject["isDeprecated"].ToObject <bool>();
            }

            if (!jObject["modifiedOn"].IsNullOrEmpty())
            {
                domainOfExpertise.ModifiedOn = jObject["modifiedOn"].ToObject <DateTime>();
            }

            if (!jObject["name"].IsNullOrEmpty())
            {
                domainOfExpertise.Name = jObject["name"].ToObject <string>();
            }

            if (!jObject["shortName"].IsNullOrEmpty())
            {
                domainOfExpertise.ShortName = jObject["shortName"].ToObject <string>();
            }

            if (!jObject["thingPreference"].IsNullOrEmpty())
            {
                domainOfExpertise.ThingPreference = jObject["thingPreference"].ToObject <string>();
            }

            return(domainOfExpertise);
        }