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