]> gerrit.simantics Code Review - simantics/interop.git/blob - org.simantics.interop/src/org/simantics/interop/test/GraphComparatorViewer.java
Subgraph difference tester
[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.exception.DatabaseException;\r
43 import org.simantics.db.exception.InvalidResourceReferenceException;\r
44 import org.simantics.db.exception.ServiceException;\r
45 import org.simantics.db.exception.ValidationException;\r
46 import org.simantics.db.request.Read;\r
47 import org.simantics.db.service.SerialisationSupport;\r
48 import org.simantics.layer0.utils.direct.GraphUtils;\r
49 import org.simantics.ui.SimanticsUI;\r
50 import org.simantics.ui.dnd.LocalObjectTransfer;\r
51 import org.simantics.ui.dnd.ResourceReferenceTransfer;\r
52 import org.simantics.ui.dnd.ResourceTransferUtils;\r
53 import org.simantics.ui.utils.ResourceAdaptionUtils;\r
54 import org.simantics.utils.datastructures.BijectionMap;\r
55 \r
56 /**\r
57  * Simple multi line text viewer for seeing differences in two subgraphs. \r
58  * \r
59  * @author Marko Luukkainen <marko.luukkainen@vtt.fi>\r
60  *\r
61  */\r
62 public class GraphComparatorViewer extends ViewPart{\r
63         \r
64         private Session session;\r
65 \r
66         private Composite composite;\r
67         \r
68         private Label resourceText1;\r
69         private Label resourceText2;\r
70         \r
71         private Text text1;\r
72         private Text text2;\r
73         \r
74         private GraphComparator comparator = new GraphComparator();\r
75         \r
76         @Override\r
77         public void createPartControl(Composite parent) {\r
78                 composite = new Composite(parent, SWT.NONE);\r
79                 composite.setLayout(new GridLayout(2, false));\r
80                 \r
81                 session = SimanticsUI.getSession();\r
82                 \r
83                 Composite topComposite = new Composite(composite, SWT.BORDER);\r
84                 topComposite.setLayout(new GridLayout(3, false));\r
85                 text1 = new Text(composite, SWT.MULTI|SWT.V_SCROLL);\r
86                 text2 = new Text(composite, SWT.MULTI|SWT.V_SCROLL);\r
87                 \r
88                 GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).grab(true, false).span(2, 1).applyTo(topComposite);\r
89                 GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, true).applyTo(text1);\r
90                 GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, true).applyTo(text2);\r
91                 \r
92                 resourceText1 = createDropLabel(topComposite);\r
93                 resourceText2 = createDropLabel(topComposite);\r
94                 \r
95                 Button button = new Button(topComposite, SWT.PUSH);\r
96                 button.setText("Compare");\r
97                 button.addSelectionListener(new SelectionAdapter() {\r
98                         @Override\r
99                         public void widgetSelected(SelectionEvent e) {\r
100                                 compare();\r
101                         }\r
102                 });\r
103                 \r
104         }\r
105         \r
106         \r
107         \r
108         private void compare() {\r
109                 text1.setText("");\r
110                 text2.setText("");\r
111                 final Resource r1 = (Resource)resourceText1.getData();\r
112                 final Resource r2 = (Resource)resourceText2.getData();\r
113                 if (r1 == null || r2 == null) {\r
114                         if (r1 == null)\r
115                                 text1.setText("Missing input!");\r
116                         if (r2 == null)\r
117                                 text2.setText("Missing input!");\r
118                         return; \r
119                 }\r
120                 \r
121                 session.asyncRequest(new ReadRequest() {\r
122                         \r
123                         @Override\r
124                         public void run(final ReadGraph graph) throws DatabaseException {\r
125                                 comparator.clearRels();\r
126                                 comparator.addTraversed(graph.getBuiltins().ConsistsOf);\r
127 //                              comparator.addTested(graph.getBuiltins().IsWeaklyRelatedTo);\r
128                                 comparator.test(graph, r1, r2);\r
129                                 BijectionMap<Statement, Statement> map = comparator.getComparable();\r
130                                 Map<Statement, Integer> indices = new HashMap<Statement, Integer>();\r
131                                 final StringBuilder sb1 = new StringBuilder();\r
132                                 int index = 0;\r
133                                 for (Statement s : comparator.getChanges1()) {\r
134                                         String sub;\r
135                                         try {\r
136                                                 \r
137                                                 sub = GraphUtils.getReadableName(graph, s.getSubject());\r
138                                                 String pre = GraphUtils.getReadableName(graph, s.getPredicate());\r
139                                                 String obj = GraphUtils.getReadableName(graph, s.getObject());\r
140                                                 if (map.containsLeft(s)) {\r
141                                                         index++;\r
142                                                         indices.put(s, index);\r
143                                                         sb1.append("["+index + "] ");\r
144                                                 }\r
145                                                 sb1.append(sub + " - " + pre + " - " + obj + "\n");\r
146                                         } catch (ValidationException e) {\r
147                                                 e.printStackTrace();\r
148                                         } catch (ServiceException e) {\r
149                                                 e.printStackTrace();\r
150                                         }\r
151                                         \r
152                                 }\r
153                                 final StringBuilder sb2 = new StringBuilder();\r
154                                 for (Statement s : comparator.getChanges2()) {\r
155                                         String sub;\r
156                                         try {\r
157                                                 sub = GraphUtils.getReadableName(graph, s.getSubject());\r
158                                                 String pre = GraphUtils.getReadableName(graph, s.getPredicate());\r
159                                                 String obj = GraphUtils.getReadableName(graph, s.getObject());\r
160                                                 if (map.containsRight(s)) {\r
161                                                         index = indices.get(map.getLeft(s));\r
162                                                         sb2.append("["+index + "] ");\r
163                                                 }\r
164                                                 sb2.append(sub + " - " + pre + " - " + obj + "\n");\r
165                                         } catch (ValidationException e) {\r
166                                                 e.printStackTrace();\r
167                                         } catch (ServiceException e) {\r
168                                                 e.printStackTrace();\r
169                                         }\r
170                                         \r
171                                 }\r
172                                 Display.getDefault().asyncExec(new Runnable() {                 \r
173                                         @Override\r
174                                         public void run() {\r
175                                                 text1.setText(sb1.toString());\r
176                                                 text2.setText(sb2.toString());\r
177                                                 \r
178                                         }\r
179                                 });\r
180                         }\r
181                 });\r
182         }\r
183         \r
184         @Override\r
185         public void setFocus() {\r
186                 composite.setFocus();\r
187         }\r
188         \r
189         @Override\r
190         public void dispose() {\r
191                 super.dispose();\r
192                 \r
193         }\r
194         \r
195         \r
196         // copy-paste from GraphDebugger\r
197          public Label createDropLabel(Composite parent) {\r
198                 final Label label = new Label(parent, SWT.BORDER);\r
199                 label.setAlignment(SWT.CENTER);\r
200                 label.setText("Drag a resource here to examine it in this debugger!");\r
201                 label.setForeground(parent.getDisplay().getSystemColor(SWT.COLOR_DARK_GRAY));\r
202                 GridData data = new GridData(SWT.FILL, SWT.TOP, true, false);\r
203                 data.heightHint = 16;\r
204                 label.setLayoutData(data);\r
205 \r
206                 // Add resource id drop support to the drop-area.\r
207                 DropTarget dropTarget = new DropTarget(label, DND.DROP_LINK | DND.DROP_COPY);\r
208                 dropTarget.setTransfer(new Transfer[] { TextTransfer.getInstance(), ResourceReferenceTransfer.getInstance(), LocalObjectTransfer.getTransfer() });\r
209                 dropTarget.addDropListener(new DropTargetAdapter() {\r
210                     @Override\r
211                     public void dragEnter(DropTargetEvent event) {\r
212                         event.detail = DND.DROP_LINK;\r
213                         //label.setBackground(green);\r
214                         return;\r
215                     }\r
216                     @Override\r
217                     public void dragLeave(DropTargetEvent event) {\r
218                         label.setBackground(null);\r
219                     }\r
220 \r
221                     @Override\r
222                     public void drop(DropTargetEvent event) {\r
223                         label.setBackground(null);\r
224                         ResourceArray[] data = parseEventData(event);\r
225                         if (data == null || data.length != 1) {\r
226                             event.detail = DND.DROP_NONE;\r
227                             return;\r
228                         }\r
229                         final ResourceArray array = data[0];\r
230                         final Resource r = array.resources[array.resources.length - 1];\r
231 \r
232                         label.setData(r);\r
233                         try {\r
234                                                 label.setText(session.syncRequest(new Read<String>() {\r
235                                                         @Override\r
236                                                         public String perform(ReadGraph graph)\r
237                                                                 throws DatabaseException {\r
238                                                                 return GraphUtils.getReadableName(graph, r);\r
239                                                         }\r
240                                                 }));\r
241                                         } catch (DatabaseException e) {\r
242                                                 e.printStackTrace();\r
243                                         }\r
244                     }\r
245 \r
246                     private ResourceArray[] parseEventData(DropTargetEvent event) {\r
247                         //System.out.println("DATA: " + event.data);\r
248                         if (event.data instanceof String) {\r
249                             try {\r
250                                 SerialisationSupport support = session.getService(SerialisationSupport.class);\r
251                                 return ResourceTransferUtils.readStringTransferable(support.getResourceSerializer(), (String) event.data).toResourceArrayArray();\r
252                             } catch (IllegalArgumentException e) {\r
253                                 e.printStackTrace();\r
254                             } catch (IOException e) {\r
255                                 e.printStackTrace();\r
256                             } catch (InvalidResourceReferenceException e) {\r
257                                 e.printStackTrace();\r
258                             }\r
259                         }\r
260                         ResourceArray[] ret = ResourceAdaptionUtils.toResourceArrays(event.data);\r
261                         if (ret.length > 0)\r
262                             return ret;\r
263                         return null;\r
264                     }\r
265                 });\r
266 \r
267                 return label;\r
268             }\r
269         \r
270         \r
271         \r
272         \r
273         \r
274         \r
275 }\r