Пример #1
0
        /// <summary>
        /// Merges two array differences to a unified difference.
        /// </summary>
        public static PositionArrayDiff Merge(PositionArrayDiff left, PositionArrayDiff right)
        {
            List <int> keys = left.Operations.Keys.ToList <int>();

            foreach (var kvp in right.Operations)
            {
                if (!left.Operations.ContainsKey(kvp.Key))
                {
                    keys.Add(kvp.Key);
                }
            }

            PositionArrayDiff h = new PositionArrayDiff();

            foreach (int key in keys)
            {
                if (left.Operations.ContainsKey(key) && right.Operations.ContainsKey(key))
                {
                    h.Operations[key] = DiffOperation.Merge(left.Operations[key], right.Operations[key]);
                }
                else if (left.Operations.ContainsKey(key))
                {
                    h.Operations[key] = left.Operations[key];
                }
                else if (right.Operations.ContainsKey(key))
                {
                    h.Operations[key] = right.Operations[key];
                }
            }
            return(h);
        }
        // Shows the difference between two arrays that use the position-merge method.
        private void DisplayDiff(ArrayList a, ArrayList b, PositionArrayDiff diff, int indent)
        {
            int n = Math.Max(a.Count, b.Count);

            for (int i = 0; i < n; ++i)
            {
                object ao = i < a.Count ? a[i] : null;
                object bo = i < b.Count ? b[i] : null;
                DisplayArrayDiff(ao, bo, diff.Operations.GetValueOrDefault(i, null), indent);
            }
        }
Пример #3
0
 /// <summary>
 /// Finds the difference operation between two Json value items.
 /// </summary>
 private static DiffOperation DiffValue(object first, object second)
 {
     if (first == null && second == null)
     {
         return(null);
     }
     else if (second == null)
     {
         return(new RemoveOperation());
     }
     else if (first == null)
     {
         return(new ChangeOperation(second));
     }
     else if (first.GetType() != second.GetType())
     {
         return(new ChangeOperation(second));
     }
     else if (first is double)
     {
         return((double)first == (double)second ? null : new ChangeOperation(second));
     }
     else if (first is bool)
     {
         return((bool)first == (bool)second ? null : new ChangeOperation(second));
     }
     else if (first is string)
     {
         return((string)first == (string)second ? null : new ChangeOperation(second));
     }
     else if (first is Hashtable)
     {
         HashDiff subdiff = Diff(first as Hashtable, second as Hashtable);
         return(subdiff.Empty() ? null : new ChangeObjectOperation(subdiff));
     }
     else if (first is ArrayList)
     {
         if (AreIdArrays(first as ArrayList, second as ArrayList))
         {
             HashDiff subdiff = IdDiff(first as ArrayList, second as ArrayList);
             return(subdiff.Empty() ? null : new ChangeIdArrayOperation(subdiff));
         }
         else
         {
             PositionArrayDiff subdiff = PositionDiff(first as ArrayList, second as ArrayList);
             return(subdiff.Empty() ? null : new ChangePositionArrayOperation(subdiff));
         }
     }
     else
     {
         throw new System.Exception("error");
     }
 }
Пример #4
0
        /// <summary>
        /// Finds the difference between two Json arrays based on positions.
        /// </summary>
        public static PositionArrayDiff PositionDiff(ArrayList a, ArrayList b)
        {
            PositionArrayDiff diff = new PositionArrayDiff();

            int n = Math.Max(a.Count, b.Count);

            for (int i = 0; i < n; ++i)
            {
                object        first_value  = i >= a.Count ? null : a[i];
                object        second_value = i >= b.Count ? null : b[i];
                DiffOperation op           = DiffValue(first_value, second_value);
                if (op != null)
                {
                    diff.Operations[i] = op;
                }
            }

            return(diff);
        }
Пример #5
0
        public static ChangePositionArrayOperation Merge(ChangePositionArrayOperation left, ChangePositionArrayOperation right)
        {
            PositionArrayDiff diff = PositionArrayDiff.Merge(left.Diff, right.Diff);

            return(new ChangePositionArrayOperation(diff));
        }
Пример #6
0
 public ChangePositionArrayOperation(PositionArrayDiff diff)
 {
     Diff = diff;
 }
        // Shows the difference between a and b in the text box.
        private void DisplayDiff(RichTextBox rtb, IFormatter f, ArrayList a, ArrayList b, PositionArrayDiff diff,
                                 int indent, string path)
        {
            int n = Math.Max(a.Count, b.Count);

            for (int i = 0; i < n; ++i)
            {
                object ao      = i < a.Count ? a[i] : null;
                object bo      = i < b.Count ? b[i] : null;
                string subpath = string.Format("{0}.{1}", path, i);
                DisplayArrayDiff(rtb, f, ao, bo, diff.Operations.GetValueOrDefault(i, null), indent, subpath);
            }
        }