]> gerrit.simantics Code Review - simantics/interop.git/blob - org.simantics.interop/src/org/simantics/interop/test/TypeComparator.java
GraphComparator behavior can be customized with ObjectComparator
[simantics/interop.git] / org.simantics.interop / src / org / simantics / interop / test / TypeComparator.java
1 package org.simantics.interop.test;\r
2 \r
3 import java.util.ArrayList;\r
4 import java.util.Collections;\r
5 import java.util.Comparator;\r
6 \r
7 import org.simantics.db.ReadGraph;\r
8 import org.simantics.db.Resource;\r
9 import org.simantics.db.Statement;\r
10 import org.simantics.db.exception.DatabaseException;\r
11 import org.simantics.db.exception.DoesNotContainValueException;\r
12 import org.simantics.db.exception.ManyObjectsForFunctionalRelationException;\r
13 import org.simantics.db.exception.ServiceException;\r
14 import org.simantics.db.exception.ValidationException;\r
15 import org.simantics.interop.test.GraphComparator.PredicateComparator;\r
16 import org.simantics.interop.test.GraphComparator.ResourceComparator;\r
17 import org.simantics.layer0.Layer0;\r
18 \r
19 /**\r
20  * Object comparator that uses type of objects to check if objects are comparable. \r
21  * \r
22  * Difference value is amount of properties that have different values.\r
23  * \r
24  * @author Marko Luukkainen <marko.luukkainen@vtt.fi>\r
25  *\r
26  */\r
27 public class TypeComparator implements ObjectComparator {\r
28 \r
29         Comparator<Statement> scomp = new PredicateComparator();\r
30         Comparator<Resource> rcomp = new ResourceComparator();\r
31         \r
32         ArrayList<Resource> rs1 = new ArrayList<Resource>();\r
33         ArrayList<Resource> rs2 = new ArrayList<Resource>();\r
34         \r
35         @Override\r
36         public int compare(ReadGraph g, Resource o1, Resource o2) throws DatabaseException{\r
37                 if (!compareType(g,o1, o2)) {\r
38                         return (Integer.MAX_VALUE);\r
39                 }\r
40                 return propsDiffCount(g,o1, o2);\r
41         }\r
42         \r
43         protected boolean compareType(ReadGraph g,Resource r1, Resource r2) throws ServiceException, ManyObjectsForFunctionalRelationException {\r
44                 Layer0 l0 = Layer0.getInstance(g);\r
45                 rs1.addAll(g.getObjects(r1, l0.InstanceOf));\r
46                 rs2.addAll(g.getObjects(r2, l0.InstanceOf));\r
47                 if (rs1.size() != rs2.size()) {\r
48                         rs1.clear();\r
49                         rs2.clear();\r
50                         return false;\r
51                 }\r
52                 Collections.sort(rs1, rcomp);\r
53                 Collections.sort(rs2, rcomp);\r
54                 for (int i = 0; i < rs1.size(); i++) {\r
55                         int c = rcomp.compare(rs1.get(i), rs2.get(i));\r
56                         if (c != 0) {\r
57                                 rs1.clear();\r
58                                 rs2.clear();\r
59                                 return false;\r
60                         }\r
61                 }\r
62                 \r
63                 rs1.clear();\r
64                 rs2.clear();\r
65                 \r
66                 return true;\r
67         }\r
68         \r
69         protected int propsDiffCount(ReadGraph g, Resource r1, Resource r2) throws ServiceException, DoesNotContainValueException, ValidationException {\r
70                 Layer0 l0 = Layer0.getInstance(g);\r
71                 ArrayList<Statement> ss1 = new ArrayList<Statement>();\r
72                 ArrayList<Statement> ss2 = new ArrayList<Statement>();\r
73                 ss1.addAll(g.getStatements(r1, l0.HasProperty));\r
74                 ss2.addAll(g.getStatements(r2, l0.HasProperty));\r
75                 Collections.sort(ss1, scomp);\r
76                 Collections.sort(ss2, scomp);\r
77                 \r
78                 int count = 0;\r
79                 \r
80                 int i1 = 0; \r
81                 int i2 = 0;\r
82                 \r
83                 while (true) {\r
84                         if (i1 >= ss1.size()) {\r
85                                 if (i2 >= ss2.size())\r
86                                         break;\r
87                                 else {\r
88                                         while (i2 < ss2.size()) {\r
89                                                 count++;\r
90                                                 i2++;\r
91                                         }\r
92                                         break;\r
93                                 }\r
94                         } else if (i2 >= ss2.size()) {\r
95                                 while (i1 < ss1.size()) {\r
96                                         count++;\r
97                                         i1++;\r
98                                 }\r
99                                 break;\r
100                         }\r
101                         Statement s1 = ss1.get(i1);\r
102                         Statement s2 = ss2.get(i2);\r
103                         int c = scomp.compare(s1, s2);\r
104                         switch (c) {\r
105                                 case 0:{\r
106                                         boolean b1 = g.hasValue(s1.getObject());\r
107                                         boolean b2 = g.hasValue(s2.getObject());\r
108                                         if (b1 == b2) {\r
109                                                 if (b1) {\r
110                                                         Object v1 = g.getValue(s1.getObject());\r
111                                                         Object v2 = g.getValue(s2.getObject());\r
112                                                         boolean eq = GraphComparator.compareValue(v1, v2);\r
113                                                         \r
114                                                         if (!eq) {\r
115                                                                 count++;\r
116                                                         }\r
117                                                         //System.out.println("Prop count values " + v1 + " " + v2);\r
118                                                 } else {\r
119                                                         count += propsDiffCount(g,s1.getObject(), s2.getObject());\r
120                                                 }\r
121                                         } else {\r
122                                                 //System.out.println("Props count structural vs literal");\r
123                                                 count++;\r
124                                         }\r
125                                         i1++;\r
126                                         i2++;\r
127                                         break;\r
128                                 }\r
129                                 case -1:{\r
130                                         count++;\r
131                                         i1++;\r
132                                         break;\r
133                                 }\r
134                                         \r
135                                 case 1:{\r
136                                         count++;\r
137                                         i2++;\r
138                                         break;\r
139                                 }\r
140                         }\r
141 \r
142                 }\r
143                 \r
144                 ss1.clear();\r
145                 ss2.clear();\r
146                 return count;\r
147         }\r
148 \r
149 }\r