Example #1
0
        private static void CheckSecurityEntityConsistency(IEnumerable <int> contentIds, IDictionary <int, SecurityEntity> secCachedEntities, SecurityConsistencyResult result)
        {
            var secDbEntities = SecurityHandler.SecurityContext.DataProvider.LoadSecurityEntities().ToList(); // convert to list, because we will modify this collection
            var foundEntities = new List <StoredSecurityEntity>();

            foreach (var contentId in contentIds)
            {
                var nh = NodeHead.Get(contentId);

                // content exists in the index but not in the db (deleted manually from the db)
                if (nh == null)
                {
                    result.AddMissingEntityFromRepository(contentId);
                    continue;
                }

                var secEntity = secDbEntities.FirstOrDefault(se => se.Id == contentId);
                if (secEntity == null || secEntity.ParentId != nh.ParentId || secEntity.OwnerId != nh.OwnerId)
                {
                    // not found in the security db, or found it but with different properties
                    result.AddMissingEntityFromSecurityDb(nh);
                    continue;
                }

                // move correctly found entities to a temp list
                foundEntities.Add(secEntity);
                secDbEntities.Remove(secEntity);
            }

            // the remaining ones are not in SN repo
            foreach (var secEntity in secDbEntities)
            {
                result.AddMissingEntityFromRepository(secEntity.Id);
            }

            // find entities that are in db but not in memory
            foreach (var secDbEntityId in secDbEntities.Concat(foundEntities).Select(dbe => dbe.Id).Except(secCachedEntities.Keys))
            {
                result.AddMissingEntityFromSecurityCache(secDbEntityId);
            }

            // find entities that are in memory but not in db
            foreach (var cachedEntityId in secCachedEntities.Keys.Except(secDbEntities.Concat(foundEntities).Select(dbe => dbe.Id)))
            {
                result.AddMissingEntityFromSecurityDb(cachedEntityId);
            }
        }