]> gerrit.simantics Code Review - simantics/interop.git/blob - org.simantics.interop/src/org/simantics/interop/test/GraphComparator.java
Allow defining matching resources (Comparing models with structural components)
[simantics/interop.git] / org.simantics.interop / src / org / simantics / interop / test / GraphComparator.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
3  * in Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     Foster Wheeler Energia Oy - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.interop.test;\r
13 \r
14 import java.util.ArrayList;\r
15 import java.util.Arrays;\r
16 import java.util.Collection;\r
17 import java.util.Collections;\r
18 import java.util.Comparator;\r
19 import java.util.HashSet;\r
20 import java.util.List;\r
21 import java.util.Set;\r
22 import java.util.Stack;\r
23 \r
24 import org.simantics.db.ReadGraph;\r
25 import org.simantics.db.Resource;\r
26 import org.simantics.db.Statement;\r
27 import org.simantics.db.common.utils.NameUtils;\r
28 import org.simantics.db.exception.DatabaseException;\r
29 import org.simantics.db.exception.DoesNotContainValueException;\r
30 import org.simantics.db.exception.ServiceException;\r
31 import org.simantics.db.exception.ValidationException;\r
32 import org.simantics.layer0.Layer0;\r
33 import org.simantics.utils.datastructures.BijectionMap;\r
34 import org.simantics.utils.datastructures.MapList;\r
35 import org.simantics.utils.datastructures.Pair;\r
36 \r
37 /**\r
38  * Compares two subgraphs and reports differences.\r
39  * \r
40  * Assumes that subgraphs (defined using traverse relations) are not cyclic.\r
41  * \r
42  * Assumes that properties can be used to identify objects, if relation type is not enough.\r
43  * \r
44  * \r
45  * \r
46  * @author Marko Luukkainen <marko.luukkainen@vtt.fi>\r
47  *\r
48  */\r
49 public class GraphComparator {\r
50 \r
51         private Resource r1;\r
52         private Resource r2;\r
53         private List<Resource> traversed = new ArrayList<Resource>(); // list of relations that are traversed (and tested)\r
54         private List<Resource> tested = new ArrayList<Resource>();    // list of relations that are tested, but not traversed\r
55         private List<Resource> nonTraversed = new ArrayList<Resource>(); // list of relations that are not traversed\r
56         private List<Resource> nonTested = new ArrayList<Resource>(); // list of relations that are not tested\r
57         \r
58         private List<Statement> changes1 = new ArrayList<Statement>();\r
59         private List<Statement> changes2 = new ArrayList<Statement>();\r
60         private List<Pair<Statement,Statement>> modifications = new ArrayList<Pair<Statement,Statement>>();\r
61         private Set<Statement> changes1Set = new HashSet<Statement>();\r
62         private Set<Statement> changes2Set = new HashSet<Statement>();\r
63         private Set<Pair<Statement,Statement>> modificationsSet = new HashSet<Pair<Statement,Statement>>();\r
64 \r
65         private BijectionMap<Statement, Statement> comparableStatements = new BijectionMap<Statement, Statement>();\r
66         private BijectionMap<Resource, Resource> comparableResources = new BijectionMap<Resource, Resource>();\r
67         \r
68         \r
69         private ObjectComparator comparator;\r
70         \r
71         private Comparator<Statement> scomp = new PredicateComparator();\r
72         private Comparator<Resource> rcomp = new ResourceComparator();\r
73         \r
74         // runtime attributes\r
75         \r
76         private ReadGraph g;\r
77         private Layer0 b;\r
78         \r
79         public GraphComparator(Resource r1, Resource r2) {\r
80                 this.r1 = r1;\r
81                 this.r2 = r2;\r
82                 comparator = new TypeComparator();\r
83         }\r
84         \r
85         public GraphComparator(Resource r1, Resource r2, ObjectComparator comparator) {\r
86                 this.r1 = r1;\r
87                 this.r2 = r2;\r
88                 this.comparator = comparator;\r
89         }\r
90         \r
91         ArrayList<Statement> ss1 = new ArrayList<Statement>();\r
92         ArrayList<Statement> ss2 = new ArrayList<Statement>();\r
93         \r
94         \r
95         public Comparator<Resource> getResourceComparator() {\r
96                 return rcomp;\r
97         }\r
98         \r
99         public Comparator<Statement> getStatementComparator() {\r
100                 return scomp;\r
101         }\r
102         \r
103         public Resource getR1() {\r
104                 return r1;\r
105         }\r
106         \r
107         public Resource getR2() {\r
108                 return r2;\r
109         }\r
110         \r
111         public void addTraversed(Resource rel) {\r
112                 traversed.add(rel);\r
113         }\r
114         \r
115         public void addTraversed(Collection<Resource> rels) {\r
116                 traversed.addAll(rels);\r
117         }\r
118         \r
119         public void addNonTraversed(Resource rel) {\r
120                 nonTraversed.add(rel);\r
121         }\r
122         \r
123         public void addNonTraversed(Collection<Resource> rels) {\r
124                 nonTraversed.addAll(rels);\r
125         }\r
126         \r
127         public void addTested(Resource rel) {\r
128                 tested.add(rel);\r
129         }\r
130         \r
131         public void addTested(Collection<Resource> rels) {\r
132                 tested.addAll(rels);\r
133         }\r
134         \r
135         public void addNonTested(Resource rel) {\r
136                 nonTested.add(rel);\r
137         }\r
138         \r
139         public void addNonTested(Collection<Resource> rels) {\r
140                 nonTested.addAll(rels);\r
141         }\r
142         \r
143         public void addComparableResources(Resource r1, Resource r2) {\r
144                 comparableResources.map(r1, r2);\r
145         }\r
146         \r
147         public void addComparableResources(BijectionMap<Resource, Resource> matching) {\r
148                 comparableResources.addAll(matching);\r
149         }\r
150         \r
151         public void clearRels() {\r
152                 traversed.clear();\r
153                 tested.clear();\r
154                 nonTraversed.clear();\r
155                 nonTested.clear();\r
156         }\r
157         \r
158         public void test(ReadGraph g) throws DatabaseException {\r
159                 this.g = g;\r
160                 this.b = Layer0.getInstance(g);\r
161                 comparator.setComparator(this);\r
162                 \r
163                 Stack<Resource> stack1 = new Stack<Resource>();\r
164                 Stack<Resource> stack2 = new Stack<Resource>();\r
165                 stack1.push(r1);\r
166                 stack2.push(r2);\r
167                 \r
168                 \r
169                 List<Statement> ss1 = new ArrayList<Statement>();\r
170                 List<Statement> ss2 = new ArrayList<Statement>();\r
171                 \r
172                 while (!stack1.isEmpty()) {\r
173                         Resource r1 = stack1.pop();\r
174                         Resource r2 = stack2.pop();\r
175                 \r
176                         if (comparableResources.contains(r1, r2)) {\r
177                                 System.out.println("already tested " + NameUtils.getSafeName(g, r1) + " " + NameUtils.getSafeName(g, r2));\r
178                                 continue;\r
179                         }\r
180                         comparableResources.map(r1, r2);\r
181                         \r
182                         System.out.println("test " + NameUtils.getSafeName(g, r1) + " " + NameUtils.getSafeName(g, r2));\r
183                         compareProps(r1, r2);\r
184                         \r
185                         for (Resource rel : tested) {\r
186                                 ss1.addAll(g.getStatements(r1, rel));\r
187                                 ss2.addAll(g.getStatements(r2, rel));\r
188                                 ss1 = filterAsserted(r1, ss1);\r
189                                 ss2 = filterAsserted(r2, ss2);\r
190                                 ss1 = filterTraversed(ss1);\r
191                                 ss2 = filterTraversed(ss2);\r
192                                 ss1 = filterNonTested(ss1);\r
193                                 ss2 = filterNonTested(ss2);\r
194                                 \r
195                                 compareStatements(ss1, ss2, null, null);\r
196                                 ss1.clear();\r
197                                 ss2.clear();\r
198                         }\r
199                         \r
200                         for (Resource rel : traversed) {\r
201                                 ss1.addAll(g.getStatements(r1, rel));\r
202                                 ss2.addAll(g.getStatements(r2, rel));\r
203                                 ss1 = filterAsserted(r1, ss1);\r
204                                 ss2 = filterAsserted(r2, ss2);\r
205                                 compareStatements(ss1, ss2, stack1, stack2);\r
206                                 ss1.clear();\r
207                                 ss2.clear();\r
208                         }\r
209                 }\r
210         }\r
211         \r
212         \r
213         \r
214         public BijectionMap<Statement, Statement> getComparableStatements() {\r
215                 return comparableStatements;\r
216         }\r
217         \r
218         public GraphChanges getChanges() {\r
219                 return new GraphChanges(r1,r2,changes1,changes2,modifications,comparableResources);\r
220         }\r
221         \r
222         private List<Statement> filterAsserted(Resource r, Collection<Statement> in) throws ServiceException {\r
223                 List<Statement> out = new ArrayList<Statement>();\r
224                 for (Statement s : in) {\r
225                         if (!s.isAsserted(r))\r
226                                 out.add(s);\r
227                         \r
228                 }\r
229                 return out;\r
230         }\r
231         \r
232         private String printStatement(ReadGraph graph, Statement s) throws ValidationException, ServiceException {\r
233                 return NameUtils.getSafeName(graph, s.getSubject()) + " " + NameUtils.getSafeName(graph, s.getPredicate()) + " " + NameUtils.getSafeName(graph, s.getObject());\r
234         }\r
235         \r
236         private List<Statement> filterTraversed(List<Statement> in) throws ServiceException {\r
237                 return filter(traversed, in);\r
238         }\r
239         \r
240         private List<Statement> filterNonTested(List<Statement> in) throws ServiceException {\r
241                 return filter(nonTested, in);\r
242         }\r
243         \r
244         private List<Statement> filter(Collection<Resource> toFilter, List<Statement> in) throws ServiceException {\r
245                 if (toFilter.size() == 0)\r
246                         return in;\r
247                 List<Statement> out = new ArrayList<Statement>();\r
248                 for (Statement s : in) {\r
249                         boolean usable = true;\r
250                         for (Resource r : toFilter) {\r
251                                 if (g.isSubrelationOf(s.getPredicate(),r)) {\r
252                                         usable = false;\r
253                                         break;\r
254                                 }\r
255                         }\r
256                         if (usable) {\r
257                                 out.add(s);\r
258                         }\r
259                         \r
260                 }\r
261                 return out;\r
262         }\r
263         \r
264         \r
265         private void addDeletion(Statement s) {\r
266                 if (!changes1Set.contains(s)) {\r
267                         changes1Set.add(s);\r
268                         changes1.add(s);\r
269                 }\r
270         }\r
271         \r
272         private void addAddition(Statement s) {\r
273                 if (!changes2Set.contains(s)) {\r
274                         changes2Set.add(s);\r
275                         changes2.add(s);\r
276                 }\r
277         }\r
278         \r
279         private void addModification(Statement s1, Statement s2) {\r
280                 Pair<Statement, Statement> mod = new Pair<Statement, Statement>(s1,s2);\r
281                 if (!modificationsSet.contains(mod)) {\r
282                         modificationsSet.add(mod);\r
283                         modifications.add(mod);\r
284                 }\r
285         }\r
286         \r
287         public void sortStatement(List<Statement> list1, List<Statement> list2) {\r
288                 Collections.sort(list1,scomp);\r
289                 Collections.sort(list2,scomp);\r
290                 \r
291                 List<Statement> sorted1 = new ArrayList<Statement>(list1.size());\r
292                 List<Statement> sorted2 = new ArrayList<Statement>(list2.size());\r
293                 sorted1.addAll(list1);\r
294                 sorted2.addAll(list2);\r
295                 \r
296                 int ss1 = 0;\r
297                 int ss2 = 0;\r
298                 for (int i = 0; i < list1.size(); ) {\r
299                         Statement s1 = list1.get(i);\r
300                         int same1 = sameRel(list1, i);  \r
301                         for (int j = 0; j < list2.size(); j++) {\r
302                                 Statement s2 = list2.get(j);\r
303                                 if (scomp.compare(s1, s2) == 0) {\r
304                                         int same2 = sameRel(list2, j);\r
305                                         copy(sorted1,ss1,list1,i,same1);\r
306                                         ss1 += same1;\r
307                                         copy(sorted2,ss2,list2,j,same2);\r
308                                         ss2 += same2;\r
309                                         break;\r
310                                 }\r
311                         }\r
312                         i+= same1;\r
313                 }\r
314                 if (ss1 < sorted1.size()) {\r
315                         for (Statement s : list1) {\r
316                                 if (!sorted1.contains(s))\r
317                                         sorted1.add(s);\r
318                         }\r
319                 }\r
320                 if (ss2 < sorted2.size()) {\r
321                         for (Statement s : list2) {\r
322                                 if (!sorted2.contains(s))\r
323                                         sorted2.add(s);\r
324                         }\r
325                 }\r
326                 \r
327                 list1.clear();\r
328                 list2.clear();\r
329                 list1.addAll(sorted1);\r
330                 list2.addAll(sorted2);\r
331         }\r
332         \r
333         public <T> void copy(List<T> to, int toIndex, List<T> from, int fromIndex, int amount) {\r
334                 for (int i = 0; i <  amount; i++) {\r
335                         to.set(toIndex + i, from.get(fromIndex+ i));\r
336                 }\r
337         }\r
338         \r
339         public void sortResource(List<Resource> list1, List<Resource> list2) {\r
340                 Collections.sort(list1,rcomp);\r
341                 int js = 0;\r
342                 for (int i = 0; i < list1.size(); i++) {\r
343                         Resource s1 = list1.get(i);\r
344                         for (int j = js; j < list2.size(); j++) {\r
345                                 Resource s2 = list2.get(j);\r
346                                 if (rcomp.compare(s1, s2) == 0) {\r
347                                         Resource t = list2.get(js);\r
348                                         list2.set(js, s2);\r
349                                         list2.set(j, t);\r
350                                         break;\r
351                                 }\r
352                         }\r
353                         js++;\r
354                         \r
355                 }\r
356         }\r
357         \r
358         private void compareStatements(List<Statement> ss1, List<Statement> ss2, Stack<Resource> stack1, Stack<Resource> stack2) throws DatabaseException {\r
359                 sortStatement(ss1, ss2);\r
360 //              Collections.sort(ss1, scomp);\r
361 //              Collections.sort(ss2, scomp);\r
362                 \r
363                 int i1 = 0;\r
364                 int i2 = 0;\r
365                 \r
366                 while (true) {\r
367                         if (i1 >= ss1.size()) {\r
368                                 if (i2 >= ss2.size()) {\r
369                                         break;\r
370                                 } else {\r
371                                         while (i2 < ss2.size()) {\r
372                                                 System.out.println("Compare Statements diff2 " + printStatement(g,ss2.get(i2)));\r
373                                                 \r
374                                                 addAddition(ss2.get(i2));\r
375                                                 i2++;\r
376                                         }\r
377                                         break;\r
378                                 }\r
379                         } else if (i2 >= ss2.size()) {\r
380                                 while (i1 < ss1.size()) {\r
381                                         System.out.println("Compare Statements diff1 " + printStatement(g,ss1.get(i1)));\r
382                                         addDeletion(ss1.get(i1));\r
383                                         i1++;\r
384                                 }\r
385                                 break;\r
386                         }\r
387                         int same1 = sameRel(ss1, i1);\r
388                         int same2 = sameRel(ss2, i2);\r
389                         int c = rcomp.compare(ss1.get(i1).getPredicate(),ss2.get(i2).getPredicate());\r
390                         if (c == 0) {\r
391                                 compareStatements(ss1, i1, same1, ss2, i2, same2,stack1,stack2);\r
392                                 i1+=same1;\r
393                                 i2+=same2;\r
394                         } else if (c < 0) {\r
395                                 for (int i = 0; i < same1; i++) {\r
396                                         System.out.println("Compare Statements diff1 " + printStatement(g,ss1.get(i+i1)));\r
397                                         addDeletion(ss1.get(i+i1));\r
398                                 }\r
399                                 i1 += same1;\r
400                         } else {\r
401                                 for (int i = 0; i < same2; i++) {\r
402                                         System.out.println("Compare Statements diff2 " + printStatement(g,ss2.get(i+i2)));\r
403                                         addAddition(ss2.get(i+i2));\r
404                                 }\r
405                                 \r
406                                 i2 += same2;\r
407                         }\r
408                         \r
409                 }\r
410         }\r
411         \r
412         private int sameRel(List<Statement> statements, int off) {\r
413                 if (statements.size() <= off)\r
414                         return 0;\r
415                 int same = 1;\r
416                 long id = statements.get(off).getPredicate().getResourceId();\r
417                 for (int i = off+1; i <statements.size(); i++) {\r
418                         if (statements.get(i).getPredicate().getResourceId() == id)\r
419                                 same++;\r
420                         else \r
421                                 break;\r
422                 }\r
423                 return same;\r
424                 \r
425         }\r
426 \r
427         private int compareObject(Resource o1, Resource o2) throws DatabaseException {\r
428                 if (comparableResources.contains(o1, o2))\r
429                         return (-1);\r
430                 return comparator.compare(g, o1, o2);\r
431         }\r
432         \r
433         private void compareStatements(List<Statement> ss1, int off1, int len1, List<Statement> ss2, int off2, int len2, Stack<Resource> stack1, Stack<Resource> stack2) throws DatabaseException {\r
434                 boolean[] used1 = new boolean[len1];\r
435                 for (int i = 0; i < used1.length; i++) {\r
436                         used1[i] = false;\r
437                 }\r
438                 \r
439                 boolean[] used2 = new boolean[len2];\r
440                 for (int i = 0; i < used2.length; i++) {\r
441                         used2[i] = false;\r
442                 }\r
443                 \r
444                 // left, right, difference\r
445                 List<List<Integer>> differences = new ArrayList<List<Integer>>();\r
446                 for (int i1 = off1; i1 < off1 + len1; i1++) {\r
447                         Statement s1 = ss1.get(i1);\r
448                         List<Integer> diff = new ArrayList<Integer>();\r
449                         for (int i2 = off2; i2 < off2 + len2; i2++) {\r
450                                 Statement s2 = ss2.get(i2);\r
451                                 diff.add(compareObject(s1.getObject(), s2.getObject()));\r
452                         }\r
453                         differences.add(diff);\r
454                 }\r
455                 // difference, left\r
456                 MapList<Integer, Integer> priorities = new MapList<Integer, Integer>();\r
457                 for (int i = 0; i < differences.size(); i++) {\r
458                         List<Integer> list = differences.get(i);\r
459                         for (int j = 0; j < list.size(); j++) {\r
460                                 priorities.add(list.get(j), i);\r
461                         }\r
462                 }\r
463                 \r
464                 Integer[] pris = priorities.getKeys(new Integer[]{});\r
465                 Arrays.sort(pris);\r
466                 \r
467                 for (Integer pri : pris) {\r
468                         if (pri == Integer.MAX_VALUE)\r
469                                 continue;\r
470                         List<Integer> i1s = priorities.getValues(pri);\r
471                         for (Integer i1 : i1s) {\r
472                                 if (used1[i1])\r
473                                         continue;\r
474                                 List<Integer> i2diff = differences.get(i1);\r
475                                 for (int i2 = 0; i2 < i2diff.size(); i2++) {\r
476                                         if (i2diff.get(i2) == pri) {\r
477                                                 if (used2[i2])\r
478                                                         continue;\r
479                                                 used1[i1] = true;\r
480                                                 used2[i2] = true;\r
481                                                 Statement s1  = ss1.get(i1+off1);\r
482                                                 Statement s2  = ss2.get(i2+off2);\r
483                                                 \r
484                                                 if (stack1 != null) {\r
485                                                         \r
486                                                                 stack1.add(s1.getObject());\r
487                                                                 stack2.add(s2.getObject());\r
488                                                         \r
489                                                 } else {\r
490                                                         // TODO : how should we report non traversed differences\r
491                                                         // using compareProps assumes that referenced objects are the same (references are not different)\r
492                                                         // using propsDiffCount assumes that objects are different, and cannot report changes in referred object.\r
493                                                         \r
494                                                         \r
495 //                                                      int diff = propsDiffCount(ss1.get(i1+off1).getObject(), ss2.get(i2+off2).getObject());\r
496 //                                                      if (diff != 0) {\r
497 //                                                              //changes1.add(ss1.get(i1+off1));\r
498 //                                                              //changes2.add(ss2.get(i2+off2));\r
499 //                                                              modifies.add(new Pair<Statement, Statement>(ss1.get(i1+off1), ss2.get(i2+off2)));\r
500 //                                                      }\r
501                                                 }\r
502                                                 comparableStatements.map(s1, s2);\r
503                                                 //comparableResources.map(s1.getObject(), s2.getObject());\r
504                                                 break;\r
505                                         }\r
506                                 }\r
507                         }\r
508                 }\r
509                 for (int i1 = off1; i1 < off1 + len1; i1++) {\r
510                         if (!used1[i1-off1]) {\r
511                                 System.out.println("Compare Object diff1 " + printStatement(g,ss1.get(i1)));\r
512                                 addDeletion(ss1.get(i1));\r
513                         }\r
514                 }\r
515                 for (int i2 = off2; i2 < off2 + len2; i2++) {\r
516                         if (!used2[i2-off2]) {\r
517                                 System.out.println("Compare Object diff2 " + printStatement(g,ss2.get(i2)));\r
518                                 addAddition(ss2.get(i2));\r
519                         }\r
520                 }\r
521         }\r
522         \r
523         \r
524         \r
525         /**\r
526          * compares properties, assumes functional relations\r
527          * @param r1\r
528          * @param r2\r
529          * @throws ServiceException\r
530          * @throws DoesNotContainValueException\r
531          * @throws ValidationException \r
532          */\r
533         private void compareProps(Resource r1, Resource r2) throws ServiceException, DoesNotContainValueException, ValidationException {\r
534                 ArrayList<Statement> ss1 = new ArrayList<Statement>();\r
535                 ArrayList<Statement> ss2 = new ArrayList<Statement>();\r
536                 ss1.addAll(g.getStatements(r1, b.HasProperty));\r
537                 ss2.addAll(g.getStatements(r2, b.HasProperty));\r
538                 sortStatement(ss1, ss2);\r
539 //              Collections.sort(ss1, scomp);\r
540 //              Collections.sort(ss2, scomp);\r
541                 \r
542                 int i1 = 0; \r
543                 int i2 = 0;\r
544                 \r
545                 while (true) {\r
546                         if (i1 >= ss1.size()) {\r
547                                 if (i2 >= ss2.size())\r
548                                         break;\r
549                                 else {\r
550                                         while (i2 < ss2.size()) {\r
551                                                 System.out.println("Compare Prop diff2 " + printStatement(g,ss2.get(i2)));\r
552                                                 addAddition(ss2.get(i2));\r
553                                                 i2++;\r
554                                         }\r
555                                         break;\r
556                                 }\r
557                         } else if (i2 >= ss2.size()) {\r
558                                 while (i1 < ss1.size()) {\r
559                                         System.out.println("Compare Prop diff1 " + printStatement(g,ss1.get(i1)));\r
560                                         addDeletion(ss1.get(i1));\r
561                                         i1++;\r
562                                 }\r
563                                 break;\r
564                         }\r
565                         Statement s1 = ss1.get(i1);\r
566                         Statement s2 = ss2.get(i2);\r
567                         int c = scomp.compare(s1, s2);\r
568                         switch (c) {\r
569                         case 0:{\r
570                                 boolean b1 = g.hasValue(s1.getObject());\r
571                                 boolean b2 = g.hasValue(s2.getObject());\r
572                                 if (b1 == b2) {\r
573                                         if (b1) {\r
574                                                 Object v1 = g.getValue(s1.getObject());\r
575                                                 Object v2 = g.getValue(s2.getObject());\r
576                                                 boolean eq = compareValue(v1, v2);\r
577                                                 if (!eq) {\r
578                                                         addModification(s1, s2);\r
579                                                         comparableStatements.map(s1, s2);\r
580                                                         comparableResources.map(s1.getObject(),s2.getObject());\r
581                                                 }\r
582                                         } else {\r
583                                                 compareProps(s1.getObject(), s2.getObject());\r
584                                         }\r
585                                 } else {\r
586                                         addModification(s1, s2);\r
587                                         comparableStatements.map(s1, s2);\r
588                                         comparableResources.map(s1.getObject(),s2.getObject());\r
589                                 }\r
590                                 i1++;\r
591                                 i2++;\r
592                                 break;\r
593                         }\r
594                         case -1:{\r
595                                 System.out.println("Compare Prop diff1s " + printStatement(g,s1));\r
596                                 addDeletion(s1);\r
597                                 i1++;\r
598                                 break;\r
599                         }\r
600                                 \r
601                         case 1:{\r
602                                 System.out.println("Compare Prop diff2s " + printStatement(g,s2));\r
603                                 addAddition(s2);\r
604                                 i2++;\r
605                                 break;\r
606                         }\r
607                         }\r
608                         \r
609                         \r
610                 }\r
611                 \r
612                 ss1.clear();\r
613                 ss2.clear();\r
614                 \r
615         }\r
616         \r
617         \r
618         public static boolean compareValue(Object v1, Object v2) {\r
619                 if (v1 instanceof Object[] && v2 instanceof Object[])\r
620                         return Arrays.deepEquals((Object[])v1, (Object[])v2);\r
621                 else if (v1 instanceof int[] && v2 instanceof int[]) \r
622                         return Arrays.equals((int[])v1, (int[])v2);\r
623                 else if (v1 instanceof float[] && v2 instanceof float[]) \r
624                         return Arrays.equals((float[])v1, (float[])v2);\r
625                 else if (v1 instanceof double[] && v2 instanceof double[]) \r
626                         return Arrays.equals((double[])v1, (double[])v2);\r
627                 else if (v1 instanceof long[] && v2 instanceof long[]) \r
628                         return  Arrays.equals((long[])v1, (long[])v2);\r
629                 else if (v1 instanceof byte[] && v2 instanceof byte[]) \r
630                         return Arrays.equals((byte[])v1, (byte[])v2);\r
631                 else if (v1 instanceof boolean[] && v2 instanceof boolean[]) \r
632                         return Arrays.equals((boolean[])v1, (boolean[])v2);\r
633                 else\r
634                         return v1.equals(v2);\r
635         }\r
636 \r
637         \r
638         \r
639         public class PredicateComparator implements Comparator<Statement> {\r
640                 @Override\r
641                 public int compare(Statement o1, Statement o2) {\r
642                         if (comparableResources.contains(o1.getPredicate(), o2.getPredicate()))\r
643                                 return 0;\r
644                         if (o1.getPredicate().getResourceId() < o2.getPredicate().getResourceId())\r
645                                 return -1;\r
646                         if (o1.getPredicate().getResourceId() > o2.getPredicate().getResourceId())\r
647                                 return 1;\r
648                         return 0;\r
649                 }\r
650         }\r
651         \r
652         public static class FullStatementComparator implements Comparator<Statement> {\r
653                 @Override\r
654                 public int compare(Statement o1, Statement o2) {\r
655                         if (o1.getSubject().getResourceId() < o2.getSubject().getResourceId())\r
656                                 return -1;\r
657                         if (o1.getSubject().getResourceId() > o2.getSubject().getResourceId())\r
658                                 return 1;\r
659                         if (o1.getPredicate().getResourceId() < o2.getPredicate().getResourceId())\r
660                                 return -1;\r
661                         if (o1.getPredicate().getResourceId() > o2.getPredicate().getResourceId())\r
662                                 return 1;\r
663                         if (o1.getObject().getResourceId() < o2.getObject().getResourceId())\r
664                                 return -1;\r
665                         if (o1.getObject().getResourceId() > o2.getObject().getResourceId())\r
666                                 return 1;\r
667                         return 0;\r
668                 }\r
669         }\r
670         \r
671 \r
672         \r
673         public class ResourceComparator implements Comparator<Resource> {\r
674                 @Override\r
675                 public int compare(Resource o1, Resource o2) {\r
676                         if (comparableResources.contains(o1, o2))\r
677                                 return 0;\r
678                         if (o1.getResourceId() < o2.getResourceId())\r
679                                 return -1;\r
680                         if (o1.getResourceId() > o2.getResourceId())\r
681                                 return 1;\r
682                         return 0;\r
683                 }\r
684         }\r
685         \r
686         \r
687 }\r