]> gerrit.simantics Code Review - simantics/interop.git/blob - org.simantics.interop/src/org/simantics/interop/test/GraphComparatorViewer.java
Comparator bug fixes.
[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         private GraphComparator comparator = new GraphComparator();\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                                 comparator.clearRels();\r
128                                 Layer0 l0 = Layer0.getInstance(graph);\r
129                                 comparator.addTraversed(l0.ConsistsOf);\r
130                                 comparator.addTested(l0.IsWeaklyRelatedTo);\r
131                                 comparator.test(graph, r1, r2);\r
132                                 BijectionMap<Statement, Statement> map = comparator.getComparable();\r
133                                 Map<Statement, Integer> indices = new HashMap<Statement, Integer>();\r
134                                 final StringBuilder sb1 = new StringBuilder();\r
135                                 final StringBuilder sb2 = new StringBuilder();\r
136                                 int index = 0;\r
137                                 \r
138                                 GraphChanges changes = comparator.getChanges();\r
139                                 \r
140                                 for (Pair<Statement,Statement> mod : changes.getModifications()) {\r
141                                         {\r
142                                                 String sub;\r
143                                                 try {\r
144                                                         Statement s = mod.first;\r
145                                                         sub = NameUtils.getSafeName(graph, s.getSubject());\r
146                                                         String pre = NameUtils.getSafeName(graph, s.getPredicate());\r
147                                                         String obj = NameUtils.getSafeName(graph, s.getObject());\r
148                                                         if (map.containsLeft(s)) {\r
149                                                                 index++;\r
150                                                                 indices.put(s, index);\r
151                                                                 sb1.append("["+index + "] ");\r
152                                                         }\r
153                                                         sb1.append(sub + " - " + pre + " - " + obj);\r
154                                                         sb1.append(" ["+s.getSubject().getResourceId() + " " + s.getPredicate().getResourceId() + " " + s.getObject().getResourceId()+"]");\r
155                                                         sb1.append("\n");\r
156                                                 } catch (ValidationException e) {\r
157                                                         e.printStackTrace();\r
158                                                 } catch (ServiceException e) {\r
159                                                         e.printStackTrace();\r
160                                                 }\r
161                                         }\r
162                                         {\r
163                                                 String sub;\r
164                                                 try {\r
165                                                         Statement s = mod.second;\r
166                                                         sub = NameUtils.getSafeName(graph, s.getSubject());\r
167                                                         String pre = NameUtils.getSafeName(graph, s.getPredicate());\r
168                                                         String obj = NameUtils.getSafeName(graph, s.getObject());\r
169                                                         if (map.containsRight(s)) {\r
170                                                                 index = indices.get(map.getLeft(s));\r
171                                                                 sb2.append("["+index + "] ");\r
172                                                         }\r
173                                                         sb2.append(sub + " - " + pre + " - " + obj);\r
174                                                         sb2.append(" ["+s.getSubject().getResourceId() + " " + s.getPredicate().getResourceId() + " " + s.getObject().getResourceId()+"]");\r
175                                                         sb2.append("\n");\r
176                                                 } catch (ValidationException e) {\r
177                                                         e.printStackTrace();\r
178                                                 } catch (ServiceException e) {\r
179                                                         e.printStackTrace();\r
180                                                 }\r
181                                         }\r
182                                 }\r
183                                 for (Statement s : changes.getDeletions()) {\r
184                                         String sub;\r
185                                         try {\r
186                                                 \r
187                                                 sub = NameUtils.getSafeName(graph, s.getSubject());\r
188                                                 String pre = NameUtils.getSafeName(graph, s.getPredicate());\r
189                                                 String obj = NameUtils.getSafeName(graph, s.getObject());\r
190                                                 if (map.containsLeft(s)) {\r
191                                                         index++;\r
192                                                         indices.put(s, index);\r
193                                                         sb1.append("["+index + "] ");\r
194                                                 }\r
195                                                 sb1.append(sub + " - " + pre + " - " + obj);\r
196                                                 sb1.append(" ["+s.getSubject().getResourceId() + " " + s.getPredicate().getResourceId() + " " + s.getObject().getResourceId()+"]");\r
197                                                 sb1.append("\n");\r
198                                         } catch (ValidationException e) {\r
199                                                 e.printStackTrace();\r
200                                         } catch (ServiceException e) {\r
201                                                 e.printStackTrace();\r
202                                         }\r
203                                         \r
204                                 }\r
205                                 \r
206                                 for (Statement s : changes.getAdditions()) {\r
207                                         String sub;\r
208                                         try {\r
209                                                 sub = NameUtils.getSafeName(graph, s.getSubject());\r
210                                                 String pre = NameUtils.getSafeName(graph, s.getPredicate());\r
211                                                 String obj = NameUtils.getSafeName(graph, s.getObject());\r
212                                                 if (map.containsRight(s)) {\r
213                                                         index = indices.get(map.getLeft(s));\r
214                                                         sb2.append("["+index + "] ");\r
215                                                 }\r
216                                                 sb2.append(sub + " - " + pre + " - " + obj);\r
217                                                 sb2.append(" ["+s.getSubject().getResourceId() + " " + s.getPredicate().getResourceId() + " " + s.getObject().getResourceId()+"]");\r
218                                                 sb2.append("\n");\r
219                                         } catch (ValidationException e) {\r
220                                                 e.printStackTrace();\r
221                                         } catch (ServiceException e) {\r
222                                                 e.printStackTrace();\r
223                                         }\r
224                                         \r
225                                 }\r
226                                 Display.getDefault().asyncExec(new Runnable() {                 \r
227                                         @Override\r
228                                         public void run() {\r
229                                                 text1.setText(sb1.toString());\r
230                                                 text2.setText(sb2.toString());\r
231                                                 \r
232                                         }\r
233                                 });\r
234                         }\r
235                 });\r
236         }\r
237         \r
238         @Override\r
239         public void setFocus() {\r
240                 composite.setFocus();\r
241         }\r
242         \r
243         @Override\r
244         public void dispose() {\r
245                 super.dispose();\r
246                 \r
247         }\r
248         \r
249         \r
250         // copy-paste from GraphDebugger\r
251          public Label createDropLabel(Composite parent) {\r
252                 final Label label = new Label(parent, SWT.BORDER);\r
253                 label.setAlignment(SWT.CENTER);\r
254                 label.setText("Drag a resource here to examine it in this debugger!");\r
255                 label.setForeground(parent.getDisplay().getSystemColor(SWT.COLOR_DARK_GRAY));\r
256                 GridData data = new GridData(SWT.FILL, SWT.TOP, true, false);\r
257                 data.heightHint = 16;\r
258                 label.setLayoutData(data);\r
259 \r
260                 // Add resource id drop support to the drop-area.\r
261                 DropTarget dropTarget = new DropTarget(label, DND.DROP_LINK | DND.DROP_COPY);\r
262                 dropTarget.setTransfer(new Transfer[] { TextTransfer.getInstance(), ResourceReferenceTransfer.getInstance(), LocalObjectTransfer.getTransfer() });\r
263                 dropTarget.addDropListener(new DropTargetAdapter() {\r
264                     @Override\r
265                     public void dragEnter(DropTargetEvent event) {\r
266                         event.detail = DND.DROP_LINK;\r
267                         //label.setBackground(green);\r
268                         return;\r
269                     }\r
270                     @Override\r
271                     public void dragLeave(DropTargetEvent event) {\r
272                         label.setBackground(null);\r
273                     }\r
274 \r
275                     @Override\r
276                     public void drop(DropTargetEvent event) {\r
277                         label.setBackground(null);\r
278                         ResourceArray[] data = parseEventData(event);\r
279                         if (data == null || data.length != 1) {\r
280                             event.detail = DND.DROP_NONE;\r
281                             return;\r
282                         }\r
283                         final ResourceArray array = data[0];\r
284                         final Resource r = array.resources[array.resources.length - 1];\r
285 \r
286                         label.setData(r);\r
287                         try {\r
288                                                 label.setText(session.syncRequest(new Read<String>() {\r
289                                                         @Override\r
290                                                         public String perform(ReadGraph graph)\r
291                                                                 throws DatabaseException {\r
292                                                                 return NameUtils.getSafeName(graph, r);\r
293                                                         }\r
294                                                 }));\r
295                                         } catch (DatabaseException e) {\r
296                                                 e.printStackTrace();\r
297                                         }\r
298                     }\r
299 \r
300                     private ResourceArray[] parseEventData(DropTargetEvent event) {\r
301                         //System.out.println("DATA: " + event.data);\r
302                         if (event.data instanceof String) {\r
303                             try {\r
304                                 SerialisationSupport support = session.getService(SerialisationSupport.class);\r
305                                 return ResourceTransferUtils.readStringTransferable(support.getResourceSerializer(), (String) event.data).toResourceArrayArray();\r
306                             } catch (IllegalArgumentException e) {\r
307                                 e.printStackTrace();\r
308                             } catch (IOException e) {\r
309                                 e.printStackTrace();\r
310                             } catch (InvalidResourceReferenceException e) {\r
311                                 e.printStackTrace();\r
312                             }\r
313                         }\r
314                         ResourceArray[] ret = ResourceAdaptionUtils.toResourceArrays(event.data);\r
315                         if (ret.length > 0)\r
316                             return ret;\r
317                         return null;\r
318                     }\r
319                 });\r
320 \r
321                 return label;\r
322             }\r
323         \r
324         \r
325         \r
326         \r
327         \r
328         \r
329 }\r