http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/163747de/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/servicedescriptions/ExternalToolServiceDescription.java ---------------------------------------------------------------------- diff --git a/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/servicedescriptions/ExternalToolServiceDescription.java b/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/servicedescriptions/ExternalToolServiceDescription.java new file mode 100644 index 0000000..54a516f --- /dev/null +++ b/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/servicedescriptions/ExternalToolServiceDescription.java @@ -0,0 +1,147 @@ +/******************************************************************************* + * Copyright (C) 2009 Hajo Nils Krabbenhoeft, INB, University of Luebeck + * + * 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 org.apache.taverna.activities.externaltool.servicedescriptions; + +import java.net.MalformedURLException; +import java.net.URL; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import javax.swing.Icon; +import javax.swing.ImageIcon; + +import org.apache.log4j.Logger; + +import org.apache.taverna.activities.externaltool.ExternalToolActivity; +import org.apache.taverna.activities.externaltool.ExternalToolActivityConfigurationBean; +import org.apache.taverna.activities.externaltool.manager.InvocationGroupManager; +import org.apache.taverna.activities.externaltool.manager.impl.InvocationGroupManagerImpl; +import org.apache.taverna.servicedescriptions.ServiceDescription; +import org.apache.taverna.workflowmodel.processor.activity.Activity; +import de.uni_luebeck.inb.knowarc.usecases.UseCaseDescription; + +/** + * ExternalToolServiceDescription stores the repository URL and the use case id so + * that it can create an ExternalToolActivityConfigurationBean + * + * @author Hajo Nils Krabbenhoeft + */ +public class ExternalToolServiceDescription extends ServiceDescription<ExternalToolActivityConfigurationBean> { + + private static Logger logger = Logger + .getLogger(ExternalToolServiceDescription.class); + + + private static InvocationGroupManager manager = InvocationGroupManagerImpl.getInstance(); + + private String repositoryUrl; + private String externaltoolid; + private UseCaseDescription useCaseDescription; + + public String getRepositoryUrl() { + return repositoryUrl; + } + + public void setRepositoryUrl(String repositoryUrl) { + this.repositoryUrl = repositoryUrl; + } + + public String getExternaltoolid() { + return externaltoolid; + } + + public void setExternaltoolid(String externaltoolid) { + this.externaltoolid = externaltoolid; + } + + public Icon getIcon() { + if (useCaseDescription != null) { + String icon_url = useCaseDescription.getIcon_url(); + if ((icon_url != null) && !icon_url.isEmpty() && !icon_url.endsWith(".ico")) + try { + ImageIcon result = new ImageIcon(new URL(icon_url)); + if ((result != null) && (result.getIconHeight() != 0) && (result.getIconWidth() != 0)){ + return result; + } + } catch (MalformedURLException e) { + logger.error("Problematic URL" + icon_url, e); + } + } + return ExternalToolActivityIcon.getExternalToolIcon(); + } + + public Class<? extends Activity<ExternalToolActivityConfigurationBean>> getActivityClass() { + return ExternalToolActivity.class; + } + + public ExternalToolActivityConfigurationBean getActivityConfiguration() { + ExternalToolActivityConfigurationBean bean = new ExternalToolActivityConfigurationBean(); + bean.setRepositoryUrl(repositoryUrl); + bean.setExternaltoolid(externaltoolid); + bean.setUseCaseDescription(useCaseDescription); + bean.setMechanism(manager.getDefaultMechanism()); + + return bean; + } + + public String getName() { + return externaltoolid; + } + + @SuppressWarnings("unchecked") + public List<? extends Comparable> getPath() { + List<String> result = new ArrayList<String>(); + result.add("Tools decribed @ " + repositoryUrl); + String group = useCaseDescription.getGroup(); + if ((group != null) && !group.isEmpty()) { + String[] groups = group.split(":"); + for (String g : groups) { + result.add(g); + } + } + return result; + } + + protected List<Object> getIdentifyingData() { + // we require use cases inside one XML file to have unique IDs, which + // means every externaltool is uniquely identified by its repository URL and + // its use case ID. + return Arrays.<Object> asList(repositoryUrl, externaltoolid); + } + + public String getDescription() { + if (useCaseDescription != null) { + String description = useCaseDescription.getDescription(); + if (description == null) { + return ""; + } + return description; + } + return ""; + } + + public void setUseCaseDescription(UseCaseDescription usecase) { + this.useCaseDescription = usecase; + } + +}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/163747de/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/servicedescriptions/ExternalToolServiceProvider.java ---------------------------------------------------------------------- diff --git a/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/servicedescriptions/ExternalToolServiceProvider.java b/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/servicedescriptions/ExternalToolServiceProvider.java new file mode 100644 index 0000000..7ba6ae3 --- /dev/null +++ b/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/servicedescriptions/ExternalToolServiceProvider.java @@ -0,0 +1,132 @@ +/******************************************************************************* + * Copyright (C) 2009 Hajo Nils Krabbenhoeft, INB, University of Luebeck + * + * 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 org.apache.taverna.activities.externaltool.servicedescriptions; + +import java.io.IOException; +import java.net.URI; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import javax.swing.Icon; + +import org.apache.taverna.servicedescriptions.AbstractConfigurableServiceProvider; +import org.apache.taverna.servicedescriptions.CustomizedConfigurePanelProvider; +import org.apache.taverna.servicedescriptions.ServiceDescriptionRegistry; +import de.uni_luebeck.inb.knowarc.usecases.UseCaseDescription; +import de.uni_luebeck.inb.knowarc.usecases.UseCaseEnumeration; + +/** + * ExternalToolServiceProvider searches an use case repository XML for use case + * descriptions. + * + * @author Hajo Nils Krabbenhoeft + */ +public class ExternalToolServiceProvider extends AbstractConfigurableServiceProvider<ExternalToolServiceProviderConfig> + implements CustomizedConfigurePanelProvider<ExternalToolServiceProviderConfig> { + + private static final URI providerId = URI + .create("http://taverna.sf.net/2010/service-provider/externaltool"); + + public ExternalToolServiceProvider() { + super(new ExternalToolServiceProviderConfig("http://taverna.nordugrid.org/sharedRepository/xml.php")); + } + + public String getName() { + return "Tool service"; + } + + public List<ExternalToolServiceProviderConfig> getDefaultConfigurations() { + List<ExternalToolServiceProviderConfig> defaults = new ArrayList<ExternalToolServiceProviderConfig>(); + // Disabled until sensible set +// defaults.add(new ExternalToolServiceProviderConfig("http://taverna.nordugrid.org/sharedRepository/xml.php")); + return defaults; + } + + public void findServiceDescriptionsAsync(FindServiceDescriptionsCallBack callBack) { + String repositoryUrl = serviceProviderConfig.getRepositoryUrl(); + callBack.status("Parsing use case repository:" + repositoryUrl); + // prepare a list of all use case descriptions which are stored in + // the given repository URL + List<UseCaseDescription> usecases = new ArrayList<UseCaseDescription> (); + try { + usecases = UseCaseEnumeration.readDescriptionsFromUrl( + repositoryUrl); + } catch (IOException e) { + callBack.fail("Unable to read tool descriptions", e); + } + callBack.status("Found " + usecases.size() + " use cases:" + repositoryUrl); + // convert all the UseCaseDescriptions in the XML file into + // ExternalToolServiceDescription items + List<ExternalToolServiceDescription> items = new ArrayList<ExternalToolServiceDescription>(); + for (UseCaseDescription usecase : usecases) { + ExternalToolServiceDescription item = new ExternalToolServiceDescription(); + item.setRepositoryUrl(repositoryUrl); + item.setExternaltoolid(usecase.getUsecaseid()); + item.setUseCaseDescription(usecase); + items.add(item); + } + // we dont have streaming data loading or partial results, so return + // results and finish + callBack.partialResults(items); + callBack.finished(); + } + + @Override + public String toString() { + return getName() + " " + getConfiguration().getRepositoryUrl(); + } + + public Icon getIcon() { + return ExternalToolActivityIcon.getExternalToolIcon(); + } + + @Override + protected List<? extends Object> getIdentifyingData() { + List<String> result; + // one can fully identify an use case repository by its URL + result = Arrays.asList(getConfiguration().getRepositoryUrl()); + return result; + } + + public void setServiceDescriptionRegistry(ServiceDescriptionRegistry registry) { + } + + @SuppressWarnings("serial") + public void createCustomizedConfigurePanel(final CustomizedConfigureCallBack<ExternalToolServiceProviderConfig> callBack) { + + AddExternalToolServiceDialog addWSDLServiceDialog = new AddExternalToolServiceDialog() { + @Override + protected void addRegistry(String externalToolURL) { + + ExternalToolServiceProviderConfig providerConfig = new ExternalToolServiceProviderConfig(externalToolURL); + callBack.newProviderConfiguration(providerConfig); + } + }; + addWSDLServiceDialog.setVisible(true); + } + + + public String getId() { + return providerId.toString(); + } +} http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/163747de/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/servicedescriptions/ExternalToolServiceProviderConfig.java ---------------------------------------------------------------------- diff --git a/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/servicedescriptions/ExternalToolServiceProviderConfig.java b/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/servicedescriptions/ExternalToolServiceProviderConfig.java new file mode 100644 index 0000000..a95fdb3 --- /dev/null +++ b/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/servicedescriptions/ExternalToolServiceProviderConfig.java @@ -0,0 +1,56 @@ +/******************************************************************************* + * Copyright (C) 2009 Hajo Nils Krabbenhoeft, INB, University of Luebeck + * + * 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 org.apache.taverna.activities.externaltool.servicedescriptions; + +import org.apache.taverna.lang.beans.PropertyAnnotated; +import org.apache.taverna.lang.beans.PropertyAnnotation; + +/** + * ExternalToolServiceProviderConfig stores the URL of the use case repository XML file + * + * @author Hajo Nils Krabbenhoeft + */ +public class ExternalToolServiceProviderConfig extends PropertyAnnotated { + private String repositoryUrl; + + public ExternalToolServiceProviderConfig() { + } + + public ExternalToolServiceProviderConfig(String repositoryUrl) { + this.repositoryUrl = repositoryUrl; + } + + @PropertyAnnotation(displayName = "Tool registry location", preferred = true) + public String getRepositoryUrl() { + return repositoryUrl; + } + + public void setRepositoryUrl(String repositoryUrl) { + this.repositoryUrl = repositoryUrl; + } + + @Override + public String toString() { + return repositoryUrl; + } + +} http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/163747de/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/servicedescriptions/ExternalToolTemplateServiceDescription.java ---------------------------------------------------------------------- diff --git a/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/servicedescriptions/ExternalToolTemplateServiceDescription.java b/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/servicedescriptions/ExternalToolTemplateServiceDescription.java new file mode 100644 index 0000000..835db90 --- /dev/null +++ b/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/servicedescriptions/ExternalToolTemplateServiceDescription.java @@ -0,0 +1,77 @@ +/** + * + */ +package org.apache.taverna.activities.externaltool.servicedescriptions; + +import java.net.URI; +import java.util.UUID; + +import javax.swing.Icon; + +import de.uni_luebeck.inb.knowarc.usecases.UseCaseDescription; + +import org.apache.taverna.activities.externaltool.ExternalToolActivity; +import org.apache.taverna.activities.externaltool.ExternalToolActivityConfigurationBean; +import org.apache.taverna.activities.externaltool.manager.InvocationGroupManager; +import org.apache.taverna.activities.externaltool.manager.impl.InvocationGroupManagerImpl; +import org.apache.taverna.servicedescriptions.AbstractTemplateService; +import org.apache.taverna.servicedescriptions.ServiceDescription; +import org.apache.taverna.workflowmodel.processor.activity.Activity; + +/** + * @author alanrw + * + */ +public class ExternalToolTemplateServiceDescription extends + AbstractTemplateService<ExternalToolActivityConfigurationBean> { + + private static final URI providerId = URI + .create("http://taverna.sf.net/2010/service-provider/external-tool"); + + private static final String EXTERNAL_TOOL = "Tool"; + + private static InvocationGroupManager manager = InvocationGroupManagerImpl.getInstance(); + + @Override + public Class<? extends Activity<ExternalToolActivityConfigurationBean>> getActivityClass() { + return ExternalToolActivity.class; + } + + @Override + public ExternalToolActivityConfigurationBean getActivityConfiguration() { + ExternalToolActivityConfigurationBean result = new ExternalToolActivityConfigurationBean(); + result.setExternaltoolid(UUID.randomUUID().toString()); + result.setUseCaseDescription(new UseCaseDescription("")); + result.setMechanism(manager.getDefaultMechanism()); + return result; + } + + @Override + public Icon getIcon() { + return ExternalToolActivityIcon.getExternalToolIcon(); + } + + @Override + public String getDescription() { + return "A service that allows tools to be used as services"; + } + + @SuppressWarnings("unchecked") + public static ServiceDescription getServiceDescription() { + ExternalToolTemplateServiceDescription bts = new ExternalToolTemplateServiceDescription(); + return bts.templateService; + } + + + + @Override + public String getId() { + return providerId.toString(); + } + + @Override + public String getName() { + return EXTERNAL_TOOL; + } + +} http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/163747de/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/utils/Tools.java ---------------------------------------------------------------------- diff --git a/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/utils/Tools.java b/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/utils/Tools.java new file mode 100644 index 0000000..e2bed9b --- /dev/null +++ b/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/utils/Tools.java @@ -0,0 +1,129 @@ +/** + * + */ +package org.apache.taverna.activities.externaltool.utils; + +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 java.util.Map; + +import javax.swing.AbstractAction; +import javax.swing.BorderFactory; +import javax.swing.JButton; +import javax.swing.JComponent; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.border.CompoundBorder; + +import de.uni_luebeck.inb.knowarc.usecases.ScriptInput; +import de.uni_luebeck.inb.knowarc.usecases.ScriptInputUser; + +import org.apache.taverna.lang.ui.DeselectingButton; + +/** + * @author alanrw + * + */ +public class Tools { + + private static CompoundBorder border = BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(5,5,5,5), BorderFactory.createLineBorder(Color.BLACK, 1)); + + private static Insets insets = new Insets(5,5,5,5); + + public static void addViewer(final JPanel innerPanel, String[] labels, JComponent[] elements, + final List viewerList, final Object viewer, final JPanel outerPanel) { + final JPanel subPanel = new JPanel(); + subPanel.setLayout(new GridBagLayout()); + subPanel.setBorder(border); + + final GridBagConstraints labelConstraint = new GridBagConstraints(); + labelConstraint.insets = insets; + labelConstraint.anchor = GridBagConstraints.FIRST_LINE_START; + labelConstraint.fill = GridBagConstraints.BOTH; + labelConstraint.gridy = 0; + labelConstraint.gridx = 0; + labelConstraint.weightx = 0; + + final GridBagConstraints elementConstraint = new GridBagConstraints(); + elementConstraint.insets = insets; + elementConstraint.anchor = GridBagConstraints.FIRST_LINE_START; + elementConstraint.fill = GridBagConstraints.BOTH; + elementConstraint.gridy = 0; + elementConstraint.gridx = 1; + elementConstraint.weightx = 1.0; + + final GridBagConstraints removeConstraint = new GridBagConstraints(); + removeConstraint.insets = insets; + removeConstraint.anchor = GridBagConstraints.FIRST_LINE_START; + removeConstraint.fill = GridBagConstraints.BOTH; + removeConstraint.gridx = 1; + removeConstraint.weightx = 0; + removeConstraint.fill = GridBagConstraints.NONE; + removeConstraint.anchor = GridBagConstraints.EAST; + + final GridBagConstraints subPanelConstraint = new GridBagConstraints(); + subPanelConstraint.insets = insets; + subPanelConstraint.anchor = GridBagConstraints.FIRST_LINE_START; + subPanelConstraint.fill = GridBagConstraints.BOTH; + subPanelConstraint.gridx = 1; +// subPanelConstraint.gridy = ++stringReplacementGridy; + subPanelConstraint.weightx = 1.00; + subPanelConstraint.fill = GridBagConstraints.HORIZONTAL; + subPanelConstraint.anchor = GridBagConstraints.WEST; + + for (int i = 0; i < labels.length; i++) { + subPanel.add(new JLabel(labels[i] + ":"), labelConstraint); + subPanel.add(elements[i], elementConstraint); + labelConstraint.gridy++; + elementConstraint.gridy++; + } + + removeConstraint.gridy = labelConstraint.gridy + 1; + final JButton removeButton = new DeselectingButton("Remove", + new AbstractAction() { + + public void actionPerformed(ActionEvent e) { + synchronized (viewerList) { + viewerList.remove(viewer); + } + innerPanel.remove(subPanel); + innerPanel.revalidate(); + innerPanel.repaint(); + outerPanel.revalidate(); + outerPanel.repaint(); + } + + }); + subPanel.add(removeButton, removeConstraint); + innerPanel.add(subPanel, subPanelConstraint); + } + + public static boolean isStringReplacement(ScriptInputUser si) { + return !si.isList() && !si.isFile() && !si.isTempFile(); + } + + public static boolean isInputFile(ScriptInputUser si) { + return !si.isList() && si.isFile(); + } + + public static boolean isFileList(ScriptInputUser si) { + return si.isList() && si.isFile(); + } + + public static boolean isUnderstood(ScriptInputUser si) { + return isStringReplacement(si) || isInputFile(si) || isFileList(si); + } + + public static boolean areAllUnderstood(Map<String, ScriptInput> inputs) { + for (ScriptInput si : inputs.values()) { + if ((si instanceof ScriptInputUser) && !isUnderstood((ScriptInputUser) si)) { + return false; + } + } + return true; + } +} http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/163747de/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/views/AnnotationPanel.java ---------------------------------------------------------------------- diff --git a/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/views/AnnotationPanel.java b/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/views/AnnotationPanel.java new file mode 100644 index 0000000..3f977c4 --- /dev/null +++ b/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/views/AnnotationPanel.java @@ -0,0 +1,41 @@ +/** + * + */ +package org.apache.taverna.activities.externaltool.views; + +import java.awt.BorderLayout; +import java.awt.Component; +import java.awt.FlowLayout; + +import javax.swing.JLabel; +import javax.swing.JPanel; + +/** + * @author alanrw + * + */ +public class AnnotationPanel extends JPanel { + + public AnnotationPanel(Component nameField, Component descriptionArea, Component groupField) { + super(); + this.setLayout(new BorderLayout()); + JPanel subPanel = new JPanel(new BorderLayout()); + JPanel namePanel = new JPanel(); + namePanel.setLayout(new FlowLayout(FlowLayout.LEFT)); + namePanel.add(new JLabel("Name: ")); + namePanel.add(nameField); + subPanel.add(namePanel, BorderLayout.NORTH); + JPanel groupPanel = new JPanel(); + groupPanel.setLayout(new FlowLayout(FlowLayout.LEFT)); + groupPanel.add(new JLabel("Group: ")); + groupPanel.add(groupField); + subPanel.add(groupPanel, BorderLayout.SOUTH); + this.add(subPanel, BorderLayout.NORTH); + JPanel descriptionPanel = new JPanel(); + descriptionPanel.setLayout(new BorderLayout()); + descriptionPanel.add(new JLabel("Description:"), BorderLayout.NORTH); + descriptionPanel.add(descriptionArea, BorderLayout.CENTER); + this.add(descriptionPanel, BorderLayout.CENTER); + } + +} http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/163747de/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/views/EditablePanel.java ---------------------------------------------------------------------- diff --git a/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/views/EditablePanel.java b/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/views/EditablePanel.java new file mode 100644 index 0000000..9b32218 --- /dev/null +++ b/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/views/EditablePanel.java @@ -0,0 +1,72 @@ +/** + * + */ +package org.apache.taverna.activities.externaltool.views; + +import java.awt.FlowLayout; +import java.awt.event.ActionEvent; +import java.io.IOException; + +import javax.swing.AbstractAction; +import javax.swing.JButton; +import javax.swing.JOptionPane; +import javax.swing.JPanel; + +import de.uni_luebeck.inb.knowarc.usecases.UseCaseDescription; +import de.uni_luebeck.inb.knowarc.usecases.UseCaseEnumeration; + +import org.apache.taverna.activities.externaltool.ExternalToolActivityConfigurationBean; +import org.apache.taverna.activities.externaltool.utils.Tools; +import org.apache.taverna.lang.ui.DeselectingButton; + +/** + * @author alanrw + * + */ +public class EditablePanel extends JPanel { + public EditablePanel(final ExternalToolConfigView view) { + super(new FlowLayout()); + + JButton update = new DeselectingButton("Update tool description", + new AbstractAction() { + + @Override + public void actionPerformed(ActionEvent e) { + ExternalToolActivityConfigurationBean bean = view.getConfiguration(); + 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.refreshConfiguration(bean); + } else { + JOptionPane.showMessageDialog(view, "Unable to find tool description " + id, "Missing tool description", JOptionPane.ERROR_MESSAGE); + } + }}); + this.add(update); + + JButton makeEditable = new DeselectingButton("Edit tool description", + new AbstractAction() { + + @Override + public void actionPerformed(ActionEvent arg0) { + ExternalToolActivityConfigurationBean config = view.makeConfiguration(); + view.setEditable(true, config); + + } + }); + makeEditable.setToolTipText("Edit the tool description"); + if (Tools.areAllUnderstood(view.getConfiguration().getUseCaseDescription().getInputs())) { + this.add(makeEditable); + } + + } + +} http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/163747de/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/views/ExternalToolActivityContextualView.java ---------------------------------------------------------------------- diff --git a/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/views/ExternalToolActivityContextualView.java b/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/views/ExternalToolActivityContextualView.java new file mode 100644 index 0000000..c1c819e --- /dev/null +++ b/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/views/ExternalToolActivityContextualView.java @@ -0,0 +1,181 @@ +/******************************************************************************* + * Copyright (C) 2010 Hajo Nils Krabbenhoeft, INB, University of Luebeck + * + * 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 org.apache.taverna.activities.externaltool.views; + +import java.awt.Frame; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.TreeMap; + +import javax.swing.Action; + +import org.apache.taverna.activities.externaltool.ExternalToolActivity; +import org.apache.taverna.activities.externaltool.ExternalToolActivityConfigurationBean; +import org.apache.taverna.activities.externaltool.actions.ExternalToolActivityConfigureAction; +import org.apache.taverna.activities.externaltool.servicedescriptions.ExternalToolActivityIcon; +import org.apache.taverna.workbench.activityicons.ActivityIconManager; +import org.apache.taverna.workbench.configuration.colour.ColourManager; +import org.apache.taverna.workbench.edits.EditManager; +import org.apache.taverna.workbench.file.FileManager; +import org.apache.taverna.workbench.ui.actions.activity.HTMLBasedActivityContextualView; +import org.apache.taverna.workflowmodel.processor.activity.Activity; +import de.uni_luebeck.inb.knowarc.usecases.ScriptInput; +import de.uni_luebeck.inb.knowarc.usecases.ScriptInputStatic; +import de.uni_luebeck.inb.knowarc.usecases.ScriptOutput; +import de.uni_luebeck.inb.knowarc.usecases.UseCaseDescription; + +/** + * ExternalToolActivityContextualView displays the use case information in a HTML table. Currently, + * this is only the use case ID. + * + * @author Hajo Nils Krabbenhoeft + */ +public class ExternalToolActivityContextualView extends + HTMLBasedActivityContextualView<ExternalToolActivityConfigurationBean> { + private static final long serialVersionUID = 1L; + private final EditManager editManager; + private final FileManager fileManager; + private final ActivityIconManager activityIconManager; + + public ExternalToolActivityContextualView(Activity<?> activity, EditManager editManager, + FileManager fileManager, ColourManager colourManager, ActivityIconManager activityIconManager) { + super(activity, colourManager); + this.editManager = editManager; + this.fileManager = fileManager; + this.activityIconManager = activityIconManager; + } + + @Override + protected String getRawTableRowsHtml() { + String html = ""; + ExternalToolActivityConfigurationBean bean = getConfigBean(); + String repositoryUrl = bean.getRepositoryUrl(); + if ((repositoryUrl == null) || repositoryUrl.isEmpty()) { + repositoryUrl = "<b>Not specified</b>"; + } + html += "<tr><td>Repository URL</td><td>" + repositoryUrl + "</td></tr>"; + + String id = bean.getExternaltoolid(); + if ((id == null) || id.isEmpty()) { + id = "<b>Not specified</b>"; + } + html += "<tr><td>Id</td><td>" + id + "</td></tr>"; + + UseCaseDescription useCaseDescription = bean.getUseCaseDescription(); + String name = useCaseDescription.getUsecaseid(); + if ((name == null) || name.isEmpty()) { + name = "<b>Not specified</b>"; + } + html += "<tr><td>Name</td><td>" + name + "</td></tr>"; + + Map<String, ScriptInput> stringReplacements = new TreeMap<String, ScriptInput>(); + Map<String, ScriptInput> fileInputs = new TreeMap<String, ScriptInput>(); + + for (Entry<String, ScriptInput> entry : useCaseDescription.getInputs().entrySet()) { + String key = entry.getKey(); + ScriptInput value = entry.getValue(); + if (value.isFile()) { + fileInputs.put(key, value); + } else if (value.isTempFile()) { + // Nothing + } else { + stringReplacements.put(key, value); + } + } + + if (!stringReplacements.isEmpty()) { + html += "<tr><td colspan=2 align=center><b>String replacements</b></td></tr>"; + html += "<tr><td><b>Port name</b></td><td><b>Replaces</b></td></tr>"; + for (String siName : stringReplacements.keySet()) { + html += "<tr><td>" + siName + "</td>"; + ScriptInput si = stringReplacements.get(siName); + html += "<td>%%" + si.getTag() + "%%</td>"; + + html += "</tr>"; + } + } + + if (!fileInputs.isEmpty()) { + html += "<tr><td colspan=2 align=center><b>File inputs</b></td></tr>"; + html += "<tr><td><b>Port name</b></td><td><b>To file</b></td></tr>"; + for (String siName : fileInputs.keySet()) { + html += "<tr><td>" + siName + "</td>"; + ScriptInput si = fileInputs.get(siName); + html += "<td>" + si.getTag() + "</td>"; + + html += "</tr>"; + } + } + + List<ScriptInputStatic> staticInputs = useCaseDescription.getStatic_inputs(); + if (!staticInputs.isEmpty()) { + html += "<tr><td colspan=2 align=center><b>Static inputs</b></td></tr>"; + html += "<tr><td><b>Type</b></td><td><b>To file</b></td></tr>"; + for (ScriptInputStatic si : staticInputs) { + if (si.getUrl() != null) { + html += "<td><b>URL</b></td>"; + } else { + html += "<td><b>Explicit content</b></td>"; + } + if (si.isFile()) { + html += "<td>" + si.getTag() + "</td>"; + } + html += "</tr>"; + } + } + Map<String, ScriptOutput> outputs = useCaseDescription.getOutputs(); + if (!outputs.isEmpty()) { + html += "<tr><td colspan=2 align=center><b>File outputs</b></td></tr>"; + html += "<tr><td><b>Port name</b></td><td><b>From file</b></td></tr>"; + for (String soName : outputs.keySet()) { + html += "<tr><td>" + soName + "</td>"; + ScriptOutput so = outputs.get(soName); + html += "<td>" + so.getPath() + "</td>"; + html += "</tr>"; + } + } + return html; + } + + @Override + public String getViewTitle() { + return "Tool service"; + } + + @Override + public Action getConfigureAction(final Frame owner) { + return new ExternalToolActivityConfigureAction((ExternalToolActivity) getActivity(), owner, + editManager, fileManager, activityIconManager); + } + + public String getBackgroundColour() { + + return ExternalToolActivityIcon.getColourString(); + } + + @Override + public int getPreferredPosition() { + return 100; + } + +} http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/163747de/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/views/ExternalToolActivityViewFactory.java ---------------------------------------------------------------------- diff --git a/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/views/ExternalToolActivityViewFactory.java b/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/views/ExternalToolActivityViewFactory.java new file mode 100644 index 0000000..202c018 --- /dev/null +++ b/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/views/ExternalToolActivityViewFactory.java @@ -0,0 +1,76 @@ +/******************************************************************************* + * Copyright (C) 2010 Hajo Nils Krabbenhoeft, INB, University of Luebeck + * + * 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 org.apache.taverna.activities.externaltool.views; + +import java.util.Arrays; +import java.util.List; + +import org.apache.taverna.activities.externaltool.ExternalToolActivity; +import org.apache.taverna.workbench.activityicons.ActivityIconManager; +import org.apache.taverna.workbench.configuration.colour.ColourManager; +import org.apache.taverna.workbench.edits.EditManager; +import org.apache.taverna.workbench.file.FileManager; +import org.apache.taverna.workbench.ui.views.contextualviews.ContextualView; +import org.apache.taverna.workbench.ui.views.contextualviews.activity.ContextualViewFactory; + +/** + * ExternalToolActivityViewFactory produces an ExternalToolActivityContextualView to show + * information for a use case activity. + * + * @author Hajo Nils Krabbenhoeft + */ +public class ExternalToolActivityViewFactory implements ContextualViewFactory<ExternalToolActivity> { + + private EditManager editManager; + private FileManager fileManager; + private ActivityIconManager activityIconManager; + private ColourManager colourManager; + + public boolean canHandle(Object object) { + if (object instanceof ExternalToolActivity) { + return true; + } + return false; + } + + public List<ContextualView> getViews(ExternalToolActivity selection) { + return Arrays.asList(new ContextualView[] { new ExternalToolActivityContextualView( + selection, editManager, fileManager, colourManager, activityIconManager) }); + } + + 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 setColourManager(ColourManager colourManager) { + this.colourManager = colourManager; + } + +} http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/163747de/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/views/ExternalToolConfigView.java ---------------------------------------------------------------------- diff --git a/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/views/ExternalToolConfigView.java b/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/views/ExternalToolConfigView.java new file mode 100644 index 0000000..6327ac2 --- /dev/null +++ b/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/views/ExternalToolConfigView.java @@ -0,0 +1,868 @@ +/******************************************************************************* + * 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 org.apache.taverna.activities.externaltool.views; + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Font; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.Map.Entry; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.help.CSH; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JEditorPane; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JTabbedPane; +import javax.swing.JTextArea; +import javax.swing.JTextField; +import javax.swing.JTextPane; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; + +import org.apache.taverna.activities.externaltool.ExternalToolActivity; +import org.apache.taverna.activities.externaltool.ExternalToolActivityConfigurationBean; +import org.apache.taverna.activities.externaltool.ExternalToolActivityHealthChecker; +import org.apache.taverna.activities.externaltool.utils.Tools; +import org.apache.taverna.lang.ui.KeywordDocument; +import org.apache.taverna.lang.ui.LinePainter; +import org.apache.taverna.lang.ui.NoWrapEditorKit; +import org.apache.taverna.workbench.ui.views.contextualviews.activity.ActivityConfigurationPanel; + +import org.apache.log4j.Logger; + +import de.uni_luebeck.inb.knowarc.usecases.ScriptInput; +import de.uni_luebeck.inb.knowarc.usecases.ScriptInputStatic; +import de.uni_luebeck.inb.knowarc.usecases.ScriptInputUser; +import de.uni_luebeck.inb.knowarc.usecases.ScriptOutput; +import de.uni_luebeck.inb.knowarc.usecases.UseCaseDescription; + +/** + * Provides the configurable view for a {@link ExternalToolActivity} through + * it's {@link ExternalToolActivityConfigurationBean}. Has 3 main tabs - Script, + * Ports & Dependencies. The {@link #inputViewList} contains the + * {@link ExternalToolInputViewer}s describing the input ports and + * {@link #outputViewList} has the {@link ExternalToolFileViewer}s + * + * @author Ian Dunlop + * @author Alex Nenadic + * @author Alan R Williams + * + */ +@SuppressWarnings("serial") +public class ExternalToolConfigView + extends + ActivityConfigurationPanel<ExternalToolActivity, ExternalToolActivityConfigurationBean> { + + private static final Color LINE_COLOR = new Color(225,225,225); + + private static final String FILE_INPUT_DESCRIPTION = "You can use a file input to feed data into " + + "the service via an input port and have that data written to the specified file."; + + private static final String FILE_OUTPUT_DESCRIPTION = "You can use a file output to take the " + + "content of a file produced by the tool and send it to an output port of the service."; + + private static final String FILE_LIST_DESCRIPTION = "If you feed a list of data into a file list " + + "input, then each data item is written to a temporary file. A file is produced containing " + + "the names of those temporary file. That index file can then be used as part of the tool " + + "command."; + + private static final String VALID_NAME_REGEX = "[\\p{L}\\p{Digit}_]+"; + + private static Logger logger = Logger + .getLogger(ExternalToolConfigView.class); + + /** The activity which this view describes */ + protected ExternalToolActivity activity; + + /** The configuration bean used to configure the activity */ + private ExternalToolActivityConfigurationBean configuration; + + private JTabbedPane tabbedPane = null; + private JPanel advancedPanel = null; + private JTabbedPane advancedTab = null; + private AnnotationPanel annotationPanel = null; + + private int stringReplacementGridy = 1; + private List<ExternalToolStringReplacementViewer> stringReplacementViewList = new ArrayList<ExternalToolStringReplacementViewer>(); + + private List<ExternalToolFileViewer> inputFileViewList = new ArrayList<ExternalToolFileViewer>(); + + private List<ExternalToolFileViewer> fileListViewList = new ArrayList<ExternalToolFileViewer>(); + + private int inputGridy = 1; + + private int outputGridy = 1; + private List<ExternalToolFileViewer> outputViewList = new ArrayList<ExternalToolFileViewer>(); + + private int staticGridy = 1; + private List<ExternalToolStaticUrlViewer> staticUrlViewList = new ArrayList<ExternalToolStaticUrlViewer>(); + + private List<ExternalToolStaticStringViewer> staticStringViewList = new ArrayList<ExternalToolStaticStringViewer>(); + +/* private List<ExternalToolRuntimeEnvironmentViewer> runtimeEnvironmentViewList = new ArrayList<ExternalToolRuntimeEnvironmentViewer>(); +*/ + + private JTextField nameField = new JTextField(20); + private JTextField groupField = new JTextField(20); + private JTextArea descriptionArea = new JTextArea(6, 40); + + private JEditorPane scriptTextArea; + + private InvocationPanel invocationPanel; + + private JCheckBox stdInCheckBox = new JCheckBox("Show STDIN"); + private JCheckBox stdOutCheckBox = new JCheckBox("Show STDOUT"); + private JCheckBox stdErrCheckBox = new JCheckBox("Show STDERR"); + + private JTextField returnCodesField = new JTextField(20); + + /** + * Stores the {@link ExternalToolActivity}, gets its + * {@link ExternalToolActivityConfigurationBean}, sets the layout and calls + * {@link #initialise()} to get the view going + * + * @param activity + * the {@link ExternalToolActivity} that the view is over + */ + public ExternalToolConfigView(ExternalToolActivity activity) { + this.activity = activity; + ExternalToolActivityHealthChecker.updateLocation(activity.getConfiguration()); + configuration = (ExternalToolActivityConfigurationBean) cloneBean(activity + .getConfiguration()); + setLayout(new GridBagLayout()); + initialise(configuration); + } + + public void noteConfiguration() { + configuration = makeConfiguration(); + } + + public ExternalToolActivityConfigurationBean makeConfiguration() { + ExternalToolActivityConfigurationBean newConfiguration = (ExternalToolActivityConfigurationBean) cloneBean(configuration); + ExternalToolActivityHealthChecker.updateLocation(newConfiguration); + + + if (!isFromRepository()) { + UseCaseDescription ucd = newConfiguration.getUseCaseDescription(); + + ucd.setUsecaseid(nameField.getText()); + if (groupField.getText().isEmpty()) { + ucd.setGroup(null); + } else { + ucd.setGroup(groupField.getText()); + } + ucd.setDescription(descriptionArea.getText()); + ucd.setCommand(scriptTextArea.getText()); + ucd.setReturnCodesAsText(returnCodesField.getText()); + ucd.setIncludeStdIn(stdInCheckBox.isSelected()); + ucd.setIncludeStdOut(stdOutCheckBox.isSelected()); + ucd.setIncludeStdErr(stdErrCheckBox.isSelected()); + + ucd.getInputs().clear(); + ucd.getTags().clear(); + synchronized (fileListViewList) { + for (ExternalToolFileViewer viewer : fileListViewList) { + ScriptInputUser si = new ScriptInputUser(); + si.setBinary(viewer.isBinary()); + si.setList(true); + si.setTag(viewer.getValue()); + si.setTempFile(false); + si.setFile(true); + ucd.getInputs().put(viewer.getName(), si); + } + } + + synchronized (stringReplacementViewList) { + for (ExternalToolStringReplacementViewer viewer : stringReplacementViewList) { + ScriptInputUser si = new ScriptInputUser(); + si.setBinary(false); + si.setList(false); + si.setTag(viewer.getValue()); + si.setTempFile(false); + si.setFile(false); + ucd.getTags().add(si.getTag()); + ucd.getInputs().put(viewer.getName(), si); + } + } + + synchronized (inputFileViewList) { + for (ExternalToolFileViewer viewer : inputFileViewList) { + ScriptInputUser si = new ScriptInputUser(); + si.setBinary(viewer.isBinary()); + si.setList(false); + si.setTag(viewer.getValue()); + si.setTempFile(false); + si.setFile(true); + ucd.getInputs().put(viewer.getName(), si); + } + } + + synchronized (outputViewList) { + ucd.getOutputs().clear(); + for (ExternalToolFileViewer viewer : outputViewList) { + ScriptOutput so = new ScriptOutput(); + so.setBinary(viewer.isBinary()); + so.setPath(viewer.getValue()); + ucd.getOutputs().put(viewer.getName(), so); + } + } + ucd.getStatic_inputs().clear(); + synchronized (staticStringViewList) { + for (ExternalToolStaticStringViewer viewer : staticStringViewList) { + ScriptInputStatic sis = new ScriptInputStatic(); + sis.setContent(viewer.getContent()); + sis.setTag(viewer.getValue()); + sis.setTempFile(false); + sis.setFile(true); + ucd.getStatic_inputs().add(sis); + } + } + synchronized (staticUrlViewList) { + for (ExternalToolStaticUrlViewer viewer : staticUrlViewList) { + ScriptInputStatic sis = new ScriptInputStatic(); + sis.setUrl(viewer.getContent()); + sis.setTag(viewer.getValue()); + sis.setTempFile(false); + sis.setFile(true); + ucd.getStatic_inputs().add(sis); + } + } + +/* synchronized (runtimeEnvironmentViewList) { + ucd.getREs().clear(); + for (ExternalToolRuntimeEnvironmentViewer viewer : runtimeEnvironmentViewList) { + RuntimeEnvironmentConstraint newConstraint = new RuntimeEnvironmentConstraint( + viewer.getId(), viewer.getRelation()); + ucd.getREs().add(newConstraint); + } + }*/ + } + invocationPanel.fillInConfiguration(newConfiguration); + + return newConfiguration; + } + + public boolean isConfigurationChanged() { + String configurationString = convertBeanToString(activity + .getConfiguration()); + return (!convertBeanToString(makeConfiguration()).equals( + configurationString)); + } + + /** + * Adds a {@link JButton} which handles the reconfiguring of the + * {@link ExternalToolActivity} through the altered + * {@link ExternalToolActivityConfigurationBean}. Sets up the initial tabs - + * Script (also sets the initial value), Ports & Dependencies and their + * initial values through {@link #setDependencies()}, + * {@link #getPortPanel()} + */ + private void initialise(ExternalToolActivityConfigurationBean configuration) { + CSH.setHelpIDString( + this, + "net.sf.taverna.t2.workbench.ui.views.contextualviews.activity.ExternalToolConfigView"); + this.configuration = configuration; + setBorder(javax.swing.BorderFactory.createTitledBorder(null, null, + javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, + javax.swing.border.TitledBorder.DEFAULT_POSITION, + new java.awt.Font("Lucida Grande", 1, 12))); + + tabbedPane = new JTabbedPane(); + + if (invocationPanel != null) { + invocationPanel.stopObserving(); + } + + if (!isFromRepository()) { + UseCaseDescription useCaseDescription = configuration + .getUseCaseDescription(); + + nameField.setText(useCaseDescription.getUsecaseid()); + if (useCaseDescription.getGroup() != null) { + groupField.setText(useCaseDescription.getGroup()); + } + descriptionArea.setText(useCaseDescription.getDescription()); + stringReplacementViewList = new ArrayList<ExternalToolStringReplacementViewer>(); + inputFileViewList = new ArrayList<ExternalToolFileViewer>(); + fileListViewList = new ArrayList<ExternalToolFileViewer>(); + outputViewList = new ArrayList<ExternalToolFileViewer>(); + staticUrlViewList = new ArrayList<ExternalToolStaticUrlViewer>(); + staticStringViewList = new ArrayList<ExternalToolStaticStringViewer>(); +/* runtimeEnvironmentViewList = new ArrayList<ExternalToolRuntimeEnvironmentViewer>();*/ + + for (Entry<String, ScriptInput> entry : useCaseDescription + .getInputs().entrySet()) { + String name = entry.getKey(); + ScriptInputUser si = (ScriptInputUser) entry.getValue(); + if (Tools.isStringReplacement(si)) { + final ExternalToolStringReplacementViewer inputView = new ExternalToolStringReplacementViewer( + name, si); + stringReplacementViewList.add(inputView); + } + + } + Collections.sort(stringReplacementViewList, + new Comparator<ExternalToolStringReplacementViewer>() { + + @Override + public int compare( + ExternalToolStringReplacementViewer o1, + ExternalToolStringReplacementViewer o2) { + return o1.getName().compareTo(o2.getName()); + } + }); + + for (Entry<String, ScriptInput> entry : useCaseDescription + .getInputs().entrySet()) { + String name = entry.getKey(); + ScriptInputUser si = (ScriptInputUser) entry.getValue(); + if (Tools.isInputFile(si)) { + final ExternalToolFileViewer inputView = new ExternalToolFileViewer( + name, si.getTag(), si.isBinary()); + inputFileViewList.add(inputView); + } + + } + Collections.sort(inputFileViewList, + new Comparator<ExternalToolFileViewer>() { + + @Override + public int compare(ExternalToolFileViewer o1, + ExternalToolFileViewer o2) { + return o1.getName().compareTo(o2.getName()); + } + }); + + for (Entry<String, ScriptInput> entry : useCaseDescription + .getInputs().entrySet()) { + String name = entry.getKey(); + ScriptInputUser si = (ScriptInputUser) entry.getValue(); + if (Tools.isFileList(si)) { + final ExternalToolFileViewer inputView = new ExternalToolFileViewer( + name, si.getTag(), si.isBinary()); + fileListViewList.add(inputView); + } + + } + Collections.sort(fileListViewList, + new Comparator<ExternalToolFileViewer>() { + + @Override + public int compare(ExternalToolFileViewer o1, + ExternalToolFileViewer o2) { + return o1.getName().compareTo(o2.getName()); + } + }); + + for (Entry<String, ScriptOutput> entry : useCaseDescription + .getOutputs().entrySet()) { + ScriptOutput so = entry.getValue(); + final ExternalToolFileViewer outputView = new ExternalToolFileViewer( + entry.getKey(), so.getPath(), so.isBinary()); + outputViewList.add(outputView); + } + Collections.sort(outputViewList, + new Comparator<ExternalToolFileViewer>() { + + @Override + public int compare(ExternalToolFileViewer o1, + ExternalToolFileViewer o2) { + return o1.getName().compareTo(o2.getName()); + } + }); + + for (ScriptInputStatic siss : useCaseDescription.getStatic_inputs()) { + if ((siss.getUrl() == null) && siss.isFile()) { + final ExternalToolStaticStringViewer staticView = new ExternalToolStaticStringViewer( + siss); + staticStringViewList.add(staticView); + } + } + Collections.sort(staticStringViewList, + new Comparator<ExternalToolStaticStringViewer>() { + + @Override + public int compare(ExternalToolStaticStringViewer o1, + ExternalToolStaticStringViewer o2) { + return o1.getContent().compareTo(o2.getContent()); + } + }); + + for (ScriptInputStatic sis : useCaseDescription.getStatic_inputs()) { + if ((sis.getUrl() != null) && sis.isFile()) { + final ExternalToolStaticUrlViewer staticView = new ExternalToolStaticUrlViewer( + sis); + staticUrlViewList.add(staticView); + } + } + Collections.sort(staticUrlViewList, + new Comparator<ExternalToolStaticUrlViewer>() { + + @Override + public int compare(ExternalToolStaticUrlViewer o1, + ExternalToolStaticUrlViewer o2) { + return o1.getContent().compareTo(o2.getContent()); + } + }); + +/* for (RuntimeEnvironmentConstraint rec : useCaseDescription.getREs()) { + final ExternalToolRuntimeEnvironmentViewer newView = new ExternalToolRuntimeEnvironmentViewer( + rec.getID(), rec.getRelation()); + runtimeEnvironmentViewList.add(newView); + } + Collections.sort(runtimeEnvironmentViewList, + new Comparator<ExternalToolRuntimeEnvironmentViewer>() { + + @Override + public int compare( + ExternalToolRuntimeEnvironmentViewer o1, + ExternalToolRuntimeEnvironmentViewer o2) { + return o1.getId().compareTo(o2.getId()); + } + });*/ + + scriptTextArea = new JTextPane(); + new LinePainter(scriptTextArea, LINE_COLOR); + + final KeywordDocument doc = new KeywordDocument( + new HashSet<String>()); + // NOTE: Due to T2-1145 - always set editor kit BEFORE setDocument + scriptTextArea.setEditorKit(new NoWrapEditorKit()); + scriptTextArea.setFont(new Font("Monospaced", Font.PLAIN, 14)); + scriptTextArea.setDocument(doc); + scriptTextArea.setText(useCaseDescription.getCommand()); + scriptTextArea.setCaretPosition(0); + scriptTextArea.setPreferredSize(new Dimension(200, 100)); + + tabbedPane.addTab("Command", new ScriptPanel(this, scriptTextArea, stdInCheckBox, stdOutCheckBox, stdErrCheckBox, returnCodesField)); + tabbedPane.addTab("String replacements", + new StringReplacementPanel(this, stringReplacementViewList)); + tabbedPane.addTab( + "File inputs", + new FilePanel(this, inputFileViewList, "To file", "File type", + "in", FILE_INPUT_DESCRIPTION, "Add file input")); + tabbedPane.addTab( + "File outputs", + new FilePanel(this, outputViewList, "From file", "File type", + "out", FILE_OUTPUT_DESCRIPTION, "Add file output")); + advancedPanel = new JPanel(); + advancedPanel.setLayout(new GridBagLayout()); + GridBagConstraints advancedConstraint = new GridBagConstraints(); + advancedConstraint.anchor = GridBagConstraints.FIRST_LINE_START; + advancedConstraint.gridx = 0; + advancedConstraint.gridy = 0; + + advancedConstraint.fill = GridBagConstraints.BOTH; + advancedConstraint.weighty = 0.1; + advancedConstraint.weightx = 0.1; + advancedTab = new JTabbedPane(); + advancedTab.addTab("Strings", new StaticStringPanel(staticStringViewList)); + advancedTab.addTab("URLs", new StaticUrlPanel(staticUrlViewList)); + advancedTab.addTab( + "File lists", + new FilePanel(this, fileListViewList, + "To file containing list", "Individual file type", + "in", FILE_LIST_DESCRIPTION, "Add file list")); + annotationPanel = new AnnotationPanel(nameField, descriptionArea, groupField); + advancedTab.addTab("Annotation", annotationPanel); + final ToolXMLPanel toolXMLPanel = new ToolXMLPanel(configuration.getUseCaseDescription()); + advancedTab.addTab("XML", toolXMLPanel); + advancedTab.addChangeListener(new ChangeListener() { + + @Override + public void stateChanged(ChangeEvent e) { + if (advancedTab.getSelectedComponent() == toolXMLPanel) { + toolXMLPanel.regenerateTree(makeConfiguration().getUseCaseDescription()); + } + }}); + tabbedPane.addChangeListener(new ChangeListener() { + + @Override + public void stateChanged(ChangeEvent e) { + if ((tabbedPane.getSelectedComponent() == advancedPanel) && + (advancedTab.getSelectedComponent() == toolXMLPanel)) { + toolXMLPanel.regenerateTree(makeConfiguration().getUseCaseDescription()); + } + } + + }); +/* advancedTab.addTab("Runtime environments", + createRuntimeEnvironmentPanel(runtimeEnvironmentViewList));*/ + advancedPanel.add(advancedTab, advancedConstraint); + tabbedPane.addTab("Advanced", advancedPanel); + } + invocationPanel = new InvocationPanel(configuration); + + tabbedPane.addTab("Location", invocationPanel); + if (isFromRepository()) { + tabbedPane.addTab("Edit", new EditablePanel(this)); + } + GridBagConstraints outerConstraint = new GridBagConstraints(); + outerConstraint.anchor = GridBagConstraints.FIRST_LINE_START; + outerConstraint.gridx = 0; + outerConstraint.gridy = 0; + + outerConstraint.fill = GridBagConstraints.BOTH; + outerConstraint.weighty = 0.1; + outerConstraint.weightx = 0.1; + add(tabbedPane, outerConstraint); + + setPreferredSize(new Dimension(700, 500)); + this.validate(); + } + + public void whenOpened() { + if (scriptTextArea != null) { + scriptTextArea.requestFocus(); + } + } + + private boolean isFromRepository() { + return (!this.configuration.isEdited() && isOriginallyFromRepository()); + } + + public boolean isOriginallyFromRepository() { + String repositoryUrl = this.configuration.getRepositoryUrl(); + return ((repositoryUrl != null) && !repositoryUrl + .isEmpty()); + + } + + + @Override + public ExternalToolActivityConfigurationBean getConfiguration() { + return configuration; + } + + public void refreshConfiguration( + ExternalToolActivityConfigurationBean config) { + int visibleTab = -1; + int secondaryTab = -1; + if (tabbedPane != null) { + visibleTab = tabbedPane.getSelectedIndex(); + if (tabbedPane.getSelectedComponent().equals(advancedTab)) { + secondaryTab = advancedTab.getSelectedIndex(); + } + } + this.removeAll(); + initialise(config); + if (visibleTab != -1) { + tabbedPane.setSelectedIndex(visibleTab); + } + if (secondaryTab != -1) { + advancedTab.setSelectedIndex(secondaryTab); + } + } + + public void showAnnotationPanel() { + tabbedPane.setSelectedComponent(advancedPanel); + advancedTab.setSelectedComponent(annotationPanel); + } + + @Override + public void refreshConfiguration() { + refreshConfiguration(activity.getConfiguration()); + } + + static Pattern tagPattern = Pattern.compile("%%([^%]*)%%"); + + @Override + /** + * Need to check that the script contains the string replacements and only them - done + * + * Need to check the input port names are valid and unique - done + * Need to check the output port names are valid and unique - done + * + * Need to check the input files and static files are unique - done + * Need to check the file names are valid + * Need to check the URLs are valid + * Need to check the replacement tags are unique - done + */ + public boolean checkValues() { + if (isFromRepository()) { + return true; + } + boolean result = true; + String text = ""; + Set<String> stringReplacementPortNames = new HashSet<String>(); + Set<String> stringReplacementTags = new HashSet<String>(); + for (ExternalToolStringReplacementViewer v : stringReplacementViewList) { + String name = v.getName(); + if (name.equalsIgnoreCase("stdin") || name.equalsIgnoreCase("stdout") || name.equalsIgnoreCase("stderr")) { + text += "A string replacement port has a reserved name \"" + name + "\"\n"; + result = false; + } + else if (stringReplacementPortNames.contains(name)) { + text += "Two string replacement ports have the name \"" + name + + "\"\n"; + result = false; + } else if (!name.matches(VALID_NAME_REGEX)) { + text += "String replacement port name \"" + name + + "\" is invalid\n"; + result = false; + } else { + stringReplacementPortNames.add(name); + } + + String tag = v.getValue(); + if (stringReplacementTags.contains(tag)) { + text += "Two string replacement ports replace \"%%" + tag + + "%%\"\n"; + result = false; + } else if (!tag.matches(VALID_NAME_REGEX)) { + text += "String replacement tag \"%%" + tag + + "%%\" is invalid\n"; + result = false; + } else { + stringReplacementTags.add(tag); + } + } + + Matcher m = tagPattern.matcher(scriptTextArea.getText()); + Set<String> tags = new HashSet<String>(); + while (m.find()) { + String tag = m.group(1); + if (tag != null) { + if (tag.isEmpty()) { + text += "The command contains an empty tag i.e. %%%%\n"; + result = false; + } else { + if (!tag.matches(VALID_NAME_REGEX)) { + text += "The command contains an invalid tag \"%%" + + tag + "\"%%\n"; + result = false; + } + if (!stringReplacementTags.contains(tag)) { + text += "There is no string replacement for %%" + tag + + "%%\n"; + result = false; + } else { + tags.add(tag); + } + } + } + } + + for (String tag : stringReplacementTags) { + if (!tags.contains(tag)) { + text += "String replacement for %%" + tag + + "%% is not used in the command\n"; + result = false; + } + } + + Set<String> inputFilePortNames = new HashSet<String>(); + Set<String> inputFileNames = new HashSet<String>(); + for (ExternalToolFileViewer v : inputFileViewList) { + String name = v.getName(); + if (name.equalsIgnoreCase("stdin") || name.equalsIgnoreCase("stdout") || name.equalsIgnoreCase("stderr")) { + text += "An input file port has a reserved name \"" + name + "\"\n"; + result = false; + } + else if (stringReplacementPortNames.contains(name)) { + text += "A string replacement port and an input file port have the name \"" + + name + "\"\n"; + result = false; + } else if (inputFilePortNames.contains(name)) { + text += "Two file input ports have the name \"" + name + "\"\n"; + result = false; + } else if (!name.matches(VALID_NAME_REGEX)) { + text += "File input port name \"" + name + "\" is invalid\n"; + result = false; + } else { + inputFilePortNames.add(name); + } + + String fileName = v.getValue(); + if (inputFileNames.contains(fileName)) { + text += "Two file inputs ports write to the same file \"" + + fileName + "\"\n"; + result = false; + } else { + inputFileNames.add(fileName); + } + } + + Set<String> fileListPortNames = new HashSet<String>(); + Set<String> fileListFileNames = new HashSet<String>(); + for (ExternalToolFileViewer v : fileListViewList) { + String name = v.getName(); + if (name.equalsIgnoreCase("stdin") || name.equalsIgnoreCase("stdout") || name.equalsIgnoreCase("stderr")) { + text += "A file list port has a reserved name \"" + name + "\"\n"; + result = false; + } else if (stringReplacementPortNames.contains(name)) { + text += "A string replacement port and a file list port have the name \"" + + name + "\"\n"; + result = false; + } else if (inputFilePortNames.contains(name)) { + text += "A file input port and a file list port have the name \"" + + name + "\"\n"; + result = false; + } else if (fileListPortNames.contains(name)) { + text += "Two file list ports have the name \"" + name + "\"\n"; + result = false; + } else if (!name.matches(VALID_NAME_REGEX)) { + text += "File list port name \"" + name + "\" is invalid\n"; + result = false; + } else { + fileListPortNames.add(name); + } + + String fileName = v.getValue(); + if (fileListFileNames.contains(fileName)) { + text += "Two file list ports write to the same file \"" + + fileName + "\"\n"; + result = false; + } else if (inputFileNames.contains(fileName)) { + text += "A file input port and a file list port write to the same file \"" + + fileName + "\"\n"; + result = false; + } else { + fileListFileNames.add(fileName); + } + } + + Set<String> staticStringFileNames = new HashSet<String>(); + for (ExternalToolStaticStringViewer v : staticStringViewList) { + String fileName = v.getValue(); + if (staticStringFileNames.contains(fileName)) { + text += "Two static strings write to the same file \"" + + fileName + "\"\n"; + result = false; + } else if (inputFileNames.contains(fileName)) { + text += "A file input port and a static string write to the same file \"" + + fileName + "\"\n"; + result = false; + } else if (fileListFileNames.contains(fileName)) { + text += "A file list port and a static string write to the same file \"" + + fileName + "\"\n"; + result = false; + } else { + staticStringFileNames.add(fileName); + } + } + + Set<String> staticUrlFileNames = new HashSet<String>(); + for (ExternalToolStaticUrlViewer v : staticUrlViewList) { + String fileName = v.getValue(); + if (staticUrlFileNames.contains(fileName)) { + text += "Two static URLss write to the same file \"" + fileName + + "\"\n"; + result = false; + } else if (inputFileNames.contains(fileName)) { + text += "A file input port and a static URL write to the same file \"" + + fileName + "\"\n"; + result = false; + } else if (fileListFileNames.contains(fileName)) { + text += "A file list port and a static URL write to the same file \"" + + fileName + "\"\n"; + result = false; + } else if (staticStringFileNames.contains(fileName)) { + text += "A static string and a static URL write to the same file \"" + + fileName + "\"\n"; + result = false; + } else { + staticUrlFileNames.add(fileName); + } + } + Set<String> outputPortNames = new HashSet<String>(); + for (ExternalToolFileViewer v : outputViewList) { + String name = v.getName(); + if (name.equalsIgnoreCase("stdin") || name.equalsIgnoreCase("stdout") || name.equalsIgnoreCase("stderr")) { + text += "An output port has a reserved name \"" + name + "\"\n"; + result = false; + } else if (outputPortNames.contains(name)) { + text += "Two output file ports have the name \"" + name + + "\"\n"; + result = false; + } else if (!name.matches(VALID_NAME_REGEX)) { + text += "Output file port name \"" + name + "\" is invalid\n"; + result = false; + } else { + outputPortNames.add(name); + } + } + if (!result) { + JOptionPane.showMessageDialog(this, text, "Problems", + JOptionPane.ERROR_MESSAGE); + } + return result; + } + + /** + * Check the proposed port name against the set of ports + * + * @return + */ + public boolean portNameExists(String name) { + if (name.equalsIgnoreCase("stdin") || name.equalsIgnoreCase("stdout") || name.equalsIgnoreCase("stderr")) { + return true; + } + + for (ExternalToolFileViewer v : inputFileViewList) { + if (name.equals(v.getName())) { + return true; + } + } + for (ExternalToolFileViewer v : fileListViewList) { + if (name.equals(v.getName())) { + return true; + } + } + for (ExternalToolStringReplacementViewer v : stringReplacementViewList) { + if (name.equals(v.getName())) { + return true; + } + } + for (ExternalToolFileViewer v : outputViewList) { + if (name.equals(v.getName())) { + return true; + } + } + return false; + } + + + public void setEditable(boolean editable, ExternalToolActivityConfigurationBean config) { + ExternalToolActivityConfigurationBean newConfig = (ExternalToolActivityConfigurationBean) cloneBean(config); + ExternalToolActivityHealthChecker.updateLocation(newConfig); + newConfig.setEdited(editable); + refreshConfiguration(newConfig); + } + + public void whenClosed() { + if (invocationPanel != null) { + invocationPanel.stopObserving(); + } + } + +} http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/163747de/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/views/ExternalToolFileViewer.java ---------------------------------------------------------------------- diff --git a/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/views/ExternalToolFileViewer.java b/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/views/ExternalToolFileViewer.java new file mode 100644 index 0000000..f23cf2a --- /dev/null +++ b/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/views/ExternalToolFileViewer.java @@ -0,0 +1,103 @@ +/** + * + */ +package org.apache.taverna.activities.externaltool.views; + +import java.awt.event.ActionEvent; + +import javax.swing.AbstractAction; +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JTextField; + +import de.uni_luebeck.inb.knowarc.usecases.ScriptInput; +import de.uni_luebeck.inb.knowarc.usecases.ScriptInputUser; +import de.uni_luebeck.inb.knowarc.usecases.ScriptOutput; + +/** + * @author alanrw + * + */ +public class ExternalToolFileViewer { + + private JTextField nameField; + private String name; + private JTextField valueField; + private JCheckBox valueFromField; + private JComboBox typeSelector; + + public ExternalToolFileViewer(String name, String value, boolean isBinary) { + this(name); + nameField.setText(name); + if (!value.equals(name)) { + valueFromField.setSelected(false); + valueField.setText(value); + valueField.setEnabled(true); + } + if (isBinary) { + typeSelector.setSelectedItem("Binary"); + } else { + typeSelector.setSelectedItem("Text"); + } + } + + public ExternalToolFileViewer(final String name) { + this.name = name; + nameField = new JTextField(20); + valueField = new JTextField(20); + valueFromField = new JCheckBox(new AbstractAction() { + + @Override + public void actionPerformed(ActionEvent e) { + if (valueFromField.isSelected()) { + valueField.setText(""); + valueField.setEnabled(false); + } else { + valueField.setText(getName()); + valueField.setEnabled(true); + } + }}); + valueFromField.setSelected(true); + valueField.setEnabled(false); + typeSelector = new JComboBox(new String[] {"Binary", "Text"}); + nameField.setText(name); + typeSelector.setSelectedItem("Text"); + + } + + public JTextField getNameField() { + return nameField; + } + + public JTextField getValueField() { + return valueField; + } + + public JComboBox getTypeSelector() { + return typeSelector; + } + + public String getName() { + return nameField.getText(); + } + + public boolean isBinary() { + return (typeSelector.getSelectedItem().equals("Binary")); + } + + public String getValue() { + if (valueFromField.isSelected()) { + return getName(); + } + return valueField.getText(); + } + + /** + * @return the valueFromField + */ + public JCheckBox getValueFromField() { + return valueFromField; + } + + +} http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/163747de/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/views/ExternalToolRuntimeEnvironmentViewer.java ---------------------------------------------------------------------- diff --git a/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/views/ExternalToolRuntimeEnvironmentViewer.java b/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/views/ExternalToolRuntimeEnvironmentViewer.java new file mode 100644 index 0000000..efc0cf6 --- /dev/null +++ b/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/views/ExternalToolRuntimeEnvironmentViewer.java @@ -0,0 +1,56 @@ +/** + * + */ +package org.apache.taverna.activities.externaltool.views; + +import javax.swing.JComboBox; +import javax.swing.JTextField; + +import de.uni_luebeck.inb.knowarc.usecases.RuntimeEnvironmentConstraint; +import de.uni_luebeck.inb.knowarc.usecases.ScriptInput; +import de.uni_luebeck.inb.knowarc.usecases.ScriptInputUser; +import de.uni_luebeck.inb.knowarc.usecases.ScriptOutput; + +/** + * @author alanrw + * + */ +public class ExternalToolRuntimeEnvironmentViewer { + + private JTextField idField; + private JComboBox relationSelector; + + public ExternalToolRuntimeEnvironmentViewer(String id, String relation) { + this(id); + idField.setText(id); + relationSelector.setSelectedItem(relation); + } + + public ExternalToolRuntimeEnvironmentViewer(String id) { + this(); + idField.setText(id); + } + + public ExternalToolRuntimeEnvironmentViewer() { + idField = new JTextField(20); + relationSelector = new JComboBox(RuntimeEnvironmentConstraint.getAcceptedRelations()); + relationSelector.setSelectedItem(RuntimeEnvironmentConstraint.getDefaultRelation()); + } + + public JTextField getIdField() { + return idField; + } + + public JComboBox getRelationSelector() { + return relationSelector; + } + + public String getId() { + return idField.getText(); + } + + public String getRelation() { + return (String) relationSelector.getSelectedItem(); + } + +} http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/163747de/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/views/ExternalToolStaticStringViewer.java ---------------------------------------------------------------------- diff --git a/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/views/ExternalToolStaticStringViewer.java b/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/views/ExternalToolStaticStringViewer.java new file mode 100644 index 0000000..8615e85 --- /dev/null +++ b/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/views/ExternalToolStaticStringViewer.java @@ -0,0 +1,53 @@ +/** + * + */ +package org.apache.taverna.activities.externaltool.views; + +import javax.swing.JTextArea; +import javax.swing.JTextField; + +import de.uni_luebeck.inb.knowarc.usecases.ScriptInputStatic; + +/** + * @author alanrw + * + */ +public class ExternalToolStaticStringViewer { + + ScriptInputStatic input; + private JTextArea contentField = new JTextArea(); + private JTextField valueField; + + + public ExternalToolStaticStringViewer(ScriptInputStatic input) { + this(); + this.input = input; + contentField.setText((String) input.getContent()); + valueField.setText(input.getTag()); + } + + public ExternalToolStaticStringViewer() { + contentField = new JTextArea(5, 40); + contentField.setText(""); + valueField = new JTextField(20); + valueField.setText(""); + } + + public String getContent() { + return contentField.getText(); + } + + public JTextArea getContentField() { + return contentField; + } + + + public JTextField getValueField() { + return valueField; + } + + public String getValue() { + return valueField.getText(); + } + +} http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/163747de/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/views/ExternalToolStaticUrlViewer.java ---------------------------------------------------------------------- diff --git a/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/views/ExternalToolStaticUrlViewer.java b/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/views/ExternalToolStaticUrlViewer.java new file mode 100644 index 0000000..53948b0 --- /dev/null +++ b/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/views/ExternalToolStaticUrlViewer.java @@ -0,0 +1,56 @@ +/** + * + */ +package org.apache.taverna.activities.externaltool.views; + +import javax.swing.JComboBox; +import javax.swing.JTextArea; +import javax.swing.JTextField; + +import de.uni_luebeck.inb.knowarc.usecases.ScriptInput; +import de.uni_luebeck.inb.knowarc.usecases.ScriptInputStatic; +import de.uni_luebeck.inb.knowarc.usecases.ScriptInputUser; + +/** + * @author alanrw + * + */ +public class ExternalToolStaticUrlViewer { + + ScriptInputStatic input; + private JTextField contentField = new JTextField(); + private JTextField valueField; + + + public ExternalToolStaticUrlViewer(ScriptInputStatic input) { + this(); + this.input = input; + contentField.setText(input.getUrl()); + valueField.setText(input.getTag()); + } + + public ExternalToolStaticUrlViewer() { + contentField = new JTextField(40); + contentField.setText(""); + valueField = new JTextField(20); + valueField.setText(""); + } + + public String getContent() { + return contentField.getText(); + } + + public JTextField getContentField() { + return contentField; + } + + + public JTextField getValueField() { + return valueField; + } + + public String getValue() { + return valueField.getText(); + } + +} http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/163747de/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/views/ExternalToolStringReplacementViewer.java ---------------------------------------------------------------------- diff --git a/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/views/ExternalToolStringReplacementViewer.java b/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/views/ExternalToolStringReplacementViewer.java new file mode 100644 index 0000000..55d9809 --- /dev/null +++ b/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/views/ExternalToolStringReplacementViewer.java @@ -0,0 +1,97 @@ +/** + * + */ +package org.apache.taverna.activities.externaltool.views; + +import java.awt.event.ActionEvent; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.swing.AbstractAction; +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JTextField; + +import de.uni_luebeck.inb.knowarc.usecases.ScriptInput; +import de.uni_luebeck.inb.knowarc.usecases.ScriptInputUser; + +/** + * @author alanrw + * + */ +public class ExternalToolStringReplacementViewer { + + private static Pattern p = Pattern.compile("\\w+"); + private static final String PERCENTS = "%%"; + ScriptInput input; + private JTextField nameField; + private String name; + private JTextField valueField; + private JCheckBox valueFromField; + + public ExternalToolStringReplacementViewer(String name, ScriptInputUser input) { + this(name); + this.input = input; + nameField.setText(name); + if (!input.getTag().equals(name)) { + valueFromField.setSelected(false); + valueField.setText(PERCENTS + input.getTag() + PERCENTS); + valueField.setEnabled(true); + } + } + + public ExternalToolStringReplacementViewer(String name) { + this.name = name; + nameField = new JTextField(20); + nameField.setText(name); + valueField = new JTextField(20); + valueFromField = new JCheckBox(new AbstractAction() { + + @Override + public void actionPerformed(ActionEvent e) { + if (valueFromField.isSelected()) { + valueField.setText(""); + valueField.setEnabled(false); + } else { + valueField.setText(PERCENTS + getName() + PERCENTS); + valueField.setEnabled(true); + } + }}); + valueFromField.setSelected(true); + valueField.setEnabled(false); + } + + public JTextField getNameField() { + return nameField; + } + + public JTextField getValueField() { + return valueField; + } + + public String getName() { + return nameField.getText(); + } + + public String getValue() { + if (valueFromField.isSelected()) { + return getName(); + } + String enteredValue = valueField.getText(); + + Matcher m = p.matcher(enteredValue); + String result = ""; + if (m.find()) { + result = m.group(); + } + return result; + } + + /** + * @return the valueFromField + */ + public JCheckBox getValueFromField() { + return valueFromField; + } + +} http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/163747de/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/views/FilePanel.java ---------------------------------------------------------------------- diff --git a/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/views/FilePanel.java b/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/views/FilePanel.java new file mode 100644 index 0000000..d493ae1 --- /dev/null +++ b/taverna-external-tool-activity-ui/src/main/java/org/apache/taverna/activities/externaltool/views/FilePanel.java @@ -0,0 +1,119 @@ +/** + * + */ +package org.apache.taverna.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.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; +import javax.swing.border.EmptyBorder; + +import org.apache.taverna.activities.externaltool.utils.Tools; +import org.apache.taverna.lang.ui.DeselectingButton; +import org.apache.taverna.lang.ui.ReadOnlyTextArea; + +/** + * @author alanrw + * + */ +public class FilePanel extends JPanel { + + private int outputGridy = 1; + private final ExternalToolConfigView view; + + public FilePanel(final ExternalToolConfigView view, + final List<ExternalToolFileViewer> viewList, + String fileHeader, String typeHeader, final String portPrefix, + final String description, String addText) { + super(); + this.view = view; + this.setLayout(new BorderLayout()); + final JPanel fileEditPanel = new JPanel(new GridBagLayout()); + + final GridBagConstraints fileConstraint = new GridBagConstraints(); + fileConstraint.insets = new Insets(5, 5, 5, 5); + fileConstraint.anchor = GridBagConstraints.FIRST_LINE_START; + fileConstraint.gridx = 0; + fileConstraint.gridy = 0; + fileConstraint.weightx = 0.1; + fileConstraint.fill = GridBagConstraints.BOTH; + + final String[] elementLabels = new String[] {"Taverna port name", + "Use port name for file", + fileHeader, + typeHeader + }; + + fileConstraint.gridx = 0; + synchronized (viewList) { + for (ExternalToolFileViewer outputView : viewList) { + addFileViewer(viewList, this, fileEditPanel, + outputView, elementLabels); + } + } + JButton addFilePortButton = new DeselectingButton(addText, + new AbstractAction() { + public void actionPerformed(ActionEvent e) { + + int portNumber = 1; + + String name2 = portPrefix + portNumber++; + boolean nameExists = true; + while (nameExists == true) { + nameExists = view.portNameExists(name2); + if (nameExists) { + name2 = portPrefix + portNumber++; + } + } + + ExternalToolFileViewer newViewer = new ExternalToolFileViewer( + name2); + synchronized (viewList) { + viewList.add(newViewer); + addFileViewer(viewList, FilePanel.this, fileEditPanel, + newViewer, elementLabels); + fileEditPanel.revalidate(); + fileEditPanel.repaint(); + } + } + + }); + JTextArea descriptionText = new ReadOnlyTextArea(description); + descriptionText.setEditable(false); + descriptionText.setFocusable(false); + descriptionText.setBorder(new EmptyBorder(5, 5, 10, 5)); + + this.add(descriptionText, BorderLayout.NORTH); + + this.add(new JScrollPane(fileEditPanel), BorderLayout.CENTER); + + JPanel buttonPanel = new JPanel(new BorderLayout()); + + buttonPanel.add(addFilePortButton, BorderLayout.EAST); + + this.add(buttonPanel, BorderLayout.SOUTH); + + } + + private void addFileViewer(final List<ExternalToolFileViewer> viewList, + final JPanel outerPanel, final JPanel panel, + ExternalToolFileViewer viewer, String[] elementLabels) { + Tools.addViewer(panel, + elementLabels, + new JComponent[] {viewer.getNameField(), viewer.getValueFromField(), viewer.getValueField(), viewer.getTypeSelector()}, + viewList, + viewer, + outerPanel); + } + +}
