You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@taverna.apache.org by st...@apache.org on 2015/02/23 11:25:00 UTC
[13/16] incubator-taverna-workbench-common-activities git commit:
Revert "Temporarily empty repository"
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/54050685/taverna-external-tool-activity-ui/src/main/java/net/sf/taverna/t2/activities/externaltool/views/InvocationPanel.java
----------------------------------------------------------------------
diff --git a/taverna-external-tool-activity-ui/src/main/java/net/sf/taverna/t2/activities/externaltool/views/InvocationPanel.java b/taverna-external-tool-activity-ui/src/main/java/net/sf/taverna/t2/activities/externaltool/views/InvocationPanel.java
new file mode 100644
index 0000000..803328b
--- /dev/null
+++ b/taverna-external-tool-activity-ui/src/main/java/net/sf/taverna/t2/activities/externaltool/views/InvocationPanel.java
@@ -0,0 +1,396 @@
+/**
+ *
+ */
+package net.sf.taverna.t2.activities.externaltool.views;
+
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.FlowLayout;
+import java.awt.GridLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.Arrays;
+import java.util.Comparator;
+
+import javax.swing.AbstractAction;
+import javax.swing.Box;
+import javax.swing.BoxLayout;
+import javax.swing.ButtonGroup;
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.DefaultListCellRenderer;
+import javax.swing.JButton;
+import javax.swing.JComboBox;
+import javax.swing.JList;
+import javax.swing.JPanel;
+import javax.swing.JRadioButton;
+import javax.swing.JTextArea;
+import javax.swing.SwingUtilities;
+import javax.swing.border.EmptyBorder;
+
+import net.sf.taverna.t2.activities.externaltool.ExternalToolActivityConfigurationBean;
+import net.sf.taverna.t2.activities.externaltool.ExternalToolActivityHealthChecker;
+import net.sf.taverna.t2.activities.externaltool.configuration.ToolInvocationConfiguration;
+import net.sf.taverna.t2.activities.externaltool.manager.InvocationGroup;
+import net.sf.taverna.t2.activities.externaltool.manager.InvocationGroupAddedEvent;
+import net.sf.taverna.t2.activities.externaltool.manager.InvocationGroupRemovedEvent;
+import net.sf.taverna.t2.activities.externaltool.manager.InvocationManagerEvent;
+import net.sf.taverna.t2.activities.externaltool.manager.InvocationMechanism;
+import net.sf.taverna.t2.activities.externaltool.manager.InvocationMechanismAddedEvent;
+import net.sf.taverna.t2.activities.externaltool.manager.InvocationMechanismRemovedEvent;
+import net.sf.taverna.t2.activities.externaltool.manager.ToolInvocationConfigurationPanel;
+import net.sf.taverna.t2.activities.externaltool.manager.impl.InvocationGroupManagerImpl;
+import net.sf.taverna.t2.lang.observer.Observable;
+import net.sf.taverna.t2.lang.observer.Observer;
+import net.sf.taverna.t2.lang.ui.DeselectingButton;
+import net.sf.taverna.t2.workbench.ui.impl.configuration.ui.T2ConfigurationFrame;
+
+import org.apache.log4j.Logger;
+
+/**
+ * @author alanrw
+ *
+ */
+public class InvocationPanel extends JPanel implements Observer<InvocationManagerEvent> {
+
+ private static final String LOCATION_DESCRIPTION = ToolInvocationConfigurationPanel.HEADER_TEXT;
+ private final JComboBox mechanismSelection;
+ private final JComboBox groupSelection;
+
+ private DefaultComboBoxModel mechanismSelectionModel = new DefaultComboBoxModel();
+ private DefaultComboBoxModel groupSelectionModel = new DefaultComboBoxModel();
+
+ private static InvocationGroupManagerImpl manager = InvocationGroupManagerImpl.getInstance();
+
+ private static Logger logger = Logger
+ .getLogger(InvocationPanel.class);
+
+ private JRadioButton unmanagedLocation;
+ private JRadioButton groupSelected;
+ private JRadioButton mechanismSelected;
+ private JButton manageInvocation;
+ private ButtonGroup mechanismOrGroup;
+ private ExternalToolActivityConfigurationBean configuration;
+
+ private ActionListener radioChangeListener;
+
+ boolean unmanagedShown = false;
+
+ public InvocationPanel(ExternalToolActivityConfigurationBean configuration) {
+ super();
+ manager.addObserver(this);
+
+ mechanismSelection = new JComboBox();
+ populateMechanismList();
+ mechanismSelection.setModel(mechanismSelectionModel);
+
+ groupSelection = new JComboBox();
+ populateGroupList();
+ groupSelection.setModel(groupSelectionModel);
+ populateInvocationPanel(configuration);
+
+ radioChangeListener = new AbstractAction() {
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ if (unmanagedShown && unmanagedLocation.isSelected()) {
+ setUnmanagedLocationSelectability(true);
+ setMechanismSelectability(false);
+ setGroupSelectability(false);
+ return;
+ }
+ if (mechanismSelected.isSelected()) {
+ if (unmanagedShown) {
+ setUnmanagedLocationSelectability(false);
+ }
+ setMechanismSelectability(true);
+ setGroupSelectability(false);
+ return;
+ }
+ if (unmanagedShown) {
+ setUnmanagedLocationSelectability(false);
+ }
+ setMechanismSelectability(false);
+ setGroupSelectability(true);
+ return; }
+
+ };
+ if (unmanagedShown) {
+ unmanagedLocation.addActionListener(radioChangeListener);
+ }
+ groupSelected.addActionListener(radioChangeListener);
+ mechanismSelected.addActionListener(radioChangeListener);
+ }
+
+ private void populateMechanismList() {
+ InvocationMechanism currentSelection = (InvocationMechanism) mechanismSelection.getSelectedItem();
+ InvocationMechanism[] mechanisms = InvocationGroupManagerImpl.getInstance()
+ .getMechanisms().toArray(new InvocationMechanism[] {});
+ Arrays.sort(mechanisms, new Comparator<InvocationMechanism>() {
+
+ @Override
+ public int compare(InvocationMechanism arg0, InvocationMechanism arg1) {
+ return arg0.getName().compareTo(
+ arg1.getName());
+ }
+ });
+ mechanismSelectionModel.removeAllElements();
+ for (InvocationMechanism mechanism : mechanisms) {
+ mechanismSelectionModel.addElement(mechanism);
+ logger.info("Added mechanism " + mechanism.hashCode());
+ }
+ if (currentSelection != null) {
+ mechanismSelection.setSelectedItem(currentSelection);
+ }
+
+ }
+
+ private void populateGroupList() {
+ InvocationGroup currentSelection = (InvocationGroup) groupSelection.getSelectedItem();
+ InvocationGroup[] groups = InvocationGroupManagerImpl.getInstance()
+ .getInvocationGroups().toArray(new InvocationGroup[] {});
+ Arrays.sort(groups, new Comparator<InvocationGroup>() {
+
+ @Override
+ public int compare(InvocationGroup arg0, InvocationGroup arg1) {
+ return arg0.getName().compareTo(
+ arg1.getName());
+ }
+ });
+ groupSelectionModel.removeAllElements();
+ for (InvocationGroup group : groups) {
+ groupSelectionModel.addElement(group);
+ logger.info("Added group " + group.hashCode());
+ }
+ if (currentSelection != null) {
+ groupSelection.setSelectedItem(currentSelection);
+ }
+
+ }
+
+
+ private void populateInvocationPanel(ExternalToolActivityConfigurationBean configuration) {
+ this.configuration = configuration;
+ this.removeAll();
+ this.setLayout(new BorderLayout());
+
+ JTextArea descriptionText = new JTextArea(
+ LOCATION_DESCRIPTION);
+ descriptionText.setEditable(false);
+ descriptionText.setFocusable(false);
+ descriptionText.setBorder(new EmptyBorder(5, 5, 10, 5));
+ descriptionText.setLineWrap(true);
+ descriptionText.setWrapStyleWord(true);
+ descriptionText.setRows(3);
+ this.add(descriptionText, BorderLayout.NORTH);
+
+ JPanel innerPanel = new JPanel(new BorderLayout());
+
+ mechanismOrGroup = new ButtonGroup();
+
+ JPanel subPanel = new JPanel(new GridLayout(4,1));
+
+ if (isUnmanaged(configuration)) {
+ createUnmanagedLocation(subPanel);
+ unmanagedShown = true;
+ }
+
+ subPanel.add(createMechanismPanel());
+
+ subPanel.add(createGroupPanel());
+
+ subPanel.add(createButtonPanel());
+
+ innerPanel.add(subPanel, BorderLayout.NORTH);
+ innerPanel.add(new JPanel(), BorderLayout.CENTER);
+
+ initializeSelectability();
+ this.add(innerPanel, BorderLayout.CENTER);
+ this.repaint();
+ }
+
+ private boolean isUnmanaged(
+ ExternalToolActivityConfigurationBean configuration2) {
+ return (!ExternalToolActivityHealthChecker.updateLocation(configuration2));
+ }
+
+ private void initializeSelectability() {
+ if (isUnmanaged(configuration)) {
+ unmanagedLocation.setSelected(true);
+ setUnmanagedLocationSelectability(true);
+ setMechanismSelectability(false);
+ setGroupSelectability(false);
+ return;
+ }
+ if (configuration.getInvocationGroup() == null) {
+ mechanismSelected.setSelected(true);
+ if (unmanagedShown) {
+ setUnmanagedLocationSelectability(false);
+ }
+ setMechanismSelectability(true);
+ setGroupSelectability(false);
+ return;
+ }
+ groupSelected.setSelected(true);
+ if (unmanagedShown) {
+ setUnmanagedLocationSelectability(false);
+ }
+ setMechanismSelectability(false);
+ setGroupSelectability(true);
+ return;
+ }
+
+ private void setGroupSelectability(boolean b) {
+ groupSelection.setEnabled(b);
+ }
+
+ private void setMechanismSelectability(boolean b) {
+ mechanismSelection.setEnabled(b);
+ }
+
+ private void setUnmanagedLocationSelectability(boolean b) {
+ // Nothing to do
+ }
+
+ private JPanel createGroupPanel() {
+ JPanel groupPanel = new JPanel(new BorderLayout());
+
+ JPanel groupSelectionPanel = new JPanel(new GridLayout(1, 2));
+ groupSelected = new JRadioButton("Select a symbolic location");
+ mechanismOrGroup.add(groupSelected);
+ groupSelected.setBorder(new EmptyBorder(10, 10, 10, 10));
+ groupSelectionPanel.add(groupSelected);
+
+ groupSelection.setRenderer(new DefaultListCellRenderer() {
+
+ @Override
+ public Component getListCellRendererComponent(JList arg0,
+ Object arg1, int arg2, boolean arg3, boolean arg4) {
+ if (arg1 instanceof InvocationGroup) {
+ return super.getListCellRendererComponent(arg0,
+ ((InvocationGroup) arg1).getName(),
+ arg2, arg3, arg4);
+ }
+ return super.getListCellRendererComponent(arg0, arg1, arg2,
+ arg3, arg4);
+ }
+ });
+
+ groupSelectionPanel.add(groupSelection);
+
+ groupPanel.add(groupSelectionPanel, BorderLayout.CENTER);
+
+ if (configuration.getInvocationGroup() != null) {
+ groupSelection.setSelectedItem(configuration.getInvocationGroup());
+ } else {
+ groupSelection.setSelectedItem(manager.getDefaultGroup());
+ }
+
+ return groupPanel;
+ }
+
+ private JPanel createMechanismPanel() {
+ JPanel mechanismPanel = new JPanel(new BorderLayout());
+ JPanel mechanismSelectionPanel = new JPanel(new GridLayout(1, 3));
+ mechanismSelected = new JRadioButton("Select an explicit location");
+ mechanismOrGroup.add(mechanismSelected);
+ mechanismSelected.setBorder(new EmptyBorder(10, 10, 10, 10));
+ mechanismSelectionPanel.add(mechanismSelected);
+
+ mechanismSelection.setRenderer(new DefaultListCellRenderer() {
+
+ @Override
+ public Component getListCellRendererComponent(JList arg0,
+ Object arg1, int arg2, boolean arg3, boolean arg4) {
+ if (arg1 instanceof InvocationMechanism) {
+ return super.getListCellRendererComponent(arg0,
+ ((InvocationMechanism) arg1).getName(),
+ arg2, arg3, arg4);
+ }
+ return super.getListCellRendererComponent(arg0, arg1, arg2,
+ arg3, arg4);
+ }
+ });
+
+ mechanismSelectionPanel.add(mechanismSelection);
+
+ mechanismPanel.add(mechanismSelectionPanel, BorderLayout.CENTER);
+ if (configuration.getMechanism() != null) {
+ mechanismSelection.setSelectedItem(configuration.getMechanism());
+ } else {
+ mechanismSelection.setSelectedItem(manager.getDefaultMechanism());
+ }
+ return mechanismPanel;
+
+ }
+
+ private JPanel createButtonPanel() {
+ JPanel buttonPanel = new JPanel(new FlowLayout());
+ manageInvocation = new DeselectingButton("Manage locations",
+ new AbstractAction() {
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ T2ConfigurationFrame.showConfiguration(ToolInvocationConfiguration.getInstance().getDisplayName());
+ }});
+ buttonPanel.add(manageInvocation);
+ return buttonPanel;
+ }
+
+ private void createUnmanagedLocation(JPanel subPanel) {
+ unmanagedLocation = new JRadioButton("Continue using unmanaged location");
+ subPanel.add(unmanagedLocation);
+ mechanismOrGroup.add(unmanagedLocation);
+ }
+
+ private void handleInvocationManagerMessage(InvocationManagerEvent message) {
+ if (message instanceof InvocationMechanismRemovedEvent) {
+ InvocationMechanism removedMechanism = ((InvocationMechanismRemovedEvent) message).getRemovedMechanism();
+ InvocationMechanism replacementMechanism = ((InvocationMechanismRemovedEvent) message).getReplacementMechanism();
+ if (mechanismSelection.getSelectedItem().equals(removedMechanism)) {
+ mechanismSelection.setSelectedItem(replacementMechanism);
+ }
+ mechanismSelectionModel.removeElement(removedMechanism);
+ } else if (message instanceof InvocationMechanismAddedEvent) {
+ populateMechanismList();
+ }
+ else if (message instanceof InvocationGroupRemovedEvent) {
+ InvocationGroup removedGroup = ((InvocationGroupRemovedEvent) message).getRemovedGroup();
+ InvocationGroup replacementGroup = ((InvocationGroupRemovedEvent) message).getReplacementGroup();
+ if (groupSelection.getSelectedItem().equals(removedGroup)) {
+ groupSelection.setSelectedItem(replacementGroup);
+ }
+ groupSelectionModel.removeElement(removedGroup);
+ } else if (message instanceof InvocationGroupAddedEvent) {
+ populateGroupList();
+ }
+ }
+
+ @Override
+ public void notify(Observable<InvocationManagerEvent> sender,
+ final InvocationManagerEvent message) throws Exception {
+ if (SwingUtilities.isEventDispatchThread()) {
+ handleInvocationManagerMessage(message);
+ } else {
+ SwingUtilities.invokeLater(new Runnable() {
+ public void run() {
+ handleInvocationManagerMessage(message);
+ }
+ });
+ } }
+
+ public void fillInConfiguration(
+ ExternalToolActivityConfigurationBean newConfiguration) {
+ if (unmanagedShown && unmanagedLocation.isSelected()) {
+ return;
+ }
+ if (mechanismSelected.isSelected()) {
+ newConfiguration.setMechanism((InvocationMechanism) mechanismSelection.getSelectedItem());
+ return;
+ }
+ newConfiguration.setInvocationGroup((InvocationGroup) groupSelection.getSelectedItem());
+ }
+
+ public void stopObserving() {
+ manager.removeObserver(this);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/54050685/taverna-external-tool-activity-ui/src/main/java/net/sf/taverna/t2/activities/externaltool/views/LoadDescriptionAction.java
----------------------------------------------------------------------
diff --git a/taverna-external-tool-activity-ui/src/main/java/net/sf/taverna/t2/activities/externaltool/views/LoadDescriptionAction.java b/taverna-external-tool-activity-ui/src/main/java/net/sf/taverna/t2/activities/externaltool/views/LoadDescriptionAction.java
new file mode 100644
index 0000000..7f0d82f
--- /dev/null
+++ b/taverna-external-tool-activity-ui/src/main/java/net/sf/taverna/t2/activities/externaltool/views/LoadDescriptionAction.java
@@ -0,0 +1,89 @@
+/**
+ *
+ */
+package net.sf.taverna.t2.activities.externaltool.views;
+
+import java.awt.event.ActionEvent;
+import java.io.IOException;
+import java.io.StringBufferInputStream;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import javax.swing.AbstractAction;
+import javax.swing.JOptionPane;
+
+import net.sf.taverna.t2.lang.ui.FileTools;
+
+import org.jdom.Document;
+import org.jdom.JDOMException;
+
+import de.uni_luebeck.inb.knowarc.usecases.UseCaseDescription;
+import de.uni_luebeck.inb.knowarc.usecases.UseCaseEnumeration;
+
+final class LoadDescriptionAction extends AbstractAction {
+ /**
+ *
+ */
+ private final ScriptPanel scriptPanel;
+ private final ExternalToolConfigView view;
+
+ LoadDescriptionAction(ScriptPanel scriptPanel, ExternalToolConfigView view) {
+ this.scriptPanel = scriptPanel;
+ this.view = view;
+ }
+
+ public void actionPerformed(ActionEvent e) {
+ String descriptionsString = FileTools.readStringFromFile(
+ this.scriptPanel, "Load tool description",
+ ".xml");
+ if (descriptionsString != null) {
+ String errorMessage = null;
+ try {
+ Document doc = ScriptPanel.builder
+ .build(new StringReader(descriptionsString));
+ List<UseCaseDescription> descriptions = UseCaseEnumeration.readDescriptionsFromStream(new StringBufferInputStream(descriptionsString));
+ if (descriptions.isEmpty()) {
+ JOptionPane.showMessageDialog(this.scriptPanel, "No tool descriptions found", "File content", JOptionPane.ERROR_MESSAGE);
+ return;
+ }
+
+ if (descriptions.size() == 1) {
+ view.getConfiguration().setUseCaseDescription(descriptions.get(0));
+ view.refreshConfiguration(view.getConfiguration());
+ return;
+ }
+
+ List<String> descriptionNames = new ArrayList();
+ for (UseCaseDescription ud : descriptions) {
+ descriptionNames.add(ud.getUsecaseid());
+ }
+ Collections.sort(descriptionNames);
+ String chosenName = (String) JOptionPane.showInputDialog(this.scriptPanel, "Please select a tool description",
+ "Select tool description", JOptionPane.PLAIN_MESSAGE, null, descriptionNames.toArray(), descriptionNames.get(0));
+ if (chosenName != null) {
+ for (UseCaseDescription ud : descriptions) {
+ if (ud.getUsecaseid().equals(chosenName)) {
+ view.getConfiguration().setUseCaseDescription(ud);
+ view.refreshConfiguration(view.getConfiguration());
+ return;
+
+ }
+ }
+ }
+ } catch (JDOMException e1) {
+ errorMessage = e1.getMessage();
+ } catch (IOException e1) {
+ errorMessage = e1.getMessage();
+ } catch (Exception e1) {
+ errorMessage = e1.getMessage();
+ }
+ if (errorMessage != null) {
+ JOptionPane.showMessageDialog(null, errorMessage,
+ "Tool description load error",
+ JOptionPane.ERROR_MESSAGE);
+ }
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/54050685/taverna-external-tool-activity-ui/src/main/java/net/sf/taverna/t2/activities/externaltool/views/SaveDescriptionAction.java
----------------------------------------------------------------------
diff --git a/taverna-external-tool-activity-ui/src/main/java/net/sf/taverna/t2/activities/externaltool/views/SaveDescriptionAction.java b/taverna-external-tool-activity-ui/src/main/java/net/sf/taverna/t2/activities/externaltool/views/SaveDescriptionAction.java
new file mode 100644
index 0000000..31266b4
--- /dev/null
+++ b/taverna-external-tool-activity-ui/src/main/java/net/sf/taverna/t2/activities/externaltool/views/SaveDescriptionAction.java
@@ -0,0 +1,124 @@
+/**
+ *
+ */
+package net.sf.taverna.t2.activities.externaltool.views;
+
+import java.awt.Component;
+import java.awt.event.ActionEvent;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.prefs.Preferences;
+
+import javax.swing.AbstractAction;
+import javax.swing.JFileChooser;
+import javax.swing.JOptionPane;
+
+import net.sf.taverna.t2.lang.ui.ExtensionFileFilter;
+import net.sf.taverna.t2.lang.ui.FileTools;
+
+import org.apache.log4j.Logger;
+import org.jdom.Element;
+import org.jdom.output.Format;
+import org.jdom.output.XMLOutputter;
+
+import de.uni_luebeck.inb.knowarc.usecases.UseCaseDescription;
+import de.uni_luebeck.inb.knowarc.usecases.UseCaseEnumeration;
+
+final class SaveDescriptionAction extends AbstractAction {
+ /**
+ *
+ */
+ private final ScriptPanel scriptPanel;
+ private final ExternalToolConfigView view;
+
+ private static Logger logger = Logger.getLogger(SaveDescriptionAction.class);
+
+ private static XMLOutputter outputter = new XMLOutputter(Format
+ .getPrettyFormat());
+
+ SaveDescriptionAction(ScriptPanel scriptPanel, ExternalToolConfigView view) {
+ this.scriptPanel = scriptPanel;
+ this.view = view;
+ }
+
+ public void actionPerformed(ActionEvent e) {
+ UseCaseDescription currentDescription = view.makeConfiguration().getUseCaseDescription();
+ String usecaseid = currentDescription.getUsecaseid();
+ String description = currentDescription.getDescription();
+ String group = currentDescription.getGroup();
+ if ((usecaseid == null) || usecaseid.isEmpty() || (description == null) || description.isEmpty() || (group == null) || group.isEmpty()) {
+ JOptionPane.showMessageDialog(view, "Please fill in the tool annotation and\nthen re-export the description", "Missing annotation", JOptionPane.PLAIN_MESSAGE, null);
+ view.showAnnotationPanel();
+ } else {
+ saveStringToFile(this.scriptPanel,
+ "Save tool description", ".xml", currentDescription);
+ }
+ }
+
+ public static boolean saveStringToFile(Component parent, String dialogTitle, String extension, UseCaseDescription description) {
+ JFileChooser fileChooser = new JFileChooser();
+ fileChooser.setDialogTitle(dialogTitle);
+
+ fileChooser.resetChoosableFileFilters();
+ fileChooser.setAcceptAllFileFilterUsed(true);
+
+ fileChooser.setFileFilter(new ExtensionFileFilter(new String[] { extension }));
+
+ Preferences prefs = Preferences.userNodeForPackage(FileTools.class);
+ String curDir = prefs
+ .get("currentDir", System.getProperty("user.home"));
+ fileChooser.setCurrentDirectory(new File(curDir));
+
+ boolean tryAgain = true;
+ while (tryAgain) {
+ tryAgain = false;
+ int returnVal = fileChooser.showSaveDialog(parent);
+ if (returnVal == JFileChooser.APPROVE_OPTION) {
+ prefs.put("currentDir", fileChooser.getCurrentDirectory()
+ .toString());
+ File file = fileChooser.getSelectedFile();
+ if (!file.getName().contains(".")) {
+ String newName = file.getName() + extension;
+ file = new File(file.getParentFile(), newName);
+ }
+
+ // TODO: Open in separate thread to avoid hanging UI
+ try {
+ List<UseCaseDescription> currentDescriptions;
+ if (file.exists()) {
+ currentDescriptions = UseCaseEnumeration.readDescriptionsFromStream(new FileInputStream(file));
+ } else {
+ currentDescriptions = new ArrayList<UseCaseDescription>();
+ }
+ Element overallElement = new Element("usecases");
+ for (UseCaseDescription ud : currentDescriptions) {
+ if (!ud.getUsecaseid().equals(description.getUsecaseid())) {
+ overallElement.addContent(ud.writeToXMLElement());
+ }
+ }
+
+ overallElement.addContent(description.writeToXMLElement());
+ BufferedWriter out = new BufferedWriter(new FileWriter(file));
+ out.write(outputter.outputString(overallElement));
+ out.close();
+ logger.info("Saved content by overwriting " + file);
+ return true;
+ } catch (IOException ex) {
+ logger.warn("Could not save content to " + file, ex);
+ JOptionPane.showMessageDialog(parent,
+ "Could not save to " + file + ": \n\n"
+ + ex.getMessage(), "Warning",
+ JOptionPane.WARNING_MESSAGE);
+ return false;
+ }
+ }
+ }
+ return false;
+ }
+
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/54050685/taverna-external-tool-activity-ui/src/main/java/net/sf/taverna/t2/activities/externaltool/views/ScriptPanel.java
----------------------------------------------------------------------
diff --git a/taverna-external-tool-activity-ui/src/main/java/net/sf/taverna/t2/activities/externaltool/views/ScriptPanel.java b/taverna-external-tool-activity-ui/src/main/java/net/sf/taverna/t2/activities/externaltool/views/ScriptPanel.java
new file mode 100644
index 0000000..ba15219
--- /dev/null
+++ b/taverna-external-tool-activity-ui/src/main/java/net/sf/taverna/t2/activities/externaltool/views/ScriptPanel.java
@@ -0,0 +1,149 @@
+/**
+ *
+ */
+package net.sf.taverna.t2.activities.externaltool.views;
+
+import java.awt.BorderLayout;
+import java.awt.FlowLayout;
+import java.awt.GridLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.IOException;
+
+import javax.swing.AbstractAction;
+import javax.swing.JButton;
+import javax.swing.JCheckBox;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JTextArea;
+import javax.swing.JTextField;
+import javax.swing.border.EmptyBorder;
+import javax.swing.text.JTextComponent;
+
+import net.sf.taverna.t2.activities.externaltool.ExternalToolActivityConfigurationBean;
+import net.sf.taverna.t2.lang.ui.DeselectingButton;
+import net.sf.taverna.t2.lang.ui.LineEnabledTextPanel;
+
+import org.jdom.input.SAXBuilder;
+
+import de.uni_luebeck.inb.knowarc.usecases.UseCaseDescription;
+import de.uni_luebeck.inb.knowarc.usecases.UseCaseEnumeration;
+
+
+/**
+ * @author alanrw
+ *
+ */
+public class ScriptPanel extends JPanel {
+
+ private static final String SCRIPT_DESCRIPTION = "Specify the commands that you want to run. You can use data arriving at an input port to replace parts of the command or to write to a file. You can also take data written to a file and send it to an output port.";
+ static SAXBuilder builder = new SAXBuilder();
+ private final JTextComponent scriptTextArea;
+
+ public ScriptPanel(final ExternalToolConfigView view, JTextComponent scriptTextArea, JCheckBox stdInCheckBox, JCheckBox stdOutCheckBox, JCheckBox stdErrCheckBox, JTextField returnCodesField) {
+ super();
+ this.setLayout(new BorderLayout());
+
+ JTextArea descriptionText = new JTextArea(
+ SCRIPT_DESCRIPTION);
+ descriptionText.setEditable(false);
+ descriptionText.setFocusable(false);
+ descriptionText.setBorder(new EmptyBorder(5, 5, 10, 5));
+ descriptionText.setLineWrap(true);
+ descriptionText.setWrapStyleWord(true);
+ this.add(descriptionText, BorderLayout.NORTH);
+
+ this.scriptTextArea = scriptTextArea;
+
+ this.add(new LineEnabledTextPanel(scriptTextArea),
+ BorderLayout.CENTER);
+
+
+ UseCaseDescription useCaseDescription = view.getConfiguration().getUseCaseDescription();
+ stdInCheckBox.setSelected(useCaseDescription.isIncludeStdIn());
+ stdOutCheckBox.setSelected(useCaseDescription.isIncludeStdOut());
+ stdErrCheckBox.setSelected(useCaseDescription.isIncludeStdErr());
+ returnCodesField.setText(useCaseDescription.getReturnCodesAsText());
+
+ JPanel codesPanel = new JPanel(new FlowLayout());
+ codesPanel.add(new JLabel("Valid return codes:"));
+ codesPanel.add(returnCodesField);
+
+ JPanel streamPanel = new JPanel(new FlowLayout());
+ streamPanel.add(stdInCheckBox);
+ streamPanel.add(stdOutCheckBox);
+ streamPanel.add(stdErrCheckBox);
+
+ JPanel buttonPanel = new JPanel(new FlowLayout());
+ if (view.isOriginallyFromRepository()) {
+ JButton revertButton = new DeselectingButton("Revert to original description",
+ new AbstractAction(){
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ ExternalToolActivityConfigurationBean bean = view.makeConfiguration();
+ String repositoryUrl = bean.getRepositoryUrl();
+ String id = bean.getExternaltoolid();
+ UseCaseDescription usecase = null;
+ try {
+ usecase = UseCaseEnumeration.readDescriptionFromUrl(
+ repositoryUrl, id);
+ }
+ catch (IOException ex) {
+ // Already logged
+ }
+ if (usecase != null) {
+ bean.setUseCaseDescription(usecase);
+ view.setEditable(false, bean);
+ } else {
+ JOptionPane.showMessageDialog(view, "Unable to find tool description " + id, "Missing tool description", JOptionPane.ERROR_MESSAGE);
+ }
+ }});
+ revertButton.setToolTipText("Revert to the tool description from the repository");
+ buttonPanel.add(revertButton);
+ }
+ JButton loadScriptButton = new DeselectingButton("Load description",
+ new LoadDescriptionAction(this, view));
+ loadScriptButton.setToolTipText("Load tool description from a file");
+
+ JButton saveScriptButton = new DeselectingButton("Export description",
+ new SaveDescriptionAction(this, view));
+ saveScriptButton.setToolTipText("Export the tool description to a file");
+
+ JButton clearScriptButton = new DeselectingButton("Clear script",
+ new AbstractAction() {
+
+ public void actionPerformed(ActionEvent e) {
+ clearScript();
+ }
+
+ });
+ clearScriptButton.setToolTipText("Clear the script from the edit area");
+
+ buttonPanel.add(loadScriptButton);
+ buttonPanel.add(saveScriptButton);
+ buttonPanel.add(clearScriptButton);
+
+ JPanel subPanel = new JPanel(new GridLayout(3,1));
+ subPanel.add(codesPanel);
+ subPanel.add(streamPanel);
+ subPanel.add(buttonPanel);
+
+ this.add(subPanel, BorderLayout.SOUTH);
+ }
+
+ /**
+ * Method for clearing the script
+ *
+ */
+ private void clearScript() {
+ if (JOptionPane.showConfirmDialog(this,
+ "Do you really want to clear the tool description?",
+ "Clearing the tool description", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
+ scriptTextArea.setText("");
+ }
+
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/54050685/taverna-external-tool-activity-ui/src/main/java/net/sf/taverna/t2/activities/externaltool/views/StaticStringPanel.java
----------------------------------------------------------------------
diff --git a/taverna-external-tool-activity-ui/src/main/java/net/sf/taverna/t2/activities/externaltool/views/StaticStringPanel.java b/taverna-external-tool-activity-ui/src/main/java/net/sf/taverna/t2/activities/externaltool/views/StaticStringPanel.java
new file mode 100644
index 0000000..885cab5
--- /dev/null
+++ b/taverna-external-tool-activity-ui/src/main/java/net/sf/taverna/t2/activities/externaltool/views/StaticStringPanel.java
@@ -0,0 +1,106 @@
+/**
+ *
+ */
+package net.sf.taverna.t2.activities.externaltool.views;
+
+import java.awt.BorderLayout;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.Insets;
+import java.awt.event.ActionEvent;
+import java.util.List;
+
+import javax.swing.AbstractAction;
+import javax.swing.JButton;
+import javax.swing.JComponent;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTextArea;
+import javax.swing.JTextField;
+import javax.swing.border.EmptyBorder;
+
+import net.sf.taverna.t2.activities.externaltool.utils.Tools;
+import net.sf.taverna.t2.lang.ui.DeselectingButton;
+import net.sf.taverna.t2.lang.ui.ReadOnlyTextArea;
+
+/**
+ * @author alanrw
+ *
+ */
+public class StaticStringPanel extends JPanel {
+
+ private static final String STATIC_STRING_DESCRIPTION = "A fixed string can be written to the specified file.";
+ private final List<ExternalToolStaticStringViewer> staticStringViewList;
+
+ int staticGridy = 1;
+
+ private static String[] elementLabels = new String[] {"String to copy", "To file"};
+
+ public StaticStringPanel(final List<ExternalToolStaticStringViewer> staticStringViewList) {
+ super(new BorderLayout());
+ this.staticStringViewList = staticStringViewList;
+ final JPanel staticEditPanel = new JPanel(new GridBagLayout());
+
+ final GridBagConstraints staticConstraint = new GridBagConstraints();
+ staticConstraint.insets = new Insets(5, 5, 5, 5);
+ staticConstraint.anchor = GridBagConstraints.FIRST_LINE_START;
+ staticConstraint.gridx = 0;
+ staticConstraint.gridy = 0;
+ staticConstraint.weightx = 0.1;
+ staticConstraint.fill = GridBagConstraints.BOTH;
+
+ staticConstraint.gridx = 0;
+ synchronized (staticStringViewList) {
+ for (ExternalToolStaticStringViewer staticView : staticStringViewList) {
+ addStaticStringViewer(StaticStringPanel.this, staticEditPanel,
+ staticView);
+ }
+ }
+
+ JTextArea descriptionText = new ReadOnlyTextArea(
+ STATIC_STRING_DESCRIPTION);
+ descriptionText.setEditable(false);
+ descriptionText.setFocusable(false);
+ descriptionText.setBorder(new EmptyBorder(5, 5, 10, 5));
+ this.add(descriptionText, BorderLayout.NORTH);
+
+ this.add(new JScrollPane(staticEditPanel),
+ BorderLayout.CENTER);
+ JButton addStaticStringButton = new DeselectingButton("Add string",
+ new AbstractAction() {
+ // FIXME refactor this into a method
+ public void actionPerformed(ActionEvent e) {
+
+ ExternalToolStaticStringViewer newViewer = new ExternalToolStaticStringViewer();
+ synchronized (staticStringViewList) {
+ staticStringViewList.add(newViewer);
+ addStaticStringViewer(StaticStringPanel.this, staticEditPanel,
+ newViewer);
+ staticEditPanel.revalidate();
+ staticEditPanel.repaint();
+ }
+ }
+
+ });
+
+ JPanel buttonPanel = new JPanel(new BorderLayout());
+
+ buttonPanel.add(addStaticStringButton, BorderLayout.EAST);
+
+ this.add(buttonPanel, BorderLayout.SOUTH);
+
+ }
+
+ private void addStaticStringViewer(final JPanel outerPanel,
+ final JPanel panel, ExternalToolStaticStringViewer viewer) {
+ Tools.addViewer(panel,
+ elementLabels,
+ new JComponent[] {new JScrollPane(viewer.getContentField()), viewer.getValueField()},
+ staticStringViewList,
+ viewer,
+ outerPanel);
+ }
+
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/54050685/taverna-external-tool-activity-ui/src/main/java/net/sf/taverna/t2/activities/externaltool/views/StaticUrlPanel.java
----------------------------------------------------------------------
diff --git a/taverna-external-tool-activity-ui/src/main/java/net/sf/taverna/t2/activities/externaltool/views/StaticUrlPanel.java b/taverna-external-tool-activity-ui/src/main/java/net/sf/taverna/t2/activities/externaltool/views/StaticUrlPanel.java
new file mode 100644
index 0000000..ba441f4
--- /dev/null
+++ b/taverna-external-tool-activity-ui/src/main/java/net/sf/taverna/t2/activities/externaltool/views/StaticUrlPanel.java
@@ -0,0 +1,108 @@
+/**
+ *
+ */
+package net.sf.taverna.t2.activities.externaltool.views;
+
+import java.awt.BorderLayout;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.Insets;
+import java.awt.event.ActionEvent;
+import java.util.List;
+
+import javax.swing.AbstractAction;
+import javax.swing.JButton;
+import javax.swing.JComponent;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTextArea;
+import javax.swing.JTextField;
+import javax.swing.border.EmptyBorder;
+
+import net.sf.taverna.t2.activities.externaltool.utils.Tools;
+import net.sf.taverna.t2.lang.ui.DeselectingButton;
+import net.sf.taverna.t2.lang.ui.ReadOnlyTextArea;
+
+/**
+ * @author alanrw
+ *
+ */
+public class StaticUrlPanel extends JPanel {
+
+ private static final String STATIC_URL_DESCRIPTION = "The data at a URL can be downloaded and stored in the specified file.";
+ private final List<ExternalToolStaticUrlViewer> staticUrlViewList;
+ private int staticGridy = 1;
+
+ private static String[] elementLabels = new String[] {"Copy from URL", "To file"};
+
+
+ public StaticUrlPanel(final List<ExternalToolStaticUrlViewer> staticUrlViewList) {
+
+ super(new BorderLayout());
+ this.staticUrlViewList = staticUrlViewList;
+ final JPanel staticEditPanel = new JPanel(new GridBagLayout());
+
+ final GridBagConstraints staticConstraint = new GridBagConstraints();
+ staticConstraint.insets = new Insets(5, 5, 5, 5);
+ staticConstraint.anchor = GridBagConstraints.FIRST_LINE_START;
+ staticConstraint.gridx = 0;
+ staticConstraint.gridy = 0;
+ staticConstraint.weightx = 0.1;
+ staticConstraint.fill = GridBagConstraints.BOTH;
+
+ staticConstraint.gridx = 0;
+ synchronized (staticUrlViewList) {
+ for (ExternalToolStaticUrlViewer staticView : staticUrlViewList) {
+ addStaticUrlViewer(this, staticEditPanel,
+ staticView);
+ }
+ }
+
+ this.add(new JScrollPane(staticEditPanel),
+ BorderLayout.CENTER);
+
+ JTextArea descriptionText = new ReadOnlyTextArea(
+ STATIC_URL_DESCRIPTION);
+ descriptionText.setEditable(false);
+ descriptionText.setFocusable(false);
+ descriptionText.setBorder(new EmptyBorder(5, 5, 10, 5));
+
+ this.add(descriptionText, BorderLayout.NORTH);
+
+ JButton addstaticPortButton = new DeselectingButton("Add URL",
+ new AbstractAction() {
+ // FIXME refactor this into a method
+ public void actionPerformed(ActionEvent e) {
+
+ ExternalToolStaticUrlViewer newViewer = new ExternalToolStaticUrlViewer();
+ synchronized (staticUrlViewList) {
+ staticUrlViewList.add(newViewer);
+ addStaticUrlViewer(StaticUrlPanel.this, staticEditPanel,
+ newViewer);
+ staticEditPanel.revalidate();
+ staticEditPanel.repaint();
+ }
+ }
+
+ });
+ JPanel buttonPanel = new JPanel(new BorderLayout());
+
+ buttonPanel.add(addstaticPortButton, BorderLayout.EAST);
+
+ this.add(buttonPanel, BorderLayout.SOUTH);
+
+ }
+
+ private void addStaticUrlViewer(final JPanel outerPanel,
+ final JPanel panel, ExternalToolStaticUrlViewer viewer) {
+ Tools.addViewer(panel,
+ elementLabels,
+ new JComponent[] {viewer.getContentField(), viewer.getValueField()},
+ staticUrlViewList,
+ viewer,
+ outerPanel);
+ }
+
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/54050685/taverna-external-tool-activity-ui/src/main/java/net/sf/taverna/t2/activities/externaltool/views/StringReplacementPanel.java
----------------------------------------------------------------------
diff --git a/taverna-external-tool-activity-ui/src/main/java/net/sf/taverna/t2/activities/externaltool/views/StringReplacementPanel.java b/taverna-external-tool-activity-ui/src/main/java/net/sf/taverna/t2/activities/externaltool/views/StringReplacementPanel.java
new file mode 100644
index 0000000..1f85d3a
--- /dev/null
+++ b/taverna-external-tool-activity-ui/src/main/java/net/sf/taverna/t2/activities/externaltool/views/StringReplacementPanel.java
@@ -0,0 +1,134 @@
+/**
+ *
+ */
+package net.sf.taverna.t2.activities.externaltool.views;
+
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.Insets;
+import java.awt.event.ActionEvent;
+import java.util.List;
+
+import javax.swing.AbstractAction;
+import javax.swing.BorderFactory;
+import javax.swing.JButton;
+import javax.swing.JCheckBox;
+import javax.swing.JComponent;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTextArea;
+import javax.swing.JTextField;
+import javax.swing.border.CompoundBorder;
+import javax.swing.border.EmptyBorder;
+
+import net.sf.taverna.t2.activities.externaltool.manager.ssh.ExternalToolSshNodeViewer;
+import net.sf.taverna.t2.activities.externaltool.utils.Tools;
+import net.sf.taverna.t2.lang.ui.DeselectingButton;
+
+/**
+ * @author alanrw
+ *
+ */
+public class StringReplacementPanel extends JPanel {
+
+ private static final String STRING_REPLACEMENT_DESCRIPTION = "You can use a string replacement to " +
+ "feed data into the service via an input port and have that data replace part of the " +
+ "command.";
+ private final List<ExternalToolStringReplacementViewer> stringReplacementViewList;
+ private int stringReplacementGridy = 1;
+ private final ExternalToolConfigView view;
+
+ private static Insets insets = new Insets(1,5,1,5);
+
+ private static String[] elementLabels = new String[] {"Taverna port name", "Replace port name", "String to replace"};
+
+ private static CompoundBorder border = BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(5,5,5,5), BorderFactory.createLineBorder(Color.BLACK, 1));
+
+
+ public StringReplacementPanel(final ExternalToolConfigView view, final List<ExternalToolStringReplacementViewer> stringReplacementViewList) {
+ super(new BorderLayout());
+ this.view = view;
+ this.stringReplacementViewList = stringReplacementViewList;
+
+ final JPanel inputEditPanel = new JPanel(new GridBagLayout());
+
+ final GridBagConstraints inputConstraint = new GridBagConstraints();
+
+ inputConstraint.anchor = GridBagConstraints.FIRST_LINE_START;
+ inputConstraint.gridx = 0;
+ inputConstraint.gridy = 0;
+ inputConstraint.weightx = 0.1;
+ inputConstraint.fill = GridBagConstraints.BOTH;
+
+ inputConstraint.gridx = 0;
+ synchronized (stringReplacementViewList) {
+ for (ExternalToolStringReplacementViewer inputView : stringReplacementViewList) {
+ addStringReplacementViewer(this, inputEditPanel,
+ inputView, elementLabels);
+
+ }
+ }
+
+ JTextArea descriptionText = new JTextArea(
+ STRING_REPLACEMENT_DESCRIPTION);
+ descriptionText.setEditable(false);
+ descriptionText.setFocusable(false);
+ descriptionText.setBorder(new EmptyBorder(5, 5, 10, 5));
+ descriptionText.setLineWrap(true);
+ descriptionText.setWrapStyleWord(true);
+
+ this.add(descriptionText, BorderLayout.NORTH);
+ this.add(new JScrollPane(inputEditPanel),
+ BorderLayout.CENTER);
+ JButton addInputPortButton = new DeselectingButton("Add string replacement",
+ new AbstractAction() {
+
+ public void actionPerformed(ActionEvent e) {
+
+ int portNumber = 1;
+ String name2 = "in" + portNumber++;
+ boolean nameExists = true;
+ while (nameExists == true) {
+ nameExists = view.portNameExists(name2);
+ if (nameExists) {
+ name2 = "in" + portNumber++;
+ }
+ }
+
+ ExternalToolStringReplacementViewer newViewer = new ExternalToolStringReplacementViewer(
+ name2);
+ synchronized (stringReplacementViewList) {
+ stringReplacementViewList.add(newViewer);
+ addStringReplacementViewer(StringReplacementPanel.this, inputEditPanel,
+ newViewer, elementLabels);
+ inputEditPanel.revalidate();
+ inputEditPanel.repaint();
+ }
+
+ }
+
+ });
+
+ JPanel buttonPanel = new JPanel();
+ buttonPanel.setLayout(new BorderLayout());
+
+ buttonPanel.add(addInputPortButton, BorderLayout.EAST);
+
+ this.add(buttonPanel, BorderLayout.SOUTH);
+ }
+
+ private void addStringReplacementViewer(final JPanel outerPanel,
+ final JPanel innerPanel, final ExternalToolStringReplacementViewer viewer, String[] elementLabels) {
+ Tools.addViewer(innerPanel,
+ elementLabels,
+ new JComponent[] {viewer.getNameField(), viewer.getValueFromField(), viewer.getValueField()},
+ stringReplacementViewList,
+ viewer,
+ outerPanel);
+ }
+
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/54050685/taverna-external-tool-activity-ui/src/main/java/net/sf/taverna/t2/activities/externaltool/views/ToolXMLPanel.java
----------------------------------------------------------------------
diff --git a/taverna-external-tool-activity-ui/src/main/java/net/sf/taverna/t2/activities/externaltool/views/ToolXMLPanel.java b/taverna-external-tool-activity-ui/src/main/java/net/sf/taverna/t2/activities/externaltool/views/ToolXMLPanel.java
new file mode 100644
index 0000000..b49211f
--- /dev/null
+++ b/taverna-external-tool-activity-ui/src/main/java/net/sf/taverna/t2/activities/externaltool/views/ToolXMLPanel.java
@@ -0,0 +1,33 @@
+/**
+ *
+ */
+package net.sf.taverna.t2.activities.externaltool.views;
+
+import java.awt.BorderLayout;
+
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+
+import net.sf.taverna.t2.renderers.impl.XMLTree;
+
+import de.uni_luebeck.inb.knowarc.usecases.UseCaseDescription;
+
+/**
+ * @author alanrw
+ *
+ */
+public class ToolXMLPanel extends JPanel {
+
+ public ToolXMLPanel(UseCaseDescription useCaseDescription) {
+ super(new BorderLayout());
+ XMLTree xmlTree = new XMLTree(useCaseDescription.writeToXMLElement());
+ this.add(new JScrollPane(xmlTree), BorderLayout.CENTER);
+ }
+
+ public void regenerateTree(UseCaseDescription useCaseDescription) {
+ this.removeAll();
+ XMLTree xmlTree = new XMLTree(useCaseDescription.writeToXMLElement());
+ this.add(new JScrollPane(xmlTree), BorderLayout.CENTER);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/54050685/taverna-external-tool-activity-ui/src/main/resources/META-INF/services/net.sf.taverna.t2.activities.externaltool.manager.InvocationMechanismEditor
----------------------------------------------------------------------
diff --git a/taverna-external-tool-activity-ui/src/main/resources/META-INF/services/net.sf.taverna.t2.activities.externaltool.manager.InvocationMechanismEditor b/taverna-external-tool-activity-ui/src/main/resources/META-INF/services/net.sf.taverna.t2.activities.externaltool.manager.InvocationMechanismEditor
new file mode 100644
index 0000000..9307977
--- /dev/null
+++ b/taverna-external-tool-activity-ui/src/main/resources/META-INF/services/net.sf.taverna.t2.activities.externaltool.manager.InvocationMechanismEditor
@@ -0,0 +1,2 @@
+net.sf.taverna.t2.activities.externaltool.manager.local.LocalInvocationMechanismEditor
+net.sf.taverna.t2.activities.externaltool.manager.ssh.SshInvocationMechanismEditor
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/54050685/taverna-external-tool-activity-ui/src/main/resources/META-INF/services/net.sf.taverna.t2.servicedescriptions.ServiceDescriptionProvider
----------------------------------------------------------------------
diff --git a/taverna-external-tool-activity-ui/src/main/resources/META-INF/services/net.sf.taverna.t2.servicedescriptions.ServiceDescriptionProvider b/taverna-external-tool-activity-ui/src/main/resources/META-INF/services/net.sf.taverna.t2.servicedescriptions.ServiceDescriptionProvider
new file mode 100644
index 0000000..e94cf6e
--- /dev/null
+++ b/taverna-external-tool-activity-ui/src/main/resources/META-INF/services/net.sf.taverna.t2.servicedescriptions.ServiceDescriptionProvider
@@ -0,0 +1,2 @@
+net.sf.taverna.t2.activities.externaltool.servicedescriptions.ExternalToolServiceProvider
+net.sf.taverna.t2.activities.externaltool.servicedescriptions.ExternalToolTemplateServiceDescription
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/54050685/taverna-external-tool-activity-ui/src/main/resources/META-INF/services/net.sf.taverna.t2.ui.menu.MenuComponent
----------------------------------------------------------------------
diff --git a/taverna-external-tool-activity-ui/src/main/resources/META-INF/services/net.sf.taverna.t2.ui.menu.MenuComponent b/taverna-external-tool-activity-ui/src/main/resources/META-INF/services/net.sf.taverna.t2.ui.menu.MenuComponent
new file mode 100644
index 0000000..db316f2
--- /dev/null
+++ b/taverna-external-tool-activity-ui/src/main/resources/META-INF/services/net.sf.taverna.t2.ui.menu.MenuComponent
@@ -0,0 +1,4 @@
+net.sf.taverna.t2.activities.externaltool.menu.ConfigureExternalToolMenuAction
+# net.sf.taverna.t2.activities.externaltool.menu.FeedbackMenuAction
+net.sf.taverna.t2.activities.externaltool.menu.AddExternalToolContextualMenuAction
+net.sf.taverna.t2.activities.externaltool.menu.AddExternalToolMenuAction
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/54050685/taverna-external-tool-activity-ui/src/main/resources/META-INF/services/net.sf.taverna.t2.workbench.ShutdownSPI
----------------------------------------------------------------------
diff --git a/taverna-external-tool-activity-ui/src/main/resources/META-INF/services/net.sf.taverna.t2.workbench.ShutdownSPI b/taverna-external-tool-activity-ui/src/main/resources/META-INF/services/net.sf.taverna.t2.workbench.ShutdownSPI
new file mode 100644
index 0000000..e6686a0
--- /dev/null
+++ b/taverna-external-tool-activity-ui/src/main/resources/META-INF/services/net.sf.taverna.t2.workbench.ShutdownSPI
@@ -0,0 +1 @@
+net.sf.taverna.t2.activities.externaltool.manager.InvocationGroupManagerShutdownHook
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/54050685/taverna-external-tool-activity-ui/src/main/resources/META-INF/services/net.sf.taverna.t2.workbench.StartupSPI
----------------------------------------------------------------------
diff --git a/taverna-external-tool-activity-ui/src/main/resources/META-INF/services/net.sf.taverna.t2.workbench.StartupSPI b/taverna-external-tool-activity-ui/src/main/resources/META-INF/services/net.sf.taverna.t2.workbench.StartupSPI
new file mode 100644
index 0000000..0dd97e4
--- /dev/null
+++ b/taverna-external-tool-activity-ui/src/main/resources/META-INF/services/net.sf.taverna.t2.workbench.StartupSPI
@@ -0,0 +1 @@
+net.sf.taverna.t2.activities.externaltool.manager.InvocationGroupManagerStartupHook
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/54050685/taverna-external-tool-activity-ui/src/main/resources/META-INF/services/net.sf.taverna.t2.workbench.activityicons.ActivityIconSPI
----------------------------------------------------------------------
diff --git a/taverna-external-tool-activity-ui/src/main/resources/META-INF/services/net.sf.taverna.t2.workbench.activityicons.ActivityIconSPI b/taverna-external-tool-activity-ui/src/main/resources/META-INF/services/net.sf.taverna.t2.workbench.activityicons.ActivityIconSPI
new file mode 100644
index 0000000..cdafd5d
--- /dev/null
+++ b/taverna-external-tool-activity-ui/src/main/resources/META-INF/services/net.sf.taverna.t2.workbench.activityicons.ActivityIconSPI
@@ -0,0 +1 @@
+net.sf.taverna.t2.activities.externaltool.servicedescriptions.ExternalToolActivityIcon
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/54050685/taverna-external-tool-activity-ui/src/main/resources/META-INF/services/net.sf.taverna.t2.workbench.configuration.ConfigurationUIFactory
----------------------------------------------------------------------
diff --git a/taverna-external-tool-activity-ui/src/main/resources/META-INF/services/net.sf.taverna.t2.workbench.configuration.ConfigurationUIFactory b/taverna-external-tool-activity-ui/src/main/resources/META-INF/services/net.sf.taverna.t2.workbench.configuration.ConfigurationUIFactory
new file mode 100644
index 0000000..b3d1525
--- /dev/null
+++ b/taverna-external-tool-activity-ui/src/main/resources/META-INF/services/net.sf.taverna.t2.workbench.configuration.ConfigurationUIFactory
@@ -0,0 +1 @@
+net.sf.taverna.t2.activities.externaltool.manager.ToolInvocationConfigurationUIFactory
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/54050685/taverna-external-tool-activity-ui/src/main/resources/META-INF/services/net.sf.taverna.t2.workbench.ui.views.contextualviews.activity.ContextualViewFactory
----------------------------------------------------------------------
diff --git a/taverna-external-tool-activity-ui/src/main/resources/META-INF/services/net.sf.taverna.t2.workbench.ui.views.contextualviews.activity.ContextualViewFactory b/taverna-external-tool-activity-ui/src/main/resources/META-INF/services/net.sf.taverna.t2.workbench.ui.views.contextualviews.activity.ContextualViewFactory
new file mode 100644
index 0000000..ca0d30f
--- /dev/null
+++ b/taverna-external-tool-activity-ui/src/main/resources/META-INF/services/net.sf.taverna.t2.workbench.ui.views.contextualviews.activity.ContextualViewFactory
@@ -0,0 +1 @@
+net.sf.taverna.t2.activities.externaltool.views.ExternalToolActivityViewFactory
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/54050685/taverna-external-tool-activity-ui/src/main/resources/META-INF/spring/external-tool-activity-ui-context-osgi.xml
----------------------------------------------------------------------
diff --git a/taverna-external-tool-activity-ui/src/main/resources/META-INF/spring/external-tool-activity-ui-context-osgi.xml b/taverna-external-tool-activity-ui/src/main/resources/META-INF/spring/external-tool-activity-ui-context-osgi.xml
new file mode 100644
index 0000000..3d7110c
--- /dev/null
+++ b/taverna-external-tool-activity-ui/src/main/resources/META-INF/spring/external-tool-activity-ui-context-osgi.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans:beans xmlns="http://www.springframework.org/schema/osgi" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:beans="http://www.springframework.org/schema/beans"
+ xsi:schemaLocation="http://www.springframework.org/schema/beans
+ http://www.springframework.org/schema/beans/spring-beans.xsd
+ http://www.springframework.org/schema/osgi
+ http://www.springframework.org/schema/osgi/spring-osgi.xsd">
+
+ <service ref="ToolInvocationConfigurationUIFactory" interface="uk.org.taverna.configuration.ConfigurationUIFactory" />
+
+ <service ref="InvocationGroupManagerStartupHook" interface="net.sf.taverna.t2.workbench.StartupSPI" />
+
+ <service ref="ExternalToolActivityIcon" interface="net.sf.taverna.t2.workbench.activityicons.ActivityIconSPI" />
+
+ <service ref="LocalInvocationMechanismEditor" interface="net.sf.taverna.t2.activities.externaltool.manager.InvocationMechanismEditor" />
+ <service ref="SshInvocationMechanismEditor" interface="net.sf.taverna.t2.activities.externaltool.manager.InvocationMechanismEditor" />
+
+ <service ref="ExternalToolServiceProvider" interface="net.sf.taverna.t2.servicedescriptions.ServiceDescriptionProvider" />
+ <service ref="ExternalToolTemplateServiceDescription" interface="net.sf.taverna.t2.servicedescriptions.ServiceDescriptionProvider" />
+
+ <service ref="ConfigureExternalToolMenuAction" auto-export="interfaces" />
+ <service ref="AddExternalToolContextualMenuAction" auto-export="interfaces" />
+ <service ref="AddExternalToolMenuAction" auto-export="interfaces" />
+
+ <service ref="InvocationGroupManagerShutdownHook" interface="net.sf.taverna.t2.workbench.ShutdownSPI" />
+
+ <service ref="ExternalToolActivityViewFactory" interface="net.sf.taverna.t2.workbench.ui.views.contextualviews.activity.ContextualViewFactory" />
+
+ <list id="mechanismCreators" interface="net.sf.taverna.t2.activities.externaltool.manager.MechanismCreator" cardinality="0..N" />
+ <list id="invocationMechanismEditors" interface="net.sf.taverna.t2.activities.externaltool.manager.InvocationMechanismEditor" cardinality="0..N" />
+
+ <reference id="editManager" interface="net.sf.taverna.t2.workbench.edits.EditManager" />
+ <reference id="fileManager" interface="net.sf.taverna.t2.workbench.file.FileManager" />
+ <reference id="menuManager" interface="net.sf.taverna.t2.ui.menu.MenuManager" />
+ <reference id="selectionManager" interface="net.sf.taverna.t2.workbench.selection.SelectionManager" />
+ <reference id="activityIconManager" interface="net.sf.taverna.t2.workbench.activityicons.ActivityIconManager" />
+ <reference id="colourManager" interface="net.sf.taverna.t2.workbench.configuration.colour.ColourManager" />
+
+</beans:beans>
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/54050685/taverna-external-tool-activity-ui/src/main/resources/META-INF/spring/external-tool-activity-ui-context.xml
----------------------------------------------------------------------
diff --git a/taverna-external-tool-activity-ui/src/main/resources/META-INF/spring/external-tool-activity-ui-context.xml b/taverna-external-tool-activity-ui/src/main/resources/META-INF/spring/external-tool-activity-ui-context.xml
new file mode 100644
index 0000000..7cf7f63
--- /dev/null
+++ b/taverna-external-tool-activity-ui/src/main/resources/META-INF/spring/external-tool-activity-ui-context.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.springframework.org/schema/beans
+ http://www.springframework.org/schema/beans/spring-beans.xsd">
+
+ <bean id="ToolInvocationConfigurationUIFactory" class="net.sf.taverna.t2.activities.externaltool.manager.ToolInvocationConfigurationUIFactory">
+ <property name="mechanismCreators" ref="mechanismCreators" />
+ <property name="invocationMechanismEditors" ref="invocationMechanismEditors" />
+ </bean>
+
+ <bean id="InvocationGroupManagerStartupHook" class="net.sf.taverna.t2.activities.externaltool.manager.InvocationGroupManagerStartupHook" />
+
+ <bean id="ExternalToolActivityIcon" class="net.sf.taverna.t2.activities.externaltool.servicedescriptions.ExternalToolActivityIcon">
+ <property name="colourManager" ref="colourManager" />
+ </bean>
+
+ <bean id="LocalInvocationMechanismEditor" class="net.sf.taverna.t2.activities.externaltool.manager.local.LocalInvocationMechanismEditor" />
+ <bean id="SshInvocationMechanismEditor" class="net.sf.taverna.t2.activities.externaltool.manager.ssh.SshInvocationMechanismEditor" />
+
+ <bean id="ExternalToolServiceProvider" class="net.sf.taverna.t2.activities.externaltool.servicedescriptions.ExternalToolServiceProvider" />
+ <bean id="ExternalToolTemplateServiceDescription" class="net.sf.taverna.t2.activities.externaltool.servicedescriptions.ExternalToolTemplateServiceDescription" />
+
+ <bean id="ConfigureExternalToolMenuAction" class="net.sf.taverna.t2.activities.externaltool.menu.ConfigureExternalToolMenuAction">
+ <property name="editManager" ref="editManager" />
+ <property name="fileManager" ref="fileManager" />
+ <property name="activityIconManager" ref="activityIconManager" />
+ </bean>
+ <bean id="AddExternalToolContextualMenuAction" class="net.sf.taverna.t2.activities.externaltool.menu.AddExternalToolContextualMenuAction">
+ <property name="editManager" ref="editManager" />
+ <property name="menuManager" ref="menuManager" />
+ <property name="selectionManager" ref="selectionManager" />
+ <property name="activityIconManager" ref="activityIconManager" />
+ </bean>
+ <bean id="AddExternalToolMenuAction" class="net.sf.taverna.t2.activities.externaltool.menu.AddExternalToolMenuAction">
+ <property name="editManager" ref="editManager" />
+ <property name="menuManager" ref="menuManager" />
+ <property name="selectionManager" ref="selectionManager" />
+ <property name="activityIconManager" ref="activityIconManager" />
+ </bean>
+
+ <bean id="InvocationGroupManagerShutdownHook" class="net.sf.taverna.t2.activities.externaltool.manager.InvocationGroupManagerShutdownHook" />
+
+ <bean id="ExternalToolActivityViewFactory" class="net.sf.taverna.t2.activities.externaltool.views.ExternalToolActivityViewFactory">
+ <property name="editManager" ref="editManager" />
+ <property name="fileManager" ref="fileManager" />
+ <property name="activityIconManager" ref="activityIconManager" />
+ <property name="colourManager" ref="colourManager" />
+ </bean>
+
+</beans>
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/54050685/taverna-external-tool-activity-ui/src/main/resources/externaltool.png
----------------------------------------------------------------------
diff --git a/taverna-external-tool-activity-ui/src/main/resources/externaltool.png b/taverna-external-tool-activity-ui/src/main/resources/externaltool.png
new file mode 100644
index 0000000..a9e84e6
Binary files /dev/null and b/taverna-external-tool-activity-ui/src/main/resources/externaltool.png differ
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/54050685/taverna-localworker-activity-ui/pom.xml
----------------------------------------------------------------------
diff --git a/taverna-localworker-activity-ui/pom.xml b/taverna-localworker-activity-ui/pom.xml
new file mode 100644
index 0000000..556de86
--- /dev/null
+++ b/taverna-localworker-activity-ui/pom.xml
@@ -0,0 +1,142 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>net.sf.taverna</groupId>
+ <artifactId>taverna-parent</artifactId>
+ <version>3.0.1-SNAPSHOT</version>
+ </parent>
+ <groupId>net.sf.taverna.t2.ui-activities</groupId>
+ <artifactId>localworker-activity-ui</artifactId>
+ <version>2.0-SNAPSHOT</version>
+ <packaging>bundle</packaging>
+ <name>Taverna 2 Localworker Activity UI</name>
+ <dependencies>
+ <dependency>
+ <groupId>net.sf.taverna.t2.ui-activities</groupId>
+ <artifactId>beanshell-activity-ui</artifactId>
+ <version>${t2.activities.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>net.sf.taverna.t2.ui-api</groupId>
+ <artifactId>activity-icons-api</artifactId>
+ <version>${t2.ui.api.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>net.sf.taverna.t2.ui-api</groupId>
+ <artifactId>activity-palette-api</artifactId>
+ <version>${t2.ui.api.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>net.sf.taverna.t2.ui-api</groupId>
+ <artifactId>edits-api</artifactId>
+ <version>${t2.ui.api.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>net.sf.taverna.t2.ui-api</groupId>
+ <artifactId>file-api</artifactId>
+ <version>${t2.ui.api.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>net.sf.taverna.t2.ui-api</groupId>
+ <artifactId>menu-api</artifactId>
+ <version>${t2.ui.api.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>uk.org.taverna.configuration</groupId>
+ <artifactId>taverna-app-configuration-api</artifactId>
+ <version>${taverna.configuration.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>uk.org.taverna.scufl2</groupId>
+ <artifactId>scufl2-api</artifactId>
+ <version>${scufl2.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-databind</artifactId>
+ <version>2.2.2</version>
+ </dependency>
+
+ <!-- category:biojava -->
+ <!-- net.sourceforge.taverna.scuflworkers.biojava.GenBankParserWorker -->
+ <!-- net.sourceforge.taverna.scuflworkers.biojava.ReverseCompWorker -->
+ <!-- net.sourceforge.taverna.scuflworkers.biojava.SwissProtParserWorker -->
+ <!-- net.sourceforge.taverna.scuflworkers.biojava.TranscribeWorker -->
+ <dependency>
+ <groupId>uk.org.mygrid.resources</groupId>
+ <artifactId>biojava</artifactId>
+ <version>1.4pre1</version>
+ </dependency>
+ <!-- category:xml -->
+ <!-- net.sourceforge.taverna.scuflworkers.xml.XPathTextWorker -->
+ <dependency>
+ <groupId>org.dom4j</groupId>
+ <artifactId>com.springsource.org.dom4j</artifactId>
+ <version>${dom4j.version}</version>
+ </dependency>
+ <!-- <dependency>
+ <groupId>dom4j</groupId>
+ <artifactId>dom4j</artifactId>
+ <version>1.6</version>
+ </dependency> -->
+ <!-- category:net -->
+ <!-- org.embl.ebi.escience.scuflworkers.java.SendEmail -->
+ <dependency>
+ <groupId>javax.mail</groupId>
+ <artifactId>com.springsource.javax.mail</artifactId>
+ <version>${mail.version}</version>
+ </dependency>
+ <!-- <dependency>
+ <groupId>javax.mail</groupId>
+ <artifactId>mail</artifactId>
+ <version>1.4</version>
+ </dependency> -->
+ <dependency>
+ <groupId>javax.activation</groupId>
+ <artifactId>com.springsource.javax.activation</artifactId>
+ <version>1.1.1</version>
+ </dependency>
+ <!-- <dependency>
+ <groupId>javax.activation</groupId>
+ <artifactId>activation</artifactId>
+ <version>1.1</version>
+ </dependency> -->
+ <!-- category:base64 -->
+ <!-- org.embl.ebi.escience.scuflworkers.java.EncodeBase64 -->
+ <!-- org.embl.ebi.escience.scuflworkers.java.DecodeBase64 -->
+ <dependency>
+ <groupId>commons-codec</groupId>
+ <artifactId>commons-codec</artifactId>
+ <version>${commons.codec.version}</version>
+ </dependency>
+ <!-- <dependency>
+ <groupId>commons-codec</groupId>
+ <artifactId>commons-codec</artifactId>
+ <version>1.3</version>
+ </dependency> -->
+ </dependencies>
+ <repositories>
+ <repository>
+ <releases />
+ <snapshots>
+ <enabled>false</enabled>
+ </snapshots>
+ <id>mygrid-repository</id>
+ <name>myGrid Repository</name>
+ <url>http://www.mygrid.org.uk/maven/repository
+ </url>
+ </repository>
+ <repository>
+ <releases>
+ <enabled>false</enabled>
+ </releases>
+ <snapshots />
+ <id>mygrid-snapshot-repository</id>
+ <name>myGrid Snapshot Repository</name>
+ <url>http://www.mygrid.org.uk/maven/snapshot-repository</url>
+ </repository>
+ </repositories>
+</project>
+
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/54050685/taverna-localworker-activity-ui/src/main/java/net/sf/taverna/t2/activities/localworker/actions/LocalworkerActivityConfigurationAction.java
----------------------------------------------------------------------
diff --git a/taverna-localworker-activity-ui/src/main/java/net/sf/taverna/t2/activities/localworker/actions/LocalworkerActivityConfigurationAction.java b/taverna-localworker-activity-ui/src/main/java/net/sf/taverna/t2/activities/localworker/actions/LocalworkerActivityConfigurationAction.java
new file mode 100644
index 0000000..2016ad0
--- /dev/null
+++ b/taverna-localworker-activity-ui/src/main/java/net/sf/taverna/t2/activities/localworker/actions/LocalworkerActivityConfigurationAction.java
@@ -0,0 +1,117 @@
+/*******************************************************************************
+ * Copyright (C) 2007 The University of Manchester
+ *
+ * Modifications to the initial code base are copyright of their
+ * respective authors, or their employers as appropriate.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ ******************************************************************************/
+package net.sf.taverna.t2.activities.localworker.actions;
+
+import java.awt.Frame;
+import java.awt.event.ActionEvent;
+
+import javax.swing.Action;
+import javax.swing.JOptionPane;
+
+import net.sf.taverna.t2.activities.localworker.views.LocalworkerActivityConfigView;
+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 uk.org.taverna.configuration.app.ApplicationConfiguration;
+import uk.org.taverna.scufl2.api.activity.Activity;
+import uk.org.taverna.scufl2.api.common.Scufl2Tools;
+import uk.org.taverna.scufl2.api.configurations.Configuration;
+
+import com.fasterxml.jackson.databind.JsonNode;
+
+/**
+ * The {@link LocalworkerActivity}s have pre-defined scripts, ports etc in a serialised form on
+ * disk. So if the user wants to change them they have to do so at own risk.
+ *
+ * @author Ian Dunlop
+ */
+@SuppressWarnings("serial")
+public class LocalworkerActivityConfigurationAction extends ActivityConfigurationAction {
+
+ public static final String EDIT_LOCALWORKER_SCRIPT = "Edit beanshell script";
+
+ private final EditManager editManager;
+
+ private final FileManager fileManager;
+
+ private final ApplicationConfiguration applicationConfiguration;
+
+ private Scufl2Tools scufl2Tools = new Scufl2Tools();
+
+ public LocalworkerActivityConfigurationAction(Activity activity, Frame owner,
+ EditManager editManager, FileManager fileManager,
+ ActivityIconManager activityIconManager,
+ ServiceDescriptionRegistry serviceDescriptionRegistry,
+ ApplicationConfiguration applicationConfiguration) {
+ super(activity, activityIconManager, serviceDescriptionRegistry);
+ this.editManager = editManager;
+ this.fileManager = fileManager;
+ this.applicationConfiguration = applicationConfiguration;
+ putValue(Action.NAME, EDIT_LOCALWORKER_SCRIPT);
+ }
+
+ /**
+ * If the localworker has not been changed it pops up a {@link JOptionPane} warning the user
+ * that they change things at their own risk. Otherwise just show the config view
+ */
+ public void actionPerformed(ActionEvent e) {
+ Object[] options = { "Continue", "Cancel" };
+ Configuration configuration = scufl2Tools.configurationFor(activity, activity.getParent());
+ JsonNode json = configuration.getJson();
+ if (!json.get("isAltered").booleanValue()) {
+ int n = JOptionPane
+ .showOptionDialog(
+ null,
+ "Changing the properties of a Local Worker may affect its behaviour. Do you want to continue?",
+ "WARNING", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE,
+ null, // do not use a
+ // custom Icon
+ options, options[0]);
+
+ if (n == 0) {
+ // continue was clicked so prepare for config
+ openDialog();
+ } else {
+ // do nothing
+ }
+ } else {
+ openDialog();
+ }
+ }
+
+ private void openDialog() {
+ ActivityConfigurationDialog currentDialog = ActivityConfigurationAction
+ .getDialog(getActivity());
+ if (currentDialog != null) {
+ currentDialog.toFront();
+ return;
+ }
+ final LocalworkerActivityConfigView localworkerConfigView = new LocalworkerActivityConfigView(
+ getActivity(), applicationConfiguration);
+ final ActivityConfigurationDialog dialog = new ActivityConfigurationDialog(getActivity(),
+ localworkerConfigView, editManager);
+ ActivityConfigurationAction.setDialog(getActivity(), dialog, fileManager);
+
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/54050685/taverna-localworker-activity-ui/src/main/java/net/sf/taverna/t2/activities/localworker/menu/ConfigureLocalworkerMenuAction.java
----------------------------------------------------------------------
diff --git a/taverna-localworker-activity-ui/src/main/java/net/sf/taverna/t2/activities/localworker/menu/ConfigureLocalworkerMenuAction.java b/taverna-localworker-activity-ui/src/main/java/net/sf/taverna/t2/activities/localworker/menu/ConfigureLocalworkerMenuAction.java
new file mode 100644
index 0000000..3afed8d
--- /dev/null
+++ b/taverna-localworker-activity-ui/src/main/java/net/sf/taverna/t2/activities/localworker/menu/ConfigureLocalworkerMenuAction.java
@@ -0,0 +1,62 @@
+package net.sf.taverna.t2.activities.localworker.menu;
+
+import javax.swing.Action;
+
+import uk.org.taverna.configuration.app.ApplicationConfiguration;
+
+import net.sf.taverna.t2.activities.beanshell.actions.BeanshellActivityConfigurationAction;
+import net.sf.taverna.t2.activities.localworker.actions.LocalworkerActivityConfigurationAction;
+import net.sf.taverna.t2.activities.localworker.servicedescriptions.LocalworkerServiceDescription;
+import net.sf.taverna.t2.servicedescriptions.ServiceDescriptionRegistry;
+import net.sf.taverna.t2.ui.menu.ContextualMenuComponent;
+import net.sf.taverna.t2.ui.menu.MenuComponent;
+import net.sf.taverna.t2.workbench.activityicons.ActivityIconManager;
+import net.sf.taverna.t2.workbench.activitytools.AbstractConfigureActivityMenuAction;
+import net.sf.taverna.t2.workbench.edits.EditManager;
+import net.sf.taverna.t2.workbench.file.FileManager;
+
+public class ConfigureLocalworkerMenuAction extends AbstractConfigureActivityMenuAction implements
+ MenuComponent, ContextualMenuComponent {
+
+ private EditManager editManager;
+ private FileManager fileManager;
+ private ActivityIconManager activityIconManager;
+ private ServiceDescriptionRegistry serviceDescriptionRegistry;
+ private ApplicationConfiguration applicationConfiguration;
+
+ public ConfigureLocalworkerMenuAction() {
+ super(LocalworkerServiceDescription.ACTIVITY_TYPE);
+ }
+
+ @Override
+ protected Action createAction() {
+ Action result = null;
+ result = new LocalworkerActivityConfigurationAction(findActivity(), getParentFrame(),
+ editManager, fileManager, activityIconManager, serviceDescriptionRegistry,
+ applicationConfiguration);
+ result.putValue(Action.NAME, BeanshellActivityConfigurationAction.EDIT_BEANSHELL_SCRIPT);
+ addMenuDots(result);
+ return result;
+ }
+
+ public void setEditManager(EditManager editManager) {
+ this.editManager = editManager;
+ }
+
+ public void setFileManager(FileManager fileManager) {
+ this.fileManager = fileManager;
+ }
+
+ public void setActivityIconManager(ActivityIconManager activityIconManager) {
+ this.activityIconManager = activityIconManager;
+ }
+
+ public void setServiceDescriptionRegistry(ServiceDescriptionRegistry serviceDescriptionRegistry) {
+ this.serviceDescriptionRegistry = serviceDescriptionRegistry;
+ }
+
+ public void setApplicationConfiguration(ApplicationConfiguration applicationConfiguration) {
+ this.applicationConfiguration = applicationConfiguration;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/54050685/taverna-localworker-activity-ui/src/main/java/net/sf/taverna/t2/activities/localworker/servicedescriptions/LocalworkerActivityIcon.java
----------------------------------------------------------------------
diff --git a/taverna-localworker-activity-ui/src/main/java/net/sf/taverna/t2/activities/localworker/servicedescriptions/LocalworkerActivityIcon.java b/taverna-localworker-activity-ui/src/main/java/net/sf/taverna/t2/activities/localworker/servicedescriptions/LocalworkerActivityIcon.java
new file mode 100644
index 0000000..7d6bb5a
--- /dev/null
+++ b/taverna-localworker-activity-ui/src/main/java/net/sf/taverna/t2/activities/localworker/servicedescriptions/LocalworkerActivityIcon.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (C) 2007 The University of Manchester
+ *
+ * Modifications to the initial code base are copyright of their
+ * respective authors, or their employers as appropriate.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ ******************************************************************************/
+package net.sf.taverna.t2.activities.localworker.servicedescriptions;
+
+import java.net.URI;
+
+import javax.swing.Icon;
+import javax.swing.ImageIcon;
+
+import net.sf.taverna.t2.workbench.activityicons.ActivityIconSPI;
+
+/**
+ *
+ * @author Alex Nenadic
+ * @author David Withers
+ */
+public class LocalworkerActivityIcon implements ActivityIconSPI {
+
+ private static Icon icon;
+
+ public int canProvideIconScore(URI activityType) {
+ if (LocalworkerServiceDescription.ACTIVITY_TYPE.equals(activityType))
+ return DEFAULT_ICON + 1;
+ else
+ return NO_ICON;
+ }
+
+ public Icon getIcon(URI activityType) {
+ return getLocalworkerIcon();
+ }
+
+ public static Icon getLocalworkerIcon() {
+ if (icon == null) {
+ icon = new ImageIcon(LocalworkerActivityIcon.class
+ .getResource("/localworker.png"));
+ }
+ return icon;
+ }
+}
+
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/54050685/taverna-localworker-activity-ui/src/main/java/net/sf/taverna/t2/activities/localworker/servicedescriptions/LocalworkerServiceDescription.java
----------------------------------------------------------------------
diff --git a/taverna-localworker-activity-ui/src/main/java/net/sf/taverna/t2/activities/localworker/servicedescriptions/LocalworkerServiceDescription.java b/taverna-localworker-activity-ui/src/main/java/net/sf/taverna/t2/activities/localworker/servicedescriptions/LocalworkerServiceDescription.java
new file mode 100644
index 0000000..38718b8
--- /dev/null
+++ b/taverna-localworker-activity-ui/src/main/java/net/sf/taverna/t2/activities/localworker/servicedescriptions/LocalworkerServiceDescription.java
@@ -0,0 +1,105 @@
+package net.sf.taverna.t2.activities.localworker.servicedescriptions;
+
+import java.net.URI;
+import java.util.Arrays;
+import java.util.List;
+
+import javax.swing.Icon;
+
+import net.sf.taverna.t2.servicedescriptions.ServiceDescription;
+import uk.org.taverna.scufl2.api.configurations.Configuration;
+
+import com.fasterxml.jackson.databind.JsonNode;
+
+public class LocalworkerServiceDescription extends ServiceDescription {
+
+ public static final URI ACTIVITY_TYPE = URI.create("http://ns.taverna.org.uk/2010/activity/localworker");
+
+ private static final String LOCALWORKER = ServiceDescription.LOCAL_SERVICES;
+
+ private JsonNode json;
+ private String operation;
+ private String category;
+ private String provider;
+ private String localworkerName;
+
+ public JsonNode getJson() {
+ return json;
+ }
+
+ public void setJson(JsonNode json) {
+ this.json = json;
+ }
+
+ public String getOperation() {
+ return operation;
+ }
+
+ public void setOperation(String operation) {
+ this.operation = operation;
+ }
+
+ public String getCategory() {
+ return category;
+ }
+
+ public void setCategory(String category) {
+ this.category = category;
+ }
+
+ public String getProvider() {
+ return provider;
+ }
+
+ public void setProvider(String provider) {
+ this.provider = provider;
+ }
+
+ public String getLocalworkerName() {
+ return localworkerName;
+ }
+
+ public void setLocalworkerName(String localworkerName) {
+ this.localworkerName = localworkerName;
+ }
+
+ public String getType() {
+ return "Localworker";
+ }
+
+ @Override
+ public URI getActivityType() {
+ return ACTIVITY_TYPE;
+ }
+
+ @Override
+ public Configuration getActivityConfiguration() {
+ Configuration configuration = new Configuration();
+ configuration.setType(ACTIVITY_TYPE.resolve("#Config"));
+ configuration.setJson(getJson());
+ return configuration;
+ }
+
+ @Override
+ public Icon getIcon() {
+ return LocalworkerActivityIcon.getLocalworkerIcon();
+ }
+
+ @Override
+ public String getName() {
+ return operation;
+ }
+
+ @Override
+ public List<? extends Comparable<?>> getPath() {
+ List<String> result =
+ Arrays.asList (LOCALWORKER, category);
+ return result;
+ }
+
+ @Override
+ protected List<Object> getIdentifyingData() {
+ return Arrays.<Object>asList(getJson());
+ }
+
+}