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