]> gerrit.simantics Code Review - simantics/interop.git/blob - org.simantics.interop/src/org/simantics/interop/test/GraphComparatorViewer.java
Started Simantics 1.6 / Apros 6.02 porting
[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, (String) event.data).toResourceArrayArray();\r
381                             } catch (IllegalArgumentException e) {\r
382                                 e.printStackTrace();\r
383                             } catch (DatabaseException e) {\r
384                                 e.printStackTrace();\r
385                             } \r
386                         }\r
387                         ResourceArray[] ret = ResourceAdaptionUtils.toResourceArrays(event.data);\r
388                         if (ret.length > 0)\r
389                             return ret;\r
390                         return null;\r
391                     }\r
392                 });\r
393 \r
394                 return label;\r
395             }\r
396         \r
397         \r
398         \r
399         private class ConfigurationDialog extends Dialog {\r
400 \r
401                 protected ConfigurationDialog(Shell parentShell) {\r
402                         super(parentShell);\r
403                 }\r
404                 \r
405                 @Override\r
406                 protected void createButtonsForButtonBar(Composite parent) {\r
407                         createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);\r
408                         createButton(parent, IDialogConstants.CLIENT_ID+1, "Load", false);\r
409                         createButton(parent, IDialogConstants.CLIENT_ID+2, "Save", false);\r
410                 }\r
411                 \r
412                 @Override\r
413                 protected void buttonPressed(int buttonId) {\r
414                         super.buttonPressed(buttonId);\r
415                         if (buttonId == IDialogConstants.CLIENT_ID+1) {\r
416                                 //load\r
417                                 FileDialog dialog = new FileDialog(Display.getCurrent().getActiveShell(),SWT.OPEN);\r
418                                 dialog.setFilterExtensions(new String[]{"*.xml"});\r
419                                 String filename = dialog.open();\r
420                                 if (filename == null)\r
421                                 return;\r
422                                 try {\r
423                                         load(filename);\r
424                                         traversedViewer.refresh();\r
425                                         testedViewer.refresh();\r
426                                         strongViewer.refresh();\r
427                                         nonTestedViewer.refresh();\r
428                                         nonTraversedViewer.refresh();\r
429                                 } catch (Exception e1) {\r
430                                         MessageDialog.openError(Display.getCurrent().getActiveShell(), "Cannot load file" , e1.getMessage());\r
431                                 }\r
432                         } else if (buttonId == IDialogConstants.CLIENT_ID+2) {\r
433                                 //save\r
434                                 FileDialog dialog = new FileDialog(Display.getCurrent().getActiveShell(),SWT.SAVE);\r
435                         dialog.setFilterExtensions(new String[]{"*.xml"});\r
436                         String filename = dialog.open();\r
437                         if (filename == null)\r
438                                 return;\r
439                         try {\r
440                                 saveConf(filename);\r
441                                 if (!filename.endsWith("xml")) \r
442                                         filename += ".xml";\r
443                         } catch (FileNotFoundException e1) {\r
444                                 MessageDialog.openError(Display.getCurrent().getActiveShell(), "Cannot save file" , e1.getMessage());\r
445                                 } catch (IOException e1) {\r
446                                         MessageDialog.openError(Display.getCurrent().getActiveShell(), "Cannot save file" , e1.getMessage());\r
447                                 } catch (DatabaseException e1) {\r
448                                         MessageDialog.openError(Display.getCurrent().getActiveShell(), "Cannot save file" , e1.getMessage());\r
449                                 }\r
450                         }\r
451                 }\r
452                 \r
453                 private ListViewer traversedViewer;\r
454                 private ListViewer testedViewer;\r
455                 private ListViewer strongViewer;\r
456                 private ListViewer nonTraversedViewer;\r
457                 private ListViewer nonTestedViewer;\r
458                 \r
459                 @Override\r
460                 protected Control createDialogArea(Composite parent) {\r
461                          Composite composite = (Composite) super.createDialogArea(parent);\r
462                          composite.setLayout(new FillLayout(SWT.VERTICAL));\r
463                          \r
464                          Group group = new Group(composite, SWT.NONE);\r
465                          group.setText("Traversed");\r
466                          group.setLayout(new FillLayout());\r
467                          traversedViewer = new ListViewer(group);\r
468                          \r
469                          group = new Group(composite, SWT.NONE);\r
470                          group.setText("Tested");\r
471                          group.setLayout(new FillLayout());\r
472                          testedViewer = new ListViewer(group);\r
473                          \r
474                          group = new Group(composite, SWT.NONE);\r
475                          group.setText("Strong");\r
476                          group.setLayout(new FillLayout());\r
477                          strongViewer = new ListViewer(group);\r
478                          \r
479                          group = new Group(composite, SWT.NONE);\r
480                          group.setText("NonTraversed");\r
481                          group.setLayout(new FillLayout());\r
482                          nonTraversedViewer = new ListViewer(group);\r
483                          \r
484                          group = new Group(composite, SWT.NONE);\r
485                          group.setText("NonTested");\r
486                          group.setLayout(new FillLayout());\r
487                          nonTestedViewer = new ListViewer(group);\r
488                          \r
489                          traversedViewer.setContentProvider(new ResourceListContentProvider());\r
490                          traversedViewer.setLabelProvider(new ResourceLabelProvider());\r
491                          \r
492                          testedViewer.setContentProvider(new ResourceListContentProvider());\r
493                          testedViewer.setLabelProvider(new ResourceLabelProvider());\r
494                          \r
495                          strongViewer.setContentProvider(new ResourceListContentProvider());\r
496                          strongViewer.setLabelProvider(new ResourceLabelProvider());\r
497                          \r
498                          nonTraversedViewer.setContentProvider(new ResourceListContentProvider());\r
499                          nonTraversedViewer.setLabelProvider(new ResourceLabelProvider());\r
500                          \r
501                          nonTestedViewer.setContentProvider(new ResourceListContentProvider());\r
502                          nonTestedViewer.setLabelProvider(new ResourceLabelProvider());\r
503                          \r
504                          MenuManager strongManager = new MenuManager();\r
505                          strongManager.setRemoveAllWhenShown(true);\r
506                          strongManager.addMenuListener(new ListPopupListener(strongViewer));\r
507                          strongViewer.getControl().setMenu(strongManager.createContextMenu(strongViewer.getControl()));\r
508                          \r
509                          MenuManager nonTestedManager = new MenuManager();\r
510                          nonTestedManager.setRemoveAllWhenShown(true);\r
511                          nonTestedManager.addMenuListener(new ListPopupListener(nonTestedViewer));\r
512                          nonTestedViewer.getControl().setMenu(nonTestedManager.createContextMenu(nonTestedViewer.getControl()));\r
513                          \r
514                          MenuManager nonTraversedManager = new MenuManager();\r
515                          nonTraversedManager.setRemoveAllWhenShown(true);\r
516                          nonTraversedManager.addMenuListener(new ListPopupListener(nonTraversedViewer));\r
517                          nonTraversedViewer.getControl().setMenu(nonTraversedManager.createContextMenu(nonTraversedViewer.getControl()));\r
518                          \r
519                          MenuManager testedManager = new MenuManager();\r
520                          testedManager.setRemoveAllWhenShown(true);\r
521                          testedManager.addMenuListener(new ListPopupListener(testedViewer));\r
522                          testedViewer.getControl().setMenu(testedManager.createContextMenu(testedViewer.getControl()));\r
523                          \r
524                          MenuManager traversedManager = new MenuManager();\r
525                          traversedManager.setRemoveAllWhenShown(true);\r
526                          traversedManager.addMenuListener(new ListPopupListener(traversedViewer));\r
527                          traversedViewer.getControl().setMenu(traversedManager.createContextMenu(traversedViewer.getControl()));\r
528                          \r
529                          traversedViewer.setInput(traversed);\r
530                          testedViewer.setInput(tested);\r
531                          strongViewer.setInput(strong);\r
532                          nonTestedViewer.setInput(nonTested);\r
533                          nonTraversedViewer.setInput(nonTraversed);\r
534                          \r
535                          return composite;\r
536                 }\r
537                 \r
538         }\r
539         \r
540         private class ListPopupListener implements IMenuListener {\r
541                 private ListViewer viewer;\r
542                 \r
543                 public ListPopupListener(ListViewer viewer) {\r
544                         this.viewer = viewer;\r
545                 }\r
546                 \r
547                 @Override\r
548                 public void menuAboutToShow(IMenuManager manager) {\r
549                         IStructuredSelection s = (IStructuredSelection)viewer.getSelection();\r
550                         List<Object> list = (List<Object>)viewer.getInput();\r
551                         manager.add(new AddAction(viewer, list));\r
552                         if (!s.isEmpty()) {\r
553                                 Object element = s.getFirstElement();\r
554                                 manager.add(new DeleteAction(viewer, list, element));\r
555                         }\r
556                         \r
557                 }\r
558         }\r
559         \r
560         private class DeleteAction extends Action {\r
561                 private Viewer viewer;\r
562                 private List<?> list;\r
563                 private Object obj;\r
564                 public DeleteAction(Viewer viewer, List<?> list, Object obj) {\r
565                         super("Delete");\r
566                         this.list = list;\r
567                         this.obj = obj;\r
568                         this.viewer = viewer;\r
569                 }\r
570                 \r
571                 @Override\r
572                 public void run() {\r
573                         list.remove(obj);\r
574                         viewer.refresh();\r
575                 }\r
576         }\r
577         \r
578         private class AddAction extends Action {\r
579                 private Viewer viewer;\r
580                 private List<Object> list;\r
581                 public AddAction(Viewer viewer, List<Object> list) {\r
582                         super("Add");\r
583                         this.list = list;\r
584                         this.viewer = viewer;\r
585                 }\r
586                 \r
587                 @Override\r
588                 public void run() {\r
589                         RelationChooseDialog dialog = new RelationChooseDialog(getSite().getShell());\r
590                         if (dialog.open() == RelationChooseDialog.OK) {\r
591                                 final String uri = dialog.getUri();\r
592                                 try {\r
593                                         Resource res = session.syncRequest(new Read<Resource>() {\r
594                                                 @Override\r
595                                                 public Resource perform(ReadGraph graph)\r
596                                                                 throws DatabaseException {\r
597                                                         try {\r
598                                                                 return graph.getResource(uri);\r
599                                                         } catch (Exception e) {\r
600                                                                 return null;\r
601                                                         }\r
602                                                 }\r
603                                         });\r
604                                         if (res != null) {\r
605                                                 list.add(res);\r
606                                                 viewer.refresh();\r
607                                         } else {\r
608                                                 MessageDialog.openError(getSite().getShell(), "Error", "Relation '" + uri + "' not found.");\r
609                                         }\r
610                                 } catch (Exception e) {\r
611                                         \r
612                                 }\r
613                                 \r
614                                 \r
615                         }\r
616                         \r
617                 }\r
618         }\r
619         \r
620         private class RelationChooseDialog extends Dialog {\r
621 \r
622                 private String uri = null;\r
623                 private Text text;\r
624                 public RelationChooseDialog(IShellProvider parentShell) {\r
625                         super(parentShell);\r
626                 }\r
627 \r
628                 public RelationChooseDialog(Shell parentShell) {\r
629                         super(parentShell);\r
630                 }\r
631                 \r
632                 @Override\r
633                 protected Control createDialogArea(Composite parent) {\r
634                         Composite composite = (Composite) super.createDialogArea(parent);\r
635                         composite.setLayout(new GridLayout(2, false));\r
636                         Label label = new Label(composite, SWT.NONE);\r
637                         label.setText("URI:");\r
638                         \r
639                         text = new Text(composite, SWT.SINGLE | SWT.BORDER);\r
640                         text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));\r
641                         \r
642                         return composite;\r
643                 }\r
644                 \r
645                 @Override\r
646                 protected void okPressed() {\r
647                         uri = text.getText();\r
648                         super.okPressed();\r
649                 }\r
650                 \r
651                 public String getUri() {\r
652                         return uri;\r
653                 }\r
654                 \r
655         }\r
656         \r
657         private class ResourceListContentProvider implements IStructuredContentProvider {\r
658                 \r
659                 @SuppressWarnings("unchecked")\r
660                 @Override\r
661                 public Object[] getElements(Object inputElement) {\r
662                         List<Resource> list = (List<Resource>)inputElement;\r
663                         return list.toArray();\r
664                 }\r
665                 \r
666                 @Override\r
667                 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {\r
668                         \r
669                 }\r
670                 \r
671                 @Override\r
672                 public void dispose() {\r
673                         \r
674                 }\r
675         }\r
676         \r
677         private class ResourceLabelProvider extends LabelProvider {\r
678                 \r
679                 @Override\r
680                 public String getText(Object element) {\r
681                         final Resource res = (Resource) element; \r
682                         try {\r
683                                 return session.syncRequest(new Read<String>() {\r
684                                         @Override\r
685                                         public String perform(ReadGraph graph) throws DatabaseException {\r
686                                                 return NameUtils.getSafeName(graph, res);\r
687                                         }\r
688                                 });\r
689                         } catch (DatabaseException e) {\r
690                                 return "Error: " + e.getMessage();\r
691                         }\r
692                 }\r
693                 \r
694         }\r
695         \r
696         private boolean saveConf(String filename) throws IOException, DatabaseException {\r
697                 File file = new File(filename);\r
698                 if (file.exists()) {\r
699                         if(!MessageDialog.openQuestion(Display.getCurrent().getActiveShell(), "Saving compare configuration", "Do you want to overwrite file'" + filename + "'?"))\r
700                                 return false;   \r
701                 } else {\r
702                         if(!file.createNewFile())\r
703                                 return false;\r
704                 }\r
705                 final PrintStream ps = new PrintStream(file);\r
706                 ps.println("<?xml version=\"1.0\"?>");\r
707                 ps.println("<compare>");\r
708                 session.syncRequest(new ReadRequest() {\r
709                         \r
710                         @Override\r
711                         public void run(ReadGraph graph) throws DatabaseException {\r
712                                 for (Resource r : traversed) {\r
713                                         ps.println("<traversed uri=\"" + graph.getURI(r) + "\"/>");\r
714                                 }\r
715                                 for (Resource r : tested) {\r
716                                         ps.println("<tested uri=\"" + graph.getURI(r) + "\"/>");\r
717                                 }\r
718                                 for (Resource r : strong) {\r
719                                         ps.println("<strong uri=\"" + graph.getURI(r) + "\"/>");\r
720                                 }\r
721                                 for (Resource r : nonTraversed) {\r
722                                         ps.println("<nontraversed uri=\"" + graph.getURI(r) + "\"/>");\r
723                                 }\r
724                                 for (Resource r : nonTested) {\r
725                                         ps.println("<nontested uri=\"" + graph.getURI(r) + "\"/>");\r
726                                 }\r
727                         }\r
728                 });\r
729                 \r
730                 ps.println("</compare>");\r
731                 ps.flush();\r
732                 ps.close();\r
733                 return true;\r
734         }\r
735         \r
736         private void load(String filename) throws Exception {\r
737                 final ImportListener listener = new ImportListener();\r
738                 XMLParser parser = new XMLParser(listener);\r
739                 parser.parse(filename);\r
740                 \r
741                 if (listener.getNonTested().size() +\r
742                         listener.getNonTraversed().size() +\r
743                         listener.getStrong().size() +\r
744                         listener.getTested().size() +\r
745                         listener.getTraversed().size() == 0)\r
746                         return;\r
747                 session.syncRequest(new ReadRequest() {\r
748                         \r
749                         @Override\r
750                         public void run(ReadGraph graph) throws DatabaseException {\r
751                                 tested.clear();\r
752                                 traversed.clear();\r
753                                 strong.clear();\r
754                                 nonTested.clear();\r
755                                 nonTraversed.clear();\r
756                                 for (String uri : listener.getTested()) {\r
757                                         tested.add(graph.getResource(uri));\r
758                                 }\r
759                                 for (String uri : listener.getTraversed()) {\r
760                                         traversed.add(graph.getResource(uri));\r
761                                 }\r
762                                 for (String uri : listener.getStrong()) {\r
763                                         strong.add(graph.getResource(uri));\r
764                                 }\r
765                                 \r
766                                 for (String uri : listener.getNonTested()) {\r
767                                         nonTested.add(graph.getResource(uri));\r
768                                 }\r
769                                 for (String uri : listener.getNonTraversed()) {\r
770                                         nonTraversed.add(graph.getResource(uri));\r
771                                 }\r
772                                 \r
773                         }\r
774                 });\r
775                 \r
776                 \r
777                 \r
778         }\r
779         \r
780         public static class ImportListener {\r
781                 \r
782         \r
783                 private Collection<String> traversed = new ArrayList<String>();\r
784                 private Collection<String> tested = new ArrayList<String>();\r
785                 private Collection<String> strong = new ArrayList<String>();\r
786                 private Collection<String> nonTraversed = new ArrayList<String>();\r
787                 private Collection<String> nonTested = new ArrayList<String>();\r
788                 \r
789 \r
790                 public void done() {\r
791 \r
792                 }\r
793                 \r
794                 \r
795                 public void addTraversed(String uri) {\r
796                         traversed.add(uri);\r
797                 }\r
798                 \r
799                 public void addTested(String uri) {\r
800                         tested.add(uri);\r
801                 }\r
802                 \r
803                 public void addStrong(String uri) {\r
804                         strong.add(uri);\r
805                 }\r
806                 \r
807                 public void addNonTraversed(String uri) {\r
808                         nonTraversed.add(uri);\r
809                 }\r
810                 \r
811                 public void addNonTested(String uri) {\r
812                         nonTested.add(uri);\r
813                 }\r
814                 \r
815                 public Collection<String> getTraversed() {\r
816                         return traversed;\r
817                 }\r
818                 \r
819                 public Collection<String> getNonTested() {\r
820                         return nonTested;\r
821                 }\r
822                 \r
823                 public Collection<String> getNonTraversed() {\r
824                         return nonTraversed;\r
825                 }\r
826                 \r
827                 public Collection<String> getStrong() {\r
828                         return strong;\r
829                 }\r
830                 \r
831                 public Collection<String> getTested() {\r
832                         return tested;\r
833                 }\r
834                 \r
835         }\r
836         \r
837         \r
838 \r
839         public static class XMLParser {\r
840                 \r
841                 private ImportListener listener;\r
842                 \r
843                 public XMLParser(ImportListener listener) {\r
844                         this.listener = listener;\r
845                 }\r
846                 \r
847                 public void parse(String filename) throws Exception{\r
848                         ParserBean p = new ParserBean();\r
849                         p.parse(filename);\r
850                 }\r
851                 \r
852                 private void handleElement(Stack<Element> parents, Element element) throws SAXException{\r
853                         String name = element.qName;\r
854                         if(name.equals("traversed")) {\r
855                                 for (Attribute a : element.attributes) {\r
856                                         String propertyName = a.localName;\r
857                                         String value = a.value;\r
858                                         if (propertyName.equals("uri")) {\r
859                                                 listener.addTraversed(value);\r
860                                                 \r
861                                         } \r
862                                 }\r
863                         } else if(name.equals("tested")) {\r
864                                 for (Attribute a : element.attributes) {\r
865                                         String propertyName = a.localName;\r
866                                         String value = a.value;\r
867                                         if (propertyName.equals("uri")) {\r
868                                                 listener.addTested(value);\r
869                                                 \r
870                                         } \r
871                                 }\r
872                         } else if(name.equals("strong")) {\r
873                                 for (Attribute a : element.attributes) {\r
874                                         String propertyName = a.localName;\r
875                                         String value = a.value;\r
876                                         if (propertyName.equals("uri")) {\r
877                                                 listener.addStrong(value);\r
878                                                 \r
879                                         } \r
880                                 }\r
881                         } else if(name.equals("nontraversed")) {\r
882                                 for (Attribute a : element.attributes) {\r
883                                         String propertyName = a.localName;\r
884                                         String value = a.value;\r
885                                         if (propertyName.equals("uri")) {\r
886                                                 listener.addNonTraversed(value);\r
887                                                 \r
888                                         } \r
889                                 }\r
890                         } else if(name.equals("nontested")) {\r
891                                 for (Attribute a : element.attributes) {\r
892                                         String propertyName = a.localName;\r
893                                         String value = a.value;\r
894                                         if (propertyName.equals("uri")) {\r
895                                                 listener.addNonTested(value);\r
896                                                 \r
897                                         } \r
898                                 }\r
899                         } else if (name.equals("compare")) {\r
900                                 \r
901                         } else {\r
902                                 throw new SAXException("Unknown element '" + name + "'. The file does not contain ExtIO configuration.");\r
903                                 \r
904                         }\r
905                 }\r
906 \r
907                 \r
908                 public class ParserBean extends DefaultHandler implements Serializable {\r
909 \r
910                         private static final long serialVersionUID = -4995836637014958966L;\r
911                         \r
912                         private Stack<Element> current = new Stack<Element>();\r
913                         private Stack<String> texts = new Stack<String>();\r
914                         \r
915                         public ParserBean() {\r
916                                 super();\r
917                         }\r
918                         \r
919                         public void parse(String filename) throws Exception {\r
920                                 SAXParserFactory spf = SAXParserFactory.newInstance();\r
921                                 SAXParser saxParser = spf.newSAXParser();\r
922                                 \r
923                                 XMLReader reader = saxParser.getXMLReader();\r
924                                 FileReader file = new FileReader(filename);\r
925                                 reader.setContentHandler(this);\r
926                                 reader.parse(new InputSource(file));\r
927                                 listener.done();\r
928                         }\r
929                         \r
930                         @Override\r
931                         public void startElement(String uri, String localName, String name,\r
932                                         Attributes attributes) throws SAXException {\r
933                                 current.push(new Element(uri,localName,name,attributes));\r
934                                 texts.push(new String());\r
935                         }\r
936                         \r
937                         @Override\r
938                         public void endElement(String uri, String localName, String name)\r
939                                         throws SAXException {\r
940                                 Element e = null;\r
941                                 String text = null;\r
942                                 if (!current.empty()) {\r
943                                         e = current.pop();\r
944                                         text = texts.pop();\r
945                                 }\r
946                                 if (e != null) {\r
947                                         e.setValue(text.trim());\r
948                                 }\r
949                                 if (e != null) {\r
950                                         handleElement(current,e);\r
951                                 }\r
952                         }\r
953                         \r
954                         @Override\r
955                         public void characters(char[] ch, int start, int length)\r
956                                         throws SAXException {\r
957                                 if (!current.empty()) {\r
958                                         \r
959                                         String text = texts.pop();\r
960                                         \r
961                                         String value = new String(\r
962                                 ch, start, length);\r
963                                 text += value;\r
964                                 texts.push(text);\r
965                              }\r
966                         }\r
967                 }\r
968                 \r
969                 public class Attribute {\r
970                         public String localName;\r
971                         public String qName;\r
972                         public String uri;\r
973                         public String value;\r
974                         \r
975                         public Attribute(String localName, String qName, String uri, String value) {\r
976                                 this.localName = localName;\r
977                                 this.qName = qName;\r
978                                 this.uri = uri;\r
979                                 this.value = value;\r
980                         }\r
981                 }\r
982                 \r
983                 public class Element implements Serializable {\r
984                         private static final long serialVersionUID = -5207502156942818875L;\r
985                         String uri;\r
986                         String localName;\r
987                         String qName;\r
988                         String value = null;\r
989                         List<Attribute> attributes = new ArrayList<Attribute>();\r
990                         \r
991                         public Element(String uri, String localName, String qName, Attributes attributes) {\r
992                                 this.uri = uri;\r
993                                 this.localName = localName;\r
994                                 this.qName = qName;\r
995                                 for (int i = 0; i < attributes.getLength(); i++) {\r
996                                         this.attributes.add(new Attribute(attributes.getLocalName(i),attributes.getQName(i),attributes.getURI(i),attributes.getValue(i)));\r
997                                 }\r
998                         }\r
999 \r
1000                         public String getUri() {\r
1001                                 return uri;\r
1002                         }\r
1003 \r
1004                         public String getLocalName() {\r
1005                                 return localName;\r
1006                         }\r
1007 \r
1008                         public String getQName() {\r
1009                                 return qName;\r
1010                         }\r
1011 \r
1012                         public String getValue() {\r
1013                                 return value;\r
1014                         }\r
1015 \r
1016                         public List<Attribute> getAttributes() {\r
1017                                 return attributes;\r
1018                         }\r
1019                         \r
1020                         public void setValue(String value) {\r
1021                                 this.value = value;\r
1022                         }\r
1023 \r
1024                 }\r
1025 \r
1026         }\r
1027         \r
1028 }\r