]> gerrit.simantics Code Review - simantics/interop.git/blob - org.simantics.interop/src/org/simantics/interop/test/GraphComparatorViewer.java
Allow defining matching resources (Comparing models with structural components)
[simantics/interop.git] / org.simantics.interop / src / org / simantics / interop / test / GraphComparatorViewer.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
3  * in Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     Foster Wheeler Energia Oy - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.interop.test;\r
13 \r
14 import java.io.IOException;\r
15 import java.util.HashMap;\r
16 import java.util.Map;\r
17 \r
18 import org.eclipse.jface.layout.GridDataFactory;\r
19 import org.eclipse.swt.SWT;\r
20 import org.eclipse.swt.dnd.DND;\r
21 import org.eclipse.swt.dnd.DropTarget;\r
22 import org.eclipse.swt.dnd.DropTargetAdapter;\r
23 import org.eclipse.swt.dnd.DropTargetEvent;\r
24 import org.eclipse.swt.dnd.TextTransfer;\r
25 import org.eclipse.swt.dnd.Transfer;\r
26 import org.eclipse.swt.events.SelectionAdapter;\r
27 import org.eclipse.swt.events.SelectionEvent;\r
28 import org.eclipse.swt.layout.GridData;\r
29 import org.eclipse.swt.layout.GridLayout;\r
30 import org.eclipse.swt.widgets.Button;\r
31 import org.eclipse.swt.widgets.Composite;\r
32 import org.eclipse.swt.widgets.Display;\r
33 import org.eclipse.swt.widgets.Label;\r
34 import org.eclipse.swt.widgets.Text;\r
35 import org.eclipse.ui.part.ViewPart;\r
36 import org.simantics.db.ReadGraph;\r
37 import org.simantics.db.Resource;\r
38 import org.simantics.db.Session;\r
39 import org.simantics.db.Statement;\r
40 import org.simantics.db.common.ResourceArray;\r
41 import org.simantics.db.common.request.ReadRequest;\r
42 import org.simantics.db.common.utils.NameUtils;\r
43 import org.simantics.db.exception.DatabaseException;\r
44 import org.simantics.db.exception.InvalidResourceReferenceException;\r
45 import org.simantics.db.exception.ServiceException;\r
46 import org.simantics.db.exception.ValidationException;\r
47 import org.simantics.db.request.Read;\r
48 import org.simantics.db.service.SerialisationSupport;\r
49 import org.simantics.layer0.Layer0;\r
50 import org.simantics.ui.SimanticsUI;\r
51 import org.simantics.ui.dnd.LocalObjectTransfer;\r
52 import org.simantics.ui.dnd.ResourceReferenceTransfer;\r
53 import org.simantics.ui.dnd.ResourceTransferUtils;\r
54 import org.simantics.ui.utils.ResourceAdaptionUtils;\r
55 import org.simantics.utils.datastructures.BijectionMap;\r
56 import org.simantics.utils.datastructures.Pair;\r
57 \r
58 /**\r
59  * Simple multi line text viewer for seeing differences in two subgraphs. \r
60  * \r
61  * @author Marko Luukkainen <marko.luukkainen@vtt.fi>\r
62  *\r
63  */\r
64 public class GraphComparatorViewer extends ViewPart{\r
65         \r
66         private Session session;\r
67 \r
68         private Composite composite;\r
69         \r
70         private Label resourceText1;\r
71         private Label resourceText2;\r
72         \r
73         private Text text1;\r
74         private Text text2;\r
75         \r
76 \r
77         \r
78         @Override\r
79         public void createPartControl(Composite parent) {\r
80                 composite = new Composite(parent, SWT.NONE);\r
81                 composite.setLayout(new GridLayout(2, false));\r
82                 \r
83                 session = SimanticsUI.getSession();\r
84                 \r
85                 Composite topComposite = new Composite(composite, SWT.BORDER);\r
86                 topComposite.setLayout(new GridLayout(3, false));\r
87                 text1 = new Text(composite, SWT.MULTI|SWT.V_SCROLL);\r
88                 text2 = new Text(composite, SWT.MULTI|SWT.V_SCROLL);\r
89                 \r
90                 GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).grab(true, false).span(2, 1).applyTo(topComposite);\r
91                 GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, true).applyTo(text1);\r
92                 GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, true).applyTo(text2);\r
93                 \r
94                 resourceText1 = createDropLabel(topComposite);\r
95                 resourceText2 = createDropLabel(topComposite);\r
96                 \r
97                 Button button = new Button(topComposite, SWT.PUSH);\r
98                 button.setText("Compare");\r
99                 button.addSelectionListener(new SelectionAdapter() {\r
100                         @Override\r
101                         public void widgetSelected(SelectionEvent e) {\r
102                                 compare();\r
103                         }\r
104                 });\r
105                 \r
106         }\r
107         \r
108         \r
109         \r
110         private void compare() {\r
111                 text1.setText("");\r
112                 text2.setText("");\r
113                 final Resource r1 = (Resource)resourceText1.getData();\r
114                 final Resource r2 = (Resource)resourceText2.getData();\r
115                 if (r1 == null || r2 == null) {\r
116                         if (r1 == null)\r
117                                 text1.setText("Missing input!");\r
118                         if (r2 == null)\r
119                                 text2.setText("Missing input!");\r
120                         return; \r
121                 }\r
122                 \r
123                 session.asyncRequest(new ReadRequest() {\r
124                         \r
125                         @Override\r
126                         public void run(final ReadGraph graph) throws DatabaseException {\r
127                                 GraphComparator comparator = new GraphComparator(r1,r2);\r
128                                 comparator.clearRels();\r
129                                 Layer0 l0 = Layer0.getInstance(graph);\r
130                                 comparator.addTraversed(l0.ConsistsOf);\r
131                                 comparator.addTraversed(l0.HasNext);\r
132                                 comparator.addTested(l0.IsWeaklyRelatedTo);\r
133                                 comparator.test(graph);\r
134                                 BijectionMap<Statement, Statement> map = comparator.getComparableStatements();\r
135                                 Map<Statement, Integer> indices = new HashMap<Statement, Integer>();\r
136                                 final StringBuilder sb1 = new StringBuilder();\r
137                                 final StringBuilder sb2 = new StringBuilder();\r
138                                 int index = 0;\r
139                                 \r
140                                 GraphChanges changes = comparator.getChanges();\r
141                                 \r
142                                 for (Pair<Statement,Statement> mod : changes.getModifications()) {\r
143                                         {\r
144                                                 String sub;\r
145                                                 try {\r
146                                                         Statement s = mod.first;\r
147                                                         sub = NameUtils.getSafeName(graph, s.getSubject());\r
148                                                         String pre = NameUtils.getSafeName(graph, s.getPredicate());\r
149                                                         String obj = NameUtils.getSafeName(graph, s.getObject());\r
150                                                         if (map.containsLeft(s)) {\r
151                                                                 index++;\r
152                                                                 indices.put(s, index);\r
153                                                                 sb1.append("["+index + "] ");\r
154                                                         }\r
155                                                         sb1.append(sub + " - " + pre + " - " + obj);\r
156                                                         sb1.append(" ["+s.getSubject().getResourceId() + " " + s.getPredicate().getResourceId() + " " + s.getObject().getResourceId()+"]");\r
157                                                         sb1.append("\n");\r
158                                                 } catch (ValidationException e) {\r
159                                                         e.printStackTrace();\r
160                                                 } catch (ServiceException e) {\r
161                                                         e.printStackTrace();\r
162                                                 }\r
163                                         }\r
164                                         {\r
165                                                 String sub;\r
166                                                 try {\r
167                                                         Statement s = mod.second;\r
168                                                         sub = NameUtils.getSafeName(graph, s.getSubject());\r
169                                                         String pre = NameUtils.getSafeName(graph, s.getPredicate());\r
170                                                         String obj = NameUtils.getSafeName(graph, s.getObject());\r
171                                                         if (map.containsRight(s)) {\r
172                                                                 index = indices.get(map.getLeft(s));\r
173                                                                 sb2.append("["+index + "] ");\r
174                                                         }\r
175                                                         sb2.append(sub + " - " + pre + " - " + obj);\r
176                                                         sb2.append(" ["+s.getSubject().getResourceId() + " " + s.getPredicate().getResourceId() + " " + s.getObject().getResourceId()+"]");\r
177                                                         sb2.append("\n");\r
178                                                 } catch (ValidationException e) {\r
179                                                         e.printStackTrace();\r
180                                                 } catch (ServiceException e) {\r
181                                                         e.printStackTrace();\r
182                                                 }\r
183                                         }\r
184                                 }\r
185                                 for (Statement s : changes.getDeletions()) {\r
186                                         String sub;\r
187                                         try {\r
188                                                 \r
189                                                 sub = NameUtils.getSafeName(graph, s.getSubject());\r
190                                                 String pre = NameUtils.getSafeName(graph, s.getPredicate());\r
191                                                 String obj = NameUtils.getSafeName(graph, s.getObject());\r
192                                                 if (map.containsLeft(s)) {\r
193                                                         index++;\r
194                                                         indices.put(s, index);\r
195                                                         sb1.append("["+index + "] ");\r
196                                                 }\r
197                                                 sb1.append(sub + " - " + pre + " - " + obj);\r
198                                                 sb1.append(" ["+s.getSubject().getResourceId() + " " + s.getPredicate().getResourceId() + " " + s.getObject().getResourceId()+"]");\r
199                                                 sb1.append("\n");\r
200                                         } catch (ValidationException e) {\r
201                                                 e.printStackTrace();\r
202                                         } catch (ServiceException e) {\r
203                                                 e.printStackTrace();\r
204                                         }\r
205                                         \r
206                                 }\r
207                                 \r
208                                 for (Statement s : changes.getAdditions()) {\r
209                                         String sub;\r
210                                         try {\r
211                                                 sub = NameUtils.getSafeName(graph, s.getSubject());\r
212                                                 String pre = NameUtils.getSafeName(graph, s.getPredicate());\r
213                                                 String obj = NameUtils.getSafeName(graph, s.getObject());\r
214                                                 if (map.containsRight(s)) {\r
215                                                         index = indices.get(map.getLeft(s));\r
216                                                         sb2.append("["+index + "] ");\r
217                                                 }\r
218                                                 sb2.append(sub + " - " + pre + " - " + obj);\r
219                                                 sb2.append(" ["+s.getSubject().getResourceId() + " " + s.getPredicate().getResourceId() + " " + s.getObject().getResourceId()+"]");\r
220                                                 sb2.append("\n");\r
221                                         } catch (ValidationException e) {\r
222                                                 e.printStackTrace();\r
223                                         } catch (ServiceException e) {\r
224                                                 e.printStackTrace();\r
225                                         }\r
226                                         \r
227                                 }\r
228                                 Display.getDefault().asyncExec(new Runnable() {                 \r
229                                         @Override\r
230                                         public void run() {\r
231                                                 text1.setText(sb1.toString());\r
232                                                 text2.setText(sb2.toString());\r
233                                                 \r
234                                         }\r
235                                 });\r
236                         }\r
237                 });\r
238         }\r
239         \r
240         @Override\r
241         public void setFocus() {\r
242                 composite.setFocus();\r
243         }\r
244         \r
245         @Override\r
246         public void dispose() {\r
247                 super.dispose();\r
248                 \r
249         }\r
250         \r
251         \r
252         // copy-paste from GraphDebugger\r
253          public Label createDropLabel(Composite parent) {\r
254                 final Label label = new Label(parent, SWT.BORDER);\r
255                 label.setAlignment(SWT.CENTER);\r
256                 label.setText("Drag a resource here to examine it in this debugger!");\r
257                 label.setForeground(parent.getDisplay().getSystemColor(SWT.COLOR_DARK_GRAY));\r
258                 GridData data = new GridData(SWT.FILL, SWT.TOP, true, false);\r
259                 data.heightHint = 16;\r
260                 label.setLayoutData(data);\r
261 \r
262                 // Add resource id drop support to the drop-area.\r
263                 DropTarget dropTarget = new DropTarget(label, DND.DROP_LINK | DND.DROP_COPY);\r
264                 dropTarget.setTransfer(new Transfer[] { TextTransfer.getInstance(), ResourceReferenceTransfer.getInstance(), LocalObjectTransfer.getTransfer() });\r
265                 dropTarget.addDropListener(new DropTargetAdapter() {\r
266                     @Override\r
267                     public void dragEnter(DropTargetEvent event) {\r
268                         event.detail = DND.DROP_LINK;\r
269                         //label.setBackground(green);\r
270                         return;\r
271                     }\r
272                     @Override\r
273                     public void dragLeave(DropTargetEvent event) {\r
274                         label.setBackground(null);\r
275                     }\r
276 \r
277                     @Override\r
278                     public void drop(DropTargetEvent event) {\r
279                         label.setBackground(null);\r
280                         ResourceArray[] data = parseEventData(event);\r
281                         if (data == null || data.length != 1) {\r
282                             event.detail = DND.DROP_NONE;\r
283                             return;\r
284                         }\r
285                         final ResourceArray array = data[0];\r
286                         final Resource r = array.resources[array.resources.length - 1];\r
287 \r
288                         label.setData(r);\r
289                         try {\r
290                                                 label.setText(session.syncRequest(new Read<String>() {\r
291                                                         @Override\r
292                                                         public String perform(ReadGraph graph)\r
293                                                                 throws DatabaseException {\r
294                                                                 return NameUtils.getSafeName(graph, r);\r
295                                                         }\r
296                                                 }));\r
297                                         } catch (DatabaseException e) {\r
298                                                 e.printStackTrace();\r
299                                         }\r
300                     }\r
301 \r
302                     private ResourceArray[] parseEventData(DropTargetEvent event) {\r
303                         //System.out.println("DATA: " + event.data);\r
304                         if (event.data instanceof String) {\r
305                             try {\r
306                                 SerialisationSupport support = session.getService(SerialisationSupport.class);\r
307                                 return ResourceTransferUtils.readStringTransferable(support.getResourceSerializer(), (String) event.data).toResourceArrayArray();\r
308                             } catch (IllegalArgumentException e) {\r
309                                 e.printStackTrace();\r
310                             } catch (IOException e) {\r
311                                 e.printStackTrace();\r
312                             } catch (InvalidResourceReferenceException e) {\r
313                                 e.printStackTrace();\r
314                             }\r
315                         }\r
316                         ResourceArray[] ret = ResourceAdaptionUtils.toResourceArrays(event.data);\r
317                         if (ret.length > 0)\r
318                             return ret;\r
319                         return null;\r
320                     }\r
321                 });\r
322 \r
323                 return label;\r
324             }\r
325         \r
326         \r
327         \r
328         \r
329         \r
330         \r
331 }\r