1 /*******************************************************************************
2 * Copyright (c) 2007, 2010 Association for Decentralized Information Management
4 * All rights reserved. This program and the accompanying materials
5 * are made available under the terms of the Eclipse Public License v1.0
6 * which accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
10 * Foster Wheeler Energia Oy - initial API and implementation
11 *******************************************************************************/
12 package org.simantics.interop.test;
15 import java.io.FileNotFoundException;
16 import java.io.FileReader;
17 import java.io.IOException;
18 import java.io.PrintStream;
19 import java.io.Serializable;
20 import java.util.ArrayList;
21 import java.util.Collection;
22 import java.util.HashMap;
23 import java.util.List;
25 import java.util.Stack;
27 import javax.xml.parsers.SAXParser;
28 import javax.xml.parsers.SAXParserFactory;
30 import org.eclipse.jface.action.Action;
31 import org.eclipse.jface.action.IMenuListener;
32 import org.eclipse.jface.action.IMenuManager;
33 import org.eclipse.jface.action.MenuManager;
34 import org.eclipse.jface.dialogs.Dialog;
35 import org.eclipse.jface.dialogs.IDialogConstants;
36 import org.eclipse.jface.dialogs.MessageDialog;
37 import org.eclipse.jface.layout.GridDataFactory;
38 import org.eclipse.jface.viewers.IStructuredContentProvider;
39 import org.eclipse.jface.viewers.IStructuredSelection;
40 import org.eclipse.jface.viewers.LabelProvider;
41 import org.eclipse.jface.viewers.ListViewer;
42 import org.eclipse.jface.viewers.Viewer;
43 import org.eclipse.jface.window.IShellProvider;
44 import org.eclipse.swt.SWT;
45 import org.eclipse.swt.dnd.DND;
46 import org.eclipse.swt.dnd.DropTarget;
47 import org.eclipse.swt.dnd.DropTargetAdapter;
48 import org.eclipse.swt.dnd.DropTargetEvent;
49 import org.eclipse.swt.dnd.TextTransfer;
50 import org.eclipse.swt.dnd.Transfer;
51 import org.eclipse.swt.events.SelectionAdapter;
52 import org.eclipse.swt.events.SelectionEvent;
53 import org.eclipse.swt.layout.FillLayout;
54 import org.eclipse.swt.layout.GridData;
55 import org.eclipse.swt.layout.GridLayout;
56 import org.eclipse.swt.widgets.Button;
57 import org.eclipse.swt.widgets.Composite;
58 import org.eclipse.swt.widgets.Control;
59 import org.eclipse.swt.widgets.Display;
60 import org.eclipse.swt.widgets.FileDialog;
61 import org.eclipse.swt.widgets.Group;
62 import org.eclipse.swt.widgets.Label;
63 import org.eclipse.swt.widgets.Shell;
64 import org.eclipse.swt.widgets.Text;
65 import org.eclipse.ui.part.ViewPart;
66 import org.simantics.Simantics;
67 import org.simantics.db.ReadGraph;
68 import org.simantics.db.Resource;
69 import org.simantics.db.Session;
70 import org.simantics.db.Statement;
71 import org.simantics.db.common.ResourceArray;
72 import org.simantics.db.common.request.ReadRequest;
73 import org.simantics.db.common.utils.NameUtils;
74 import org.simantics.db.exception.DatabaseException;
75 import org.simantics.db.exception.ServiceException;
76 import org.simantics.db.exception.ValidationException;
77 import org.simantics.db.request.Read;
78 import org.simantics.db.service.SerialisationSupport;
79 import org.simantics.interop.test.GraphChanges.Modification;
80 import org.simantics.layer0.Layer0;
81 import org.simantics.ui.dnd.LocalObjectTransfer;
82 import org.simantics.ui.dnd.ResourceReferenceTransfer;
83 import org.simantics.ui.dnd.ResourceTransferUtils;
84 import org.simantics.ui.utils.ResourceAdaptionUtils;
85 import org.simantics.utils.datastructures.BijectionMap;
86 import org.simantics.utils.datastructures.Pair;
87 import org.simantics.utils.ui.ExceptionUtils;
88 import org.xml.sax.Attributes;
89 import org.xml.sax.InputSource;
90 import org.xml.sax.SAXException;
91 import org.xml.sax.XMLReader;
92 import org.xml.sax.helpers.DefaultHandler;
95 * Simple multiline text viewer for seeing differences in two subgraphs.
97 * @author Marko Luukkainen <marko.luukkainen@vtt.fi>
100 public class GraphComparatorViewer extends ViewPart{
102 private Session session;
104 private Composite composite;
106 private Label resourceText1;
107 private Label resourceText2;
113 private List<Resource> traversed = new ArrayList<Resource>();
114 private List<Resource> tested = new ArrayList<Resource>();
115 private List<Resource> strong = new ArrayList<Resource>();
116 private List<Resource> nonTraversed = new ArrayList<Resource>();
117 private List<Resource> nonTested = new ArrayList<Resource>();
121 public void createPartControl(Composite parent) {
122 composite = new Composite(parent, SWT.NONE);
123 composite.setLayout(new GridLayout(2, false));
125 session = Simantics.getSession();
127 Composite topComposite = new Composite(composite, SWT.BORDER);
128 topComposite.setLayout(new GridLayout(3, false));
129 text1 = new Text(composite, SWT.MULTI|SWT.V_SCROLL);
130 text2 = new Text(composite, SWT.MULTI|SWT.V_SCROLL);
132 GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).grab(true, false).span(2, 1).applyTo(topComposite);
133 GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, true).applyTo(text1);
134 GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, true).applyTo(text2);
136 resourceText1 = createDropLabel(topComposite);
137 resourceText2 = createDropLabel(topComposite);
139 Button button = new Button(topComposite, SWT.PUSH);
140 button.setText("Compare");
141 button.addSelectionListener(new SelectionAdapter() {
143 public void widgetSelected(SelectionEvent e) {
150 getViewSite().getActionBars().getToolBarManager().add(new Action("Config") {
153 ConfigurationDialog dialog = new ConfigurationDialog(getSite().getShell());
160 private void defaultConf() {
165 nonTraversed.clear();
167 session.syncRequest(new ReadRequest() {
169 public void run(ReadGraph graph) throws DatabaseException {
170 Layer0 l0 = Layer0.getInstance(graph);
171 traversed.add(l0.ConsistsOf);
172 tested.add(l0.IsWeaklyRelatedTo);
173 nonTraversed.add(l0.InstanceOf);
176 } catch (Exception e) {
177 ExceptionUtils.logAndShowError(e);
181 private void compare() {
184 final Resource r1 = (Resource)resourceText1.getData();
185 final Resource r2 = (Resource)resourceText2.getData();
186 if (r1 == null || r2 == null) {
188 text1.setText("Missing input!");
190 text2.setText("Missing input!");
194 session.asyncRequest(new ReadRequest() {
197 public void run(final ReadGraph graph) throws DatabaseException {
198 GraphComparator comparator = new GraphComparator(r1,r2);
200 comparator.addTested(tested);
201 comparator.addTraversed(traversed);
202 comparator.addNonTested(nonTested);
203 comparator.addNonTraversed(nonTraversed);
204 comparator.addStrong(strong);
206 comparator.test(graph);
207 BijectionMap<Statement, Statement> map = comparator.getComparableStatements();
208 Map<Statement, Integer> indices = new HashMap<Statement, Integer>();
209 final StringBuilder sb1 = new StringBuilder();
210 final StringBuilder sb2 = new StringBuilder();
213 GraphChanges changes = comparator.getChanges();
215 for (Modification mod : changes.getModifications()) {
219 Statement s = mod.getLeftStm();
220 sub = NameUtils.getSafeName(graph, mod.getLeftSub());
221 String pre = NameUtils.getSafeName(graph, s.getPredicate());
222 String obj = NameUtils.getSafeName(graph, s.getObject());
223 if (map.containsLeft(s)) {
225 indices.put(s, index);
226 sb1.append("["+index + "] ");
228 sb1.append(sub + " - " + pre + " - " + obj);
229 sb1.append(" ["+s.getSubject().getResourceId() + " " + s.getPredicate().getResourceId() + " " + s.getObject().getResourceId()+"]");
231 } catch (ValidationException e) {
233 } catch (ServiceException e) {
240 Statement s = mod.getRightStm();
241 sub = NameUtils.getSafeName(graph, mod.getRightSub());
242 String pre = NameUtils.getSafeName(graph, s.getPredicate());
243 String obj = NameUtils.getSafeName(graph, s.getObject());
244 if (map.containsRight(s)) {
245 index = indices.get(map.getLeft(s));
246 sb2.append("["+index + "] ");
248 sb2.append(sub + " - " + pre + " - " + obj);
249 sb2.append(" ["+s.getSubject().getResourceId() + " " + s.getPredicate().getResourceId() + " " + s.getObject().getResourceId()+"]");
251 } catch (ValidationException e) {
253 } catch (ServiceException e) {
258 for (Statement s : changes.getDeletions()) {
262 sub = NameUtils.getSafeName(graph, s.getSubject());
263 String pre = NameUtils.getSafeName(graph, s.getPredicate());
264 String obj = NameUtils.getSafeName(graph, s.getObject());
265 if (map.containsLeft(s)) {
267 indices.put(s, index);
268 sb1.append("["+index + "] ");
270 sb1.append(sub + " - " + pre + " - " + obj);
271 sb1.append(" ["+s.getSubject().getResourceId() + " " + s.getPredicate().getResourceId() + " " + s.getObject().getResourceId()+"]");
273 } catch (ValidationException e) {
275 } catch (ServiceException e) {
281 for (Statement s : changes.getAdditions()) {
284 sub = NameUtils.getSafeName(graph, s.getSubject());
285 String pre = NameUtils.getSafeName(graph, s.getPredicate());
286 String obj = NameUtils.getSafeName(graph, s.getObject());
287 if (map.containsRight(s)) {
288 index = indices.get(map.getLeft(s));
289 sb2.append("["+index + "] ");
291 sb2.append(sub + " - " + pre + " - " + obj);
292 sb2.append(" ["+s.getSubject().getResourceId() + " " + s.getPredicate().getResourceId() + " " + s.getObject().getResourceId()+"]");
294 } catch (ValidationException e) {
296 } catch (ServiceException e) {
301 Display.getDefault().asyncExec(new Runnable() {
304 text1.setText(sb1.toString());
305 text2.setText(sb2.toString());
314 public void setFocus() {
315 composite.setFocus();
319 public void dispose() {
325 // copy-paste from GraphDebugger
326 public Label createDropLabel(Composite parent) {
327 final Label label = new Label(parent, SWT.BORDER);
328 label.setAlignment(SWT.CENTER);
329 label.setText("Drag a resource here to examine it in this debugger!");
330 label.setForeground(parent.getDisplay().getSystemColor(SWT.COLOR_DARK_GRAY));
331 GridData data = new GridData(SWT.FILL, SWT.TOP, true, false);
332 data.heightHint = 16;
333 label.setLayoutData(data);
335 // Add resource id drop support to the drop-area.
336 DropTarget dropTarget = new DropTarget(label, DND.DROP_LINK | DND.DROP_COPY);
337 dropTarget.setTransfer(new Transfer[] { TextTransfer.getInstance(), ResourceReferenceTransfer.getInstance(), LocalObjectTransfer.getTransfer() });
338 dropTarget.addDropListener(new DropTargetAdapter() {
340 public void dragEnter(DropTargetEvent event) {
341 event.detail = DND.DROP_LINK;
342 //label.setBackground(green);
346 public void dragLeave(DropTargetEvent event) {
347 label.setBackground(null);
351 public void drop(DropTargetEvent event) {
352 label.setBackground(null);
353 ResourceArray[] data = parseEventData(event);
354 if (data == null || data.length != 1) {
355 event.detail = DND.DROP_NONE;
358 final ResourceArray array = data[0];
359 final Resource r = array.resources[array.resources.length - 1];
363 label.setText(session.syncRequest(new Read<String>() {
365 public String perform(ReadGraph graph)
366 throws DatabaseException {
367 return NameUtils.getSafeName(graph, r);
370 } catch (DatabaseException e) {
375 private ResourceArray[] parseEventData(DropTargetEvent event) {
376 //System.out.println("DATA: " + event.data);
377 if (event.data instanceof String) {
379 SerialisationSupport support = session.getService(SerialisationSupport.class);
380 return ResourceTransferUtils.readStringTransferable(support, (String) event.data).toResourceArrayArray();
381 } catch (IllegalArgumentException e) {
383 } catch (DatabaseException e) {
387 ResourceArray[] ret = ResourceAdaptionUtils.toResourceArrays(event.data);
399 private class ConfigurationDialog extends Dialog {
401 protected ConfigurationDialog(Shell parentShell) {
406 protected void createButtonsForButtonBar(Composite parent) {
407 createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
408 createButton(parent, IDialogConstants.CLIENT_ID+1, "Load", false);
409 createButton(parent, IDialogConstants.CLIENT_ID+2, "Save", false);
413 protected void buttonPressed(int buttonId) {
414 super.buttonPressed(buttonId);
415 if (buttonId == IDialogConstants.CLIENT_ID+1) {
417 FileDialog dialog = new FileDialog(Display.getCurrent().getActiveShell(),SWT.OPEN);
418 dialog.setFilterExtensions(new String[]{"*.xml"});
419 String filename = dialog.open();
420 if (filename == null)
424 traversedViewer.refresh();
425 testedViewer.refresh();
426 strongViewer.refresh();
427 nonTestedViewer.refresh();
428 nonTraversedViewer.refresh();
429 } catch (Exception e1) {
430 MessageDialog.openError(Display.getCurrent().getActiveShell(), "Cannot load file" , e1.getMessage());
432 } else if (buttonId == IDialogConstants.CLIENT_ID+2) {
434 FileDialog dialog = new FileDialog(Display.getCurrent().getActiveShell(),SWT.SAVE);
435 dialog.setFilterExtensions(new String[]{"*.xml"});
436 String filename = dialog.open();
437 if (filename == null)
441 if (!filename.endsWith("xml"))
443 } catch (FileNotFoundException e1) {
444 MessageDialog.openError(Display.getCurrent().getActiveShell(), "Cannot save file" , e1.getMessage());
445 } catch (IOException e1) {
446 MessageDialog.openError(Display.getCurrent().getActiveShell(), "Cannot save file" , e1.getMessage());
447 } catch (DatabaseException e1) {
448 MessageDialog.openError(Display.getCurrent().getActiveShell(), "Cannot save file" , e1.getMessage());
453 private ListViewer traversedViewer;
454 private ListViewer testedViewer;
455 private ListViewer strongViewer;
456 private ListViewer nonTraversedViewer;
457 private ListViewer nonTestedViewer;
460 protected Control createDialogArea(Composite parent) {
461 Composite composite = (Composite) super.createDialogArea(parent);
462 composite.setLayout(new FillLayout(SWT.VERTICAL));
464 Group group = new Group(composite, SWT.NONE);
465 group.setText("Traversed");
466 group.setLayout(new FillLayout());
467 traversedViewer = new ListViewer(group);
469 group = new Group(composite, SWT.NONE);
470 group.setText("Tested");
471 group.setLayout(new FillLayout());
472 testedViewer = new ListViewer(group);
474 group = new Group(composite, SWT.NONE);
475 group.setText("Strong");
476 group.setLayout(new FillLayout());
477 strongViewer = new ListViewer(group);
479 group = new Group(composite, SWT.NONE);
480 group.setText("NonTraversed");
481 group.setLayout(new FillLayout());
482 nonTraversedViewer = new ListViewer(group);
484 group = new Group(composite, SWT.NONE);
485 group.setText("NonTested");
486 group.setLayout(new FillLayout());
487 nonTestedViewer = new ListViewer(group);
489 traversedViewer.setContentProvider(new ResourceListContentProvider());
490 traversedViewer.setLabelProvider(new ResourceLabelProvider());
492 testedViewer.setContentProvider(new ResourceListContentProvider());
493 testedViewer.setLabelProvider(new ResourceLabelProvider());
495 strongViewer.setContentProvider(new ResourceListContentProvider());
496 strongViewer.setLabelProvider(new ResourceLabelProvider());
498 nonTraversedViewer.setContentProvider(new ResourceListContentProvider());
499 nonTraversedViewer.setLabelProvider(new ResourceLabelProvider());
501 nonTestedViewer.setContentProvider(new ResourceListContentProvider());
502 nonTestedViewer.setLabelProvider(new ResourceLabelProvider());
504 MenuManager strongManager = new MenuManager();
505 strongManager.setRemoveAllWhenShown(true);
506 strongManager.addMenuListener(new ListPopupListener(strongViewer));
507 strongViewer.getControl().setMenu(strongManager.createContextMenu(strongViewer.getControl()));
509 MenuManager nonTestedManager = new MenuManager();
510 nonTestedManager.setRemoveAllWhenShown(true);
511 nonTestedManager.addMenuListener(new ListPopupListener(nonTestedViewer));
512 nonTestedViewer.getControl().setMenu(nonTestedManager.createContextMenu(nonTestedViewer.getControl()));
514 MenuManager nonTraversedManager = new MenuManager();
515 nonTraversedManager.setRemoveAllWhenShown(true);
516 nonTraversedManager.addMenuListener(new ListPopupListener(nonTraversedViewer));
517 nonTraversedViewer.getControl().setMenu(nonTraversedManager.createContextMenu(nonTraversedViewer.getControl()));
519 MenuManager testedManager = new MenuManager();
520 testedManager.setRemoveAllWhenShown(true);
521 testedManager.addMenuListener(new ListPopupListener(testedViewer));
522 testedViewer.getControl().setMenu(testedManager.createContextMenu(testedViewer.getControl()));
524 MenuManager traversedManager = new MenuManager();
525 traversedManager.setRemoveAllWhenShown(true);
526 traversedManager.addMenuListener(new ListPopupListener(traversedViewer));
527 traversedViewer.getControl().setMenu(traversedManager.createContextMenu(traversedViewer.getControl()));
529 traversedViewer.setInput(traversed);
530 testedViewer.setInput(tested);
531 strongViewer.setInput(strong);
532 nonTestedViewer.setInput(nonTested);
533 nonTraversedViewer.setInput(nonTraversed);
540 private class ListPopupListener implements IMenuListener {
541 private ListViewer viewer;
543 public ListPopupListener(ListViewer viewer) {
544 this.viewer = viewer;
548 public void menuAboutToShow(IMenuManager manager) {
549 IStructuredSelection s = (IStructuredSelection)viewer.getSelection();
550 List<Object> list = (List<Object>)viewer.getInput();
551 manager.add(new AddAction(viewer, list));
553 Object element = s.getFirstElement();
554 manager.add(new DeleteAction(viewer, list, element));
560 private class DeleteAction extends Action {
561 private Viewer viewer;
562 private List<?> list;
564 public DeleteAction(Viewer viewer, List<?> list, Object obj) {
568 this.viewer = viewer;
578 private class AddAction extends Action {
579 private Viewer viewer;
580 private List<Object> list;
581 public AddAction(Viewer viewer, List<Object> list) {
584 this.viewer = viewer;
589 RelationChooseDialog dialog = new RelationChooseDialog(getSite().getShell());
590 if (dialog.open() == RelationChooseDialog.OK) {
591 final String uri = dialog.getUri();
593 Resource res = session.syncRequest(new Read<Resource>() {
595 public Resource perform(ReadGraph graph)
596 throws DatabaseException {
598 return graph.getResource(uri);
599 } catch (Exception e) {
608 MessageDialog.openError(getSite().getShell(), "Error", "Relation '" + uri + "' not found.");
610 } catch (Exception e) {
620 private class RelationChooseDialog extends Dialog {
622 private String uri = null;
624 public RelationChooseDialog(IShellProvider parentShell) {
628 public RelationChooseDialog(Shell parentShell) {
633 protected Control createDialogArea(Composite parent) {
634 Composite composite = (Composite) super.createDialogArea(parent);
635 composite.setLayout(new GridLayout(2, false));
636 Label label = new Label(composite, SWT.NONE);
637 label.setText("URI:");
639 text = new Text(composite, SWT.SINGLE | SWT.BORDER);
640 text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
646 protected void okPressed() {
647 uri = text.getText();
651 public String getUri() {
657 private class ResourceListContentProvider implements IStructuredContentProvider {
659 @SuppressWarnings("unchecked")
661 public Object[] getElements(Object inputElement) {
662 List<Resource> list = (List<Resource>)inputElement;
663 return list.toArray();
667 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
672 public void dispose() {
677 private class ResourceLabelProvider extends LabelProvider {
680 public String getText(Object element) {
681 final Resource res = (Resource) element;
683 return session.syncRequest(new Read<String>() {
685 public String perform(ReadGraph graph) throws DatabaseException {
686 return NameUtils.getSafeName(graph, res);
689 } catch (DatabaseException e) {
690 return "Error: " + e.getMessage();
696 private boolean saveConf(String filename) throws IOException, DatabaseException {
697 File file = new File(filename);
699 if(!MessageDialog.openQuestion(Display.getCurrent().getActiveShell(), "Saving compare configuration", "Do you want to overwrite file'" + filename + "'?"))
702 if(!file.createNewFile())
705 final PrintStream ps = new PrintStream(file);
706 ps.println("<?xml version=\"1.0\"?>");
707 ps.println("<compare>");
708 session.syncRequest(new ReadRequest() {
711 public void run(ReadGraph graph) throws DatabaseException {
712 for (Resource r : traversed) {
713 ps.println("<traversed uri=\"" + graph.getURI(r) + "\"/>");
715 for (Resource r : tested) {
716 ps.println("<tested uri=\"" + graph.getURI(r) + "\"/>");
718 for (Resource r : strong) {
719 ps.println("<strong uri=\"" + graph.getURI(r) + "\"/>");
721 for (Resource r : nonTraversed) {
722 ps.println("<nontraversed uri=\"" + graph.getURI(r) + "\"/>");
724 for (Resource r : nonTested) {
725 ps.println("<nontested uri=\"" + graph.getURI(r) + "\"/>");
730 ps.println("</compare>");
736 private void load(String filename) throws Exception {
737 final ImportListener listener = new ImportListener();
738 XMLParser parser = new XMLParser(listener);
739 parser.parse(filename);
741 if (listener.getNonTested().size() +
742 listener.getNonTraversed().size() +
743 listener.getStrong().size() +
744 listener.getTested().size() +
745 listener.getTraversed().size() == 0)
747 session.syncRequest(new ReadRequest() {
750 public void run(ReadGraph graph) throws DatabaseException {
755 nonTraversed.clear();
756 for (String uri : listener.getTested()) {
757 tested.add(graph.getResource(uri));
759 for (String uri : listener.getTraversed()) {
760 traversed.add(graph.getResource(uri));
762 for (String uri : listener.getStrong()) {
763 strong.add(graph.getResource(uri));
766 for (String uri : listener.getNonTested()) {
767 nonTested.add(graph.getResource(uri));
769 for (String uri : listener.getNonTraversed()) {
770 nonTraversed.add(graph.getResource(uri));
780 public static class ImportListener {
783 private Collection<String> traversed = new ArrayList<String>();
784 private Collection<String> tested = new ArrayList<String>();
785 private Collection<String> strong = new ArrayList<String>();
786 private Collection<String> nonTraversed = new ArrayList<String>();
787 private Collection<String> nonTested = new ArrayList<String>();
795 public void addTraversed(String uri) {
799 public void addTested(String uri) {
803 public void addStrong(String uri) {
807 public void addNonTraversed(String uri) {
808 nonTraversed.add(uri);
811 public void addNonTested(String uri) {
815 public Collection<String> getTraversed() {
819 public Collection<String> getNonTested() {
823 public Collection<String> getNonTraversed() {
827 public Collection<String> getStrong() {
831 public Collection<String> getTested() {
839 public static class XMLParser {
841 private ImportListener listener;
843 public XMLParser(ImportListener listener) {
844 this.listener = listener;
847 public void parse(String filename) throws Exception{
848 ParserBean p = new ParserBean();
852 private void handleElement(Stack<Element> parents, Element element) throws SAXException{
853 String name = element.qName;
854 if(name.equals("traversed")) {
855 for (Attribute a : element.attributes) {
856 String propertyName = a.localName;
857 String value = a.value;
858 if (propertyName.equals("uri")) {
859 listener.addTraversed(value);
863 } else if(name.equals("tested")) {
864 for (Attribute a : element.attributes) {
865 String propertyName = a.localName;
866 String value = a.value;
867 if (propertyName.equals("uri")) {
868 listener.addTested(value);
872 } else if(name.equals("strong")) {
873 for (Attribute a : element.attributes) {
874 String propertyName = a.localName;
875 String value = a.value;
876 if (propertyName.equals("uri")) {
877 listener.addStrong(value);
881 } else if(name.equals("nontraversed")) {
882 for (Attribute a : element.attributes) {
883 String propertyName = a.localName;
884 String value = a.value;
885 if (propertyName.equals("uri")) {
886 listener.addNonTraversed(value);
890 } else if(name.equals("nontested")) {
891 for (Attribute a : element.attributes) {
892 String propertyName = a.localName;
893 String value = a.value;
894 if (propertyName.equals("uri")) {
895 listener.addNonTested(value);
899 } else if (name.equals("compare")) {
902 throw new SAXException("Unknown element '" + name + "'. The file does not contain ExtIO configuration.");
908 public class ParserBean extends DefaultHandler implements Serializable {
910 private static final long serialVersionUID = -4995836637014958966L;
912 private Stack<Element> current = new Stack<Element>();
913 private Stack<String> texts = new Stack<String>();
915 public ParserBean() {
919 public void parse(String filename) throws Exception {
920 SAXParserFactory spf = SAXParserFactory.newInstance();
921 SAXParser saxParser = spf.newSAXParser();
923 XMLReader reader = saxParser.getXMLReader();
924 FileReader file = new FileReader(filename);
925 reader.setContentHandler(this);
926 reader.parse(new InputSource(file));
931 public void startElement(String uri, String localName, String name,
932 Attributes attributes) throws SAXException {
933 current.push(new Element(uri,localName,name,attributes));
934 texts.push(new String());
938 public void endElement(String uri, String localName, String name)
939 throws SAXException {
942 if (!current.empty()) {
947 e.setValue(text.trim());
950 handleElement(current,e);
955 public void characters(char[] ch, int start, int length)
956 throws SAXException {
957 if (!current.empty()) {
959 String text = texts.pop();
961 String value = new String(
969 public class Attribute {
970 public String localName;
975 public Attribute(String localName, String qName, String uri, String value) {
976 this.localName = localName;
983 public class Element implements Serializable {
984 private static final long serialVersionUID = -5207502156942818875L;
989 List<Attribute> attributes = new ArrayList<Attribute>();
991 public Element(String uri, String localName, String qName, Attributes attributes) {
993 this.localName = localName;
995 for (int i = 0; i < attributes.getLength(); i++) {
996 this.attributes.add(new Attribute(attributes.getLocalName(i),attributes.getQName(i),attributes.getURI(i),attributes.getValue(i)));
1000 public String getUri() {
1004 public String getLocalName() {
1008 public String getQName() {
1012 public String getValue() {
1016 public List<Attribute> getAttributes() {
1020 public void setValue(String value) {