]> gerrit.simantics Code Review - simantics/interop.git/blob - org.simantics.interop/src/org/simantics/interop/test/GraphComparatorViewer.java
ComparatorView's comparator can be configured.
[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.File;\r
15 import java.io.FileNotFoundException;\r
16 import java.io.FileReader;\r
17 import java.io.IOException;\r
18 import java.io.PrintStream;\r
19 import java.io.Serializable;\r
20 import java.util.ArrayList;\r
21 import java.util.Collection;\r
22 import java.util.HashMap;\r
23 import java.util.List;\r
24 import java.util.Map;\r
25 import java.util.Stack;\r
26 \r
27 import javax.xml.parsers.SAXParser;\r
28 import javax.xml.parsers.SAXParserFactory;\r
29 \r
30 import org.eclipse.jface.action.Action;\r
31 import org.eclipse.jface.action.IMenuListener;\r
32 import org.eclipse.jface.action.IMenuManager;\r
33 import org.eclipse.jface.action.MenuManager;\r
34 import org.eclipse.jface.dialogs.Dialog;\r
35 import org.eclipse.jface.dialogs.IDialogConstants;\r
36 import org.eclipse.jface.dialogs.MessageDialog;\r
37 import org.eclipse.jface.layout.GridDataFactory;\r
38 import org.eclipse.jface.viewers.IStructuredContentProvider;\r
39 import org.eclipse.jface.viewers.IStructuredSelection;\r
40 import org.eclipse.jface.viewers.LabelProvider;\r
41 import org.eclipse.jface.viewers.ListViewer;\r
42 import org.eclipse.jface.viewers.Viewer;\r
43 import org.eclipse.jface.window.IShellProvider;\r
44 import org.eclipse.swt.SWT;\r
45 import org.eclipse.swt.dnd.DND;\r
46 import org.eclipse.swt.dnd.DropTarget;\r
47 import org.eclipse.swt.dnd.DropTargetAdapter;\r
48 import org.eclipse.swt.dnd.DropTargetEvent;\r
49 import org.eclipse.swt.dnd.TextTransfer;\r
50 import org.eclipse.swt.dnd.Transfer;\r
51 import org.eclipse.swt.events.SelectionAdapter;\r
52 import org.eclipse.swt.events.SelectionEvent;\r
53 import org.eclipse.swt.layout.FillLayout;\r
54 import org.eclipse.swt.layout.GridData;\r
55 import org.eclipse.swt.layout.GridLayout;\r
56 import org.eclipse.swt.widgets.Button;\r
57 import org.eclipse.swt.widgets.Composite;\r
58 import org.eclipse.swt.widgets.Control;\r
59 import org.eclipse.swt.widgets.Display;\r
60 import org.eclipse.swt.widgets.FileDialog;\r
61 import org.eclipse.swt.widgets.Group;\r
62 import org.eclipse.swt.widgets.Label;\r
63 import org.eclipse.swt.widgets.Shell;\r
64 import org.eclipse.swt.widgets.Text;\r
65 import org.eclipse.ui.part.ViewPart;\r
66 import org.simantics.db.ReadGraph;\r
67 import org.simantics.db.Resource;\r
68 import org.simantics.db.Session;\r
69 import org.simantics.db.Statement;\r
70 import org.simantics.db.common.ResourceArray;\r
71 import org.simantics.db.common.request.ReadRequest;\r
72 import org.simantics.db.common.utils.NameUtils;\r
73 import org.simantics.db.exception.DatabaseException;\r
74 import org.simantics.db.exception.InvalidResourceReferenceException;\r
75 import org.simantics.db.exception.ServiceException;\r
76 import org.simantics.db.exception.ValidationException;\r
77 import org.simantics.db.request.Read;\r
78 import org.simantics.db.service.SerialisationSupport;\r
79 import org.simantics.layer0.Layer0;\r
80 import org.simantics.ui.SimanticsUI;\r
81 import org.simantics.ui.dnd.LocalObjectTransfer;\r
82 import org.simantics.ui.dnd.ResourceReferenceTransfer;\r
83 import org.simantics.ui.dnd.ResourceTransferUtils;\r
84 import org.simantics.ui.utils.ResourceAdaptionUtils;\r
85 import org.simantics.utils.datastructures.BijectionMap;\r
86 import org.simantics.utils.datastructures.Pair;\r
87 import org.simantics.utils.ui.ExceptionUtils;\r
88 import org.xml.sax.Attributes;\r
89 import org.xml.sax.InputSource;\r
90 import org.xml.sax.SAXException;\r
91 import org.xml.sax.XMLReader;\r
92 import org.xml.sax.helpers.DefaultHandler;\r
93 \r
94 /**\r
95  * Simple multiline text viewer for seeing differences in two subgraphs. \r
96  * \r
97  * @author Marko Luukkainen <marko.luukkainen@vtt.fi>\r
98  *\r
99  */\r
100 public class GraphComparatorViewer extends ViewPart{\r
101         \r
102         private Session session;\r
103 \r
104         private Composite composite;\r
105         \r
106         private Label resourceText1;\r
107         private Label resourceText2;\r
108         \r
109         private Text text1;\r
110         private Text text2;\r
111         \r
112         \r
113         private List<Resource> traversed = new ArrayList<Resource>();\r
114         private List<Resource> tested = new ArrayList<Resource>();\r
115         private List<Resource> strong = new ArrayList<Resource>();\r
116         private List<Resource> nonTraversed = new ArrayList<Resource>();\r
117         private List<Resource> nonTested = new ArrayList<Resource>();\r
118 \r
119         \r
120         @Override\r
121         public void createPartControl(Composite parent) {\r
122                 composite = new Composite(parent, SWT.NONE);\r
123                 composite.setLayout(new GridLayout(2, false));\r
124                 \r
125                 session = SimanticsUI.getSession();\r
126                 \r
127                 Composite topComposite = new Composite(composite, SWT.BORDER);\r
128                 topComposite.setLayout(new GridLayout(3, false));\r
129                 text1 = new Text(composite, SWT.MULTI|SWT.V_SCROLL);\r
130                 text2 = new Text(composite, SWT.MULTI|SWT.V_SCROLL);\r
131                 \r
132                 GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).grab(true, false).span(2, 1).applyTo(topComposite);\r
133                 GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, true).applyTo(text1);\r
134                 GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, true).applyTo(text2);\r
135                 \r
136                 resourceText1 = createDropLabel(topComposite);\r
137                 resourceText2 = createDropLabel(topComposite);\r
138                 \r
139                 Button button = new Button(topComposite, SWT.PUSH);\r
140                 button.setText("Compare");\r
141                 button.addSelectionListener(new SelectionAdapter() {\r
142                         @Override\r
143                         public void widgetSelected(SelectionEvent e) {\r
144                                 compare();\r
145                         }\r
146                 });\r
147                 \r
148                 defaultConf();\r
149                 \r
150                 getViewSite().getActionBars().getToolBarManager().add(new Action("Config") {\r
151                         @Override\r
152                         public void run() {\r
153                                 ConfigurationDialog dialog = new ConfigurationDialog(getSite().getShell());\r
154                                 dialog.open();\r
155                         }\r
156                 });\r
157                 \r
158         }\r
159         \r
160         private void defaultConf() {\r
161                 traversed.clear();\r
162                 tested.clear();\r
163                 strong.clear();\r
164                 nonTested.clear();\r
165                 nonTraversed.clear();\r
166                 try {\r
167                 session.syncRequest(new ReadRequest() {\r
168                         @Override\r
169                         public void run(ReadGraph graph) throws DatabaseException {\r
170                                 Layer0 l0 = Layer0.getInstance(graph);\r
171                                 traversed.add(l0.ConsistsOf);\r
172                                 tested.add(l0.IsWeaklyRelatedTo);\r
173                                 nonTraversed.add(l0.InstanceOf);\r
174                         }\r
175                 });\r
176                 } catch (Exception e) {\r
177                         ExceptionUtils.logAndShowError(e);\r
178                 }\r
179         }\r
180         \r
181         private void compare() {\r
182                 text1.setText("");\r
183                 text2.setText("");\r
184                 final Resource r1 = (Resource)resourceText1.getData();\r
185                 final Resource r2 = (Resource)resourceText2.getData();\r
186                 if (r1 == null || r2 == null) {\r
187                         if (r1 == null)\r
188                                 text1.setText("Missing input!");\r
189                         if (r2 == null)\r
190                                 text2.setText("Missing input!");\r
191                         return; \r
192                 }\r
193                 \r
194                 session.asyncRequest(new ReadRequest() {\r
195                         \r
196                         @Override\r
197                         public void run(final ReadGraph graph) throws DatabaseException {\r
198                                 GraphComparator comparator = new GraphComparator(r1,r2);\r
199                                 \r
200                                 comparator.addTested(tested);\r
201                                 comparator.addTraversed(traversed);\r
202                                 comparator.addNonTested(nonTested);\r
203                                 comparator.addNonTraversed(nonTraversed);\r
204                                 comparator.addStrong(strong);\r
205                                 \r
206                                 comparator.test(graph);\r
207                                 BijectionMap<Statement, Statement> map = comparator.getComparableStatements();\r
208                                 Map<Statement, Integer> indices = new HashMap<Statement, Integer>();\r
209                                 final StringBuilder sb1 = new StringBuilder();\r
210                                 final StringBuilder sb2 = new StringBuilder();\r
211                                 int index = 0;\r
212                                 \r
213                                 GraphChanges changes = comparator.getChanges();\r
214                                 \r
215                                 for (Pair<Statement,Statement> mod : changes.getModifications()) {\r
216                                         {\r
217                                                 String sub;\r
218                                                 try {\r
219                                                         Statement s = mod.first;\r
220                                                         sub = NameUtils.getSafeName(graph, s.getSubject());\r
221                                                         String pre = NameUtils.getSafeName(graph, s.getPredicate());\r
222                                                         String obj = NameUtils.getSafeName(graph, s.getObject());\r
223                                                         if (map.containsLeft(s)) {\r
224                                                                 index++;\r
225                                                                 indices.put(s, index);\r
226                                                                 sb1.append("["+index + "] ");\r
227                                                         }\r
228                                                         sb1.append(sub + " - " + pre + " - " + obj);\r
229                                                         sb1.append(" ["+s.getSubject().getResourceId() + " " + s.getPredicate().getResourceId() + " " + s.getObject().getResourceId()+"]");\r
230                                                         sb1.append("\n");\r
231                                                 } catch (ValidationException e) {\r
232                                                         e.printStackTrace();\r
233                                                 } catch (ServiceException e) {\r
234                                                         e.printStackTrace();\r
235                                                 }\r
236                                         }\r
237                                         {\r
238                                                 String sub;\r
239                                                 try {\r
240                                                         Statement s = mod.second;\r
241                                                         sub = NameUtils.getSafeName(graph, s.getSubject());\r
242                                                         String pre = NameUtils.getSafeName(graph, s.getPredicate());\r
243                                                         String obj = NameUtils.getSafeName(graph, s.getObject());\r
244                                                         if (map.containsRight(s)) {\r
245                                                                 index = indices.get(map.getLeft(s));\r
246                                                                 sb2.append("["+index + "] ");\r
247                                                         }\r
248                                                         sb2.append(sub + " - " + pre + " - " + obj);\r
249                                                         sb2.append(" ["+s.getSubject().getResourceId() + " " + s.getPredicate().getResourceId() + " " + s.getObject().getResourceId()+"]");\r
250                                                         sb2.append("\n");\r
251                                                 } catch (ValidationException e) {\r
252                                                         e.printStackTrace();\r
253                                                 } catch (ServiceException e) {\r
254                                                         e.printStackTrace();\r
255                                                 }\r
256                                         }\r
257                                 }\r
258                                 for (Statement s : changes.getDeletions()) {\r
259                                         String sub;\r
260                                         try {\r
261                                                 \r
262                                                 sub = NameUtils.getSafeName(graph, s.getSubject());\r
263                                                 String pre = NameUtils.getSafeName(graph, s.getPredicate());\r
264                                                 String obj = NameUtils.getSafeName(graph, s.getObject());\r
265                                                 if (map.containsLeft(s)) {\r
266                                                         index++;\r
267                                                         indices.put(s, index);\r
268                                                         sb1.append("["+index + "] ");\r
269                                                 }\r
270                                                 sb1.append(sub + " - " + pre + " - " + obj);\r
271                                                 sb1.append(" ["+s.getSubject().getResourceId() + " " + s.getPredicate().getResourceId() + " " + s.getObject().getResourceId()+"]");\r
272                                                 sb1.append("\n");\r
273                                         } catch (ValidationException e) {\r
274                                                 e.printStackTrace();\r
275                                         } catch (ServiceException e) {\r
276                                                 e.printStackTrace();\r
277                                         }\r
278                                         \r
279                                 }\r
280                                 \r
281                                 for (Statement s : changes.getAdditions()) {\r
282                                         String sub;\r
283                                         try {\r
284                                                 sub = NameUtils.getSafeName(graph, s.getSubject());\r
285                                                 String pre = NameUtils.getSafeName(graph, s.getPredicate());\r
286                                                 String obj = NameUtils.getSafeName(graph, s.getObject());\r
287                                                 if (map.containsRight(s)) {\r
288                                                         index = indices.get(map.getLeft(s));\r
289                                                         sb2.append("["+index + "] ");\r
290                                                 }\r
291                                                 sb2.append(sub + " - " + pre + " - " + obj);\r
292                                                 sb2.append(" ["+s.getSubject().getResourceId() + " " + s.getPredicate().getResourceId() + " " + s.getObject().getResourceId()+"]");\r
293                                                 sb2.append("\n");\r
294                                         } catch (ValidationException e) {\r
295                                                 e.printStackTrace();\r
296                                         } catch (ServiceException e) {\r
297                                                 e.printStackTrace();\r
298                                         }\r
299                                         \r
300                                 }\r
301                                 Display.getDefault().asyncExec(new Runnable() {                 \r
302                                         @Override\r
303                                         public void run() {\r
304                                                 text1.setText(sb1.toString());\r
305                                                 text2.setText(sb2.toString());\r
306                                                 \r
307                                         }\r
308                                 });\r
309                         }\r
310                 });\r
311         }\r
312         \r
313         @Override\r
314         public void setFocus() {\r
315                 composite.setFocus();\r
316         }\r
317         \r
318         @Override\r
319         public void dispose() {\r
320                 super.dispose();\r
321                 \r
322         }\r
323         \r
324         \r
325         // copy-paste from GraphDebugger\r
326          public Label createDropLabel(Composite parent) {\r
327                 final Label label = new Label(parent, SWT.BORDER);\r
328                 label.setAlignment(SWT.CENTER);\r
329                 label.setText("Drag a resource here to examine it in this debugger!");\r
330                 label.setForeground(parent.getDisplay().getSystemColor(SWT.COLOR_DARK_GRAY));\r
331                 GridData data = new GridData(SWT.FILL, SWT.TOP, true, false);\r
332                 data.heightHint = 16;\r
333                 label.setLayoutData(data);\r
334 \r
335                 // Add resource id drop support to the drop-area.\r
336                 DropTarget dropTarget = new DropTarget(label, DND.DROP_LINK | DND.DROP_COPY);\r
337                 dropTarget.setTransfer(new Transfer[] { TextTransfer.getInstance(), ResourceReferenceTransfer.getInstance(), LocalObjectTransfer.getTransfer() });\r
338                 dropTarget.addDropListener(new DropTargetAdapter() {\r
339                     @Override\r
340                     public void dragEnter(DropTargetEvent event) {\r
341                         event.detail = DND.DROP_LINK;\r
342                         //label.setBackground(green);\r
343                         return;\r
344                     }\r
345                     @Override\r
346                     public void dragLeave(DropTargetEvent event) {\r
347                         label.setBackground(null);\r
348                     }\r
349 \r
350                     @Override\r
351                     public void drop(DropTargetEvent event) {\r
352                         label.setBackground(null);\r
353                         ResourceArray[] data = parseEventData(event);\r
354                         if (data == null || data.length != 1) {\r
355                             event.detail = DND.DROP_NONE;\r
356                             return;\r
357                         }\r
358                         final ResourceArray array = data[0];\r
359                         final Resource r = array.resources[array.resources.length - 1];\r
360 \r
361                         label.setData(r);\r
362                         try {\r
363                                                 label.setText(session.syncRequest(new Read<String>() {\r
364                                                         @Override\r
365                                                         public String perform(ReadGraph graph)\r
366                                                                 throws DatabaseException {\r
367                                                                 return NameUtils.getSafeName(graph, r);\r
368                                                         }\r
369                                                 }));\r
370                                         } catch (DatabaseException e) {\r
371                                                 e.printStackTrace();\r
372                                         }\r
373                     }\r
374 \r
375                     private ResourceArray[] parseEventData(DropTargetEvent event) {\r
376                         //System.out.println("DATA: " + event.data);\r
377                         if (event.data instanceof String) {\r
378                             try {\r
379                                 SerialisationSupport support = session.getService(SerialisationSupport.class);\r
380                                 return ResourceTransferUtils.readStringTransferable(support.getResourceSerializer(), (String) event.data).toResourceArrayArray();\r
381                             } catch (IllegalArgumentException e) {\r
382                                 e.printStackTrace();\r
383                             } catch (IOException e) {\r
384                                 e.printStackTrace();\r
385                             } catch (InvalidResourceReferenceException e) {\r
386                                 e.printStackTrace();\r
387                             }\r
388                         }\r
389                         ResourceArray[] ret = ResourceAdaptionUtils.toResourceArrays(event.data);\r
390                         if (ret.length > 0)\r
391                             return ret;\r
392                         return null;\r
393                     }\r
394                 });\r
395 \r
396                 return label;\r
397             }\r
398         \r
399         \r
400         \r
401         private class ConfigurationDialog extends Dialog {\r
402 \r
403                 protected ConfigurationDialog(Shell parentShell) {\r
404                         super(parentShell);\r
405                 }\r
406                 \r
407                 @Override\r
408                 protected void createButtonsForButtonBar(Composite parent) {\r
409                         createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);\r
410                         createButton(parent, IDialogConstants.CLIENT_ID+1, "Load", false);\r
411                         createButton(parent, IDialogConstants.CLIENT_ID+2, "Save", false);\r
412                 }\r
413                 \r
414                 @Override\r
415                 protected void buttonPressed(int buttonId) {\r
416                         super.buttonPressed(buttonId);\r
417                         if (buttonId == IDialogConstants.CLIENT_ID+1) {\r
418                                 //load\r
419                                 FileDialog dialog = new FileDialog(Display.getCurrent().getActiveShell(),SWT.OPEN);\r
420                                 dialog.setFilterExtensions(new String[]{"*.xml"});\r
421                                 String filename = dialog.open();\r
422                                 if (filename == null)\r
423                                 return;\r
424                                 try {\r
425                                         load(filename);\r
426                                         traversedViewer.refresh();\r
427                                         testedViewer.refresh();\r
428                                         strongViewer.refresh();\r
429                                         nonTestedViewer.refresh();\r
430                                         nonTraversedViewer.refresh();\r
431                                 } catch (Exception e1) {\r
432                                         MessageDialog.openError(Display.getCurrent().getActiveShell(), "Cannot load file" , e1.getMessage());\r
433                                 }\r
434                         } else if (buttonId == IDialogConstants.CLIENT_ID+2) {\r
435                                 //save\r
436                                 FileDialog dialog = new FileDialog(Display.getCurrent().getActiveShell(),SWT.SAVE);\r
437                         dialog.setFilterExtensions(new String[]{"*.xml"});\r
438                         String filename = dialog.open();\r
439                         if (filename == null)\r
440                                 return;\r
441                         try {\r
442                                 saveConf(filename);\r
443                                 if (!filename.endsWith("xml")) \r
444                                         filename += ".xml";\r
445                         } catch (FileNotFoundException e1) {\r
446                                 MessageDialog.openError(Display.getCurrent().getActiveShell(), "Cannot save file" , e1.getMessage());\r
447                                 } catch (IOException e1) {\r
448                                         MessageDialog.openError(Display.getCurrent().getActiveShell(), "Cannot save file" , e1.getMessage());\r
449                                 } catch (DatabaseException e1) {\r
450                                         MessageDialog.openError(Display.getCurrent().getActiveShell(), "Cannot save file" , e1.getMessage());\r
451                                 }\r
452                         }\r
453                 }\r
454                 \r
455                 private ListViewer traversedViewer;\r
456                 private ListViewer testedViewer;\r
457                 private ListViewer strongViewer;\r
458                 private ListViewer nonTraversedViewer;\r
459                 private ListViewer nonTestedViewer;\r
460                 \r
461                 @Override\r
462                 protected Control createDialogArea(Composite parent) {\r
463                          Composite composite = (Composite) super.createDialogArea(parent);\r
464                          composite.setLayout(new FillLayout(SWT.VERTICAL));\r
465                          \r
466                          Group group = new Group(composite, SWT.NONE);\r
467                          group.setText("Traversed");\r
468                          group.setLayout(new FillLayout());\r
469                          traversedViewer = new ListViewer(group);\r
470                          \r
471                          group = new Group(composite, SWT.NONE);\r
472                          group.setText("Tested");\r
473                          group.setLayout(new FillLayout());\r
474                          testedViewer = new ListViewer(group);\r
475                          \r
476                          group = new Group(composite, SWT.NONE);\r
477                          group.setText("Strong");\r
478                          group.setLayout(new FillLayout());\r
479                          strongViewer = new ListViewer(group);\r
480                          \r
481                          group = new Group(composite, SWT.NONE);\r
482                          group.setText("NonTraversed");\r
483                          group.setLayout(new FillLayout());\r
484                          nonTraversedViewer = new ListViewer(group);\r
485                          \r
486                          group = new Group(composite, SWT.NONE);\r
487                          group.setText("NonTested");\r
488                          group.setLayout(new FillLayout());\r
489                          nonTestedViewer = new ListViewer(group);\r
490                          \r
491                          traversedViewer.setContentProvider(new ResourceListContentProvider());\r
492                          traversedViewer.setLabelProvider(new ResourceLabelProvider());\r
493                          \r
494                          testedViewer.setContentProvider(new ResourceListContentProvider());\r
495                          testedViewer.setLabelProvider(new ResourceLabelProvider());\r
496                          \r
497                          strongViewer.setContentProvider(new ResourceListContentProvider());\r
498                          strongViewer.setLabelProvider(new ResourceLabelProvider());\r
499                          \r
500                          nonTraversedViewer.setContentProvider(new ResourceListContentProvider());\r
501                          nonTraversedViewer.setLabelProvider(new ResourceLabelProvider());\r
502                          \r
503                          nonTestedViewer.setContentProvider(new ResourceListContentProvider());\r
504                          nonTestedViewer.setLabelProvider(new ResourceLabelProvider());\r
505                          \r
506                          MenuManager strongManager = new MenuManager();\r
507                          strongManager.setRemoveAllWhenShown(true);\r
508                          strongManager.addMenuListener(new ListPopupListener(strongViewer));\r
509                          strongViewer.getControl().setMenu(strongManager.createContextMenu(strongViewer.getControl()));\r
510                          \r
511                          MenuManager nonTestedManager = new MenuManager();\r
512                          nonTestedManager.setRemoveAllWhenShown(true);\r
513                          nonTestedManager.addMenuListener(new ListPopupListener(nonTestedViewer));\r
514                          nonTestedViewer.getControl().setMenu(nonTestedManager.createContextMenu(nonTestedViewer.getControl()));\r
515                          \r
516                          MenuManager nonTraversedManager = new MenuManager();\r
517                          nonTraversedManager.setRemoveAllWhenShown(true);\r
518                          nonTraversedManager.addMenuListener(new ListPopupListener(nonTraversedViewer));\r
519                          nonTraversedViewer.getControl().setMenu(nonTraversedManager.createContextMenu(nonTraversedViewer.getControl()));\r
520                          \r
521                          MenuManager testedManager = new MenuManager();\r
522                          testedManager.setRemoveAllWhenShown(true);\r
523                          testedManager.addMenuListener(new ListPopupListener(testedViewer));\r
524                          testedViewer.getControl().setMenu(testedManager.createContextMenu(testedViewer.getControl()));\r
525                          \r
526                          MenuManager traversedManager = new MenuManager();\r
527                          traversedManager.setRemoveAllWhenShown(true);\r
528                          traversedManager.addMenuListener(new ListPopupListener(traversedViewer));\r
529                          traversedViewer.getControl().setMenu(traversedManager.createContextMenu(traversedViewer.getControl()));\r
530                          \r
531                          traversedViewer.setInput(traversed);\r
532                          testedViewer.setInput(tested);\r
533                          strongViewer.setInput(strong);\r
534                          nonTestedViewer.setInput(nonTested);\r
535                          nonTraversedViewer.setInput(nonTraversed);\r
536                          \r
537                          return composite;\r
538                 }\r
539                 \r
540         }\r
541         \r
542         private class ListPopupListener implements IMenuListener {\r
543                 private ListViewer viewer;\r
544                 \r
545                 public ListPopupListener(ListViewer viewer) {\r
546                         this.viewer = viewer;\r
547                 }\r
548                 \r
549                 @Override\r
550                 public void menuAboutToShow(IMenuManager manager) {\r
551                         IStructuredSelection s = (IStructuredSelection)viewer.getSelection();\r
552                         List<Object> list = (List<Object>)viewer.getInput();\r
553                         manager.add(new AddAction(viewer, list));\r
554                         if (!s.isEmpty()) {\r
555                                 Object element = s.getFirstElement();\r
556                                 manager.add(new DeleteAction(viewer, list, element));\r
557                         }\r
558                         \r
559                 }\r
560         }\r
561         \r
562         private class DeleteAction extends Action {\r
563                 private Viewer viewer;\r
564                 private List<?> list;\r
565                 private Object obj;\r
566                 public DeleteAction(Viewer viewer, List<?> list, Object obj) {\r
567                         super("Delete");\r
568                         this.list = list;\r
569                         this.obj = obj;\r
570                         this.viewer = viewer;\r
571                 }\r
572                 \r
573                 @Override\r
574                 public void run() {\r
575                         list.remove(obj);\r
576                         viewer.refresh();\r
577                 }\r
578         }\r
579         \r
580         private class AddAction extends Action {\r
581                 private Viewer viewer;\r
582                 private List<Object> list;\r
583                 public AddAction(Viewer viewer, List<Object> list) {\r
584                         super("Add");\r
585                         this.list = list;\r
586                         this.viewer = viewer;\r
587                 }\r
588                 \r
589                 @Override\r
590                 public void run() {\r
591                         RelationChooseDialog dialog = new RelationChooseDialog(getSite().getShell());\r
592                         if (dialog.open() == RelationChooseDialog.OK) {\r
593                                 final String uri = dialog.getUri();\r
594                                 try {\r
595                                         Resource res = session.syncRequest(new Read<Resource>() {\r
596                                                 @Override\r
597                                                 public Resource perform(ReadGraph graph)\r
598                                                                 throws DatabaseException {\r
599                                                         try {\r
600                                                                 return graph.getResource(uri);\r
601                                                         } catch (Exception e) {\r
602                                                                 return null;\r
603                                                         }\r
604                                                 }\r
605                                         });\r
606                                         if (res != null) {\r
607                                                 list.add(res);\r
608                                                 viewer.refresh();\r
609                                         } else {\r
610                                                 MessageDialog.openError(getSite().getShell(), "Error", "Relation '" + uri + "' not found.");\r
611                                         }\r
612                                 } catch (Exception e) {\r
613                                         \r
614                                 }\r
615                                 \r
616                                 \r
617                         }\r
618                         \r
619                 }\r
620         }\r
621         \r
622         private class RelationChooseDialog extends Dialog {\r
623 \r
624                 private String uri = null;\r
625                 private Text text;\r
626                 public RelationChooseDialog(IShellProvider parentShell) {\r
627                         super(parentShell);\r
628                 }\r
629 \r
630                 public RelationChooseDialog(Shell parentShell) {\r
631                         super(parentShell);\r
632                 }\r
633                 \r
634                 @Override\r
635                 protected Control createDialogArea(Composite parent) {\r
636                         Composite composite = (Composite) super.createDialogArea(parent);\r
637                         composite.setLayout(new GridLayout(2, false));\r
638                         Label label = new Label(composite, SWT.NONE);\r
639                         label.setText("URI:");\r
640                         \r
641                         text = new Text(composite, SWT.SINGLE | SWT.BORDER);\r
642                         text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));\r
643                         \r
644                         return composite;\r
645                 }\r
646                 \r
647                 @Override\r
648                 protected void okPressed() {\r
649                         uri = text.getText();\r
650                         super.okPressed();\r
651                 }\r
652                 \r
653                 public String getUri() {\r
654                         return uri;\r
655                 }\r
656                 \r
657         }\r
658         \r
659         private class ResourceListContentProvider implements IStructuredContentProvider {\r
660                 \r
661                 @SuppressWarnings("unchecked")\r
662                 @Override\r
663                 public Object[] getElements(Object inputElement) {\r
664                         List<Resource> list = (List<Resource>)inputElement;\r
665                         return list.toArray();\r
666                 }\r
667                 \r
668                 @Override\r
669                 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {\r
670                         \r
671                 }\r
672                 \r
673                 @Override\r
674                 public void dispose() {\r
675                         \r
676                 }\r
677         }\r
678         \r
679         private class ResourceLabelProvider extends LabelProvider {\r
680                 \r
681                 @Override\r
682                 public String getText(Object element) {\r
683                         final Resource res = (Resource) element; \r
684                         try {\r
685                                 return session.syncRequest(new Read<String>() {\r
686                                         @Override\r
687                                         public String perform(ReadGraph graph) throws DatabaseException {\r
688                                                 return NameUtils.getSafeName(graph, res);\r
689                                         }\r
690                                 });\r
691                         } catch (DatabaseException e) {\r
692                                 return "Error: " + e.getMessage();\r
693                         }\r
694                 }\r
695                 \r
696         }\r
697         \r
698         private boolean saveConf(String filename) throws IOException, DatabaseException {\r
699                 File file = new File(filename);\r
700                 if (file.exists()) {\r
701                         if(!MessageDialog.openQuestion(Display.getCurrent().getActiveShell(), "Saving compare configuration", "Do you want to overwrite file'" + filename + "'?"))\r
702                                 return false;   \r
703                 } else {\r
704                         if(!file.createNewFile())\r
705                                 return false;\r
706                 }\r
707                 final PrintStream ps = new PrintStream(file);\r
708                 ps.println("<?xml version=\"1.0\"?>");\r
709                 ps.println("<compare>");\r
710                 session.syncRequest(new ReadRequest() {\r
711                         \r
712                         @Override\r
713                         public void run(ReadGraph graph) throws DatabaseException {\r
714                                 for (Resource r : traversed) {\r
715                                         ps.println("<traversed uri=\"" + graph.getURI(r) + "\"/>");\r
716                                 }\r
717                                 for (Resource r : tested) {\r
718                                         ps.println("<tested uri=\"" + graph.getURI(r) + "\"/>");\r
719                                 }\r
720                                 for (Resource r : strong) {\r
721                                         ps.println("<strong uri=\"" + graph.getURI(r) + "\"/>");\r
722                                 }\r
723                                 for (Resource r : nonTraversed) {\r
724                                         ps.println("<nontraversed uri=\"" + graph.getURI(r) + "\"/>");\r
725                                 }\r
726                                 for (Resource r : nonTested) {\r
727                                         ps.println("<nontested uri=\"" + graph.getURI(r) + "\"/>");\r
728                                 }\r
729                         }\r
730                 });\r
731                 \r
732                 ps.println("</compare>");\r
733                 ps.flush();\r
734                 ps.close();\r
735                 return true;\r
736         }\r
737         \r
738         private void load(String filename) throws Exception {\r
739                 final ImportListener listener = new ImportListener();\r
740                 XMLParser parser = new XMLParser(listener);\r
741                 parser.parse(filename);\r
742                 \r
743                 if (listener.getNonTested().size() +\r
744                         listener.getNonTraversed().size() +\r
745                         listener.getStrong().size() +\r
746                         listener.getTested().size() +\r
747                         listener.getTraversed().size() == 0)\r
748                         return;\r
749                 session.syncRequest(new ReadRequest() {\r
750                         \r
751                         @Override\r
752                         public void run(ReadGraph graph) throws DatabaseException {\r
753                                 tested.clear();\r
754                                 traversed.clear();\r
755                                 strong.clear();\r
756                                 nonTested.clear();\r
757                                 nonTraversed.clear();\r
758                                 for (String uri : listener.getTested()) {\r
759                                         tested.add(graph.getResource(uri));\r
760                                 }\r
761                                 for (String uri : listener.getTraversed()) {\r
762                                         traversed.add(graph.getResource(uri));\r
763                                 }\r
764                                 for (String uri : listener.getStrong()) {\r
765                                         strong.add(graph.getResource(uri));\r
766                                 }\r
767                                 \r
768                                 for (String uri : listener.getNonTested()) {\r
769                                         nonTested.add(graph.getResource(uri));\r
770                                 }\r
771                                 for (String uri : listener.getNonTraversed()) {\r
772                                         nonTraversed.add(graph.getResource(uri));\r
773                                 }\r
774                                 \r
775                         }\r
776                 });\r
777                 \r
778                 \r
779                 \r
780         }\r
781         \r
782         public static class ImportListener {\r
783                 \r
784         \r
785                 private Collection<String> traversed = new ArrayList<String>();\r
786                 private Collection<String> tested = new ArrayList<String>();\r
787                 private Collection<String> strong = new ArrayList<String>();\r
788                 private Collection<String> nonTraversed = new ArrayList<String>();\r
789                 private Collection<String> nonTested = new ArrayList<String>();\r
790                 \r
791 \r
792                 public void done() {\r
793 \r
794                 }\r
795                 \r
796                 \r
797                 public void addTraversed(String uri) {\r
798                         traversed.add(uri);\r
799                 }\r
800                 \r
801                 public void addTested(String uri) {\r
802                         tested.add(uri);\r
803                 }\r
804                 \r
805                 public void addStrong(String uri) {\r
806                         strong.add(uri);\r
807                 }\r
808                 \r
809                 public void addNonTraversed(String uri) {\r
810                         nonTraversed.add(uri);\r
811                 }\r
812                 \r
813                 public void addNonTested(String uri) {\r
814                         nonTested.add(uri);\r
815                 }\r
816                 \r
817                 public Collection<String> getTraversed() {\r
818                         return traversed;\r
819                 }\r
820                 \r
821                 public Collection<String> getNonTested() {\r
822                         return nonTested;\r
823                 }\r
824                 \r
825                 public Collection<String> getNonTraversed() {\r
826                         return nonTraversed;\r
827                 }\r
828                 \r
829                 public Collection<String> getStrong() {\r
830                         return strong;\r
831                 }\r
832                 \r
833                 public Collection<String> getTested() {\r
834                         return tested;\r
835                 }\r
836                 \r
837         }\r
838         \r
839         \r
840 \r
841         public static class XMLParser {\r
842                 \r
843                 private ImportListener listener;\r
844                 \r
845                 public XMLParser(ImportListener listener) {\r
846                         this.listener = listener;\r
847                 }\r
848                 \r
849                 public void parse(String filename) throws Exception{\r
850                         ParserBean p = new ParserBean();\r
851                         p.parse(filename);\r
852                 }\r
853                 \r
854                 private void handleElement(Stack<Element> parents, Element element) throws SAXException{\r
855                         String name = element.qName;\r
856                         if(name.equals("traversed")) {\r
857                                 for (Attribute a : element.attributes) {\r
858                                         String propertyName = a.localName;\r
859                                         String value = a.value;\r
860                                         if (propertyName.equals("uri")) {\r
861                                                 listener.addTraversed(value);\r
862                                                 \r
863                                         } \r
864                                 }\r
865                         } else if(name.equals("tested")) {\r
866                                 for (Attribute a : element.attributes) {\r
867                                         String propertyName = a.localName;\r
868                                         String value = a.value;\r
869                                         if (propertyName.equals("uri")) {\r
870                                                 listener.addTested(value);\r
871                                                 \r
872                                         } \r
873                                 }\r
874                         } else if(name.equals("strong")) {\r
875                                 for (Attribute a : element.attributes) {\r
876                                         String propertyName = a.localName;\r
877                                         String value = a.value;\r
878                                         if (propertyName.equals("uri")) {\r
879                                                 listener.addStrong(value);\r
880                                                 \r
881                                         } \r
882                                 }\r
883                         } else if(name.equals("nontraversed")) {\r
884                                 for (Attribute a : element.attributes) {\r
885                                         String propertyName = a.localName;\r
886                                         String value = a.value;\r
887                                         if (propertyName.equals("uri")) {\r
888                                                 listener.addNonTraversed(value);\r
889                                                 \r
890                                         } \r
891                                 }\r
892                         } else if(name.equals("nontested")) {\r
893                                 for (Attribute a : element.attributes) {\r
894                                         String propertyName = a.localName;\r
895                                         String value = a.value;\r
896                                         if (propertyName.equals("uri")) {\r
897                                                 listener.addNonTested(value);\r
898                                                 \r
899                                         } \r
900                                 }\r
901                         } else if (name.equals("compare")) {\r
902                                 \r
903                         } else {\r
904                                 throw new SAXException("Unknown element '" + name + "'. The file does not contain ExtIO configuration.");\r
905                                 \r
906                         }\r
907                 }\r
908 \r
909                 \r
910                 public class ParserBean extends DefaultHandler implements Serializable {\r
911 \r
912                         private static final long serialVersionUID = -4995836637014958966L;\r
913                         \r
914                         private Stack<Element> current = new Stack<Element>();\r
915                         private Stack<String> texts = new Stack<String>();\r
916                         \r
917                         public ParserBean() {\r
918                                 super();\r
919                         }\r
920                         \r
921                         public void parse(String filename) throws Exception {\r
922                                 SAXParserFactory spf = SAXParserFactory.newInstance();\r
923                                 SAXParser saxParser = spf.newSAXParser();\r
924                                 \r
925                                 XMLReader reader = saxParser.getXMLReader();\r
926                                 FileReader file = new FileReader(filename);\r
927                                 reader.setContentHandler(this);\r
928                                 reader.parse(new InputSource(file));\r
929                                 listener.done();\r
930                         }\r
931                         \r
932                         @Override\r
933                         public void startElement(String uri, String localName, String name,\r
934                                         Attributes attributes) throws SAXException {\r
935                                 current.push(new Element(uri,localName,name,attributes));\r
936                                 texts.push(new String());\r
937                         }\r
938                         \r
939                         @Override\r
940                         public void endElement(String uri, String localName, String name)\r
941                                         throws SAXException {\r
942                                 Element e = null;\r
943                                 String text = null;\r
944                                 if (!current.empty()) {\r
945                                         e = current.pop();\r
946                                         text = texts.pop();\r
947                                 }\r
948                                 if (e != null) {\r
949                                         e.setValue(text.trim());\r
950                                 }\r
951                                 if (e != null) {\r
952                                         handleElement(current,e);\r
953                                 }\r
954                         }\r
955                         \r
956                         @Override\r
957                         public void characters(char[] ch, int start, int length)\r
958                                         throws SAXException {\r
959                                 if (!current.empty()) {\r
960                                         \r
961                                         String text = texts.pop();\r
962                                         \r
963                                         String value = new String(\r
964                                 ch, start, length);\r
965                                 text += value;\r
966                                 texts.push(text);\r
967                              }\r
968                         }\r
969                 }\r
970                 \r
971                 public class Attribute {\r
972                         public String localName;\r
973                         public String qName;\r
974                         public String uri;\r
975                         public String value;\r
976                         \r
977                         public Attribute(String localName, String qName, String uri, String value) {\r
978                                 this.localName = localName;\r
979                                 this.qName = qName;\r
980                                 this.uri = uri;\r
981                                 this.value = value;\r
982                         }\r
983                 }\r
984                 \r
985                 public class Element implements Serializable {\r
986                         private static final long serialVersionUID = -5207502156942818875L;\r
987                         String uri;\r
988                         String localName;\r
989                         String qName;\r
990                         String value = null;\r
991                         List<Attribute> attributes = new ArrayList<Attribute>();\r
992                         \r
993                         public Element(String uri, String localName, String qName, Attributes attributes) {\r
994                                 this.uri = uri;\r
995                                 this.localName = localName;\r
996                                 this.qName = qName;\r
997                                 for (int i = 0; i < attributes.getLength(); i++) {\r
998                                         this.attributes.add(new Attribute(attributes.getLocalName(i),attributes.getQName(i),attributes.getURI(i),attributes.getValue(i)));\r
999                                 }\r
1000                         }\r
1001 \r
1002                         public String getUri() {\r
1003                                 return uri;\r
1004                         }\r
1005 \r
1006                         public String getLocalName() {\r
1007                                 return localName;\r
1008                         }\r
1009 \r
1010                         public String getQName() {\r
1011                                 return qName;\r
1012                         }\r
1013 \r
1014                         public String getValue() {\r
1015                                 return value;\r
1016                         }\r
1017 \r
1018                         public List<Attribute> getAttributes() {\r
1019                                 return attributes;\r
1020                         }\r
1021                         \r
1022                         public void setValue(String value) {\r
1023                                 this.value = value;\r
1024                         }\r
1025 \r
1026                 }\r
1027 \r
1028         }\r
1029         \r
1030 }\r