/// <summary>
        /// Gets all user groups.
        /// </summary>
        /// <returns></returns>
        public virtual IList <UserGroup> GetAllUserGroups()
        {
            if (_userGroups != null)
            {
                return(_userGroups);
            }

            Domain domain = Domain.GetDomain(_sitecoreContext.BackendDomainName);

            IList <Role> sitecoreDomainRoles = domain.GetRoles().ToList();

            IList <UserGroup> existingUserGroups = UserGroup.All().ToList();

            //If number of roles matches in both ends we assume everything is up to date.
            if (sitecoreDomainRoles.Count == existingUserGroups.Count)
            {
                _userGroups = sitecoreDomainRoles.Select(x => MapExternalUserGroupToInternalUserGroup(x.LocalName)).ToList();
                return(_userGroups);
            }

            lock (_lock)
            {
                var roleNamesNotCreatedAsUserGroups = sitecoreDomainRoles.Where(x => existingUserGroups.All(y => y.ExternalId != x.LocalName)).Select(x => x.LocalName).ToList();

                var newGroups = MapExternalUserGroupsToInternalUserGroups(roleNamesNotCreatedAsUserGroups);

                ObjectFactory.Instance.Resolve <IRepository <UserGroup> >().Save(newGroups);

                var allGroups = existingUserGroups.Concat(newGroups).ToList();

                _userGroups = allGroups;

                return(_userGroups);
            }
        }