Exemplo n.º 1
0
        protected virtual bool ShouldUpdateExisting(ISerializedItem serializedItem, ISourceItem existingItem, DeferredLogWriter <ISerializedAsMasterEvaluatorLogger> deferredUpdateLog)
        {
            Assert.ArgumentNotNull(serializedItem, "serializedItem");
            Assert.ArgumentNotNull(existingItem, "existingItem");

            if (existingItem.Id == RootId)
            {
                return(false);                                       // we never want to update the Sitecore root item
            }
            // check if templates are different
            if (IsTemplateMatch(existingItem, serializedItem, deferredUpdateLog))
            {
                return(true);
            }

            // check if names are different
            if (IsNameMatch(existingItem, serializedItem, deferredUpdateLog))
            {
                return(true);
            }

            // check if source has version(s) that serialized does not
            var orphanVersions = existingItem.Versions.Where(sourceItemVersion => serializedItem.GetVersion(sourceItemVersion.Language, sourceItemVersion.VersionNumber) == null).ToArray();

            if (orphanVersions.Length > 0)
            {
                deferredUpdateLog.AddEntry(x => x.OrphanSourceVersion(existingItem, serializedItem, orphanVersions));
                return(true);                // source contained versions not present in the serialized version, which is a difference
            }

            // check if shared fields have any mismatching values
            if (AnyFieldMatch(serializedItem.SharedFields, existingItem.SharedFields, existingItem, serializedItem, deferredUpdateLog))
            {
                return(true);
            }

            // see if the serialized versions have any mismatching values in the source data
            return(serializedItem.Versions.Any(serializedItemVersion =>
            {
                var sourceItemVersion = existingItem.GetVersion(serializedItemVersion.Language, serializedItemVersion.VersionNumber);

                // version exists in serialized item but does not in source version
                if (sourceItemVersion == null)
                {
                    deferredUpdateLog.AddEntry(x => x.NewSerializedVersionMatch(serializedItemVersion, serializedItem, existingItem));
                    return true;
                }

                // field values mismatch
                var fieldMatch = AnyFieldMatch(serializedItemVersion.Fields, sourceItemVersion.Fields, existingItem, serializedItem, deferredUpdateLog, serializedItemVersion);
                if (fieldMatch)
                {
                    return true;
                }

                // if we get here everything matches to the best of our knowledge, so we return false (e.g. "do not update this item")
                return false;
            }));
        }