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