]> gerrit.simantics Code Review - simantics/interop.git/blob - org.simantics.interop/src/org/simantics/interop/test/TypeComparator.java
Prevent TypeComparator from matching different type resources.
[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         /**
44          * Compares resources based on L0.InstaceOf relations.
45          * If there are no L0.InstanceOf relations, uses ResourceComparator for comparison.
46          *  
47          * @param g
48          * @param r1
49          * @param r2
50          * @return
51          * @throws DatabaseException
52          */
53         protected boolean compareType(ReadGraph g,Resource r1, Resource r2) throws DatabaseException {
54                 Layer0 l0 = Layer0.getInstance(g);
55                 rs1.addAll(g.getObjects(r1, l0.InstanceOf));
56                 rs2.addAll(g.getObjects(r2, l0.InstanceOf));
57                 if (rs1.size() != rs2.size()) {
58                         rs1.clear();
59                         rs2.clear();
60                         return false;
61                 }
62                 Comparator<Resource> rcomp = getComparator().getResourceComparator();
63                 if (rs1.size() == 0) {
64                         return rcomp.compare(r1, r2) == 0;
65                 }
66         
67                 getComparator().sortResource(rs1, rs2);
68
69                 for (int i = 0; i < rs1.size(); i++) {
70                         int c = rcomp.compare(rs1.get(i), rs2.get(i));
71                         if (c != 0) {
72                                 rs1.clear();
73                                 rs2.clear();
74                                 return false;
75                         }
76                 }
77                 if (rs1.size() == 1) {
78                         // Check for enumeration type. Without this enumeration instances could be mixed together.
79                         if (g.hasStatement(rs1.get(0), l0.Enumeration, rs1.get(0))) {
80                                 if (!r1.equals(r2)) {
81                                         rs1.clear();
82                                         rs2.clear();
83                                         return false;
84                                 }
85                         }
86                 }
87                 
88                 rs1.clear();
89                 rs2.clear();
90                 
91                 return true;
92         }
93         
94         
95         protected int propsDiffCount(ReadGraph g, Resource r1, Resource r2) throws DatabaseException {
96                 Layer0 l0 = Layer0.getInstance(g);
97                 ArrayList<Statement> ss1 = new ArrayList<Statement>();
98                 ArrayList<Statement> ss2 = new ArrayList<Statement>();
99                 ss1.addAll(g.getStatements(r1, l0.HasProperty));
100                 ss2.addAll(g.getStatements(r2, l0.HasProperty));
101                 
102                 if (ss1.size() == 0 && ss2.size() == 0)
103                         return 0;
104                 
105                 Comparator<Statement> scomp = getComparator().getStatementComparator();
106                 
107                 getComparator().sortStatement(ss1, ss2);
108                 
109                 int count = 1;
110                 
111                 int i1 = 0; 
112                 int i2 = 0;
113                 
114                 while (true) {
115                         if (i1 >= ss1.size()) {
116                                 if (i2 >= ss2.size())
117                                         break;
118                                 else {
119                                         while (i2 < ss2.size()) {
120                                                 count++;
121                                                 i2++;
122                                         }
123                                         break;
124                                 }
125                         } else if (i2 >= ss2.size()) {
126                                 while (i1 < ss1.size()) {
127                                         count++;
128                                         i1++;
129                                 }
130                                 break;
131                         }
132                         Statement s1 = ss1.get(i1);
133                         Statement s2 = ss2.get(i2);
134                         if (s1.isAsserted(r1) && s2.isAsserted(r2)) {
135                                 i1++;
136                                 i2++;
137                                 continue;
138                         }
139                         int c = scomp.compare(s1, s2);
140                         switch (c) {
141                                 case 0:{
142                                         boolean b1 = g.hasValue(s1.getObject());
143                                         boolean b2 = g.hasValue(s2.getObject());
144                                         if (b1 == b2) {
145                                                 if (b1) {
146                                                         boolean eq = GraphComparator.compareValue(g, l0 , s1.getObject(), s2.getObject());
147                                                         if (!eq) {
148                                                                 count++;
149                                                         }
150                                                 } else {
151                                                         count += propsDiffCount(g,s1.getObject(), s2.getObject());
152                                                 }
153                                         } else {
154                                                 //System.out.println("Props count structural vs literal");
155                                                 count++;
156                                         }
157                                         i1++;
158                                         i2++;
159                                         break;
160                                 }
161                                 case -1:{
162                                         count++;
163                                         i1++;
164                                         break;
165                                 }
166                                         
167                                 case 1:{
168                                         count++;
169                                         i2++;
170                                         break;
171                                 }
172                         }
173
174                 }
175                 
176                 ss1.clear();
177                 ss2.clear();
178                 return count;
179         }
180
181 }