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