http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/163747de/taverna-xpath-activity-ui/src/main/java/net/sf/taverna/t2/activities/xpath/ui/config/XPathActivityConfigurationPanel.java
----------------------------------------------------------------------
diff --git 
a/taverna-xpath-activity-ui/src/main/java/net/sf/taverna/t2/activities/xpath/ui/config/XPathActivityConfigurationPanel.java
 
b/taverna-xpath-activity-ui/src/main/java/net/sf/taverna/t2/activities/xpath/ui/config/XPathActivityConfigurationPanel.java
deleted file mode 100644
index 54719a2..0000000
--- 
a/taverna-xpath-activity-ui/src/main/java/net/sf/taverna/t2/activities/xpath/ui/config/XPathActivityConfigurationPanel.java
+++ /dev/null
@@ -1,1202 +0,0 @@
-package net.sf.taverna.t2.activities.xpath.ui.config;
-
-import java.awt.AWTEvent;
-import java.awt.BorderLayout;
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.Cursor;
-import java.awt.Dimension;
-import java.awt.GridBagConstraints;
-import java.awt.GridBagLayout;
-import java.awt.GridLayout;
-import java.awt.Insets;
-import java.awt.Point;
-import java.awt.Toolkit;
-import java.awt.event.AWTEventListener;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.FocusEvent;
-import java.awt.event.FocusListener;
-import java.awt.event.KeyAdapter;
-import java.awt.event.KeyEvent;
-import java.awt.event.KeyListener;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
-import java.awt.geom.Area;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.prefs.Preferences;
-
-import javax.swing.AbstractAction;
-import javax.swing.BorderFactory;
-import javax.swing.BoxLayout;
-import javax.swing.JButton;
-import javax.swing.JCheckBoxMenuItem;
-import javax.swing.JFileChooser;
-import javax.swing.JFrame;
-import javax.swing.JLabel;
-import javax.swing.JOptionPane;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JSeparator;
-import javax.swing.JTabbedPane;
-import javax.swing.JTable;
-import javax.swing.JTextArea;
-import javax.swing.JTextField;
-import javax.swing.JToggleButton;
-import javax.swing.ListSelectionModel;
-import javax.swing.Popup;
-import javax.swing.PopupFactory;
-import javax.swing.SwingUtilities;
-import javax.swing.Timer;
-import javax.swing.event.CaretEvent;
-import javax.swing.event.CaretListener;
-import javax.swing.filechooser.FileFilter;
-import javax.swing.table.DefaultTableModel;
-
-import org.apache.taverna.activities.xpath.XPathActivityConfigurationBean;
-import net.sf.taverna.t2.activities.xpath.ui.config.xmltree.TableCellListener;
-import 
net.sf.taverna.t2.activities.xpath.ui.config.xmltree.XPathActivityXMLTree;
-import 
net.sf.taverna.t2.activities.xpath.ui.servicedescription.XPathActivityIcon;
-import net.sf.taverna.t2.workbench.icons.WorkbenchIcons;
-
-import org.apache.log4j.Logger;
-import org.dom4j.Document;
-import org.dom4j.DocumentException;
-import org.dom4j.DocumentHelper;
-import org.dom4j.InvalidXPathException;
-import org.dom4j.Node;
-import org.dom4j.XPath;
-import org.dom4j.XPathException;
-
-/**
- * @author Sergejs Aleksejevs
- */
-@SuppressWarnings("serial")
-public class XPathActivityConfigurationPanel extends JPanel {
-
-       private Logger logger = 
Logger.getLogger(XPathActivityConfigurationPanel.class);
-
-       // --- CONSTANTS ---
-       public static final int 
MAX_NUMBER_OF_MATCHING_NODES_TO_HIGHLIGHT_IN_THE_TREE = 100;
-
-       private static final Color INACTIVE_PANEL_BACKGROUND_COLOR = new 
Color(215,
-                       215, 215);
-
-       private static final String EXAMPLE_XML_PROMPT = "Paste example XML 
here...";
-
-       private static final String 
XPATH_XML_DOCUMENT_DIR_PROPERTY="XPathXMLDocumentDir";
-
-       private XPathActivityConfigurationPanel thisPanel;
-
-       // --- COMPONENTS FOR ACTIVITY CONFIGURATION PANEL ---
-       private JPanel jpActivityConfiguration;
-
-       private JPanel jpLeft;
-       private JPanel jpRight;
-
-       private JToggleButton bShowXMLTreeSettings;
-       private Popup xmlTreeSettingsMenu;
-       private long xmlTreeSettingsMenuLastShownAt;
-       private JButton bGenerateXPathExpression;
-       private JPanel jpXMLTreeSettingsMenuContents;
-       private JCheckBoxMenuItem miIncludeAttributes;
-       private JCheckBoxMenuItem miIncludeValues;
-       private JCheckBoxMenuItem miIncludeNamespaces;
-
-       private JTextArea taSourceXML;
-       private JButton bLoadXMLDocument;
-       private JButton bParseXML;
-       private XPathActivityXMLTree xmlTree;
-       private JScrollPane spXMLTreePlaceholder;
-
-       // --- COMPONENTS FOR XPATH EDITING PANEL ---
-       private JLabel jlXPathExpressionStatus;
-       private JLabel jlXPathExpression;
-       private JTextField tfXPathExpression;
-       private Map<String, String> xpathNamespaceMap;
-       private JButton bRunXPath;
-
-       private JLabel jlShowHideNamespaceMappings;
-       private JTable jtXPathNamespaceMappings;
-       private JButton bAddMapping;
-       private JButton bRemoveMapping;
-       private JPanel jpNamespaceMappingsWithButton;
-
-       // --- COMPONENTS FOR XPATH TESTING PANEL ---
-       private JPanel jpXPathTesting;
-
-       private JTextField tfExecutedXPathExpression;
-       private JTextField tfMatchingElementCount;
-
-       private JTabbedPane tpExecutedXPathExpressionResults;
-       private JTextArea taExecutedXPathExpressionResultsAsText;
-       private JScrollPane spExecutedXPathExpressionResultsAsText;
-       private JTextArea taExecutedXPathExpressionResultsAsXML;
-       private JScrollPane spExecutedXPathExpressionResultsAsXML;
-
-       public XPathActivityConfigurationPanel() {
-               this.thisPanel = this;
-
-               this.setLayout(new GridBagLayout());
-               GridBagConstraints c = new GridBagConstraints();
-
-               c.gridx = 0;
-               c.gridy = 0;
-               c.fill = GridBagConstraints.BOTH;
-               c.weightx = 1.0;
-               c.weighty = 0.50;
-               c.insets = new Insets(0, 10, 10, 10);
-               this.jpActivityConfiguration = 
createActivityConfigurationPanel();
-               this.add(this.jpActivityConfiguration, c);
-
-               c.gridy++;
-               c.fill = GridBagConstraints.HORIZONTAL;
-               c.weighty = 0;
-               c.insets = new Insets(0, 10, 0, 10);
-               this.add(new JSeparator(), c);
-
-               // XPath expression editing panel
-               c.gridy++;
-               c.fill = GridBagConstraints.BOTH;
-               c.weighty = 0.05;
-               c.insets = new Insets(5, 10, 5, 10);
-               this.add(createXPathExpressionEditingPanel(), c);
-
-               c.gridy++;
-               ;
-               c.fill = GridBagConstraints.HORIZONTAL;
-               c.weighty = 0;
-               c.insets = new Insets(0, 10, 0, 10);
-               this.add(new JSeparator(), c);
-
-               // XPath expression testing panel
-               c.gridy++;
-               c.fill = GridBagConstraints.BOTH;
-               c.weighty = 0.35;
-               c.insets = new Insets(5, 10, 0, 10);
-               this.jpXPathTesting = createXPathExpressionTestingPanel();
-               this.add(this.jpXPathTesting, c);
-       }
-
-       private JPanel createActivityConfigurationPanel() {
-               JPanel jpConfig = new JPanel(new GridBagLayout());
-               GridBagConstraints c = new GridBagConstraints();
-
-               // text area for example XML document
-               c.gridx = 0;
-               c.gridy = 0;
-               c.fill = GridBagConstraints.BOTH;
-               c.weightx = 0.5;
-               c.weighty = 1.0;
-               c.insets = new Insets(5, 0, 0, 5);
-               taSourceXML = new JTextArea(10, 30);
-               taSourceXML
-                               .setToolTipText("<html>Use this text area to 
paste or load an example XML document.<br>"
-                                               + "This document can then be 
parsed by clicking the button<br>"
-                                               + "with a green arrow in order 
to see its tree structure.</html>");
-               taSourceXML.setText(EXAMPLE_XML_PROMPT);
-               taSourceXML.addFocusListener(new FocusListener() {
-                       public void focusGained(FocusEvent e) {
-                               taSourceXML.selectAll();
-                       }
-
-                       public void focusLost(FocusEvent e) { /* do nothing */
-                       }
-               });
-               taSourceXML.addCaretListener(new CaretListener() {
-                       public void caretUpdate(CaretEvent e) {
-                               // make sure that it is only allowed to "parse 
example XML"
-                               // when something is actually present in the 
text area
-                               
bParseXML.setEnabled(taSourceXML.getText().trim().length() > 0
-                                               && 
!taSourceXML.getText().trim().equals(
-                                                               
EXAMPLE_XML_PROMPT));
-                       }
-               });
-               jpLeft = new JPanel(new GridLayout(1, 1));
-               jpLeft.add(new JScrollPane(taSourceXML));
-               jpConfig.add(jpLeft, c);
-
-               // button to parse example XML document
-
-               c.gridx++;
-               c.fill = GridBagConstraints.NONE;
-               c.weightx = 0;
-               c.weighty = 0;
-               c.insets = new Insets(0, 0, 0, 0);
-               bParseXML = new JButton(
-                               XPathActivityIcon
-                                               
.getIconById(XPathActivityIcon.XPATH_ACTIVITY_CONFIGURATION_PARSE_XML_ICON));
-               bParseXML
-                               .setToolTipText("Parse example XML document and 
generate its tree structure");
-               bParseXML.setEnabled(false);
-               bParseXML.addActionListener(new ActionListener() {
-                       public void actionPerformed(ActionEvent e) {
-                               parseXML();
-                       }
-               });
-               jpConfig.add(bParseXML, c);
-
-               // placeholder for XML tree (will be replaced by a real tree 
when the
-               // parsing is done)
-
-               c.gridx++;
-               c.fill = GridBagConstraints.BOTH;
-               c.weightx = 0.5;
-               c.weighty = 1.0;
-               c.insets = new Insets(5, 5, 0, 0);
-               JTextArea taXMLTreePlaceholder = new JTextArea(10, 30);
-               taXMLTreePlaceholder
-                               .setToolTipText("<html>This area will show tree 
structure of the example XML after you<br>"
-                                               + "paste it into the space on 
the left-hand side and press 'Parse'<br>"
-                                               + "button with the green 
arrow.</html>");
-               taXMLTreePlaceholder.setEditable(false);
-               
taXMLTreePlaceholder.setBackground(INACTIVE_PANEL_BACKGROUND_COLOR);
-               spXMLTreePlaceholder = new JScrollPane(taXMLTreePlaceholder);
-               jpRight = new JPanel(new GridLayout(1, 1));
-               jpRight.add(spXMLTreePlaceholder);
-               jpConfig.add(jpRight, c);
-
-               // Button to load XML document from a file
-               
-               bLoadXMLDocument = new JButton("Load XML from file", 
WorkbenchIcons.openIcon);  
-               bLoadXMLDocument.addActionListener(new ActionListener() {
-                       
-                       @Override
-                       public void actionPerformed(ActionEvent e) {
-                               JFileChooser fileChooser = new JFileChooser();
-                               Preferences prefs = 
Preferences.userNodeForPackage(getClass());
-                               String curDir = 
prefs.get(XPATH_XML_DOCUMENT_DIR_PROPERTY, System.getProperty("user.home"));
-                               fileChooser.setDialogTitle("Select file to load 
XML from");
-                               fileChooser.setFileFilter(new FileFilter() {  
-                                       public boolean accept(File f) {
-                                       return f.isDirectory() || 
f.getName().toLowerCase().endsWith(".xml");
-                                   }
-                                   
-                                   public String getDescription() {
-                                       return ".xml files";
-                                   }
-                               });
-                               fileChooser.setCurrentDirectory(new 
File(curDir));              
-                               int returnVal = 
fileChooser.showOpenDialog(((JButton) e
-                                               .getSource()).getParent());
-                               if (returnVal == JFileChooser.APPROVE_OPTION) {
-                                       
prefs.put(XPATH_XML_DOCUMENT_DIR_PROPERTY, fileChooser
-                                                       
.getCurrentDirectory().toString());
-                                       File file = 
fileChooser.getSelectedFile();
-                                       // Read the contents of a file into a 
string
-                                       // and set the value of the XML 
document text area to it
-                                       FileInputStream fis = null;
-                                       try{
-                                               byte[] fileBytes = new 
byte[(int)file.length()];
-                                               fis = new FileInputStream(file);
-                                               fis.read(fileBytes);
-                                               String xmlDocument = new 
String(fileBytes, "UTF-8");
-                                               setSourceXML(xmlDocument);
-                                       }
-                                       catch(Exception ex){
-                                               logger.error("An error occured 
while trying to read the XML document from file " + file.getAbsolutePath(), ex);
-                                               JOptionPane.showMessageDialog(
-                                                               ((JButton) 
e.getSource()).getParent(), 
-                                                               "There was an 
error while trying to read the file", 
-                                                               "XPath 
Activity", 
-                                                               
JOptionPane.ERROR_MESSAGE);
-                                       }
-                                       finally{
-                                               try {
-                                                       fis.close();
-                                               } catch (IOException e1) {
-                                                       // Ignore
-                                               }
-                                       }
-
-                               }
-                       }
-               });
-               c.gridx = 0;
-               c.gridy++;
-               c.gridwidth = 1;
-               c.fill = GridBagConstraints.NONE;
-               c.weightx = 0;
-               c.weighty = 0;
-               c.insets = new Insets(5, 0, 0, 5);
-               c.anchor = GridBagConstraints.EAST;
-               jpConfig.add(bLoadXMLDocument, c);
-               
-               // settings for the view of XML tree from example XML document
-
-               miIncludeAttributes = new JCheckBoxMenuItem("Show XML node 
attributes");
-               miIncludeAttributes.setSelected(true);
-               miIncludeAttributes.addActionListener(new ActionListener() {
-                       public void actionPerformed(ActionEvent e) {
-                               refreshXMLTreeUI();
-                       }
-               });
-
-               miIncludeValues = new JCheckBoxMenuItem(
-                               "Show values of XML elements and attributes");
-               miIncludeValues.setSelected(true);
-               miIncludeValues.addActionListener(new ActionListener() {
-                       public void actionPerformed(ActionEvent e) {
-                               refreshXMLTreeUI();
-                       }
-               });
-
-               miIncludeNamespaces = new JCheckBoxMenuItem(
-                               "Show namespaces of XML elements");
-               miIncludeNamespaces.addActionListener(new ActionListener() {
-                       public void actionPerformed(ActionEvent e) {
-                               refreshXMLTreeUI();
-                       }
-               });
-
-               jpXMLTreeSettingsMenuContents = new JPanel();
-               jpXMLTreeSettingsMenuContents.setBorder(BorderFactory
-                               .createRaisedBevelBorder());
-               jpXMLTreeSettingsMenuContents.setLayout(new BoxLayout(
-                               jpXMLTreeSettingsMenuContents, 
BoxLayout.Y_AXIS));
-               jpXMLTreeSettingsMenuContents.add(miIncludeAttributes);
-               jpXMLTreeSettingsMenuContents.add(miIncludeValues);
-               jpXMLTreeSettingsMenuContents.add(miIncludeNamespaces);
-
-               bShowXMLTreeSettings = new JToggleButton("Show XML tree 
settings...",
-                               
XPathActivityIcon.getIconById(XPathActivityIcon.UNFOLD_ICON));
-               bShowXMLTreeSettings.setSelectedIcon(XPathActivityIcon
-                               .getIconById(XPathActivityIcon.FOLD_ICON));
-               bShowXMLTreeSettings.setEnabled(false);
-               bShowXMLTreeSettings.addActionListener(new ActionListener() {
-                       public void actionPerformed(ActionEvent e) {
-                               if (xmlTreeSettingsMenu == null) {
-                                       xmlTreeSettingsMenuLastShownAt = 
System.currentTimeMillis();
-
-                                       Point parentPosition = 
bShowXMLTreeSettings
-                                                       .getLocationOnScreen();
-                                       xmlTreeSettingsMenu = 
PopupFactory.getSharedInstance()
-                                                       .getPopup(
-                                                                       
bShowXMLTreeSettings,
-                                                                       
jpXMLTreeSettingsMenuContents,
-                                                                       
parentPosition.x,
-                                                                       
parentPosition.y
-                                                                               
        + bShowXMLTreeSettings.getHeight());
-                                       xmlTreeSettingsMenu.show();
-                               } else {
-                                       bShowXMLTreeSettings.setSelected(false);
-                               }
-                       }
-               });
-               
-               bGenerateXPathExpression = new JButton("Generate XPath 
expression",
-                               XPathActivityIcon
-                                               
.getIconById(XPathActivityIcon.XML_TREE_NODE_ICON));
-               bGenerateXPathExpression.addActionListener(new ActionListener() 
{
-                       @Override
-                       public void actionPerformed(ActionEvent e) {
-                            updateXPathEditingPanelValues();   
-                       }       
-               });
-               
-               JPanel xmlTreeButtonPanel = new JPanel();
-               xmlTreeButtonPanel.add(bGenerateXPathExpression);
-               xmlTreeButtonPanel.add(bShowXMLTreeSettings);
-               
-               c.gridx = 2;
-               c.gridwidth = 1;
-               c.fill = GridBagConstraints.NONE;
-               c.weightx = 0;
-               c.weighty = 0;
-               c.insets = new Insets(5, 0, 0, 0);
-               c.anchor = GridBagConstraints.EAST;
-               jpConfig.add(xmlTreeButtonPanel, c);
-
-               // register a new listener for all AWT mouse events - this will 
be used
-               // to identify clicks outside of the XML tree popup menu and 
the toggle
-               // button used to show/hide it
-               Toolkit.getDefaultToolkit().addAWTEventListener(new 
AWTEventListener() {
-                       public void eventDispatched(AWTEvent event) {
-                               if (event instanceof MouseEvent && 
xmlTreeSettingsMenu != null) {
-                                       MouseEvent e = (MouseEvent) event;
-                                       if (e.getClickCount() > 0
-                                                       && (e.getWhen() - 
xmlTreeSettingsMenuLastShownAt) > 100) {
-                                               // convert a point where mouse 
click was made from
-                                               // relative coordinates of the 
source component
-                                               // to the coordinates of the 
panel that represents the
-                                               // contents of the popup menu
-                                               Point clickRelativeToOverlay = 
SwingUtilities
-                                                               
.convertPoint((Component) e.getSource(), e
-                                                                               
.getPoint(),
-                                                                               
jpXMLTreeSettingsMenuContents);
-
-                                               Area 
areaOfPopupPanelAndToggleButton = new Area(
-                                                               
jpXMLTreeSettingsMenuContents.getBounds());
-
-                                               // only hide the popup menu if 
a click was made outside
-                                               // of the calculated area --
-                                               // plus not on one of the 
associated toggle buttons
-                                               if 
(!areaOfPopupPanelAndToggleButton
-                                                               
.contains(clickRelativeToOverlay)) {
-                                                       
xmlTreeSettingsMenu.hide();
-                                                       
bShowXMLTreeSettings.setSelected(false);
-
-                                                       // if the popup menu 
was dismissed by a click on the
-                                                       // toggle button that
-                                                       // has made it visible, 
this timer makes sure that
-                                                       // this click doesn't
-                                                       // re-show the popup 
menu
-                                                       new Timer(100, new 
ActionListener() {
-                                                               public void 
actionPerformed(ActionEvent e) {
-                                                                       
((Timer) e.getSource()).stop();
-                                                                       
xmlTreeSettingsMenu = null;
-                                                               }
-                                                       }).start();
-
-                                               }
-                                       }
-                               }
-                       }
-               }, AWTEvent.MOUSE_EVENT_MASK);
-
-               return (jpConfig);
-       }
-
-       private JPanel createXPathExpressionEditingPanel() {
-               this.jlXPathExpressionStatus = new JLabel();
-
-               this.jlXPathExpression = new JLabel("XPath expression");
-
-               this.bRunXPath = new JButton("Run XPath");
-               this.bRunXPath.setEnabled(false);
-               this.bRunXPath.addActionListener(new ActionListener() {
-                       public void actionPerformed(ActionEvent e) {
-                               runXPath(true);
-                       }
-               });
-
-               this.tfXPathExpression = new JTextField(30);
-               this.tfXPathExpression.setPreferredSize(new Dimension(0, 
this.bRunXPath
-                               .getPreferredSize().height));
-               this.tfXPathExpression.setMinimumSize(new Dimension(0, 
this.bRunXPath
-                               .getPreferredSize().height));
-               this.tfXPathExpression.addCaretListener(new CaretListener() {
-                       public void caretUpdate(CaretEvent e) {
-                               validateXPathAndUpdateUI();
-                       }
-               });
-               this.tfXPathExpression.addKeyListener(new KeyListener() {
-                       public void keyPressed(KeyEvent e) {
-                               if (e.getKeyCode() == KeyEvent.VK_ENTER) {
-                                       if (bRunXPath.isEnabled()) {
-                                               // it is safe to check that 
ENTER key may execute the
-                                               // XPath expression if the
-                                               // "Run XPath" button is 
enabled, as expression
-                                               // validation is responsible for
-                                               // enabling / disabling the 
button as the expression
-                                               // changes
-                                               runXPath(true);
-                                       }
-                               }
-                       }
-
-                       public void keyReleased(KeyEvent e) { /* not in use */
-                       }
-
-                       public void keyTyped(KeyEvent e) { /* not in use */
-                       }
-               });
-
-               JPanel jpXPath = new JPanel(new GridBagLayout());
-               GridBagConstraints c = new GridBagConstraints();
-               c.fill = GridBagConstraints.HORIZONTAL;
-               c.weighty = 0;
-
-               c.gridx = 0;
-               c.gridy = 0;
-               c.weightx = 0;
-               jpXPath.add(jlXPathExpressionStatus);
-
-               c.gridx++;
-               c.weightx = 0.0;
-               c.insets = new Insets(0, 10, 0, 0);
-               jpXPath.add(jlXPathExpression, c);
-               
-               c.gridx++;
-               c.weightx = 1.0;
-               c.insets = new Insets(0, 10, 0, 10);
-               jpXPath.add(tfXPathExpression, c);
-
-               c.gridx++;
-               c.weightx = 0;
-               c.insets = new Insets(0, 0, 0, 0);
-               jpXPath.add(bRunXPath, c);
-
-               c.gridx = 2;
-               c.gridy++;
-               c.weightx = 1.0;
-               c.weighty = 0;
-               c.gridwidth = 2;
-               c.fill = GridBagConstraints.NONE;
-               c.anchor = GridBagConstraints.WEST;
-               c.insets = new Insets(0, 10, 0, 10);
-               jlShowHideNamespaceMappings = new JLabel("Show namespace 
mappings...");
-               jlShowHideNamespaceMappings.setForeground(Color.BLUE);
-               jlShowHideNamespaceMappings.setCursor(new 
Cursor(Cursor.HAND_CURSOR));
-               jlShowHideNamespaceMappings.addMouseListener(new MouseAdapter() 
{
-                       public void mouseClicked(MouseEvent e) {
-                               jpNamespaceMappingsWithButton
-                                               
.setVisible(!jpNamespaceMappingsWithButton.isVisible());
-                               jlShowHideNamespaceMappings
-                                               
.setText((jpNamespaceMappingsWithButton.isVisible() ? "Hide"
-                                                               : "Show")
-                                                               + " namespace 
mappings...");
-                               thisPanel.validate();
-                       }
-               });
-               jpXPath.add(jlShowHideNamespaceMappings, c);
-
-               // namespace mapping table
-               DefaultTableModel tableModel = new DefaultTableModel();
-               tableModel.addColumn("Namespace Prefix");
-               tableModel.addColumn("Namespace URI");
-
-               jtXPathNamespaceMappings = new JTable();
-               jtXPathNamespaceMappings.setModel(tableModel);
-               // 
((DefaultCellEditor)jtXPathNamespaceMappings.getDefaultEditor(String.class)).setClickCountToStart(1);
-               // // TODO - enable if one-click-to-start-editing behaviour is 
required
-               // TODO - next line is to be enabled when Taverna is migrated 
to Java
-               // 1.6; for now it's fine to run without this
-               // jtXPathNamespaceMappings.setFillsViewportHeight(true); // 
makes sure
-               // that when the dedicated area is larger than the table, the 
latter is
-               // stretched vertically to fill the empty space
-               jtXPathNamespaceMappings
-                               
.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); // only one row can be 
selected at a time
-               jtXPathNamespaceMappings
-                               .setPreferredScrollableViewportSize(new 
Dimension(200, 50)); // NB! this prevents the table from occupying most of the 
space in the panel when screen is maximized
-               jtXPathNamespaceMappings.addKeyListener(new KeyAdapter() {
-                       public void keyReleased(KeyEvent e) {
-                               if (e.getKeyCode() == KeyEvent.VK_DELETE) {
-                                       removeNamespaceMapping();
-                               }
-                       }
-               });
-
-               TableCellListener cellListener = new TableCellListener(
-                               jtXPathNamespaceMappings, new AbstractAction() {
-                                       public void actionPerformed(ActionEvent 
e) {
-                                               TableCellListener tcl = 
(TableCellListener) e
-                                                               .getSource();
-
-                                               if (tcl.getColumn() == 0) {
-                                                       // prefix was modified
-                                                       String newPrefix = 
(String) tcl.getNewValue();
-                                                       if 
(xpathNamespaceMap.containsKey(newPrefix)) {
-                                                               // such prefix 
already exists - change won't be
-                                                               // saved
-                                                               JOptionPane
-                                                                               
.showMessageDialog(
-                                                                               
                thisPanel,
-                                                                               
                "Cannot update namespace prefix: "
-                                                                               
                                + "updated value already exists",
-                                                                               
                "XPath Activity",
-                                                                               
                JOptionPane.WARNING_MESSAGE);
-                                                       } else {
-                                                               // update the 
map with the new prefix for the
-                                                               // same URI 
value
-                                                               String 
oldPrefix = (String) tcl.getOldValue();
-                                                               
xpathNamespaceMap.put(newPrefix,
-                                                                               
xpathNamespaceMap.remove(oldPrefix));
-                                                       }
-                                               } else {
-                                                       // simple case - just 
the URI value has changed:
-                                                       // just overwrite the 
value in the namespace map
-                                                       String 
prefixOfUpdatedURI = (String) jtXPathNamespaceMappings
-                                                                       
.getModel().getValueAt(tcl.getRow(), 0);
-                                                       
xpathNamespaceMap.put(prefixOfUpdatedURI,
-                                                                       
(String) tcl.getNewValue());
-                                               }
-
-                                               // either way - reload from the 
local map (map could be
-                                               // not updated if the 
validation didn't succeed)
-                                               
reloadNamespaceMappingTableFromLocalMap();
-                                       }
-                               });
-
-               jtXPathNamespaceMappings.getColumnModel().getColumn(0)
-                               .setPreferredWidth(20); // set relative sizes 
of columns
-               jtXPathNamespaceMappings.getColumnModel().getColumn(1)
-                               .setPreferredWidth(300);
-
-               JScrollPane spXPathNamespaceMappings = new JScrollPane(
-                               jtXPathNamespaceMappings);
-               spXPathNamespaceMappings.setAlignmentY(TOP_ALIGNMENT);
-               spXPathNamespaceMappings.setMinimumSize(new Dimension(200, 
50)); // makes the table to have at least two rows visible in all cases - no 
matter how small the parent panel is
-
-               bAddMapping = new JButton("Add Mapping");
-               bAddMapping.addActionListener(new ActionListener() {
-                       public void actionPerformed(ActionEvent e) {
-                               addNamespaceMapping();
-                       }
-               });
-
-               bRemoveMapping = new JButton("Remove Mapping");
-               bRemoveMapping.setEnabled(false);
-               bRemoveMapping.addActionListener(new ActionListener() {
-                       public void actionPerformed(ActionEvent e) {
-                               removeNamespaceMapping();
-                       }
-               });
-
-               bAddMapping.setMinimumSize(bRemoveMapping.getPreferredSize()); 
// make sure that the 'Add Mapping' button is of the same size as 'Remove 
Mapping'
-                                                                               
                                        
-               
bAddMapping.setPreferredSize(bRemoveMapping.getPreferredSize()); // -- both are 
required to achieve desired behaviour when window is resized / namespace 
mapping table is enabled/disabled                                               
                                               
-
-               bRunXPath.setMinimumSize(bRemoveMapping.getPreferredSize()); // 
do the same for 'Run XPath' button
-               
-               bRunXPath.setPreferredSize(bRemoveMapping.getPreferredSize());
-
-               JPanel jpAddRemoveButtons = new JPanel();
-               jpAddRemoveButtons.setLayout(new GridBagLayout());
-               GridBagConstraints cAddRemove = new GridBagConstraints();
-               cAddRemove.gridx = 0;
-               cAddRemove.gridy = 0;
-               cAddRemove.weightx = 1.0;
-               cAddRemove.anchor = GridBagConstraints.NORTH;
-               cAddRemove.fill = GridBagConstraints.HORIZONTAL;
-               jpAddRemoveButtons.add(bAddMapping, cAddRemove);
-               cAddRemove.gridy++;
-               cAddRemove.weighty = 1.0;
-               cAddRemove.insets = new Insets(2, 0, 0, 0);
-               jpAddRemoveButtons.add(bRemoveMapping, cAddRemove);
-
-               jpNamespaceMappingsWithButton = new JPanel();
-               jpNamespaceMappingsWithButton.setVisible(false);
-               jpNamespaceMappingsWithButton.setLayout(new BorderLayout(10, 
0));
-               jpNamespaceMappingsWithButton.add(spXPathNamespaceMappings,
-                               BorderLayout.CENTER);
-               jpNamespaceMappingsWithButton
-                               .add(jpAddRemoveButtons, BorderLayout.EAST);
-
-               c.gridx = 0;
-               c.gridy++;
-               c.gridwidth = 4;
-               c.fill = GridBagConstraints.BOTH;
-               c.weightx = 1.0;
-               c.weighty = 1.0;
-               c.insets = new Insets(5, 0, 0, 0);
-               jpXPath.add(jpNamespaceMappingsWithButton, c);
-
-               // initialise some values / tooltips
-               resetXPathEditingPanel();
-
-               return (jpXPath);
-       }
-
-       protected void addNamespaceMapping() {
-               TwoFieldQueryPanel queryPanel = new TwoFieldQueryPanel(
-                               "Namespace prefix:", "Namespace URI:");
-               int result = JOptionPane.showConfirmDialog(this, queryPanel,
-                               "XPath Activity - Create new namespace mapping",
-                               JOptionPane.OK_CANCEL_OPTION);
-
-               if (result == JOptionPane.OK_OPTION) {
-                       boolean bInvalidMapping = true;
-                       do {
-                               bInvalidMapping = 
queryPanel.getFirstValue().length() == 0
-                                               || 
queryPanel.getSecondValue().length() == 0
-                                               || 
xpathNamespaceMap.containsKey(queryPanel
-                                                               
.getFirstValue());
-
-                               if (bInvalidMapping) {
-                                       queryPanel = new TwoFieldQueryPanel(
-                                                       "<html><center><font 
color=\"red\">ERROR: you must "
-                                                                       + 
"enter values for both namespace prefix and URI. Prefix must be<br>"
-                                                                       + 
"unique in the mapping table - duplicates are not 
allowed!</font></center></html>",
-                                                       "Namespace prefix:", 
queryPanel.getFirstValue(),
-                                                       "Namespace URI:", 
queryPanel.getSecondValue());
-                                       result = 
JOptionPane.showConfirmDialog(this, queryPanel,
-                                                       "XPath Activity - 
Create new namespace mapping",
-                                                       
JOptionPane.OK_CANCEL_OPTION);
-                               }
-                       } while (bInvalidMapping && result == 
JOptionPane.OK_OPTION);
-
-                       if (result == JOptionPane.OK_OPTION && 
!bInvalidMapping) {
-                               // the value appears to be valid and OK was 
pressed - create new
-                               // mapping
-                               
this.xpathNamespaceMap.put(queryPanel.getFirstValue(),
-                                               queryPanel.getSecondValue());
-                               reloadNamespaceMappingTableFromLocalMap();
-                       }
-               }
-       }
-
-       protected void removeNamespaceMapping() {
-               int selectedRow = jtXPathNamespaceMappings.getSelectedRow();
-               if (selectedRow != -1) {
-                       // some row is selected - need to delete it and refresh 
table's UI
-                       // (but first stop editing to avoid
-                       // problems with cell editor trying to store an edited 
value after
-                       // edited row has been deleted)
-                       if (jtXPathNamespaceMappings.getCellEditor() != null) {
-                               
jtXPathNamespaceMappings.getCellEditor().stopCellEditing();
-                       }
-                       
xpathNamespaceMap.remove(jtXPathNamespaceMappings.getValueAt(
-                                       selectedRow, 0));
-                       reloadNamespaceMappingTableFromLocalMap();
-
-                       // select another row in the table
-                       int rowCount = jtXPathNamespaceMappings.getRowCount();
-                       if (rowCount > 0) {
-                               if (selectedRow < 
jtXPathNamespaceMappings.getRowCount()) {
-                                       // select the row that followed the one 
that was deleted
-                                       
jtXPathNamespaceMappings.getSelectionModel()
-                                                       
.setSelectionInterval(selectedRow, selectedRow);
-                               } else {
-                                       // last row in the table was deleted - 
select the one that
-                                       // is the new last row
-                                       
jtXPathNamespaceMappings.getSelectionModel()
-                                                       
.setSelectionInterval(rowCount - 1, rowCount - 1);
-                               }
-                       }
-               } else {
-                       JOptionPane.showMessageDialog(thisPanel,
-                                       "Please select a mapping to delete in 
the table first!",
-                                       "XPath Activity", 
JOptionPane.WARNING_MESSAGE);
-               }
-       }
-
-       private JPanel createXPathExpressionTestingPanel() {
-               JPanel jpTesting = new JPanel(new GridBagLayout());
-               GridBagConstraints c = new GridBagConstraints();
-
-               c.gridx = 0;
-               c.gridy = 0;
-               c.gridwidth = 1;
-               c.anchor = GridBagConstraints.WEST;
-               c.fill = GridBagConstraints.NONE;
-               c.weightx = 0;
-               c.weighty = 0;
-               c.insets = new Insets(0, 0, 10, 10);
-               jpTesting.add(new JLabel("Executed XPath expression:"), c);
-
-               c.gridx++;
-               c.fill = GridBagConstraints.HORIZONTAL;
-               c.weightx = 1.0;
-               c.weighty = 0;
-               c.insets = new Insets(0, 0, 10, 10);
-               tfExecutedXPathExpression = new JTextField();
-               tfExecutedXPathExpression.setEditable(false);
-               tfExecutedXPathExpression.setBorder(null);
-               jpTesting.add(tfExecutedXPathExpression, c);
-
-               c.gridx = 0;
-               c.gridy++;
-               c.fill = GridBagConstraints.NONE;
-               c.weightx = 0;
-               c.weighty = 0;
-               c.insets = new Insets(0, 0, 5, 10);
-               jpTesting.add(new JLabel("Number of matching nodes:"), c);
-
-               c.gridx++;
-               c.fill = GridBagConstraints.HORIZONTAL;
-               c.weightx = 1.0;
-               c.weighty = 0;
-               c.insets = new Insets(0, 0, 5, 10);
-               tfMatchingElementCount = new JTextField();
-               tfMatchingElementCount.setEditable(false);
-               tfMatchingElementCount.setBorder(null);
-               jpTesting.add(tfMatchingElementCount, c);
-
-               c.gridx = 0;
-               c.gridy++;
-               c.gridwidth = 2;
-               c.fill = GridBagConstraints.BOTH;
-               c.weightx = 1.0;
-               c.weighty = 1.0;
-               tpExecutedXPathExpressionResults = new JTabbedPane();
-               jpTesting.add(tpExecutedXPathExpressionResults, c);
-
-               taExecutedXPathExpressionResultsAsText = new JTextArea();
-               taExecutedXPathExpressionResultsAsText.setEditable(false);
-               spExecutedXPathExpressionResultsAsText = new JScrollPane(
-                               taExecutedXPathExpressionResultsAsText);
-               spExecutedXPathExpressionResultsAsText.setPreferredSize(new 
Dimension(
-                               200, 60));
-               spExecutedXPathExpressionResultsAsText.setBorder(BorderFactory
-                               
.createLineBorder(INACTIVE_PANEL_BACKGROUND_COLOR, 3));
-               tpExecutedXPathExpressionResults.add("Results as text",
-                               spExecutedXPathExpressionResultsAsText);
-
-               taExecutedXPathExpressionResultsAsXML = new JTextArea();
-               taExecutedXPathExpressionResultsAsXML.setEditable(false);
-               spExecutedXPathExpressionResultsAsXML = new JScrollPane(
-                               taExecutedXPathExpressionResultsAsXML);
-               spExecutedXPathExpressionResultsAsXML.setPreferredSize(new 
Dimension(
-                               200, 60));
-               spExecutedXPathExpressionResultsAsXML.setBorder(BorderFactory
-                               
.createLineBorder(INACTIVE_PANEL_BACKGROUND_COLOR, 3));
-               tpExecutedXPathExpressionResults.add("Results as XML",
-                               spExecutedXPathExpressionResultsAsXML);
-
-               // initialise some values / tooltips
-               resetXPathTestingPanel();
-
-               return (jpTesting);
-       }
-
-       protected void parseXML() {
-               String xmlData = taSourceXML.getText();
-
-               try {
-                       xmlTree = 
XPathActivityXMLTree.createFromXMLData(xmlData,
-                                       miIncludeAttributes.isSelected(), 
miIncludeValues
-                                                       .isSelected(), 
miIncludeNamespaces.isSelected(),
-                                       this);
-                       xmlTree
-                                       .setToolTipText("<html>This is a tree 
structure of the XML document that you have pasted.<br><br>"
-                                                       + "Clicking on the 
nodes in this tree will automatically generate a<br>"
-                                                       + "corresponding XPath 
expression. Multiple <b>identical</b> nodes can<br>"
-                                                       + "be selected at once 
- in this case <b>wildcards</b> will be used in the<br>"
-                                                       + "generated XPath 
expression to if selected nodes have different<br>"
-                                                       + "ancestors. Other 
nodes that match the generated XPath expression<br>"
-                                                       + "will also be 
selected in the tree.<br><br>"
-                                                       + "Contextual menu 
provides convenience methods for expanding or<br>"
-                                                       + "collapsing the 
tree." + "</html>");
-                       xmlTree.setBorder(BorderFactory.createEmptyBorder(5, 5, 
5, 5));
-                       JScrollPane spXMLTree = new JScrollPane(xmlTree);
-                       
spXMLTree.setPreferredSize(spXMLTreePlaceholder.getPreferredSize());
-                       jpRight.removeAll();
-                       jpRight.add(spXMLTree);
-
-                       // all successful - enable options to modify the tree
-                       this.bShowXMLTreeSettings.setEnabled(true);
-
-                       // data structures inside the XML tree were reset (as 
the tree was
-                       // re-created) -
-                       // now reset the UI to the initial state as well
-                       resetXPathEditingPanel();
-                       resetXPathTestingPanel();
-
-                       // XML tree has pre-populated the namespace map with 
the namespaces
-                       // specified in the
-                       // root element of the tree - load these values
-                       updateXPathEditingPanelValues();
-
-                       this.validate();
-                       this.repaint();
-               } catch (DocumentException e) {
-                       JOptionPane.showMessageDialog(this, e.getMessage(),
-                                       "XPath Activity", 
JOptionPane.ERROR_MESSAGE);
-                       this.taSourceXML.requestFocusInWindow();
-                       return;
-               }
-       }
-
-       /**
-        * Makes the {@link XPathActivityXMLTree} to refresh its UI from the
-        * original XML document that was used to create it in first place.
-        * 
-        * The reason for using this method is to apply new options to the way 
the
-        * tree is rendered - e.g. attributes shown/hidden in the tree, values 
and
-        * namespaces shown/hidden, etc.
-        */
-       protected void refreshXMLTreeUI() {
-               
this.xmlTree.refreshFromExistingDocument(this.miIncludeAttributes
-                               .isSelected(), 
this.miIncludeValues.isSelected(),
-                               this.miIncludeNamespaces.isSelected());
-       }
-
-       /**
-        * Initialises XPath Editing panel: -- resets XPath expression that is 
being
-        * shown; -- resets local copy of namespace map; -- resets UI of 
namespace
-        * mapping table;
-        */
-       private void resetXPathEditingPanel() {
-               tfXPathExpression.setText("");
-               validateXPathAndUpdateUI();
-
-               // clear the local copy of namespace map
-               xpathNamespaceMap = new HashMap<String, String>();
-
-               // clear the namespace mapping table and reload the data from 
the map
-               DefaultTableModel tableModel = (DefaultTableModel) 
jtXPathNamespaceMappings
-                               .getModel();
-               tableModel.getDataVector().removeAllElements();
-       }
-
-       /**
-        * Initialises XPath testing panel which shows results of executing 
current
-        * XPath expression against the example XML - the panel is returned to 
the
-        * way it looks when it is first loaded.
-        */
-       private void resetXPathTestingPanel() {
-               this.tfExecutedXPathExpression.setText("--");
-               this.tfMatchingElementCount.setText("--");
-
-               this.taExecutedXPathExpressionResultsAsText.setText("");
-               this.taExecutedXPathExpressionResultsAsText
-                               .setBackground(INACTIVE_PANEL_BACKGROUND_COLOR);
-
-               this.taExecutedXPathExpressionResultsAsXML.setText("");
-               this.taExecutedXPathExpressionResultsAsXML
-                               .setBackground(INACTIVE_PANEL_BACKGROUND_COLOR);
-       }
-
-       public void updateXPathEditingPanelValues() {
-               if (xmlTree.getCurrentXPathExpression() != null) {
-                       
tfXPathExpression.setText(xmlTree.getCurrentXPathExpression()
-                                       .getText());
-               }
-
-               // clear the local copy of namespace map and update it with all 
values
-               // from
-               // the map in XML tree instance (which was apparently just 
re-generated
-               // on user request)
-               xpathNamespaceMap.clear();
-               xpathNamespaceMap.putAll(xmlTree.getCurrentXPathNamespaces());
-
-               // clear the namespace mapping table and reload the data from 
the map
-               reloadNamespaceMappingTableFromLocalMap();
-       }
-
-       protected void reloadNamespaceMappingTableFromLocalMap() {
-               // clear the namespace mapping table and reload the data from 
the map
-               DefaultTableModel tableModel = (DefaultTableModel) 
jtXPathNamespaceMappings
-                               .getModel();
-               tableModel.getDataVector().removeAllElements();
-               for (Map.Entry<String, String> mapping : this.xpathNamespaceMap
-                               .entrySet()) {
-                       tableModel.addRow(new Object[] { mapping.getKey(),
-                                       mapping.getValue() });
-               }
-
-               
bRemoveMapping.setEnabled(this.xpathNamespaceMap.entrySet().size() > 0);
-
-               repaint();
-       }
-
-       private String getXPathValidationErrorMessage() {
-               try {
-                       // try to parse the XPath expression...
-                       
DocumentHelper.createXPath(tfXPathExpression.getText().trim());
-                       // ...success
-                       return ("");
-               } catch (InvalidXPathException e) {
-                       // ...failed to parse the XPath expression: notify of 
the error
-                       return (e.getMessage());
-               }
-       }
-
-       /**
-        * Validates the current XPath expression and updates UI accordingly: --
-        * XPath status icon is updated; -- tooltip for the icon explains the
-        * status; -- 'Run XPath' button is enabled/disabled depending on 
validity
-        * of XPath expression and existence of example data in the XML tree
-        */
-       protected void validateXPathAndUpdateUI() {
-               String candidatePath = tfXPathExpression.getText();
-               int xpathStatus = XPathActivityConfigurationBean
-                               .validateXPath(candidatePath);
-
-               switch (xpathStatus) {
-               case XPathActivityConfigurationBean.XPATH_VALID:
-                       // success: expression is correct
-                       jlXPathExpressionStatus.setIcon(XPathActivityIcon
-                                       
.getIconById(XPathActivityIcon.XPATH_STATUS_OK_ICON));
-                       jlXPathExpressionStatus
-                                       .setToolTipText("Current XPath 
expression is well-formed and valid");
-
-                       // could allow to execute against example XML, with 
only condition:
-                       // XML tree must be populated
-                       // (that is, there should be something to run the 
expression
-                       // against)
-                       if (xmlTree != null) {
-                               this.bRunXPath.setEnabled(true);
-                               this.bRunXPath
-                                               .setToolTipText("<html>Evaluate 
current XPath expression against the XML document<br>"
-                                                               + "whose 
structure is shown in the tree view above.</html>");
-                       } else {
-                               this.bRunXPath.setEnabled(false);
-                               this.bRunXPath
-                                               .setToolTipText("<html>No XML 
document to evaluate the current XPath expression against.<br><br>"
-                                                               + "Paste some 
example XML into the area in the top-left section of the<br>"
-                                                               + "window, then 
parse it by clicking on the button with the green arrow<br>"
-                                                               + "in order to 
test your XPath expression.</html>");
-                       }
-                       break;
-
-               case XPathActivityConfigurationBean.XPATH_EMPTY:
-                       // no XPath expression - can't tell if it is correct + 
nothing to
-                       // execute
-                       jlXPathExpressionStatus.setIcon(XPathActivityIcon
-                                       
.getIconById(XPathActivityIcon.XPATH_STATUS_UNKNOWN_ICON));
-                       jlXPathExpressionStatus
-                                       .setToolTipText("<html>There is no 
XPath expression to validate.<br><br>"
-                                                       + "<b>Hint:</b> select 
something in the tree view showing the structure<br>"
-                                                       + "of the XML document 
that you have pasted (or type the XPath<br>"
-                                                       + "expression 
manually).</html>");
-                       this.bRunXPath.setEnabled(false);
-                       this.bRunXPath.setToolTipText("No XPath expression to 
execute");
-                       break;
-
-               case XPathActivityConfigurationBean.XPATH_INVALID:
-                       // failed to parse the XPath expression: notify of the 
error
-                       jlXPathExpressionStatus.setIcon(XPathActivityIcon
-                                       
.getIconById(XPathActivityIcon.XPATH_STATUS_ERROR_ICON));
-                       jlXPathExpressionStatus
-                                       
.setToolTipText(getXPathValidationErrorMessage());
-
-                       this.bRunXPath.setEnabled(false);
-                       this.bRunXPath
-                                       .setToolTipText("Cannot execute invalid 
XPath expression");
-                       break;
-               }
-
-       }
-
-       /**
-        * Executes the current XPath expression against the current XML tree.
-        * 
-        * @param displayResults
-        *            <code>true</code> to execute and display results in the 
XPath
-        *            activity configuration panel (this happens when the 'Run
-        *            XPath' button is clicked);<br/>
-        *            <false> to run the expression quietly and simply return 
the
-        *            number of matching nodes.
-        * @return Number of nodes in the XML tree that match the current XPath
-        *         expression. (Or <code>-1</code> if an error has occurred 
during
-        *         the execution -- error messages will only be shown if
-        *         <code>displayResults == true</code>).
-        */
-       public int runXPath(boolean displayResults) {
-               // ----- RUNNING THE XPath EXPRESSION -----
-               XPath expr = null;
-               try {
-                       expr = 
DocumentHelper.createXPath(this.tfXPathExpression.getText());
-                       expr.setNamespaceURIs(this.xpathNamespaceMap);
-               } catch (InvalidXPathException e) {
-                       if (displayResults) {
-                               JOptionPane
-                                               .showMessageDialog(
-                                                               thisPanel,
-                                                               "Incorrect 
XPath Expression\n\n"
-                                                                               
+ "Please check the expression if you have manually modified it;\n"
-                                                                               
+ "Alternatively, try to select another node from the XML tree.\n\n"
-                                                                               
+ 
"------------------------------------------------------------------------------------\n\n"
-                                                                               
+ "XPath processing library reported the following error:\n"
-                                                                               
+ e.getMessage(), "XPath Activity",
-                                                               
JOptionPane.ERROR_MESSAGE);
-                       }
-                       return (-1);
-               }
-
-               Document doc = xmlTree.getDocumentUsedToPopulateTree();
-               List<Node> matchingNodes = null;
-               int matchingNodeCount = -1;
-               try {
-                       matchingNodes = expr.selectNodes(doc);
-                       matchingNodeCount = matchingNodes.size();
-               } catch (XPathException e) {
-                       if (displayResults) {
-                               JOptionPane
-                                               .showMessageDialog(
-                                                               thisPanel,
-                                                               "Unexpected 
error has occurred while executing the XPath expression.\n\n"
-                                                                               
+ "If you have manually modified the XPath expression and/or namespace 
mappings,\n"
-                                                                               
+ "please check you changes. Alternatively, make your selection in the XML tree 
and\n"
-                                                                               
+ "a correct XPath expression with corresponding namespace mapping will be 
generated.\n\n"
-                                                                               
+ 
"-------------------------------------------------------------------------------------------------------------\n\n"
-                                                                               
+ "XPath processing library reported the following error:\n"
-                                                                               
+ e.getMessage(), "XPath Activity",
-                                                               
JOptionPane.ERROR_MESSAGE);
-                       }
-                       return (-1);
-               }
-
-               // ----- DISPLAYING THE RESULTS -----
-               if (displayResults) {
-                       tfExecutedXPathExpression.setText(expr.getText());
-                       tfMatchingElementCount.setText("" + matchingNodeCount);
-
-                       StringBuffer outNodesText = new StringBuffer();
-                       StringBuffer outNodesXML = new StringBuffer();
-                       for (Node n : matchingNodes) {
-                               if (n.getStringValue() != null
-                                               && n.getStringValue().length() 
> 0) {
-                                       outNodesText.append(n.getStringValue() 
+ "\n");
-                               }
-                               outNodesXML.append(n.asXML() + "\n");
-                       }
-
-                       // 
tpExecutedXPathExpressionResults.setSelectedIndex(0); // open the
-                       // first tab (should be the one with textual results) 
// TODO -
-                       // enable if needed
-
-                       
taExecutedXPathExpressionResultsAsText.setText(outNodesText
-                                       .toString());
-                       
taExecutedXPathExpressionResultsAsText.setBackground(Color.WHITE);
-                       
taExecutedXPathExpressionResultsAsText.setCaretPosition(0);
-                       
spExecutedXPathExpressionResultsAsText.setBorder(BorderFactory
-                                       .createLineBorder(Color.WHITE, 3));
-
-                       
taExecutedXPathExpressionResultsAsXML.setText(outNodesXML
-                                       .toString());
-                       
taExecutedXPathExpressionResultsAsXML.setBackground(Color.WHITE);
-                       
taExecutedXPathExpressionResultsAsXML.setCaretPosition(0);
-                       
spExecutedXPathExpressionResultsAsXML.setBorder(BorderFactory
-                                       .createLineBorder(Color.WHITE, 3));
-               }
-
-               return (matchingNodeCount);
-       }
-
-       protected void setSourceXML(String xmlData) {
-               this.taSourceXML.setText(xmlData);
-       }
-
-       protected String getCurrentXPathExpression() {
-               return (this.tfXPathExpression.getText().trim());
-       }
-
-       protected void setCurrentXPathExpression(String xpathExpression) {
-               this.tfXPathExpression.setText(xpathExpression);
-       }
-
-       protected Map<String, String> getCurrentXPathNamespaceMap() {
-               return (this.xpathNamespaceMap);
-       }
-
-       /**
-        * This method doesn't simply set a reference to the passed map, but 
rather
-        * performs a shallow copy of values.
-        * 
-        * This is because the method is used during configuration panel's
-        * initialisation from the values that are held in the configuration 
bean.
-        * In case of simple reference assignment, any changes made to map in 
the
-        * configuration panel are also taking effect on the same map - 
referenced
-        * from the configuration bean, which leads to undesired behaviour.
-        */
-       protected void setCurrentXPathNamespaceMapValues(
-                       Map<String, String> xpathNamespaceMap) {
-               this.xpathNamespaceMap.clear();
-               this.xpathNamespaceMap.putAll(xpathNamespaceMap);
-       }
-
-       protected XPathActivityXMLTree getCurrentXMLTree() {
-               return (this.xmlTree);
-       }
-
-       /**
-        * For testing
-        */
-       public static void main(String[] args) {
-               JFrame frame = new JFrame();
-               frame.getContentPane().add(new 
XPathActivityConfigurationPanel());
-               frame.pack();
-               frame.setSize(new Dimension(900, 600));
-               frame.setLocationRelativeTo(null);
-               frame.setVisible(true);
-       }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/163747de/taverna-xpath-activity-ui/src/main/java/net/sf/taverna/t2/activities/xpath/ui/config/XPathActivityConfigurationPanelProvider.java
----------------------------------------------------------------------
diff --git 
a/taverna-xpath-activity-ui/src/main/java/net/sf/taverna/t2/activities/xpath/ui/config/XPathActivityConfigurationPanelProvider.java
 
b/taverna-xpath-activity-ui/src/main/java/net/sf/taverna/t2/activities/xpath/ui/config/XPathActivityConfigurationPanelProvider.java
deleted file mode 100644
index dec6f61..0000000
--- 
a/taverna-xpath-activity-ui/src/main/java/net/sf/taverna/t2/activities/xpath/ui/config/XPathActivityConfigurationPanelProvider.java
+++ /dev/null
@@ -1,158 +0,0 @@
-package net.sf.taverna.t2.activities.xpath.ui.config;
-
-import java.awt.BorderLayout;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import javax.swing.BorderFactory;
-import javax.swing.JOptionPane;
-
-import net.sf.taverna.t2.activities.xpath.XPathActivityConfigurationBean;
-import 
net.sf.taverna.t2.workbench.ui.views.contextualviews.activity.ActivityConfigurationPanel;
-import org.apache.taverna.commons.services.ServiceRegistry;
-import org.apache.taverna.scufl2.api.activity.Activity;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.ArrayNode;
-
-/**
- *
- * @author Sergejs Aleksejevs
- * @author David Withers
- */
-@SuppressWarnings("serial")
-public class XPathActivityConfigurationPanelProvider extends 
ActivityConfigurationPanel {
-
-       private XPathActivityConfigurationPanel configPanel;
-       private final ServiceRegistry serviceRegistry;
-
-       public XPathActivityConfigurationPanelProvider(Activity activity, 
ServiceRegistry serviceRegistry) {
-               super(activity);
-               this.serviceRegistry = serviceRegistry;
-               initialise();
-       }
-
-       @Override
-       protected void initialise() {
-               super.initialise();
-               removeAll();
-               setLayout(new BorderLayout());
-
-               // create actual contents of the config panel
-               this.configPanel = new XPathActivityConfigurationPanel();
-               add(configPanel, BorderLayout.CENTER);
-
-               // place the whole configuration panel into a raised area, so 
that
-               // automatically added 'Apply' / 'Close' buttons visually apply 
to
-               // the whole of the panel, not just part of it
-               this.setBorder(BorderFactory.createCompoundBorder(
-                               BorderFactory.createEmptyBorder(12, 12, 2, 12),
-                               BorderFactory.createRaisedBevelBorder()));
-
-               // Populate fields from activity configuration bean
-               refreshConfiguration();
-       }
-
-       /**
-        * Prepare a new configuration bean from the UI, to be returned with
-        * getConfiguration()
-        */
-       @Override
-       public void noteConfiguration() {
-               if (configPanel.getCurrentXMLTree() != null) {
-                       setProperty("exampleXmlDocument", 
configPanel.getCurrentXMLTree()
-                                       
.getDocumentUsedToPopulateTree().asXML());
-               }
-               setProperty("xpathExpression", 
configPanel.getCurrentXPathExpression());
-
-               Map<String, String> xPathNamespaceMap = 
configPanel.getCurrentXPathNamespaceMap();
-               if (xPathNamespaceMap.isEmpty()) {
-                       json.remove("xpathNamespaceMap");
-               } else {
-                       ArrayNode namespaceMapNode = json.arrayNode();
-                       for (Entry<String, String> namespaceMapping : 
xPathNamespaceMap.entrySet()) {
-                               namespaceMapNode.addObject().put("prefix", 
namespaceMapping.getKey()).put("uri", namespaceMapping.getValue());
-                       }
-                       json.set("xpathNamespaceMap", namespaceMapNode);
-               }
-
-               configureInputPorts(serviceRegistry);
-               configureOutputPorts(serviceRegistry);
-}
-
-       /**
-        * Check that user values in the UI are valid.
-        */
-       @Override
-       public boolean checkValues() {
-               // the only validity condition is the correctness of the XPath
-               // expression -- so checking that
-               int xpathExpressionStatus = 
XPathActivityConfigurationBean.validateXPath(this.configPanel
-                               .getCurrentXPathExpression());
-
-               // show an explicit warning message to explain the problem
-               if (xpathExpressionStatus == 
XPathActivityConfigurationBean.XPATH_EMPTY) {
-                       JOptionPane.showMessageDialog(this, "XPath expression 
should not be empty",
-                                       "XPath Activity", 
JOptionPane.WARNING_MESSAGE);
-               } else if (xpathExpressionStatus == 
XPathActivityConfigurationBean.XPATH_INVALID) {
-                       JOptionPane.showMessageDialog(this,
-                                       "<html><center>XPath expression is 
invalid - hover the mouse over the XPath status<br>"
-                                                       + "icon to get more 
information</center></html>", "XPath Activity",
-                                       JOptionPane.WARNING_MESSAGE);
-               }
-
-               return (xpathExpressionStatus == 
XPathActivityConfigurationBean.XPATH_VALID);
-       }
-
-       /**
-        * Update GUI from a changed configuration bean (perhaps by undo / 
redo).
-        */
-       @Override
-       public void refreshConfiguration() {
-               if (json.has("exampleXmlDocument")) {
-                       
configPanel.setSourceXML(getProperty("exampleXmlDocument"));
-                       configPanel.parseXML();
-               }
-
-               
configPanel.setCurrentXPathExpression(getProperty("xpathExpression"));
-
-               Map<String, String> xpathNamespaceMap = new HashMap<>();
-               if (json.has("xpathNamespaceMap")) {
-                       for (JsonNode namespaceMapping : 
json.get("xpathNamespaceMap")) {
-                               
xpathNamespaceMap.put(namespaceMapping.get("prefix").asText(), 
namespaceMapping.get("uri").asText());
-                       }
-               }
-               
configPanel.setCurrentXPathNamespaceMapValues(xpathNamespaceMap);
-               configPanel.reloadNamespaceMappingTableFromLocalMap();
-
-               // if the XML tree was populated, (re-)run the XPath expression
-               // and restore selection of nodes in the tree, if possible
-               if (configPanel.getCurrentXMLTree() != null) {
-                       configPanel.runXPath(true);
-
-                       // convert the XPath expression into the required list 
form;
-                       // discard the first 'leg', as it's a side effect of
-                       // "String.split()" -
-                       // non-existent string to the left of the first "/"
-                       String[] xpathLegs = 
getProperty("xpathExpression").split("/");
-                       List<String> xpathLegList = new ArrayList<String>();
-                       for (int i = 1; i < xpathLegs.length; i++) {
-                               xpathLegList.add("/" + xpathLegs[i]);
-                       }
-
-                       // if nothing was obtained, we should be looking at the 
root node -
-                       // but add the actual expression as it was, just in case
-                       if (xpathLegList.size() == 0) {
-                               
xpathLegList.add(configPanel.getCurrentXPathExpression());
-                       }
-
-                       // invoke selection handler of the XML tree to do the 
job
-                       
configPanel.getCurrentXMLTree().getXMLTreeSelectionHandler()
-                                       
.selectAllNodesThatMatchTheCurrentXPath(xpathLegList, null);
-               }
-
-       }
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/163747de/taverna-xpath-activity-ui/src/main/java/net/sf/taverna/t2/activities/xpath/ui/config/XPathActivityConfigureAction.java
----------------------------------------------------------------------
diff --git 
a/taverna-xpath-activity-ui/src/main/java/net/sf/taverna/t2/activities/xpath/ui/config/XPathActivityConfigureAction.java
 
b/taverna-xpath-activity-ui/src/main/java/net/sf/taverna/t2/activities/xpath/ui/config/XPathActivityConfigureAction.java
deleted file mode 100644
index 3bdc74c..0000000
--- 
a/taverna-xpath-activity-ui/src/main/java/net/sf/taverna/t2/activities/xpath/ui/config/XPathActivityConfigureAction.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package net.sf.taverna.t2.activities.xpath.ui.config;
-
-import java.awt.Frame;
-import java.awt.event.ActionEvent;
-
-import net.sf.taverna.t2.servicedescriptions.ServiceDescriptionRegistry;
-import net.sf.taverna.t2.workbench.activityicons.ActivityIconManager;
-import net.sf.taverna.t2.workbench.edits.EditManager;
-import net.sf.taverna.t2.workbench.file.FileManager;
-import 
net.sf.taverna.t2.workbench.ui.actions.activity.ActivityConfigurationAction;
-import 
net.sf.taverna.t2.workbench.ui.views.contextualviews.activity.ActivityConfigurationDialog;
-import org.apache.taverna.commons.services.ServiceRegistry;
-import org.apache.taverna.scufl2.api.activity.Activity;
-
-/**
- * @author Sergejs Aleksejevs
- * @author David Withers
- */
-@SuppressWarnings("serial")
-public class XPathActivityConfigureAction extends ActivityConfigurationAction {
-
-       private final EditManager editManager;
-       private final FileManager fileManager;
-       private final ServiceRegistry serviceRegistry;
-
-       public XPathActivityConfigureAction(Activity activity, Frame owner,
-                       EditManager editManager, FileManager fileManager,
-                       ActivityIconManager activityIconManager,
-                       ServiceDescriptionRegistry serviceDescriptionRegistry, 
ServiceRegistry serviceRegistry) {
-               super(activity, activityIconManager, 
serviceDescriptionRegistry);
-               this.editManager = editManager;
-               this.fileManager = fileManager;
-               this.serviceRegistry = serviceRegistry;
-       }
-
-       public void actionPerformed(ActionEvent e) {
-               ActivityConfigurationDialog currentDialog = 
ActivityConfigurationAction.getDialog(getActivity());
-
-               if (currentDialog != null) {
-                       currentDialog.toFront();
-                       return;
-               }
-
-               XPathActivityConfigurationPanelProvider panel = new 
XPathActivityConfigurationPanelProvider(
-                               getActivity(), serviceRegistry);
-               ActivityConfigurationDialog dialog = new 
ActivityConfigurationDialog(
-                               getActivity(), panel, editManager);
-
-               ActivityConfigurationAction.setDialog(getActivity(), dialog, 
fileManager);
-       }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/163747de/taverna-xpath-activity-ui/src/main/java/net/sf/taverna/t2/activities/xpath/ui/config/xmltree/TableCellListener.java
----------------------------------------------------------------------
diff --git 
a/taverna-xpath-activity-ui/src/main/java/net/sf/taverna/t2/activities/xpath/ui/config/xmltree/TableCellListener.java
 
b/taverna-xpath-activity-ui/src/main/java/net/sf/taverna/t2/activities/xpath/ui/config/xmltree/TableCellListener.java
deleted file mode 100644
index 872fd70..0000000
--- 
a/taverna-xpath-activity-ui/src/main/java/net/sf/taverna/t2/activities/xpath/ui/config/xmltree/TableCellListener.java
+++ /dev/null
@@ -1,186 +0,0 @@
-package net.sf.taverna.t2.activities.xpath.ui.config.xmltree;
-
-import java.awt.event.*;
-import javax.swing.*;
-import java.beans.*;
-
-/**
- *  This class listens for changes made to the data in the table via the
- *  TableCellEditor. When editing is started, the value of the cell is saved
- *  When editing is stopped the new value is saved. When the oold and new
- *  values are different, then the provided Action is invoked.
- *
- *  The source of the Action is a TableCellListener instance.
- *  
- *  TODO: update to work with Java 1.6, when Taverna is migrated to that 
version
- *        (see the next TODO tag - this is where the change needs to be made) 
- *  
- *  @author Robert Camick
- *  
- *  @see <a 
href="http://tips4java.wordpress.com/2009/06/07/table-cell-listener/";>http://tips4java.wordpress.com/2009/06/07/table-cell-listener/</a>
- *  @see <a 
href="http://www.camick.com/java/source/TableCellListener.java";>http://www.camick.com/java/source/TableCellListener.java</a>
- */
-public class TableCellListener implements PropertyChangeListener, Runnable
-{
-  private JTable table;
-  private Action action;
-
-  private int row;
-  private int column;
-  private Object oldValue;
-  private Object newValue;
-
-  /**
-   *  Create a TableCellListener.
-   *
-   *  @param table   the table to be monitored for data changes
-   *  @param action  the Action to invoke when cell data is changed
-   */
-  public TableCellListener(JTable table, Action action)
-  {
-    this.table = table;
-    this.action = action;
-    this.table.addPropertyChangeListener( this );
-  }
-
-  /**
-   *  Create a TableCellListener with a copy of all the data relevant to
-   *  the change of data for a given cell.
-   *
-   *  @param row  the row of the changed cell
-   *  @param column  the column of the changed cell
-   *  @param oldValue  the old data of the changed cell
-   *  @param newValue  the new data of the changed cell
-   */
-  private TableCellListener(JTable table, int row, int column, Object 
oldValue, Object newValue)
-  {
-    this.table = table;
-    this.row = row;
-    this.column = column;
-    this.oldValue = oldValue;
-    this.newValue = newValue;
-  }
-
-  /**
-   *  Get the column that was last edited - value as in table model, not in 
the UI
-   *
-   *  @return the column that was edited
-   */
-  public int getColumn()
-  {
-    return column;
-  }
-
-  /**
-   *  Get the new value in the cell
-   *
-   *  @return the new value in the cell
-   */
-  public Object getNewValue()
-  {
-    return newValue;
-  }
-
-  /**
-   *  Get the old value of the cell
-   *
-   *  @return the old value of the cell
-   */
-  public Object getOldValue()
-  {
-    return oldValue;
-  }
-
-  /**
-   *  Get the row that was last edited - value as in table model, not in the UI
-   *
-   *  @return the row that was edited
-   */
-  public int getRow()
-  {
-    return row;
-  }
-
-  /**
-   *  Get the table of the cell that was changed
-   *
-   *  @return the table of the cell that was changed
-   */
-  public JTable getTable()
-  {
-    return table;
-  }
-  
-  //
-  //  Implement the PropertyChangeListener interface
-  //
-  public void propertyChange(PropertyChangeEvent e)
-  {
-    //  A cell has started/stopped editing
-
-    if ("tableCellEditor".equals(e.getPropertyName()))
-    {
-      if (table.isEditing())
-        processEditingStarted();
-      else
-        processEditingStopped();
-    }
-  }
-
-  /*
-   *  Save information of the cell about to be edited
-   */
-  private void processEditingStarted()
-  {
-    //  The invokeLater is necessary because the editing row and editing
-    //  column of the table have not been set when the "tableCellEditor"
-    //  PropertyChangeEvent is fired.
-    //  This results in the "run" method being invoked
-
-    SwingUtilities.invokeLater( this );
-  }
-  
-  /*
-   *  See above.
-   */
-  public void run()
-  {
-//    TODO - the next line is a correct implementation for Java 1.6    
-//    row = table.convertRowIndexToModel( table.getEditingRow() );
-    
-//    in Java 1.5 which is currently used, tables are not easily sortable
-//    (and that is the case for the XPath Activity, where this class is used) 
--
-//    hence, row numbers in the view and in the model will always be identical
-//    --> HACK: just use the row number from the view...
-    row = table.getEditingRow();
-    
-    column = table.convertColumnIndexToModel( table.getEditingColumn() );
-    oldValue = table.getModel().getValueAt(row, column);
-    newValue = null;
-  }
-
-  /*
-   *  Update the Cell history when necessary
-   */
-  private void processEditingStopped()
-  {
-    newValue = table.getModel().getValueAt(row, column);
-
-    //  The data has changed, invoke the supplied Action
-
-    if (! newValue.equals(oldValue))
-    {
-      //  Make a copy of the data in case another cell starts editing
-      //  while processing this change
-
-      TableCellListener tcl = new TableCellListener(
-        getTable(), getRow(), getColumn(), getOldValue(), getNewValue());
-
-      ActionEvent event = new ActionEvent(
-        tcl,
-        ActionEvent.ACTION_PERFORMED,
-        "");
-      action.actionPerformed(event);
-    }
-  }
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/163747de/taverna-xpath-activity-ui/src/main/java/net/sf/taverna/t2/activities/xpath/ui/config/xmltree/XPathActivityXMLTree.java
----------------------------------------------------------------------
diff --git 
a/taverna-xpath-activity-ui/src/main/java/net/sf/taverna/t2/activities/xpath/ui/config/xmltree/XPathActivityXMLTree.java
 
b/taverna-xpath-activity-ui/src/main/java/net/sf/taverna/t2/activities/xpath/ui/config/xmltree/XPathActivityXMLTree.java
deleted file mode 100644
index 4f98851..0000000
--- 
a/taverna-xpath-activity-ui/src/main/java/net/sf/taverna/t2/activities/xpath/ui/config/xmltree/XPathActivityXMLTree.java
+++ /dev/null
@@ -1,572 +0,0 @@
-package net.sf.taverna.t2.activities.xpath.ui.config.xmltree;
-
-import java.awt.Component;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-import javax.swing.JLabel;
-import javax.swing.JMenuItem;
-import javax.swing.JPopupMenu;
-import javax.swing.JTree;
-import javax.swing.event.TreeSelectionListener;
-import javax.swing.text.Position;
-import javax.swing.tree.DefaultMutableTreeNode;
-import javax.swing.tree.DefaultTreeCellRenderer;
-import javax.swing.tree.DefaultTreeModel;
-import javax.swing.tree.TreePath;
-
-import 
net.sf.taverna.t2.activities.xpath.ui.config.XPathActivityConfigurationPanel;
-import 
net.sf.taverna.t2.activities.xpath.ui.servicedescription.XPathActivityIcon;
-
-import org.dom4j.Attribute;
-import org.dom4j.Document;
-import org.dom4j.DocumentException;
-import org.dom4j.DocumentHelper;
-import org.dom4j.Element;
-import org.dom4j.Namespace;
-import org.dom4j.QName;
-import org.dom4j.XPath;
-
-
-/**
- * 
- * @author Sergejs Aleksejevs
- */
-public class XPathActivityXMLTree extends JTree
-{
-  private XPathActivityXMLTree instanceOfSelf;
-  private XPathActivityXMLTreeRenderer treeRenderer;
-  
-  private JPopupMenu contextualMenu;
-  
-  private TreeSelectionListener[] allSelectionListeners;
-  private XPathActivityXMLTreeSelectionHandler xmlTreeSelectionHandler;
-  
-  /**
-   * 
-   */
-  private XPathActivityConfigurationPanel parentConfigPanel;
-
-  private Document documentUsedToPopulateTree;
-  
-  /**
-   *  holds value of the current XPath expression obtained from 
-   *  the combination of nodes selected in the XML tree 
-   */
-  private XPath currentXPathExpression;
-  
-  private Map<String,String> currentXPathNamespaces;
-  
-  
-  
-  private XPathActivityXMLTree(XPathActivityXMLTreeNode root, Document 
documentUsedToPopulateTree, 
-      boolean bIncludeElementValues, boolean bIncludeElementNamespaces, 
XPathActivityConfigurationPanel parentConfigPanel)
-  {
-    super(root);
-    
-    this.instanceOfSelf = this;
-    this.allSelectionListeners = new TreeSelectionListener[0];
-    
-    this.parentConfigPanel = parentConfigPanel;
-    
-    this.documentUsedToPopulateTree = documentUsedToPopulateTree;
-    this.currentXPathExpression = null;
-    this.currentXPathNamespaces = new HashMap<String,String>();
-    this.prepopulateNamespaceMap();
-    
-    
-    // custom renderer of the nodes in the XML tree
-    this.treeRenderer = new 
XPathActivityXMLTreeRenderer(bIncludeElementValues, bIncludeElementNamespaces);
-    this.setCellRenderer(treeRenderer);
-    
-    
-    // add listener to handle various selections of nodes in the tree 
-    this.xmlTreeSelectionHandler = new 
XPathActivityXMLTreeSelectionHandler(parentConfigPanel, this);
-    this.addTreeSelectionListener(xmlTreeSelectionHandler);
-    
-    
-    // --- CONTEXTUAL MENU FOR EXPANDING / COLLAPSING THE TREE ---
-    
-    // create popup menu for expanding / collapsing all nodes in the tree
-    JMenuItem miExpandAll = new JMenuItem("Expand all", 
XPathActivityIcon.getIconById(XPathActivityIcon.XML_TREE_EXPAND_ALL_ICON));
-    miExpandAll.setToolTipText("Expand all nodes in the filtering tree");
-    miExpandAll.addActionListener(new ActionListener() {
-      public void actionPerformed(ActionEvent e) {
-        for (int i = 0; i < getRowCount(); i++) {
-          instanceOfSelf.expandRow(i);
-        }
-      }
-    });
-    JMenuItem miCollapseAll = new JMenuItem("Collapse all", 
XPathActivityIcon.getIconById(XPathActivityIcon.XML_TREE_COLLAPSE_ALL_ICON));
-    miCollapseAll.setToolTipText("Collapse all expanded nodes in the filtering 
tree");
-    miCollapseAll.addActionListener(new ActionListener() {
-      public void actionPerformed(ActionEvent e) {
-        for (int i = getRowCount() - 1; i >= 0; i--) {
-          instanceOfSelf.collapseRow(i);
-        }
-      }
-    });
-    
-    // populate the popup menu with created menu items
-    contextualMenu = new JPopupMenu();
-    contextualMenu.add(miExpandAll);
-    contextualMenu.add(miCollapseAll);
-    
-    // mouse events may cause the contextual menu to be shown - adding a 
listener
-    this.addMouseListener(new MouseAdapter()
-    {
-      public void mousePressed(MouseEvent e) {
-        if (e.isPopupTrigger()) {
-          contextualMenu.show(instanceOfSelf, e.getX(), e.getY());
-        }
-      }
-      public void mouseReleased(MouseEvent e) {
-        if (e.isPopupTrigger()) {
-          // another way a popup menu may be called on different systems
-          contextualMenu.show(instanceOfSelf, e.getX(), e.getY());
-        }
-      }
-    });
-    
-  }
-  
-  
-  /**
-   * Pre-populates namespace map with the namespaced declared in the root
-   * node of the XML document, which was used to populate the tree.
-   */
-  private void prepopulateNamespaceMap()
-  {
-    Document doc = this.getDocumentUsedToPopulateTree();
-    Element root = doc.getRootElement();
-    
-    // get opening tag of the root node
-    String rootAsXML = root.asXML().substring(0, root.asXML().indexOf(">"));
-    
-    // split the opening tag into tokens (all attributes are separated by a 
space)
-    String[] rootTokens = rootAsXML.split(" ");
-    
-    // for each attribute check if that's a namespace declaration
-    for (String token : rootTokens) {
-      if (token.startsWith("xmlns"))
-      {
-        String[] namespacePrefixAndURI = token.split("=");
-        
-        // a prefix is either given explicitly, or an empty one will be used
-        String prefix = namespacePrefixAndURI[0].indexOf(":") == -1 ?
-                        "" :
-                        namespacePrefixAndURI[0].split(":")[1];
-        
-        // URI is the value of the XML attribute, so need to strip out 
surrounding quotes
-        String URI = namespacePrefixAndURI[1].replaceAll("\"", "");
-        
-        // now add the details of the current namespace to the map
-        this.addNamespaceToXPathMap(new Namespace(prefix, URI));
-      }
-    }
-  }
-
-
-  protected XPathActivityConfigurationPanel getParentConfigPanel() {
-    return parentConfigPanel;
-  }
-  
-  public XPathActivityXMLTreeSelectionHandler getXMLTreeSelectionHandler() {
-    return xmlTreeSelectionHandler;
-  }
-  
-  public Document getDocumentUsedToPopulateTree() {
-    return documentUsedToPopulateTree;
-  }
-  
-  public XPath getCurrentXPathExpression() {
-    return currentXPathExpression;
-  }
-  protected void setCurrentXPathExpression(XPath xpathExpression) {
-    this.currentXPathExpression = xpathExpression;
-  }
-  
-  
-  public Map<String,String> getCurrentXPathNamespaces() {
-    return currentXPathNamespaces;
-  }
-  
-  
-  
-  protected void removeAllSelectionListeners()
-  {
-    this.allSelectionListeners = this.getTreeSelectionListeners();
-    for (TreeSelectionListener listener : this.allSelectionListeners) {
-      this.removeTreeSelectionListener(listener);
-    }
-  }
-  
-  protected void restoreAllSelectionListeners()
-  {
-    for (TreeSelectionListener listener : this.allSelectionListeners) {
-      this.addTreeSelectionListener(listener);
-    }
-  }
-  
-  
-  
-  /**
-   * Creates an instance of the XML tree from provided XML data.
-   * 
-   * @param xmlData XML document in the form of a <code>String</code> to
-   *        derive the tree from.
-   * @param bIncludeAttributesIntoTree
-   * @param bIncludeValuesIntoTree
-   * @param bIncludeElementNamespacesIntoTree
-   * @param parentConfigPanel
-   * @return
-   * @throws DocumentException if <code>xmlData</code> does not
-   *                           contain a valid XML document. 
-   * 
-   */
-  public static XPathActivityXMLTree createFromXMLData(String xmlData, boolean 
bIncludeAttributesIntoTree,
-                   boolean bIncludeValuesIntoTree, boolean 
bIncludeElementNamespacesIntoTree,
-                   XPathActivityConfigurationPanel parentConfigPanel) throws 
DocumentException
-  {
-    // ----- XML DOCUMENT PARSING -----
-    // try to parse the XML document - the next line will throw an exception if
-    // the document is not well-formed; proceed otherwise
-    Document doc = DocumentHelper.parseText(xmlData);
-    Element rootElement = doc.getRootElement();
-    
-    
-    // ----- POPULATE XML TREE -----
-    XPathActivityXMLTreeElementNode rootNode = new 
XPathActivityXMLTreeElementNode(rootElement);
-    populate(rootNode, rootElement, bIncludeAttributesIntoTree);
-    
-    return (new XPathActivityXMLTree(rootNode, doc, bIncludeValuesIntoTree, 
bIncludeElementNamespacesIntoTree, parentConfigPanel));
-  }
-  
-  
-  /**
-   * Worker method for populating the tree recursively from a list of Elements.
-   * 
-   * @param node
-   * @param element
-   */
-  private static void populate(DefaultMutableTreeNode node, Element element,
-                               boolean bIncludeAttributesIntoTree)
-  {
-    Iterator<Element> elementIterator = element.elements().iterator();
-    while (elementIterator.hasNext()) {
-      Element childElement = elementIterator.next();
-      XPathActivityXMLTreeElementNode childNode = new 
XPathActivityXMLTreeElementNode(childElement);
-      node.add(childNode);
-      
-      // recursively repeat for all children of the current child element
-      populate(childNode, childElement, bIncludeAttributesIntoTree);
-    }
-    
-    
-    // add attributes of the element as its children, if necessary
-    if (bIncludeAttributesIntoTree) {
-      List<Attribute> attributes = element.attributes();
-      for (Attribute attribute : attributes) {
-        node.add(new XPathActivityXMLTreeAttributeNode(attribute));
-      }
-    }
-  }
-  
-  
-  // ---------------- RESPONDING TO REQUESTS TO CHANGE APPEARANCE OF EXISTING 
TREE -----------------
-  
-  /**
-   * NB! May be inefficient, as this solution re-generates the whole tree from
-   *     stored XML document and replaces the root node of itself with a newly
-   *     generated root node (that will be populated with updated children,
-   *     according to the new values of options).
-   *  
-   *     However, this is a simple solution that will work for now.
-   * 
-   * @param bIncludeAttributes
-   * @param bIncludeValues
-   * @param bIncludeNamespaces
-   */
-  public void refreshFromExistingDocument(boolean bIncludeAttributes, boolean 
bIncludeValues, boolean bIncludeNamespaces)
-  {
-    this.setEnabled(false);
-    removeAllSelectionListeners();
-    
-    // store expansion and selection state of the XML tree
-    // see documentation for restoreExpandedPaths() for more details
-    //
-    // stored paths to expanded nodes are quite reliable, as paths are 
recorded;
-    // stored selected rows are less reliable, as only indices are kept -- 
however,
-    // the tree is re-created from the same document, so ordering/number of 
nodes
-    // cannot change (apart from attributes that may be added / removed - the 
attributes
-    // appear after other child nodes of some node in the tree, therefore only 
their
-    // selection could be affected)
-    HashMap<String,ArrayList<String>> toExpand = new 
HashMap<String,ArrayList<String>>();
-    ArrayList<Integer> toSelect = new ArrayList<Integer>();
-    for( int i = 1; i < this.getRowCount(); i++) {
-      if( this.isExpanded(i) ) {
-        TreePath path = this.getPathForRow(i);
-        String parentPath = path.getParentPath().toString();
-        ArrayList<String> values = toExpand.get(parentPath);
-        if(values == null) {
-          values = new ArrayList<String>();
-        }
-        values.add(path.getLastPathComponent().toString());
-        toExpand.put(parentPath, values);
-      }
-      if (this.isRowSelected(i)) {
-        toSelect.add(i);
-      }
-    }
-    
-    
-    // update presentation options
-    this.treeRenderer.setIncludeElementValues(bIncludeValues);
-    this.treeRenderer.setIncludeElementNamespaces(bIncludeNamespaces);
-    
-    // re-create the root node of the tree and replace the old one with it
-    Element rootElement = this.documentUsedToPopulateTree.getRootElement();
-    XPathActivityXMLTreeNode newRootNode = new 
XPathActivityXMLTreeElementNode(rootElement);
-    populate(newRootNode, rootElement, bIncludeAttributes);
-    ((DefaultTreeModel)this.getModel()).setRoot(newRootNode);
-    
-    
-    // restore previous state of the tree from saved values
-    restoreExpandedPaths(toExpand, this.getPathForRow(0));
-    restoreSelectedPaths(toSelect);
-    
-    this.restoreAllSelectionListeners();
-    this.setEnabled(true);
-  }
-  
-  
-  /**
-   * This method can only reliably work when the tree is re-generated from the 
same
-   * XML document, so that number / order of nodes would not change.
-   * 
-   * @param toSelect List of indices of rows to re-select after tree was 
re-generated.
-   */
-  private void restoreSelectedPaths(ArrayList<Integer> toSelect)
-  {
-    if (toSelect == null || toSelect.isEmpty()) return;
-    
-    // something definitely needs to be selected, so include root element into 
selection
-    this.addSelectionRow(0);
-    
-    // select all stored rows
-    for (Integer value : toSelect) {
-      this.addSelectionRow(value);
-    }
-  }
-
-
-
-  /**
-   * Taken from: <a 
href="http://java.itags.org/java-core-gui-apis/58504/";>http://java.itags.org/java-core-gui-apis/58504/</a>
-   * 
-   * This method recursively expands all previously stored paths.
-   * Works under assumption that the name of the root node did not change.
-   * Otherwise, it can handle changed structure of the tree.
-   * 
-   * To achieve its goal, it cannot simply use stored TreePath from your the 
original tree,
-   * since the paths are invalid after the tree is refreshed. Instead, a 
HashMap which links
-   * a String representation of the parent tree path to all expanded child 
node names is used.
-   * 
-   * @param toExpand Map which links a String representation of the parent 
tree path to all
-   *                 expanded child node names is used.
-   * @param rootPath Path to root node.
-   */
-  void restoreExpandedPaths(HashMap<String,ArrayList<String>> toExpand, 
TreePath rootPath)
-  {
-    ArrayList<String> values = toExpand.remove(rootPath.toString());
-    if (values == null) return;
-    
-    int row = this.getRowForPath(rootPath);
-    for (String value : values)
-    {
-      TreePath nextMatch = this.getNextMatch(value, row, 
Position.Bias.Forward);
-      this.expandPath(nextMatch);
-      if (toExpand.containsKey(nextMatch.toString())) {
-        restoreExpandedPaths(toExpand, nextMatch);
-      }
-    }
-  }
-  
-  
-  
-  // ---------------- TREE SELECTION MODEL + XPath GENERATION -----------------
-  
-  
-  protected String generateXPathFromTreePath(TreePath path)
-  {
-    StringBuilder xpath = new StringBuilder();
-    
-    for (String leg : generateXPathFromTreePathAsLegList(path)) {
-      xpath.append(leg);
-    }
-    
-    return (xpath.toString());
-  }
-  
-  
-  protected List<String> generateXPathFromTreePathAsLegList(TreePath path)
-  {
-    List<String> pathLegs = new LinkedList<String>();
-    
-    TreePath parentPath = path;
-    for (int i = 0; i < path.getPathCount(); i++)
-    {
-      XPathActivityXMLTreeNode lastXMLTreeNodeInThisPath = 
(XPathActivityXMLTreeNode)parentPath.getLastPathComponent();
-      pathLegs.add(0, 
this.getXMLTreeNodeEffectiveQualifiedNameAsXPathLeg(lastXMLTreeNodeInThisPath));
-      
-      parentPath = parentPath.getParentPath();
-    }
-    
-    return (pathLegs);
-  }
-  
-  
-  protected String 
getXMLTreeNodeEffectiveQualifiedNameAsXPathLeg(XPathActivityXMLTreeNode node)
-  {
-    QName qname = node.getNodeQName();
-    String effectiveNamespacePrefix = 
addNamespaceToXPathMap(qname.getNamespace());
-    
-    return("/" +
-           (node.isAttribute() ? "@" : "") +
-           (effectiveNamespacePrefix.length() > 0 ? (effectiveNamespacePrefix 
+ ":") : "") +
-           qname.getName());
-  }
-  
-  
-  
-  private String addNamespaceToXPathMap(Namespace namespace) 
-  {
-    // EMTPY PREFIX
-    if (namespace.getPrefix().length() == 0) {
-      if (namespace.getURI().length() == 0) {
-        // DEFAULT NAMESPACE with no URI - nothing to worry about
-        return "";
-      }
-      else {
-        // DEFAULT NAMESPACE WITH NO PREFIX, BUT URI IS KNOWN
-        return (addNamespaceToXPathMap(new Namespace("default", 
namespace.getURI())));
-      }
-    }
-    
-    // NEW NON-EMPTY PREFIX
-    if (!this.currentXPathNamespaces.containsKey(namespace.getPrefix())) {
-      this.currentXPathNamespaces.put(namespace.getPrefix(), 
namespace.getURI());
-      return (namespace.getPrefix());
-    }
-    
-    // EXISTING NON-EMPTY PREFIX AND THE SAME URI - NO NEED TO ADD AGAIN
-    else if 
(this.currentXPathNamespaces.get(namespace.getPrefix()).equals(namespace.getURI()))
 {
-      return (namespace.getPrefix());
-    }
-    
-    // EXISTING NON-EMPTY PREFIX, BUT DIFFERENT URI
-    else {
-      String repeatedPrefix = namespace.getPrefix();
-      
-      int i = 0;
-      while (this.currentXPathNamespaces.containsKey(repeatedPrefix + i)) {
-        // check if current alternative prefix wasn't yet applied to current 
URI
-        if (this.currentXPathNamespaces.get(repeatedPrefix + 
i).equals(namespace.getURI())) {
-          return (repeatedPrefix + i);
-        }
-        else {
-          // still another URI for the same prefix, keep trying to increase 
the ID in the prefix
-          i++;
-        }
-      }
-      
-      String modifiedPrefix = repeatedPrefix + i;
-      this.currentXPathNamespaces.put(modifiedPrefix, namespace.getURI());
-      return (modifiedPrefix);
-    }
-  }
-  
-  
-  // ----------------------- Tree Cell Renderer --------------------------
-  
-  /**
-   * 
-   * @author Sergejs Aleksejevs
-   */
-  private class XPathActivityXMLTreeRenderer extends DefaultTreeCellRenderer
-  {
-    private boolean bIncludeElementValues;
-    private boolean bIncludeElementNamespaces;
-    
-    public XPathActivityXMLTreeRenderer(boolean bIncludeElementValues, boolean 
bIncludeElementNamespaces) {
-      super();
-      this.bIncludeElementValues = bIncludeElementValues;
-      this.bIncludeElementNamespaces = bIncludeElementNamespaces;
-    }
-    
-    
-    public boolean getIncludeElementValues() {
-      return bIncludeElementValues;
-    }
-    public void setIncludeElementValues(boolean bIncludeElementValues) {
-      this.bIncludeElementValues = bIncludeElementValues;
-    }
-    
-    public boolean getIncludeElementNamespaces() {
-      return bIncludeElementNamespaces;
-    }
-    public void setIncludeElementNamespaces(boolean bIncludeElementNamespaces) 
{
-      this.bIncludeElementNamespaces = bIncludeElementNamespaces;
-    }
-    
-    
-    public Component getTreeCellRendererComponent(JTree tree, Object value,
-        boolean selected, boolean expanded, boolean leaf, int row,
-        boolean hasFocus)
-    {
-      // obtain the default rendering, we'll then customize it
-      Component defaultRendering = super.getTreeCellRendererComponent(tree, 
value, selected, expanded, leaf, row, hasFocus);
-      
-      // it is most likely that the default rendering will be a JLabel, check 
just to be safe
-      if (defaultRendering instanceof JLabel)
-      {
-        JLabel defaultRenderedLabel = ((JLabel)defaultRendering);
-        
-        // ---------- CHOOSE APPROPRIATE ICON FOR THE NODE ------------
-        if (row == 0) {
-          // set the icon for the XML tree root node
-          
defaultRenderedLabel.setIcon(XPathActivityIcon.getIconById(XPathActivityIcon.XML_TREE_ROOT_ICON));
-        }
-        else {
-          // set the icon for the XML tree node
-          if (value instanceof XPathActivityXMLTreeNode && 
-              ((XPathActivityXMLTreeNode)value).isAttribute())
-          {
-            
defaultRenderedLabel.setIcon(XPathActivityIcon.getIconById(XPathActivityIcon.XML_TREE_ATTRIBUTE_ICON));
-          }
-          else {
-            
defaultRenderedLabel.setIcon(XPathActivityIcon.getIconById(XPathActivityIcon.XML_TREE_NODE_ICON));
-          }
-        }
-        
-        
-        // ----------- CHOOSE THE DISPLAY TITLE FOR THE NODE ------------
-        if (value instanceof XPathActivityXMLTreeNode) {
-          
defaultRenderedLabel.setText(((XPathActivityXMLTreeNode)value).getTreeNodeDisplayLabel(
-              this.bIncludeElementValues, this.bIncludeElementNamespaces, 
true));
-        }
-      }
-      
-      return (defaultRendering);
-    }
-    
-  }
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/163747de/taverna-xpath-activity-ui/src/main/java/net/sf/taverna/t2/activities/xpath/ui/config/xmltree/XPathActivityXMLTreeAttributeNode.java
----------------------------------------------------------------------
diff --git 
a/taverna-xpath-activity-ui/src/main/java/net/sf/taverna/t2/activities/xpath/ui/config/xmltree/XPathActivityXMLTreeAttributeNode.java
 
b/taverna-xpath-activity-ui/src/main/java/net/sf/taverna/t2/activities/xpath/ui/config/xmltree/XPathActivityXMLTreeAttributeNode.java
deleted file mode 100644
index d22623f..0000000
--- 
a/taverna-xpath-activity-ui/src/main/java/net/sf/taverna/t2/activities/xpath/ui/config/xmltree/XPathActivityXMLTreeAttributeNode.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package net.sf.taverna.t2.activities.xpath.ui.config.xmltree;
-
-import org.dom4j.Attribute;
-
-/**
- * 
- * @author Sergejs Aleksejevs
- */
-public class XPathActivityXMLTreeAttributeNode extends XPathActivityXMLTreeNode
-{
-  private Attribute associatedAttribute;
-  
-  public XPathActivityXMLTreeAttributeNode(Attribute associatedAttribute) {
-    super(associatedAttribute, true);
-    this.associatedAttribute = associatedAttribute;
-  }
-  
-  public Attribute getAssociatedAttribute() {
-    return associatedAttribute;
-  }
-  
-  public String getTreeNodeDisplayLabel(boolean bIncludeValue, boolean 
bUseStyling)
-  {
-    StringBuilder label = new StringBuilder();
-    
-    // add qualified attribute name (possibly) with styling
-    label.append((bUseStyling ? "<font color=\"purple\">" : "") +
-                 this.associatedAttribute.getQualifiedName() +
-                 (bUseStyling ? "</font>" : ""));
-    
-    // add attribute value
-    if (bIncludeValue)
-    {
-      String attributeTextValue = this.associatedAttribute.getText();
-      
-      if (attributeTextValue != null && attributeTextValue.length() > 0) {
-        label.append((bUseStyling ? "<font color=\"gray\"> - </font><font 
color=\"green\">" : "") +
-                     
truncateElementTextValue(stripAllHTML(attributeTextValue)) +
-                     (bUseStyling ? "</font>" : ""));
-      }
-    }
-    
-    if (bUseStyling) {
-      label.insert(0, "<html>");
-      label.append("</html>");
-    }
-    
-    return (label.toString());
-  }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/163747de/taverna-xpath-activity-ui/src/main/java/net/sf/taverna/t2/activities/xpath/ui/config/xmltree/XPathActivityXMLTreeElementNode.java
----------------------------------------------------------------------
diff --git 
a/taverna-xpath-activity-ui/src/main/java/net/sf/taverna/t2/activities/xpath/ui/config/xmltree/XPathActivityXMLTreeElementNode.java
 
b/taverna-xpath-activity-ui/src/main/java/net/sf/taverna/t2/activities/xpath/ui/config/xmltree/XPathActivityXMLTreeElementNode.java
deleted file mode 100644
index a151753..0000000
--- 
a/taverna-xpath-activity-ui/src/main/java/net/sf/taverna/t2/activities/xpath/ui/config/xmltree/XPathActivityXMLTreeElementNode.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package net.sf.taverna.t2.activities.xpath.ui.config.xmltree;
-
-import org.dom4j.Element;
-import org.dom4j.Namespace;
-
-
-/**
- * 
- * @author Sergejs Aleksejevs
- */
-public class XPathActivityXMLTreeElementNode extends XPathActivityXMLTreeNode
-{
-  private Element associatedElement;
-  
-  public XPathActivityXMLTreeElementNode(Element associatedElement) {
-    super(associatedElement, false);
-    this.associatedElement = associatedElement;
-  }
-  
-  public Element getAssociatedElement() {
-    return associatedElement;
-  }
-  
-  public String getTreeNodeDisplayLabel(boolean bIncludeValue, boolean 
bIncludeNamespace, boolean bUseStyling)
-  {
-    StringBuilder label = new StringBuilder();
-    
-    // add qualified element name
-    label.append(this.associatedElement.getQualifiedName());
-    
-    // add element namespace
-    if (bIncludeNamespace)
-    {
-      Namespace ns = this.associatedElement.getNamespace();
-      
-      label.append((bUseStyling ? "<font color=\"gray\">" : "") +
-          " - xmlns" + (ns.getPrefix().length() > 0 ? (":" + ns.getPrefix()) : 
"") + "=\"" + 
-          this.associatedElement.getNamespaceURI() +
-          (bUseStyling ? "\"</font>" : ""));
-    }
-    
-    // add element value
-    if (bIncludeValue)
-    {
-      String elementTextValue = this.associatedElement.getTextTrim();
-      
-      if (elementTextValue != null && elementTextValue.length() > 0) {
-        label.append((bUseStyling ? "<font color=\"gray\"> - </font><font 
color=\"blue\">" : "") +
-                     truncateElementTextValue(stripAllHTML(elementTextValue)) +
-                     (bUseStyling ? "</font>" : ""));
-      }
-    }
-    
-    if (bUseStyling) {
-      label.insert(0, "<html>");
-      label.append("</html>");
-    }
-    
-    return (label.toString());
-  }
-  
-}
\ No newline at end of file

Reply via email to