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