示例#1
0
        public DiffChain Resolve(object local, object remote, ResolveContext context)
        {
            if (local == null && remote == null)
            {
                return(DiffChain.Empty());
            }
            var remoteIp = remote as IPEndPoint;
            var localIp  = local as IPEndPoint;
            var result   = new DiffChain();

            if (remoteIp == null)
            {
                result.Add(context.CreateDiffFromCurrentPath());
            }
            else if (localIp == null)
            {
                result.Add(context.CreateDiffFromCurrentPath(remote));
            }
            else if (remoteIp.Port != localIp.Port || remoteIp.Address.ToString() != localIp.Address.ToString())
            {
                result.Add(context.CreateDiffFromCurrentPath(remote));
            }
            result.Lock();
            return(result);
        }
示例#2
0
        public DiffChain Resolve(object local, object remote, ResolveContext context)
        {
            if (local == null && remote == null)
            {
                return(DiffChain.Empty());
            }

            var remoteFont = remote as Font;
            var localFont  = local as Font;
            var result     = new DiffChain();

            if (remoteFont == null)
            {
                result.Add(context.CreateDiffFromCurrentPath());
            }
            else if (localFont == null)
            {
                result.Add(context.CreateDiffFromCurrentPath(remote));
            }
            else if (!(Equals(remoteFont, localFont)))
            {
                result.Add(context.CreateDiffFromCurrentPath(remote));
            }
            result.Lock();
            return(result);
        }
示例#3
0
        public DiffChain Resolve(object local, object remote, ResolveContext context)
        {
            if (local == null && remote == null)
            {
                return(DiffChain.Empty());
            }

            var remoteUri = remote as Uri;
            var localUri  = local as Uri;
            var result    = new DiffChain();

            if (remoteUri == null)
            {
                result.Add(context.CreateDiffFromCurrentPath());
            }
            else if (localUri == null)
            {
                result.Add(context.CreateDiffFromCurrentPath(remote));
            }
            else if (remoteUri.OriginalString != localUri.OriginalString)
            {
                result.Add(context.CreateDiffFromCurrentPath(remote));
            }
            result.Lock();
            return(result);
        }
示例#4
0
        public DiffChain Resolve(object local, object remote, ResolveContext context)
        {
            if (local == null && remote == null)
            {
                return(DiffChain.Empty());
            }

            IEnumerable <MemberInfo> members = TypeMemberInfo.GetAllPublicMembers(context.Type);
            var result = new DiffChain();

            if (local == null)
            {
                result.Add(context.CreateDiffFromCurrentPath(remote));
            }
            else if (remote == null)
            {
                result.Add(context.CreateDiffFromCurrentPath());
            }
            else
            {
                foreach (var member in members)
                {
                    if (IgnoreMembersLogic.IgnoredByAttribute(context.Options, member))
                    {
                        continue;
                    }
                    var fi = member as FieldInfo;
                    if (fi != null)
                    {
                        var fieldLocal  = fi.GetValue(local);
                        var fieldRemote = fi.GetValue(remote);
                        var memberType  = GetType(fieldLocal, fieldRemote);
                        if (memberType != null)
                        {
                            result.Add(context.Resolvers.FindResolver(memberType).Resolve(fieldLocal, fieldRemote, new ResolveContext(context, member.Name, memberType)));
                        }
                        continue;
                    }
                    var pi = member as PropertyInfo;
                    if (pi != null)
                    {
                        var propertyLocal  = pi.GetValue(local);
                        var propertyRemote = pi.GetValue(remote);
                        var memberType     = GetType(propertyLocal, propertyRemote);
                        if (memberType != null)
                        {
                            result.Add(context.Resolvers.FindResolver(memberType).Resolve(propertyLocal, propertyRemote, new ResolveContext(context, member.Name, memberType)));
                        }
                    }
                }
            }
            result.Lock();
            return(result);
        }
示例#5
0
        public DiffChain Resolve(object local, object remote, ResolveContext context)
        {
            if (local == null && remote == null)
            {
                return(DiffChain.Empty());
            }

            var result = new DiffChain();

            if (local == null)
            {
                result.Add(context.CreateDiffFromCurrentPath(remote, DiffPartType.Create));
            }
            else if (remote == null)
            {
                result.Add(context.CreateDiffFromCurrentPath(DiffPartType.Remove));
            }
            else
            {
                var remoteDict = (IDictionary)remote;
                var localDict  = (IDictionary)local;

                var remoteEnumerator = remoteDict.GetEnumerator();
                var localEnumerator  = localDict.GetEnumerator();

                Type[] arguments = context.Type.GetGenericArguments();
                Type   valueType = arguments[1];
                // Удаление элементов, по ключам отсутствующем в конечном состоянии
                while (localEnumerator.MoveNext())
                {
                    if (!remoteDict.Contains(localEnumerator.Key))
                    {
                        result.Add(new ResolveContext(context, ObjSerializer.Serialize(localEnumerator.Key), valueType).CreateDiffFromCurrentPath());
                    }
                }
                // Определение новых элементов и сравнение пересекающихся по ключам
                while (remoteEnumerator.MoveNext())
                {
                    if (localDict.Contains(remoteEnumerator.Key))
                    {
                        var remoteValue = remoteEnumerator.Value;
                        var localValue  = localDict[remoteEnumerator.Key];
                        result.Add(context.Resolvers.FindResolver(valueType).Resolve(localValue, remoteValue, new ResolveContext(context, ObjSerializer.Serialize(remoteEnumerator.Key), valueType)));
                    }
                    else
                    {
                        result.Add(new ResolveContext(context, ObjSerializer.Serialize(remoteEnumerator.Key), valueType).CreateDiffFromCurrentPath(remoteEnumerator.Value));
                    }
                }
            }
            result.Lock();
            return(result);
        }
示例#6
0
 public DiffChain Resolve(object local, object remote, ResolveContext context)
 {
     if (local == null && remote == null)
     {
         return(DiffChain.Empty());
     }
     if (String.Compare((string)local, (string)remote, StringComparison.Ordinal) != 0)
     {
         var result = new DiffChain
         {
             remote == null
                 ? context.CreateDiffFromCurrentPath()
                 : context.CreateDiffFromCurrentPath(remote)
         };
         result.Lock();
         return(result);
     }
     return(DiffChain.Empty());
 }
示例#7
0
        public DiffChain Resolve(object local, object remote, ResolveContext context)
        {
            if (local == null && remote == null)
            {
                return(DiffChain.Empty());
            }
            var result = new DiffChain();

            if (local == null)
            {
                result.Add(context.CreateDiffFromCurrentPath(remote, DiffPartType.Create));
            }
            else if (remote == null)
            {
                result.Add(context.CreateDiffFromCurrentPath(DiffPartType.Remove));
            }
            else
            {
                var localEnumerator  = (IList)local;
                var remoteEnumerator = (IList)remote;
                // Сравнение пересекающихся частей
                Type[] arguments    = context.Type.GetGenericArguments();
                Type   elementType  = arguments[0];
                var    compareCount = Math.Min(localEnumerator.Count, remoteEnumerator.Count);
                for (int i = 0; i < compareCount; i++)
                {
                    result.Add(context.Resolvers.FindResolver(elementType).Resolve(localEnumerator[i], remoteEnumerator[i], new ResolveContext(context, i.ToString(), elementType)));
                }
                if (localEnumerator.Count < remoteEnumerator.Count)
                {
                    for (int i = compareCount; i < remoteEnumerator.Count; i++)
                    {
                        result.Add(context.CreateDiffFromCurrentPath(remoteEnumerator[i]));
                    }
                }
                else if (localEnumerator.Count > remoteEnumerator.Count)
                {
                    result.Add(context.CreateDiffFromCurrentPath(remoteEnumerator.Count, DiffPartType.Resize));
                }
            }
            result.Lock();
            return(result);
        }
示例#8
0
        public DiffChain Resolve(object local, object remote, ResolveContext context)
        {
            if (local == null && remote == null)
            {
                return(DiffChain.Empty());
            }
            var result = new DiffChain();

            if (local == null)
            {
                result.Add(context.CreateDiffFromCurrentPath(remote, DiffPartType.Create));
            }
            else if (remote == null)
            {
                result.Add(context.CreateDiffFromCurrentPath(DiffPartType.Remove));
            }
            else
            {
                var  lArr         = (Array)local;
                var  rArr         = (Array)remote;
                var  compareCount = Math.Min(lArr.Length, rArr.Length);
                Type elementType  = context.Type.GetElementType();
                // Сравнение пересекающейся части
                for (int i = 0; i < compareCount; i++)
                {
                    result.Add(context.Resolvers.FindResolver(elementType).Resolve(lArr.GetValue(i), rArr.GetValue(i), new ResolveContext(context, i.ToString(), elementType)));
                }
                if (lArr.Length != rArr.Length)
                {
                    result.Add(context.CreateDiffFromCurrentPath(rArr.Length, DiffPartType.Resize));
                    if (lArr.Length < rArr.Length)
                    {
                        for (int i = compareCount; i < rArr.Length; i++)
                        {
                            result.Add(new ResolveContext(context, i.ToString(), elementType).CreateDiffFromCurrentPath(rArr.GetValue(i)));
                        }
                    }
                }
            }
            result.Lock();
            return(result);
        }
示例#9
0
        public DiffChain Resolve(object local, object remote, ResolveContext context)
        {
            if (local == null && remote == null)
            {
                return(DiffChain.Empty());
            }

            var result = new DiffChain();

            if (local == null)
            {
                result.Add(context.CreateDiffFromCurrentPath(remote, DiffPartType.Create));
            }
            else if (remote == null)
            {
                result.Add(context.CreateDiffFromCurrentPath(DiffPartType.Remove));
            }
            else
            {
                IEnumerator remoteEnumerator = GetEnumerator(remote);
                IEnumerator localEnumerator  = GetEnumerator(local);

                while (localEnumerator.MoveNext())
                {
                    if (!Contains(remote, localEnumerator.Current))
                    {
                        result.Add(context.CreateDiffFromCurrentPath(localEnumerator.Current, DiffPartType.Exclude));
                    }
                }
                while (remoteEnumerator.MoveNext())
                {
                    if (!Contains(local, remoteEnumerator.Current))
                    {
                        result.Add(new ResolveContext(context, "", context.Type).CreateDiffFromCurrentPath(remoteEnumerator.Current));
                    }
                }
            }
            result.Lock();
            return(result);
        }