You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@taverna.apache.org by re...@apache.org on 2015/03/27 17:22:17 UTC
[04/23] incubator-taverna-workbench-common-activities git commit:
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