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
10 * Foster Wheeler Energia Oy - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.interop.test;
\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
27 import javax.xml.parsers.SAXParser;
\r
28 import javax.xml.parsers.SAXParserFactory;
\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
95 * Simple multiline text viewer for seeing differences in two subgraphs.
\r
97 * @author Marko Luukkainen <marko.luukkainen@vtt.fi>
\r
100 public class GraphComparatorViewer extends ViewPart{
\r
102 private Session session;
\r
104 private Composite composite;
\r
106 private Label resourceText1;
\r
107 private Label resourceText2;
\r
109 private Text text1;
\r
110 private Text text2;
\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
121 public void createPartControl(Composite parent) {
\r
122 composite = new Composite(parent, SWT.NONE);
\r
123 composite.setLayout(new GridLayout(2, false));
\r
125 session = SimanticsUI.getSession();
\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
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
136 resourceText1 = createDropLabel(topComposite);
\r
137 resourceText2 = createDropLabel(topComposite);
\r
139 Button button = new Button(topComposite, SWT.PUSH);
\r
140 button.setText("Compare");
\r
141 button.addSelectionListener(new SelectionAdapter() {
\r
143 public void widgetSelected(SelectionEvent e) {
\r
150 getViewSite().getActionBars().getToolBarManager().add(new Action("Config") {
\r
152 public void run() {
\r
153 ConfigurationDialog dialog = new ConfigurationDialog(getSite().getShell());
\r
160 private void defaultConf() {
\r
165 nonTraversed.clear();
\r
167 session.syncRequest(new ReadRequest() {
\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
176 } catch (Exception e) {
\r
177 ExceptionUtils.logAndShowError(e);
\r
181 private void compare() {
\r
184 final Resource r1 = (Resource)resourceText1.getData();
\r
185 final Resource r2 = (Resource)resourceText2.getData();
\r
186 if (r1 == null || r2 == null) {
\r
188 text1.setText("Missing input!");
\r
190 text2.setText("Missing input!");
\r
194 session.asyncRequest(new ReadRequest() {
\r
197 public void run(final ReadGraph graph) throws DatabaseException {
\r
198 GraphComparator comparator = new GraphComparator(r1,r2);
\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
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
213 GraphChanges changes = comparator.getChanges();
\r
215 for (Pair<Statement,Statement> mod : changes.getModifications()) {
\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
225 indices.put(s, index);
\r
226 sb1.append("["+index + "] ");
\r
228 sb1.append(sub + " - " + pre + " - " + obj);
\r
229 sb1.append(" ["+s.getSubject().getResourceId() + " " + s.getPredicate().getResourceId() + " " + s.getObject().getResourceId()+"]");
\r
231 } catch (ValidationException e) {
\r
232 e.printStackTrace();
\r
233 } catch (ServiceException e) {
\r
234 e.printStackTrace();
\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
248 sb2.append(sub + " - " + pre + " - " + obj);
\r
249 sb2.append(" ["+s.getSubject().getResourceId() + " " + s.getPredicate().getResourceId() + " " + s.getObject().getResourceId()+"]");
\r
251 } catch (ValidationException e) {
\r
252 e.printStackTrace();
\r
253 } catch (ServiceException e) {
\r
254 e.printStackTrace();
\r
258 for (Statement s : changes.getDeletions()) {
\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
267 indices.put(s, index);
\r
268 sb1.append("["+index + "] ");
\r
270 sb1.append(sub + " - " + pre + " - " + obj);
\r
271 sb1.append(" ["+s.getSubject().getResourceId() + " " + s.getPredicate().getResourceId() + " " + s.getObject().getResourceId()+"]");
\r
273 } catch (ValidationException e) {
\r
274 e.printStackTrace();
\r
275 } catch (ServiceException e) {
\r
276 e.printStackTrace();
\r
281 for (Statement s : changes.getAdditions()) {
\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
291 sb2.append(sub + " - " + pre + " - " + obj);
\r
292 sb2.append(" ["+s.getSubject().getResourceId() + " " + s.getPredicate().getResourceId() + " " + s.getObject().getResourceId()+"]");
\r
294 } catch (ValidationException e) {
\r
295 e.printStackTrace();
\r
296 } catch (ServiceException e) {
\r
297 e.printStackTrace();
\r
301 Display.getDefault().asyncExec(new Runnable() {
\r
303 public void run() {
\r
304 text1.setText(sb1.toString());
\r
305 text2.setText(sb2.toString());
\r
314 public void setFocus() {
\r
315 composite.setFocus();
\r
319 public void dispose() {
\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
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
340 public void dragEnter(DropTargetEvent event) {
\r
341 event.detail = DND.DROP_LINK;
\r
342 //label.setBackground(green);
\r
346 public void dragLeave(DropTargetEvent event) {
\r
347 label.setBackground(null);
\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
358 final ResourceArray array = data[0];
\r
359 final Resource r = array.resources[array.resources.length - 1];
\r
363 label.setText(session.syncRequest(new Read<String>() {
\r
365 public String perform(ReadGraph graph)
\r
366 throws DatabaseException {
\r
367 return NameUtils.getSafeName(graph, r);
\r
370 } catch (DatabaseException e) {
\r
371 e.printStackTrace();
\r
375 private ResourceArray[] parseEventData(DropTargetEvent event) {
\r
376 //System.out.println("DATA: " + event.data);
\r
377 if (event.data instanceof String) {
\r
379 SerialisationSupport support = session.getService(SerialisationSupport.class);
\r
380 return ResourceTransferUtils.readStringTransferable(support.getResourceSerializer(), (String) event.data).toResourceArrayArray();
\r
381 } catch (IllegalArgumentException e) {
\r
382 e.printStackTrace();
\r
383 } catch (IOException e) {
\r
384 e.printStackTrace();
\r
385 } catch (InvalidResourceReferenceException e) {
\r
386 e.printStackTrace();
\r
389 ResourceArray[] ret = ResourceAdaptionUtils.toResourceArrays(event.data);
\r
390 if (ret.length > 0)
\r
401 private class ConfigurationDialog extends Dialog {
\r
403 protected ConfigurationDialog(Shell parentShell) {
\r
404 super(parentShell);
\r
408 protected void createButtonsForButtonBar(Composite parent) {
\r
409 createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
\r
410 createButton(parent, IDialogConstants.CLIENT_ID+1, "Load", false);
\r
411 createButton(parent, IDialogConstants.CLIENT_ID+2, "Save", false);
\r
415 protected void buttonPressed(int buttonId) {
\r
416 super.buttonPressed(buttonId);
\r
417 if (buttonId == IDialogConstants.CLIENT_ID+1) {
\r
419 FileDialog dialog = new FileDialog(Display.getCurrent().getActiveShell(),SWT.OPEN);
\r
420 dialog.setFilterExtensions(new String[]{"*.xml"});
\r
421 String filename = dialog.open();
\r
422 if (filename == null)
\r
426 traversedViewer.refresh();
\r
427 testedViewer.refresh();
\r
428 strongViewer.refresh();
\r
429 nonTestedViewer.refresh();
\r
430 nonTraversedViewer.refresh();
\r
431 } catch (Exception e1) {
\r
432 MessageDialog.openError(Display.getCurrent().getActiveShell(), "Cannot load file" , e1.getMessage());
\r
434 } else if (buttonId == IDialogConstants.CLIENT_ID+2) {
\r
436 FileDialog dialog = new FileDialog(Display.getCurrent().getActiveShell(),SWT.SAVE);
\r
437 dialog.setFilterExtensions(new String[]{"*.xml"});
\r
438 String filename = dialog.open();
\r
439 if (filename == null)
\r
442 saveConf(filename);
\r
443 if (!filename.endsWith("xml"))
\r
444 filename += ".xml";
\r
445 } catch (FileNotFoundException e1) {
\r
446 MessageDialog.openError(Display.getCurrent().getActiveShell(), "Cannot save file" , e1.getMessage());
\r
447 } catch (IOException e1) {
\r
448 MessageDialog.openError(Display.getCurrent().getActiveShell(), "Cannot save file" , e1.getMessage());
\r
449 } catch (DatabaseException e1) {
\r
450 MessageDialog.openError(Display.getCurrent().getActiveShell(), "Cannot save file" , e1.getMessage());
\r
455 private ListViewer traversedViewer;
\r
456 private ListViewer testedViewer;
\r
457 private ListViewer strongViewer;
\r
458 private ListViewer nonTraversedViewer;
\r
459 private ListViewer nonTestedViewer;
\r
462 protected Control createDialogArea(Composite parent) {
\r
463 Composite composite = (Composite) super.createDialogArea(parent);
\r
464 composite.setLayout(new FillLayout(SWT.VERTICAL));
\r
466 Group group = new Group(composite, SWT.NONE);
\r
467 group.setText("Traversed");
\r
468 group.setLayout(new FillLayout());
\r
469 traversedViewer = new ListViewer(group);
\r
471 group = new Group(composite, SWT.NONE);
\r
472 group.setText("Tested");
\r
473 group.setLayout(new FillLayout());
\r
474 testedViewer = new ListViewer(group);
\r
476 group = new Group(composite, SWT.NONE);
\r
477 group.setText("Strong");
\r
478 group.setLayout(new FillLayout());
\r
479 strongViewer = new ListViewer(group);
\r
481 group = new Group(composite, SWT.NONE);
\r
482 group.setText("NonTraversed");
\r
483 group.setLayout(new FillLayout());
\r
484 nonTraversedViewer = new ListViewer(group);
\r
486 group = new Group(composite, SWT.NONE);
\r
487 group.setText("NonTested");
\r
488 group.setLayout(new FillLayout());
\r
489 nonTestedViewer = new ListViewer(group);
\r
491 traversedViewer.setContentProvider(new ResourceListContentProvider());
\r
492 traversedViewer.setLabelProvider(new ResourceLabelProvider());
\r
494 testedViewer.setContentProvider(new ResourceListContentProvider());
\r
495 testedViewer.setLabelProvider(new ResourceLabelProvider());
\r
497 strongViewer.setContentProvider(new ResourceListContentProvider());
\r
498 strongViewer.setLabelProvider(new ResourceLabelProvider());
\r
500 nonTraversedViewer.setContentProvider(new ResourceListContentProvider());
\r
501 nonTraversedViewer.setLabelProvider(new ResourceLabelProvider());
\r
503 nonTestedViewer.setContentProvider(new ResourceListContentProvider());
\r
504 nonTestedViewer.setLabelProvider(new ResourceLabelProvider());
\r
506 MenuManager strongManager = new MenuManager();
\r
507 strongManager.setRemoveAllWhenShown(true);
\r
508 strongManager.addMenuListener(new ListPopupListener(strongViewer));
\r
509 strongViewer.getControl().setMenu(strongManager.createContextMenu(strongViewer.getControl()));
\r
511 MenuManager nonTestedManager = new MenuManager();
\r
512 nonTestedManager.setRemoveAllWhenShown(true);
\r
513 nonTestedManager.addMenuListener(new ListPopupListener(nonTestedViewer));
\r
514 nonTestedViewer.getControl().setMenu(nonTestedManager.createContextMenu(nonTestedViewer.getControl()));
\r
516 MenuManager nonTraversedManager = new MenuManager();
\r
517 nonTraversedManager.setRemoveAllWhenShown(true);
\r
518 nonTraversedManager.addMenuListener(new ListPopupListener(nonTraversedViewer));
\r
519 nonTraversedViewer.getControl().setMenu(nonTraversedManager.createContextMenu(nonTraversedViewer.getControl()));
\r
521 MenuManager testedManager = new MenuManager();
\r
522 testedManager.setRemoveAllWhenShown(true);
\r
523 testedManager.addMenuListener(new ListPopupListener(testedViewer));
\r
524 testedViewer.getControl().setMenu(testedManager.createContextMenu(testedViewer.getControl()));
\r
526 MenuManager traversedManager = new MenuManager();
\r
527 traversedManager.setRemoveAllWhenShown(true);
\r
528 traversedManager.addMenuListener(new ListPopupListener(traversedViewer));
\r
529 traversedViewer.getControl().setMenu(traversedManager.createContextMenu(traversedViewer.getControl()));
\r
531 traversedViewer.setInput(traversed);
\r
532 testedViewer.setInput(tested);
\r
533 strongViewer.setInput(strong);
\r
534 nonTestedViewer.setInput(nonTested);
\r
535 nonTraversedViewer.setInput(nonTraversed);
\r
542 private class ListPopupListener implements IMenuListener {
\r
543 private ListViewer viewer;
\r
545 public ListPopupListener(ListViewer viewer) {
\r
546 this.viewer = viewer;
\r
550 public void menuAboutToShow(IMenuManager manager) {
\r
551 IStructuredSelection s = (IStructuredSelection)viewer.getSelection();
\r
552 List<Object> list = (List<Object>)viewer.getInput();
\r
553 manager.add(new AddAction(viewer, list));
\r
554 if (!s.isEmpty()) {
\r
555 Object element = s.getFirstElement();
\r
556 manager.add(new DeleteAction(viewer, list, element));
\r
562 private class DeleteAction extends Action {
\r
563 private Viewer viewer;
\r
564 private List<?> list;
\r
565 private Object obj;
\r
566 public DeleteAction(Viewer viewer, List<?> list, Object obj) {
\r
570 this.viewer = viewer;
\r
574 public void run() {
\r
580 private class AddAction extends Action {
\r
581 private Viewer viewer;
\r
582 private List<Object> list;
\r
583 public AddAction(Viewer viewer, List<Object> list) {
\r
586 this.viewer = viewer;
\r
590 public void run() {
\r
591 RelationChooseDialog dialog = new RelationChooseDialog(getSite().getShell());
\r
592 if (dialog.open() == RelationChooseDialog.OK) {
\r
593 final String uri = dialog.getUri();
\r
595 Resource res = session.syncRequest(new Read<Resource>() {
\r
597 public Resource perform(ReadGraph graph)
\r
598 throws DatabaseException {
\r
600 return graph.getResource(uri);
\r
601 } catch (Exception e) {
\r
610 MessageDialog.openError(getSite().getShell(), "Error", "Relation '" + uri + "' not found.");
\r
612 } catch (Exception e) {
\r
622 private class RelationChooseDialog extends Dialog {
\r
624 private String uri = null;
\r
626 public RelationChooseDialog(IShellProvider parentShell) {
\r
627 super(parentShell);
\r
630 public RelationChooseDialog(Shell parentShell) {
\r
631 super(parentShell);
\r
635 protected Control createDialogArea(Composite parent) {
\r
636 Composite composite = (Composite) super.createDialogArea(parent);
\r
637 composite.setLayout(new GridLayout(2, false));
\r
638 Label label = new Label(composite, SWT.NONE);
\r
639 label.setText("URI:");
\r
641 text = new Text(composite, SWT.SINGLE | SWT.BORDER);
\r
642 text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
\r
648 protected void okPressed() {
\r
649 uri = text.getText();
\r
653 public String getUri() {
\r
659 private class ResourceListContentProvider implements IStructuredContentProvider {
\r
661 @SuppressWarnings("unchecked")
\r
663 public Object[] getElements(Object inputElement) {
\r
664 List<Resource> list = (List<Resource>)inputElement;
\r
665 return list.toArray();
\r
669 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
\r
674 public void dispose() {
\r
679 private class ResourceLabelProvider extends LabelProvider {
\r
682 public String getText(Object element) {
\r
683 final Resource res = (Resource) element;
\r
685 return session.syncRequest(new Read<String>() {
\r
687 public String perform(ReadGraph graph) throws DatabaseException {
\r
688 return NameUtils.getSafeName(graph, res);
\r
691 } catch (DatabaseException e) {
\r
692 return "Error: " + e.getMessage();
\r
698 private boolean saveConf(String filename) throws IOException, DatabaseException {
\r
699 File file = new File(filename);
\r
700 if (file.exists()) {
\r
701 if(!MessageDialog.openQuestion(Display.getCurrent().getActiveShell(), "Saving compare configuration", "Do you want to overwrite file'" + filename + "'?"))
\r
704 if(!file.createNewFile())
\r
707 final PrintStream ps = new PrintStream(file);
\r
708 ps.println("<?xml version=\"1.0\"?>");
\r
709 ps.println("<compare>");
\r
710 session.syncRequest(new ReadRequest() {
\r
713 public void run(ReadGraph graph) throws DatabaseException {
\r
714 for (Resource r : traversed) {
\r
715 ps.println("<traversed uri=\"" + graph.getURI(r) + "\"/>");
\r
717 for (Resource r : tested) {
\r
718 ps.println("<tested uri=\"" + graph.getURI(r) + "\"/>");
\r
720 for (Resource r : strong) {
\r
721 ps.println("<strong uri=\"" + graph.getURI(r) + "\"/>");
\r
723 for (Resource r : nonTraversed) {
\r
724 ps.println("<nontraversed uri=\"" + graph.getURI(r) + "\"/>");
\r
726 for (Resource r : nonTested) {
\r
727 ps.println("<nontested uri=\"" + graph.getURI(r) + "\"/>");
\r
732 ps.println("</compare>");
\r
738 private void load(String filename) throws Exception {
\r
739 final ImportListener listener = new ImportListener();
\r
740 XMLParser parser = new XMLParser(listener);
\r
741 parser.parse(filename);
\r
743 if (listener.getNonTested().size() +
\r
744 listener.getNonTraversed().size() +
\r
745 listener.getStrong().size() +
\r
746 listener.getTested().size() +
\r
747 listener.getTraversed().size() == 0)
\r
749 session.syncRequest(new ReadRequest() {
\r
752 public void run(ReadGraph graph) throws DatabaseException {
\r
757 nonTraversed.clear();
\r
758 for (String uri : listener.getTested()) {
\r
759 tested.add(graph.getResource(uri));
\r
761 for (String uri : listener.getTraversed()) {
\r
762 traversed.add(graph.getResource(uri));
\r
764 for (String uri : listener.getStrong()) {
\r
765 strong.add(graph.getResource(uri));
\r
768 for (String uri : listener.getNonTested()) {
\r
769 nonTested.add(graph.getResource(uri));
\r
771 for (String uri : listener.getNonTraversed()) {
\r
772 nonTraversed.add(graph.getResource(uri));
\r
782 public static class ImportListener {
\r
785 private Collection<String> traversed = new ArrayList<String>();
\r
786 private Collection<String> tested = new ArrayList<String>();
\r
787 private Collection<String> strong = new ArrayList<String>();
\r
788 private Collection<String> nonTraversed = new ArrayList<String>();
\r
789 private Collection<String> nonTested = new ArrayList<String>();
\r
792 public void done() {
\r
797 public void addTraversed(String uri) {
\r
798 traversed.add(uri);
\r
801 public void addTested(String uri) {
\r
805 public void addStrong(String uri) {
\r
809 public void addNonTraversed(String uri) {
\r
810 nonTraversed.add(uri);
\r
813 public void addNonTested(String uri) {
\r
814 nonTested.add(uri);
\r
817 public Collection<String> getTraversed() {
\r
821 public Collection<String> getNonTested() {
\r
825 public Collection<String> getNonTraversed() {
\r
826 return nonTraversed;
\r
829 public Collection<String> getStrong() {
\r
833 public Collection<String> getTested() {
\r
841 public static class XMLParser {
\r
843 private ImportListener listener;
\r
845 public XMLParser(ImportListener listener) {
\r
846 this.listener = listener;
\r
849 public void parse(String filename) throws Exception{
\r
850 ParserBean p = new ParserBean();
\r
854 private void handleElement(Stack<Element> parents, Element element) throws SAXException{
\r
855 String name = element.qName;
\r
856 if(name.equals("traversed")) {
\r
857 for (Attribute a : element.attributes) {
\r
858 String propertyName = a.localName;
\r
859 String value = a.value;
\r
860 if (propertyName.equals("uri")) {
\r
861 listener.addTraversed(value);
\r
865 } else if(name.equals("tested")) {
\r
866 for (Attribute a : element.attributes) {
\r
867 String propertyName = a.localName;
\r
868 String value = a.value;
\r
869 if (propertyName.equals("uri")) {
\r
870 listener.addTested(value);
\r
874 } else if(name.equals("strong")) {
\r
875 for (Attribute a : element.attributes) {
\r
876 String propertyName = a.localName;
\r
877 String value = a.value;
\r
878 if (propertyName.equals("uri")) {
\r
879 listener.addStrong(value);
\r
883 } else if(name.equals("nontraversed")) {
\r
884 for (Attribute a : element.attributes) {
\r
885 String propertyName = a.localName;
\r
886 String value = a.value;
\r
887 if (propertyName.equals("uri")) {
\r
888 listener.addNonTraversed(value);
\r
892 } else if(name.equals("nontested")) {
\r
893 for (Attribute a : element.attributes) {
\r
894 String propertyName = a.localName;
\r
895 String value = a.value;
\r
896 if (propertyName.equals("uri")) {
\r
897 listener.addNonTested(value);
\r
901 } else if (name.equals("compare")) {
\r
904 throw new SAXException("Unknown element '" + name + "'. The file does not contain ExtIO configuration.");
\r
910 public class ParserBean extends DefaultHandler implements Serializable {
\r
912 private static final long serialVersionUID = -4995836637014958966L;
\r
914 private Stack<Element> current = new Stack<Element>();
\r
915 private Stack<String> texts = new Stack<String>();
\r
917 public ParserBean() {
\r
921 public void parse(String filename) throws Exception {
\r
922 SAXParserFactory spf = SAXParserFactory.newInstance();
\r
923 SAXParser saxParser = spf.newSAXParser();
\r
925 XMLReader reader = saxParser.getXMLReader();
\r
926 FileReader file = new FileReader(filename);
\r
927 reader.setContentHandler(this);
\r
928 reader.parse(new InputSource(file));
\r
933 public void startElement(String uri, String localName, String name,
\r
934 Attributes attributes) throws SAXException {
\r
935 current.push(new Element(uri,localName,name,attributes));
\r
936 texts.push(new String());
\r
940 public void endElement(String uri, String localName, String name)
\r
941 throws SAXException {
\r
943 String text = null;
\r
944 if (!current.empty()) {
\r
946 text = texts.pop();
\r
949 e.setValue(text.trim());
\r
952 handleElement(current,e);
\r
957 public void characters(char[] ch, int start, int length)
\r
958 throws SAXException {
\r
959 if (!current.empty()) {
\r
961 String text = texts.pop();
\r
963 String value = new String(
\r
964 ch, start, length);
\r
971 public class Attribute {
\r
972 public String localName;
\r
973 public String qName;
\r
975 public String value;
\r
977 public Attribute(String localName, String qName, String uri, String value) {
\r
978 this.localName = localName;
\r
979 this.qName = qName;
\r
981 this.value = value;
\r
985 public class Element implements Serializable {
\r
986 private static final long serialVersionUID = -5207502156942818875L;
\r
990 String value = null;
\r
991 List<Attribute> attributes = new ArrayList<Attribute>();
\r
993 public Element(String uri, String localName, String qName, Attributes attributes) {
\r
995 this.localName = localName;
\r
996 this.qName = qName;
\r
997 for (int i = 0; i < attributes.getLength(); i++) {
\r
998 this.attributes.add(new Attribute(attributes.getLocalName(i),attributes.getQName(i),attributes.getURI(i),attributes.getValue(i)));
\r
1002 public String getUri() {
\r
1006 public String getLocalName() {
\r
1010 public String getQName() {
\r
1014 public String getValue() {
\r
1018 public List<Attribute> getAttributes() {
\r
1019 return attributes;
\r
1022 public void setValue(String value) {
\r
1023 this.value = value;
\r