You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@taverna.apache.org by re...@apache.org on 2015/03/26 19:52:34 UTC
[45/51] [partial] incubator-taverna-workbench git commit: all
packages are moved to org.apache.taverna.*
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/ServiceTreePanel.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/ServiceTreePanel.java b/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/ServiceTreePanel.java
new file mode 100644
index 0000000..5d24027
--- /dev/null
+++ b/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/ServiceTreePanel.java
@@ -0,0 +1,192 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+package org.apache.taverna.workbench.ui.servicepanel;
+
+import static java.awt.datatransfer.DataFlavor.javaJVMLocalObjectMimeType;
+import static javax.swing.SwingUtilities.invokeLater;
+
+import java.awt.Component;
+import java.awt.FlowLayout;
+import java.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.Transferable;
+import java.awt.datatransfer.UnsupportedFlavorException;
+import java.io.IOException;
+
+import javax.swing.JComponent;
+import javax.swing.JPanel;
+import javax.swing.TransferHandler;
+import javax.swing.event.TreeExpansionEvent;
+import javax.swing.event.TreeWillExpandListener;
+import javax.swing.tree.ExpandVetoException;
+import javax.swing.tree.TreeCellRenderer;
+import javax.swing.tree.TreePath;
+
+import org.apache.taverna.servicedescriptions.ServiceDescription;
+import org.apache.taverna.servicedescriptions.ServiceDescriptionRegistry;
+import org.apache.taverna.ui.menu.MenuManager;
+import org.apache.taverna.workbench.edits.EditManager;
+import org.apache.taverna.workbench.selection.SelectionManager;
+import org.apache.taverna.workbench.ui.servicepanel.menu.AddServiceProviderMenu;
+import org.apache.taverna.workbench.ui.servicepanel.tree.Filter;
+import org.apache.taverna.workbench.ui.servicepanel.tree.FilterTreeModel;
+import org.apache.taverna.workbench.ui.servicepanel.tree.FilterTreeNode;
+import org.apache.taverna.workbench.ui.servicepanel.tree.TreePanel;
+
+import org.apache.log4j.Logger;
+
+import org.apache.taverna.commons.services.ServiceRegistry;
+
+public class ServiceTreePanel extends TreePanel {
+ private static final long serialVersionUID = 6611462684296693909L;
+ private static Logger logger = Logger.getLogger(ServiceTreePanel.class);
+
+ private final ServiceDescriptionRegistry serviceDescriptionRegistry;
+ private final EditManager editManager;
+ private final MenuManager menuManager;
+ private final SelectionManager selectionManager;
+ private final ServiceRegistry serviceRegistry;
+
+ public ServiceTreePanel(FilterTreeModel treeModel,
+ ServiceDescriptionRegistry serviceDescriptionRegistry, EditManager editManager,
+ MenuManager menuManager, SelectionManager selectionManager, ServiceRegistry serviceRegistry) {
+ super(treeModel);
+ this.serviceDescriptionRegistry = serviceDescriptionRegistry;
+ this.editManager = editManager;
+ this.menuManager = menuManager;
+ this.selectionManager = selectionManager;
+ this.serviceRegistry = serviceRegistry;
+ initialize();
+ }
+
+ @Override
+ protected void initialize() {
+ super.initialize();
+ tree.setDragEnabled(true);
+ tree.setTransferHandler(new ServiceTransferHandler());
+ tree.addTreeWillExpandListener(new AvoidRootCollapse());
+ tree.expandRow(0);
+
+ invokeLater(new Runnable() {
+ @Override
+ public void run() {
+ tree.addMouseListener(new ServiceTreeClickListener(tree,
+ ServiceTreePanel.this, serviceDescriptionRegistry,
+ editManager, menuManager, selectionManager,
+ serviceRegistry));
+ }
+ });
+ }
+
+ @Override
+ protected Component createExtraComponent() {
+ JComponent buttonPanel = new JPanel(new FlowLayout());
+ buttonPanel.add(new AddServiceProviderMenu(serviceDescriptionRegistry));
+ // buttonPanel.add(new JButton(new RefreshProviderRegistryAction()));
+ return buttonPanel;
+ }
+
+ @Override
+ public Filter createFilter(String text) {
+ return new ServiceFilter(text, filterTreeModel.getRoot());
+ }
+
+ @Override
+ protected TreeCellRenderer createCellRenderer() {
+ return new ServiceTreeCellRenderer();
+ }
+
+ public static class AvoidRootCollapse implements TreeWillExpandListener {
+ @Override
+ public void treeWillCollapse(TreeExpansionEvent event) throws ExpandVetoException {
+ if (event.getPath().getPathCount() == 1)
+ throw new ExpandVetoException(event, "Can't collapse root");
+ }
+
+ @Override
+ public void treeWillExpand(TreeExpansionEvent event) throws ExpandVetoException {
+ }
+ }
+
+ private final class ServiceTransferHandler extends TransferHandler {
+ private static final long serialVersionUID = 4347965626386951176L;
+
+ /**
+ * Triggered when a node ie. an {@link ActivityItem} is dragged out of
+ * the tree. Figures out what node it is being dragged and then starts a
+ * drag action with it
+ */
+ @Override
+ protected Transferable createTransferable(JComponent c) {
+ TreePath selectionPath = tree.getSelectionPath();
+ if (selectionPath == null)
+ return null;
+ FilterTreeNode lastPathComponent = (FilterTreeNode) selectionPath
+ .getLastPathComponent();
+ if (!(lastPathComponent.getUserObject() instanceof ServiceDescription))
+ return null;
+ final ServiceDescription serviceDescription = (ServiceDescription) lastPathComponent
+ .getUserObject();
+
+ return new Transferable() {
+ @Override
+ public Object getTransferData(DataFlavor flavor)
+ throws UnsupportedFlavorException, IOException {
+ return serviceDescription;
+ }
+
+ @Override
+ public DataFlavor[] getTransferDataFlavors() {
+ DataFlavor[] flavors = new DataFlavor[1];
+ try {
+ flavors[0] = getFlavorForClass(ServiceDescription.class);
+ } catch (ClassNotFoundException e) {
+ logger.error("Error casting Dataflavor", e);
+ flavors[0] = null;
+ }
+ return flavors;
+ }
+
+ @Override
+ public boolean isDataFlavorSupported(DataFlavor flavor) {
+ DataFlavor thisFlavor = null;
+ try {
+ thisFlavor = getFlavorForClass(ServiceDescription.class);
+ } catch (ClassNotFoundException e) {
+ logger.error("Error casting Dataflavor", e);
+ }
+ return flavor.equals(thisFlavor);
+ }
+ };
+ }
+
+ @Override
+ public int getSourceActions(JComponent c) {
+ return COPY_OR_MOVE;
+ }
+ }
+
+ private DataFlavor getFlavorForClass(Class<?> clazz)
+ throws ClassNotFoundException {
+ String name = clazz.getName();
+ return new DataFlavor(javaJVMLocalObjectMimeType + ";class=" + clazz,
+ name.substring(name.lastIndexOf('.') + 1),
+ clazz.getClassLoader());
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/actions/AddServiceProviderAction.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/actions/AddServiceProviderAction.java b/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/actions/AddServiceProviderAction.java
new file mode 100644
index 0000000..ae1be4e
--- /dev/null
+++ b/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/actions/AddServiceProviderAction.java
@@ -0,0 +1,255 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+package org.apache.taverna.workbench.ui.servicepanel.actions;
+
+import static java.awt.BorderLayout.CENTER;
+import static java.awt.BorderLayout.NORTH;
+import static java.awt.BorderLayout.SOUTH;
+import static java.awt.BorderLayout.WEST;
+import static java.awt.event.KeyEvent.VK_ENTER;
+import static javax.swing.JOptionPane.ERROR_MESSAGE;
+import static javax.swing.JOptionPane.showMessageDialog;
+import static org.apache.taverna.workbench.MainWindow.getMainWindow;
+import static org.apache.commons.beanutils.PropertyUtils.getPropertyDescriptors;
+import static org.apache.log4j.Logger.getLogger;
+
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.event.ActionEvent;
+import java.awt.event.KeyAdapter;
+import java.awt.event.KeyEvent;
+import java.beans.PropertyDescriptor;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.swing.AbstractAction;
+import javax.swing.JButton;
+import javax.swing.JDialog;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+
+import org.apache.taverna.lang.observer.Observable;
+import org.apache.taverna.lang.observer.Observer;
+import org.apache.taverna.lang.uibuilder.UIBuilder;
+import org.apache.taverna.servicedescriptions.ConfigurableServiceProvider;
+import org.apache.taverna.servicedescriptions.CustomizedConfigurePanelProvider;
+import org.apache.taverna.servicedescriptions.ServiceDescriptionRegistry;
+import org.apache.taverna.servicedescriptions.CustomizedConfigurePanelProvider.CustomizedConfigureCallBack;
+import org.apache.taverna.servicedescriptions.events.ProviderErrorNotification;
+import org.apache.taverna.servicedescriptions.events.ServiceDescriptionProvidedEvent;
+import org.apache.taverna.servicedescriptions.events.ServiceDescriptionRegistryEvent;
+import org.apache.taverna.workbench.helper.HelpEnabledDialog;
+
+import org.apache.log4j.Logger;
+
+import org.apache.taverna.scufl2.api.configurations.Configuration;
+
+/**
+ * Action for adding a service provider
+ *
+ * @author Stian Soiland-Reyes
+ * @author Alan R Williams
+ */
+@SuppressWarnings("serial")
+public class AddServiceProviderAction extends AbstractAction {
+ private static Logger logger = getLogger(AddServiceProviderAction.class);
+
+ // protected static Dimension DIALOG_SIZE = new Dimension(400, 300);
+
+ private ServiceDescriptionRegistry serviceDescriptionRegistry;
+
+ private final ConfigurableServiceProvider confProvider;
+ private final Component owner;
+
+ public AddServiceProviderAction(ConfigurableServiceProvider confProvider,
+ Component owner) {
+ super(confProvider.getName() + "...", confProvider.getIcon());
+ this.confProvider = confProvider;
+ this.owner = owner;
+ }
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ if (confProvider instanceof CustomizedConfigurePanelProvider) {
+ final CustomizedConfigurePanelProvider provider = (CustomizedConfigurePanelProvider) confProvider;
+ provider.createCustomizedConfigurePanel(new CustomizedConfigureCallBack() {
+ @Override
+ public Configuration getTemplateConfig() {
+ return (Configuration) provider.getConfiguration().clone();
+ }
+
+ @Override
+ public ServiceDescriptionRegistry getServiceDescriptionRegistry() {
+ return AddServiceProviderAction.this.getServiceDescriptionRegistry();
+ }
+
+ @Override
+ public void newProviderConfiguration(Configuration providerConfig) {
+ addNewProvider(providerConfig);
+ }
+ });
+ return;
+ }
+
+ Configuration configuration;
+ try {
+ configuration = (Configuration) confProvider.getConfiguration().clone();
+ } catch (Exception ex) {
+ throw new RuntimeException("Can't clone configuration bean", ex);
+ }
+ JPanel buildEditor = buildEditor(configuration);
+ String title = "Add " + confProvider.getName();
+ JDialog dialog = new HelpEnabledDialog(getMainWindow(), title, true, null);
+ JPanel iconPanel = new JPanel();
+ iconPanel.add(new JLabel(confProvider.getIcon()), NORTH);
+ dialog.add(iconPanel, WEST);
+ dialog.add(buildEditor, CENTER);
+ JPanel buttonPanel = new JPanel(new BorderLayout());
+ final AddProviderAction addProviderAction = new AddProviderAction(configuration,
+ dialog);
+ JButton addProviderButton = new JButton(addProviderAction);
+ buttonPanel.add(addProviderButton, WEST);
+
+ dialog.add(buttonPanel, SOUTH);
+ // When user presses "Return" key fire the action on the "Add" button
+ addProviderButton.addKeyListener(new KeyAdapter() {
+ @Override
+ public void keyPressed(KeyEvent evt) {
+ if (evt.getKeyCode() == VK_ENTER)
+ addProviderAction.actionPerformed(null);
+ }
+ });
+ dialog.getRootPane().setDefaultButton(addProviderButton);
+
+ // dialog.setSize(buttonPanel.getPreferredSize());
+ dialog.pack();
+ dialog.setLocationRelativeTo(owner);
+// dialog.setLocation(owner.getLocationOnScreen().x + owner.getWidth(),
+// owner.getLocationOnScreen().y + owner.getHeight());
+ dialog.setVisible(true);
+ }
+
+ protected void addNewProvider(Configuration configurationBean) {
+ ConfigurableServiceProvider cloned = (ConfigurableServiceProvider) confProvider
+ .newInstance();
+ try {
+ cloned.configure(configurationBean);
+ getServiceDescriptionRegistry().addObserver(
+ new CheckAddedCorrectlyObserver(cloned));
+ getServiceDescriptionRegistry().addServiceDescriptionProvider(
+ cloned);
+ } catch (Exception ex) {
+ logger.warn("Can't configure provider " + cloned + " using "
+ + configurationBean, ex);
+ showMessageDialog(owner, "Can't configure service provider "
+ + cloned.getName(), "Can't add service provider",
+ ERROR_MESSAGE);
+ }
+ }
+
+ private PropertyDescriptor[] getProperties(Configuration configuration) {
+ // FIXME This is *so* wrong!
+ try {
+ return getPropertyDescriptors(configuration);
+ } catch (Exception ex) {
+ throw new RuntimeException("Can't inspect configuration bean", ex);
+ }
+ }
+
+ // TODO This is probably not right
+ protected JPanel buildEditor(Configuration configuration) {
+ List<String> uiBuilderConfig = new ArrayList<>();
+ int lastPreferred = 0;
+ for (PropertyDescriptor property : getProperties(configuration)) {
+ if (property.isHidden() || property.isExpert())
+ // TODO: Add support for expert properties
+ continue;
+ String propertySpec = property.getName() + ":name="
+ + property.getDisplayName();
+ if (property.isPreferred())
+ // Add it to the front
+ uiBuilderConfig.add(lastPreferred++, propertySpec);
+ else
+ uiBuilderConfig.add(propertySpec);
+ }
+
+ return UIBuilder.buildEditor(configuration, uiBuilderConfig
+ .toArray(new String[0]));
+ }
+
+ public void setServiceDescriptionRegistry(
+ ServiceDescriptionRegistry serviceDescriptionRegistry) {
+ this.serviceDescriptionRegistry = serviceDescriptionRegistry;
+ }
+
+ public ServiceDescriptionRegistry getServiceDescriptionRegistry() {
+ return serviceDescriptionRegistry;
+ }
+
+ public class AddProviderAction extends AbstractAction {
+ private final Configuration configurationBean;
+ private final JDialog dialog;
+
+ private AddProviderAction(Configuration configurationBean, JDialog dialog) {
+ super("Add");
+ this.configurationBean = configurationBean;
+ this.dialog = dialog;
+ }
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ addNewProvider(configurationBean);
+ dialog.setVisible(false);
+ }
+ }
+
+ public class CheckAddedCorrectlyObserver implements
+ Observer<ServiceDescriptionRegistryEvent> {
+ private final ConfigurableServiceProvider provider;
+
+ private CheckAddedCorrectlyObserver(ConfigurableServiceProvider provider) {
+ this.provider = provider;
+ }
+
+ @Override
+ public void notify(Observable<ServiceDescriptionRegistryEvent> sender,
+ ServiceDescriptionRegistryEvent message) throws Exception {
+ if (message instanceof ProviderErrorNotification)
+ notify((ProviderErrorNotification) message);
+ else if (message instanceof ServiceDescriptionProvidedEvent)
+ notify((ServiceDescriptionProvidedEvent) message);
+ }
+
+ private void notify(ServiceDescriptionProvidedEvent providedMsg) {
+ if (providedMsg.getProvider() == provider)
+ getServiceDescriptionRegistry().removeObserver(this);
+ }
+
+ private void notify(ProviderErrorNotification errorMsg) {
+ if (errorMsg.getProvider() != provider)
+ return;
+ getServiceDescriptionRegistry().removeObserver(this);
+ getServiceDescriptionRegistry().removeServiceDescriptionProvider(
+ provider);
+// showMessageDialog(owner, errorMsg.getMessage(),
+// "Can't add provider " + provider, ERROR_MESSAGE);
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/actions/ExportServiceDescriptionsAction.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/actions/ExportServiceDescriptionsAction.java b/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/actions/ExportServiceDescriptionsAction.java
new file mode 100644
index 0000000..2183854
--- /dev/null
+++ b/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/actions/ExportServiceDescriptionsAction.java
@@ -0,0 +1,154 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+package org.apache.taverna.workbench.ui.servicepanel.actions;
+
+import static javax.swing.JFileChooser.APPROVE_OPTION;
+import static javax.swing.JOptionPane.ERROR_MESSAGE;
+import static javax.swing.JOptionPane.NO_OPTION;
+import static javax.swing.JOptionPane.YES_NO_CANCEL_OPTION;
+import static javax.swing.JOptionPane.YES_OPTION;
+import static javax.swing.JOptionPane.showConfirmDialog;
+import static javax.swing.JOptionPane.showMessageDialog;
+
+import java.awt.event.ActionEvent;
+import java.io.File;
+import java.util.prefs.Preferences;
+
+import javax.swing.AbstractAction;
+import javax.swing.JButton;
+import javax.swing.JComponent;
+import javax.swing.JFileChooser;
+import javax.swing.filechooser.FileFilter;
+
+import org.apache.taverna.servicedescriptions.ServiceDescriptionRegistry;
+
+import org.apache.log4j.Logger;
+
+/**
+ * Action to export the current service descritpions from the Service
+ * Registry to an xml file.
+ *
+ * @author Alex Nenadic
+ */
+//FIXME this file assumes we're writing out as XML
+@SuppressWarnings("serial")
+public class ExportServiceDescriptionsAction extends AbstractAction {
+ private static final String EXTENSION = ".xml";
+ private static final String EXPORT_SERVICES = "Export services to file";
+ private static final String SERVICE_EXPORT_DIR_PROPERTY = "serviceExportDir";
+ private Logger logger = Logger.getLogger(ExportServiceDescriptionsAction.class);
+ private final ServiceDescriptionRegistry serviceDescriptionRegistry;
+
+ public ExportServiceDescriptionsAction(ServiceDescriptionRegistry serviceDescriptionRegistry) {
+ super(EXPORT_SERVICES);
+ this.serviceDescriptionRegistry = serviceDescriptionRegistry;
+ }
+
+ public static final boolean INHIBIT = true;
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ JComponent parentComponent = null;
+ if (e.getSource() instanceof JComponent)
+ parentComponent = (JComponent) e.getSource();
+
+ if (INHIBIT) {
+ showMessageDialog(parentComponent,
+ "Operation not currently working correctly",
+ "Not Implemented", ERROR_MESSAGE);
+ return;
+ }
+
+ JFileChooser fileChooser = new JFileChooser();
+ Preferences prefs = Preferences.userNodeForPackage(getClass());
+ String curDir = prefs.get(SERVICE_EXPORT_DIR_PROPERTY,
+ System.getProperty("user.home"));
+ fileChooser.setDialogTitle("Select file to export services to");
+
+ fileChooser.setFileFilter(new FileFilter() {
+ @Override
+ public boolean accept(File f) {
+ return f.isDirectory()
+ || f.getName().toLowerCase().endsWith(EXTENSION);
+ }
+
+ @Override
+ public String getDescription() {
+ return ".xml files";
+ }
+ });
+
+ fileChooser.setCurrentDirectory(new File(curDir));
+
+ boolean tryAgain = true;
+ while (tryAgain) {
+ tryAgain = false;
+ int returnVal = fileChooser.showSaveDialog(parentComponent);
+ if (returnVal == APPROVE_OPTION) {
+ prefs.put(SERVICE_EXPORT_DIR_PROPERTY, fileChooser.getCurrentDirectory()
+ .toString());
+ File file = fileChooser.getSelectedFile();
+ if (!file.getName().toLowerCase().endsWith(EXTENSION)) {
+ String newName = file.getName() + EXTENSION;
+ file = new File(file.getParentFile(), newName);
+ }
+
+ try {
+ if (file.exists()) {
+ String msg = "Are you sure you want to overwrite existing file "
+ + file + "?";
+ int ret = showConfirmDialog(parentComponent, msg,
+ "File already exists", YES_NO_CANCEL_OPTION);
+ if (ret == NO_OPTION) {
+ tryAgain = true;
+ continue;
+ } else if (ret != YES_OPTION) {
+ logger.info("Service descriptions export: aborted overwrite of "
+ + file.getAbsolutePath());
+ break;
+ }
+ }
+ exportServiceDescriptions(file);
+ break;
+ } catch (Exception ex) {
+ logger.error("Service descriptions export: failed to export services to "
+ + file.getAbsolutePath(), ex);
+ showMessageDialog(
+ parentComponent,
+ "Failed to export services to "
+ + file.getAbsolutePath(), "Error",
+ ERROR_MESSAGE);
+ break;
+ }
+ }
+ }
+
+ if (parentComponent instanceof JButton)
+ // lose the focus from the button after performing the action
+ parentComponent.requestFocusInWindow();
+ }
+
+ private void exportServiceDescriptions(File file) {
+ // TODO: Open in separate thread to avoid hanging UI
+ serviceDescriptionRegistry.exportCurrentServiceDescriptions(file);
+ logger.info("Service descriptions export: saved to file "
+ + file.getAbsolutePath());
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/actions/ImportServiceDescriptionsFromFileAction.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/actions/ImportServiceDescriptionsFromFileAction.java b/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/actions/ImportServiceDescriptionsFromFileAction.java
new file mode 100644
index 0000000..218df0f
--- /dev/null
+++ b/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/actions/ImportServiceDescriptionsFromFileAction.java
@@ -0,0 +1,157 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+package org.apache.taverna.workbench.ui.servicepanel.actions;
+
+import static javax.swing.JFileChooser.APPROVE_OPTION;
+import static javax.swing.JOptionPane.CANCEL_OPTION;
+import static javax.swing.JOptionPane.ERROR_MESSAGE;
+import static javax.swing.JOptionPane.QUESTION_MESSAGE;
+import static javax.swing.JOptionPane.YES_NO_CANCEL_OPTION;
+import static javax.swing.JOptionPane.YES_OPTION;
+import static javax.swing.JOptionPane.showMessageDialog;
+import static javax.swing.JOptionPane.showOptionDialog;
+
+import java.awt.event.ActionEvent;
+import java.io.File;
+import java.util.HashSet;
+import java.util.prefs.Preferences;
+
+import javax.swing.AbstractAction;
+import javax.swing.JButton;
+import javax.swing.JComponent;
+import javax.swing.JFileChooser;
+import javax.swing.filechooser.FileFilter;
+
+import org.apache.log4j.Logger;
+
+import org.apache.taverna.servicedescriptions.ConfigurableServiceProvider;
+import org.apache.taverna.servicedescriptions.ServiceDescriptionProvider;
+import org.apache.taverna.servicedescriptions.ServiceDescriptionRegistry;
+
+/**
+ * Action to import a list of service descriptions from an xml file
+ * into the Service Registry. Users have an option to completely
+ * replace the current services or just add the ones from the file
+ * to the current services.
+ *
+ * @author Alex Nenadic
+ */
+//FIXME this file assumes we're writing out as XML
+@SuppressWarnings("serial")
+public class ImportServiceDescriptionsFromFileAction extends AbstractAction{
+ private static final String EXTENSION = ".xml";
+ private static final String IMPORT_SERVICES = "Import services from file";
+ private static final String SERVICE_IMPORT_DIR_PROPERTY = "serviceImportDir";
+ private static final Logger logger = Logger.getLogger(ExportServiceDescriptionsAction.class);
+
+ private final ServiceDescriptionRegistry serviceDescriptionRegistry;
+
+ public ImportServiceDescriptionsFromFileAction(
+ ServiceDescriptionRegistry serviceDescriptionRegistry) {
+ super(IMPORT_SERVICES);
+ this.serviceDescriptionRegistry = serviceDescriptionRegistry;
+ }
+
+ private static final Object[] CHOICES = { "Add to current services",
+ "Replace current services", "Cancel" };
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ JComponent parentComponent = null;
+ if (e.getSource() instanceof JComponent)
+ parentComponent = (JComponent) e.getSource();
+
+ if (ExportServiceDescriptionsAction.INHIBIT) {
+ showMessageDialog(parentComponent,
+ "Operation not currently working correctly",
+ "Not Implemented", ERROR_MESSAGE);
+ return;
+ }
+
+ int choice = showOptionDialog(
+ parentComponent,
+ "Do you want to add the imported services to the current ones or replace the current ones?",
+ "Import services", YES_NO_CANCEL_OPTION, QUESTION_MESSAGE,
+ null, CHOICES, CHOICES[0]);
+
+ if (choice != CANCEL_OPTION) {
+ JFileChooser fileChooser = new JFileChooser();
+ Preferences prefs = Preferences.userNodeForPackage(getClass());
+ String curDir = prefs.get(SERVICE_IMPORT_DIR_PROPERTY, System.getProperty("user.home"));
+
+ fileChooser.setDialogTitle("Select file to import services from");
+
+ fileChooser.setFileFilter(new FileFilter() {
+ @Override
+ public boolean accept(File f) {
+ return f.isDirectory()
+ || f.getName().toLowerCase().endsWith(EXTENSION);
+ }
+
+ @Override
+ public String getDescription() {
+ return EXTENSION + " files";
+ }
+ });
+
+ fileChooser.setCurrentDirectory(new File(curDir));
+
+ if (fileChooser.showOpenDialog(parentComponent) == APPROVE_OPTION) {
+ prefs.put(SERVICE_IMPORT_DIR_PROPERTY, fileChooser
+ .getCurrentDirectory().toString());
+ File file = fileChooser.getSelectedFile();
+
+ try {
+ // Did user want to replace or add services?
+ importServices(file, choice == YES_OPTION);
+ } catch (Exception ex) {
+ logger.error(
+ "Service descriptions import: failed to import services from "
+ + file.getAbsolutePath(), ex);
+ showMessageDialog(parentComponent,
+ "Failed to import services from " + file.getAbsolutePath(), "Error",
+ ERROR_MESSAGE);
+ }
+ }
+ }
+
+ if (parentComponent instanceof JButton)
+ // lose the focus from the button after performing the action
+ parentComponent.requestFocusInWindow();
+ }
+
+ private void importServices(final File file, final boolean addToCurrent)
+ throws Exception {
+ // TODO: Open in separate thread to avoid hanging UI
+
+ if (!addToCurrent)
+ for (ServiceDescriptionProvider provider : new HashSet<>(
+ serviceDescriptionRegistry.getServiceDescriptionProviders()))
+ // remove all configurable service providers
+ if (provider instanceof ConfigurableServiceProvider)
+ serviceDescriptionRegistry
+ .removeServiceDescriptionProvider(provider);
+
+ // import all providers from the file
+ serviceDescriptionRegistry.loadServiceProviders(file);
+ serviceDescriptionRegistry.saveServiceDescriptions();
+ }
+}
+
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/actions/ImportServiceDescriptionsFromURLAction.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/actions/ImportServiceDescriptionsFromURLAction.java b/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/actions/ImportServiceDescriptionsFromURLAction.java
new file mode 100644
index 0000000..af51ce1
--- /dev/null
+++ b/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/actions/ImportServiceDescriptionsFromURLAction.java
@@ -0,0 +1,128 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+package org.apache.taverna.workbench.ui.servicepanel.actions;
+
+import static javax.swing.JOptionPane.CANCEL_OPTION;
+import static javax.swing.JOptionPane.ERROR_MESSAGE;
+import static javax.swing.JOptionPane.QUESTION_MESSAGE;
+import static javax.swing.JOptionPane.YES_NO_CANCEL_OPTION;
+import static javax.swing.JOptionPane.YES_OPTION;
+import static javax.swing.JOptionPane.showInputDialog;
+import static javax.swing.JOptionPane.showMessageDialog;
+import static javax.swing.JOptionPane.showOptionDialog;
+
+import java.awt.event.ActionEvent;
+import java.net.URL;
+import java.util.HashSet;
+
+import javax.swing.AbstractAction;
+import javax.swing.JButton;
+import javax.swing.JComponent;
+
+import org.apache.taverna.servicedescriptions.ConfigurableServiceProvider;
+import org.apache.taverna.servicedescriptions.ServiceDescriptionProvider;
+import org.apache.taverna.servicedescriptions.ServiceDescriptionRegistry;
+
+import org.apache.log4j.Logger;
+
+/**
+ * Action to import a list of service descriptions from an URL pointing
+ * to an xml file into the Service Registry. Users have an option to
+ * completely replace the current services or just add the ones from the
+ * file to the current services.
+ *
+ * @author Alex Nenadic
+ */
+@SuppressWarnings("serial")
+public class ImportServiceDescriptionsFromURLAction extends AbstractAction{
+ private static final String IMPORT_SERVICES_FROM_URL = "Import services from URL";
+ private static final Logger logger = Logger.getLogger(ExportServiceDescriptionsAction.class);
+
+ private final ServiceDescriptionRegistry serviceDescriptionRegistry;
+
+ public ImportServiceDescriptionsFromURLAction(ServiceDescriptionRegistry serviceDescriptionRegistry) {
+ super(IMPORT_SERVICES_FROM_URL);
+ this.serviceDescriptionRegistry = serviceDescriptionRegistry;
+ }
+
+ private static final Object[] CHOICES = { "Add to current services",
+ "Replace current services", "Cancel" };
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ JComponent parentComponent = null;
+ if (e.getSource() instanceof JComponent)
+ parentComponent = (JComponent) e.getSource();
+
+ if (ExportServiceDescriptionsAction.INHIBIT) {
+ showMessageDialog(parentComponent,
+ "Operation not currently working correctly",
+ "Not Implemented", ERROR_MESSAGE);
+ return;
+ }
+
+ int choice = showOptionDialog(
+ parentComponent,
+ "Do you want to add the imported services to the current ones or replace the current ones?",
+ "Import services", YES_NO_CANCEL_OPTION, QUESTION_MESSAGE,
+ null, CHOICES, CHOICES[0]);
+
+ if (choice != CANCEL_OPTION) {
+ final String urlString = (String) showInputDialog(parentComponent,
+ "Enter the URL of the service descriptions file to import",
+ "Service Descriptions URL", QUESTION_MESSAGE, null, null,
+ "http://");
+ try {
+ if (urlString != null && !urlString.isEmpty())
+ // Did user want to replace or add services?
+ importServices(urlString, choice == YES_OPTION);
+ } catch (Exception ex) {
+ logger.error(
+ "Service descriptions import: failed to import services from "
+ + urlString, ex);
+ showMessageDialog(parentComponent,
+ "Failed to import services from " + urlString, "Error",
+ ERROR_MESSAGE);
+ }
+ }
+
+ if (parentComponent instanceof JButton)
+ // lose the focus from the button after performing the action
+ parentComponent.requestFocusInWindow();
+ }
+
+ private void importServices(final String urlString, final boolean addToCurrent)
+ throws Exception {
+ // TODO: Open in separate thread to avoid hanging UI
+ URL url = new URL(urlString);
+
+ if (!addToCurrent)
+ for (ServiceDescriptionProvider provider : new HashSet<>(
+ serviceDescriptionRegistry.getServiceDescriptionProviders()))
+ // remove all configurable service providers
+ if (provider instanceof ConfigurableServiceProvider)
+ serviceDescriptionRegistry
+ .removeServiceDescriptionProvider(provider);
+
+ // import all providers from the URL
+ serviceDescriptionRegistry.loadServiceProviders(url);
+ serviceDescriptionRegistry.saveServiceDescriptions();
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/actions/RefreshProviderRegistryAction.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/actions/RefreshProviderRegistryAction.java b/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/actions/RefreshProviderRegistryAction.java
new file mode 100644
index 0000000..5cd6ddb
--- /dev/null
+++ b/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/actions/RefreshProviderRegistryAction.java
@@ -0,0 +1,51 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+package org.apache.taverna.workbench.ui.servicepanel.actions;
+
+import java.awt.event.ActionEvent;
+
+import javax.swing.AbstractAction;
+
+import org.apache.taverna.servicedescriptions.ServiceDescriptionRegistry;
+
+/**
+ * Action for refreshing the service provider registry.
+ * <p>
+ * This would typically re-parse WSDLs, etc.
+ *
+ * @see ServiceDescriptionRegistry#refresh()
+ * @author Stian Soiland-Reyes
+ */
+@SuppressWarnings("serial")
+public class RefreshProviderRegistryAction extends AbstractAction {
+ private static final String REFRESH = "Reload services";
+ private final ServiceDescriptionRegistry serviceDescriptionRegistry;
+
+ public RefreshProviderRegistryAction(
+ ServiceDescriptionRegistry serviceDescriptionRegistry) {
+ super(REFRESH);
+ this.serviceDescriptionRegistry = serviceDescriptionRegistry;
+ }
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ serviceDescriptionRegistry.refresh();
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/actions/RemoveDefaultServicesAction.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/actions/RemoveDefaultServicesAction.java b/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/actions/RemoveDefaultServicesAction.java
new file mode 100644
index 0000000..0460004
--- /dev/null
+++ b/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/actions/RemoveDefaultServicesAction.java
@@ -0,0 +1,50 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+package org.apache.taverna.workbench.ui.servicepanel.actions;
+
+import java.awt.event.ActionEvent;
+
+import javax.swing.AbstractAction;
+
+import org.apache.taverna.servicedescriptions.ConfigurableServiceProvider;
+import org.apache.taverna.servicedescriptions.ServiceDescriptionProvider;
+import org.apache.taverna.servicedescriptions.ServiceDescriptionRegistry;
+
+@SuppressWarnings("serial")
+public class RemoveDefaultServicesAction extends AbstractAction {
+ private final ServiceDescriptionRegistry serviceDescriptionRegistry;
+
+ public RemoveDefaultServicesAction(
+ ServiceDescriptionRegistry serviceDescriptionRegistry) {
+ super("Remove default service providers");
+ this.serviceDescriptionRegistry = serviceDescriptionRegistry;
+ }
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ for (ServiceDescriptionProvider provider : serviceDescriptionRegistry
+ .getDefaultServiceDescriptionProviders()) {
+ if (!(provider instanceof ConfigurableServiceProvider))
+ continue;
+ serviceDescriptionRegistry
+ .removeServiceDescriptionProvider(provider);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/actions/RemoveUserServicesAction.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/actions/RemoveUserServicesAction.java b/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/actions/RemoveUserServicesAction.java
new file mode 100644
index 0000000..43a43ba
--- /dev/null
+++ b/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/actions/RemoveUserServicesAction.java
@@ -0,0 +1,58 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+package org.apache.taverna.workbench.ui.servicepanel.actions;
+
+import static javax.swing.JOptionPane.YES_NO_OPTION;
+import static javax.swing.JOptionPane.YES_OPTION;
+import static javax.swing.JOptionPane.showConfirmDialog;
+
+import java.awt.event.ActionEvent;
+
+import javax.swing.AbstractAction;
+import javax.swing.JLabel;
+
+import org.apache.taverna.servicedescriptions.ServiceDescriptionProvider;
+import org.apache.taverna.servicedescriptions.ServiceDescriptionRegistry;
+
+@SuppressWarnings("serial")
+public class RemoveUserServicesAction extends AbstractAction {
+ private static final String CONFIRM_MESSAGE = "You are about to remove all services you have added. <br>"
+ + "Are you <b>really</b> sure you want to do this?";
+ private final ServiceDescriptionRegistry serviceDescriptionRegistry;
+
+ public RemoveUserServicesAction(
+ ServiceDescriptionRegistry serviceDescriptionRegistry) {
+ super("Remove all user added service providers");
+ this.serviceDescriptionRegistry = serviceDescriptionRegistry;
+ }
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ int option = showConfirmDialog(null, new JLabel("<html><body>"
+ + CONFIRM_MESSAGE + "</body></html>"),
+ "Confirm service deletion", YES_NO_OPTION);
+
+ if (option == YES_OPTION)
+ for (ServiceDescriptionProvider provider : serviceDescriptionRegistry
+ .getUserAddedServiceProviders())
+ serviceDescriptionRegistry
+ .removeServiceDescriptionProvider(provider);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/actions/RestoreDefaultServicesAction.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/actions/RestoreDefaultServicesAction.java b/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/actions/RestoreDefaultServicesAction.java
new file mode 100644
index 0000000..e7a5f46
--- /dev/null
+++ b/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/actions/RestoreDefaultServicesAction.java
@@ -0,0 +1,49 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+package org.apache.taverna.workbench.ui.servicepanel.actions;
+
+import java.awt.event.ActionEvent;
+
+import javax.swing.AbstractAction;
+
+import org.apache.taverna.servicedescriptions.ConfigurableServiceProvider;
+import org.apache.taverna.servicedescriptions.ServiceDescriptionProvider;
+import org.apache.taverna.servicedescriptions.ServiceDescriptionRegistry;
+
+@SuppressWarnings("serial")
+public class RestoreDefaultServicesAction extends AbstractAction {
+ private final ServiceDescriptionRegistry serviceDescriptionRegistry;
+
+ public RestoreDefaultServicesAction(
+ ServiceDescriptionRegistry serviceDescriptionRegistry) {
+ super("Restore default service providers");
+ this.serviceDescriptionRegistry = serviceDescriptionRegistry;
+ }
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ for (ServiceDescriptionProvider provider : serviceDescriptionRegistry
+ .getDefaultServiceDescriptionProviders()) {
+ if (!(provider instanceof ConfigurableServiceProvider))
+ continue;
+ serviceDescriptionRegistry.addServiceDescriptionProvider(provider);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/config/ServiceDescriptionConfigPanel.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/config/ServiceDescriptionConfigPanel.java b/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/config/ServiceDescriptionConfigPanel.java
new file mode 100644
index 0000000..61a7d1a
--- /dev/null
+++ b/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/config/ServiceDescriptionConfigPanel.java
@@ -0,0 +1,181 @@
+/*******************************************************************************
+ * 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.workbench.ui.servicepanel.config;
+
+import static java.awt.GridBagConstraints.HORIZONTAL;
+import static java.awt.GridBagConstraints.NONE;
+import static java.awt.GridBagConstraints.WEST;
+
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.Insets;
+import java.awt.event.ActionEvent;
+
+import javax.swing.AbstractAction;
+import javax.swing.JButton;
+import javax.swing.JCheckBox;
+import javax.swing.JPanel;
+import javax.swing.JTextArea;
+import javax.swing.border.EmptyBorder;
+
+import org.apache.taverna.servicedescriptions.ConfigurableServiceProvider;
+import org.apache.taverna.servicedescriptions.ServiceDescriptionProvider;
+import org.apache.taverna.servicedescriptions.ServiceDescriptionRegistry;
+import org.apache.taverna.servicedescriptions.ServiceDescriptionsConfiguration;
+import org.apache.taverna.workbench.helper.Helper;
+
+@SuppressWarnings("serial")
+public class ServiceDescriptionConfigPanel extends JPanel {
+ private static final String REMOVE_PERMANENTLY = "Allow permanent removal of default service providers";
+ private static final String INCLUDE_DEFAULTS = "Include default service providers";
+
+ private final ServiceDescriptionsConfiguration config;
+ private JCheckBox includeDefaults;
+ private JCheckBox removePermanently;
+ private final ServiceDescriptionRegistry serviceDescRegistry;
+
+ public ServiceDescriptionConfigPanel(ServiceDescriptionsConfiguration config,
+ ServiceDescriptionRegistry serviceDescRegistry) {
+ super(new GridBagLayout());
+ this.config = config;
+ this.serviceDescRegistry = serviceDescRegistry;
+ initialize();
+ }
+
+ private void initialize() {
+ removeAll();
+
+ GridBagConstraints gbc = new GridBagConstraints();
+
+ // Title describing what kind of settings we are configuring here
+ JTextArea descriptionText = new JTextArea(
+ "Configure behaviour of default service providers in Service Panel");
+ descriptionText.setLineWrap(true);
+ descriptionText.setWrapStyleWord(true);
+ descriptionText.setEditable(false);
+ descriptionText.setFocusable(false);
+ descriptionText.setBorder(new EmptyBorder(10, 10, 10, 10));
+ gbc.gridx = 0;
+ gbc.gridy = 0;
+ gbc.anchor = WEST;
+ gbc.fill = HORIZONTAL;
+ add(descriptionText, gbc);
+
+ includeDefaults = new JCheckBox(INCLUDE_DEFAULTS);
+ gbc.gridx = 0;
+ gbc.gridy = 1;
+ gbc.anchor = WEST;
+ gbc.fill = NONE;
+ gbc.insets = new Insets(10, 0, 0, 0);
+ add(includeDefaults, gbc);
+
+ removePermanently = new JCheckBox(REMOVE_PERMANENTLY);
+ gbc.gridx = 0;
+ gbc.gridy = 2;
+ gbc.insets = new Insets(0, 0, 0, 0);
+ add(removePermanently, gbc);
+
+ // Filler
+ gbc.gridx = 0;
+ gbc.gridy = 3;
+ gbc.weighty = 1;
+ gbc.weightx = 1;
+ gbc.fill = GridBagConstraints.BOTH;
+ gbc.insets = new Insets(10, 0, 0, 0);
+ add(createButtonPanel(), gbc);
+
+ setFields(config);
+ }
+
+ /**
+ * Create the panel to contain the buttons
+ *
+ * @return
+ */
+ private JPanel createButtonPanel() {
+ final JPanel panel = new JPanel();
+
+ /**
+ * The helpButton shows help about the current component
+ */
+ JButton helpButton = new JButton(new AbstractAction("Help") {
+ @Override
+ public void actionPerformed(ActionEvent arg0) {
+ Helper.showHelp(panel);
+ }
+ });
+ panel.add(helpButton);
+
+ /**
+ * The resetButton changes the property values shown to those
+ * corresponding to the configuration currently applied.
+ */
+ JButton resetButton = new JButton(new AbstractAction("Reset") {
+ @Override
+ public void actionPerformed(ActionEvent arg0) {
+ setFields(config);
+ }
+ });
+ panel.add(resetButton);
+
+ /**
+ * The applyButton applies the shown field values to the
+ * {@link HttpProxyConfiguration} and saves them for future.
+ */
+ JButton applyButton = new JButton(new AbstractAction("Apply") {
+ @Override
+ public void actionPerformed(ActionEvent arg0) {
+ applySettings();
+ setFields(config);
+ }
+ });
+ panel.add(applyButton);
+
+ return panel;
+ }
+
+ protected void applySettings() {
+ // Include default service providers
+ config.setIncludeDefaults(includeDefaults.isSelected());
+ for (ServiceDescriptionProvider provider : serviceDescRegistry
+ .getDefaultServiceDescriptionProviders()) {
+ if (! (provider instanceof ConfigurableServiceProvider))
+ continue;
+ if (config.isIncludeDefaults())
+ serviceDescRegistry.addServiceDescriptionProvider(provider);
+ else
+ serviceDescRegistry.removeServiceDescriptionProvider(provider);
+ }
+
+ // Allow permanent removal of default service providers
+ config.setRemovePermanently(removePermanently.isSelected());
+ }
+
+ /**
+ * Set the shown configuration field values to those currently in use
+ * (i.e. last saved configuration).
+ *
+ */
+ private void setFields(ServiceDescriptionsConfiguration configurable) {
+ includeDefaults.setSelected(configurable.isIncludeDefaults());
+ removePermanently.setSelected(configurable.isRemovePermanently());
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/config/ServiceDescriptionConfigUIFactory.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/config/ServiceDescriptionConfigUIFactory.java b/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/config/ServiceDescriptionConfigUIFactory.java
new file mode 100644
index 0000000..a95b644
--- /dev/null
+++ b/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/config/ServiceDescriptionConfigUIFactory.java
@@ -0,0 +1,56 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+package org.apache.taverna.workbench.ui.servicepanel.config;
+
+import javax.swing.JPanel;
+
+import uk.org.taverna.configuration.Configurable;
+import uk.org.taverna.configuration.ConfigurationUIFactory;
+
+import org.apache.taverna.servicedescriptions.ServiceDescriptionRegistry;
+import org.apache.taverna.servicedescriptions.ServiceDescriptionsConfiguration;
+
+public class ServiceDescriptionConfigUIFactory implements ConfigurationUIFactory {
+ private ServiceDescriptionsConfiguration serviceDescriptionsConfiguration;
+ private ServiceDescriptionRegistry serviceDescriptionRegistry;
+
+ @Override
+ public boolean canHandle(String uuid) {
+ return uuid.equals(serviceDescriptionsConfiguration.getUUID());
+ }
+
+ @Override
+ public Configurable getConfigurable() {
+ return serviceDescriptionsConfiguration;
+ }
+
+ @Override
+ public JPanel getConfigurationPanel() {
+ return new ServiceDescriptionConfigPanel(serviceDescriptionsConfiguration, serviceDescriptionRegistry);
+ }
+
+ public void setServiceDescriptionRegistry(ServiceDescriptionRegistry serviceDescriptionRegistry) {
+ this.serviceDescriptionRegistry = serviceDescriptionRegistry;
+ }
+
+ public void setServiceDescriptionsConfiguration(ServiceDescriptionsConfiguration serviceDescriptionsConfiguration) {
+ this.serviceDescriptionsConfiguration = serviceDescriptionsConfiguration;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/menu/AddServiceProviderMenu.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/menu/AddServiceProviderMenu.java b/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/menu/AddServiceProviderMenu.java
new file mode 100644
index 0000000..6ac89e2
--- /dev/null
+++ b/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/menu/AddServiceProviderMenu.java
@@ -0,0 +1,112 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+package org.apache.taverna.workbench.ui.servicepanel.menu;
+
+import java.awt.Component;
+import java.awt.event.ActionEvent;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+import javax.swing.AbstractAction;
+import javax.swing.JButton;
+import javax.swing.JPopupMenu;
+
+import org.apache.taverna.servicedescriptions.ConfigurableServiceProvider;
+import org.apache.taverna.servicedescriptions.ServiceDescription;
+import org.apache.taverna.servicedescriptions.ServiceDescriptionProvider;
+import org.apache.taverna.servicedescriptions.ServiceDescriptionRegistry;
+import org.apache.taverna.workbench.ui.servicepanel.ServicePanel;
+import org.apache.taverna.workbench.ui.servicepanel.actions.AddServiceProviderAction;
+
+/**
+ * A menu that provides a set up menu actions for adding new service providers
+ * to the Service Panel.
+ * <p>
+ * The Actions are discovered from the {@link ServiceDescriptionProvider}s found
+ * through the SPI.
+ *
+ * @author Stuart Owen
+ * @author Stian Soiland-Reyes
+ * @author Alan R Williams
+ *
+ * @see ServiceDescription
+ * @see ServicePanel
+ * @see ServiceDescriptionRegistry#addServiceDescriptionProvider(ServiceDescriptionProvider)
+ */
+@SuppressWarnings("serial")
+public class AddServiceProviderMenu extends JButton {
+ public static class ServiceProviderComparator implements
+ Comparator<ServiceDescriptionProvider> {
+ @Override
+ public int compare(ServiceDescriptionProvider o1,
+ ServiceDescriptionProvider o2) {
+ return o1.getName().toLowerCase().compareTo(
+ o2.getName().toLowerCase());
+ }
+ }
+
+ private final static String ADD_SERVICE_PROVIDER_MENU_NAME = "Import new services";
+
+ private final ServiceDescriptionRegistry serviceDescriptionRegistry;
+
+ public AddServiceProviderMenu(ServiceDescriptionRegistry serviceDescriptionRegistry) {
+ super();
+ this.serviceDescriptionRegistry = serviceDescriptionRegistry;
+
+ final Component c = createCustomComponent();
+ setAction(new AbstractAction(ADD_SERVICE_PROVIDER_MENU_NAME) {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ ((JPopupMenu) c).show(AddServiceProviderMenu.this, 0,
+ AddServiceProviderMenu.this.getHeight());
+ }
+ });
+ }
+
+ private Component createCustomComponent() {
+ JPopupMenu addServiceMenu = new JPopupMenu(
+ ADD_SERVICE_PROVIDER_MENU_NAME);
+ addServiceMenu.setToolTipText("Add a new service provider");
+ boolean isEmpty = true;
+ List<ConfigurableServiceProvider> providers = new ArrayList<>(
+ serviceDescriptionRegistry.getUnconfiguredServiceProviders());
+ Collections.sort(providers, new ServiceProviderComparator());
+ for (ConfigurableServiceProvider provider : providers) {
+ /*
+ * Skip BioCatalogue's ConfigurableServiceProviderS as they should
+ * not be used to add servcie directlry but rather though the
+ * Service Catalogue perspective
+ */
+ if (provider.getId().toLowerCase().contains("servicecatalogue"))
+ continue;
+
+ AddServiceProviderAction addAction = new AddServiceProviderAction(
+ provider, this);
+ addAction.setServiceDescriptionRegistry(serviceDescriptionRegistry);
+ addServiceMenu.add(addAction);
+ isEmpty = false;
+ }
+ if (isEmpty)
+ addServiceMenu.setEnabled(false);
+ return addServiceMenu;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/tree/Filter.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/tree/Filter.java b/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/tree/Filter.java
new file mode 100644
index 0000000..476aa9c
--- /dev/null
+++ b/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/tree/Filter.java
@@ -0,0 +1,32 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+package org.apache.taverna.workbench.ui.servicepanel.tree;
+
+import javax.swing.tree.DefaultMutableTreeNode;
+
+public interface Filter {
+ boolean pass(DefaultMutableTreeNode node);
+
+ String filterRepresentation(String original);
+
+ void setSuperseded(boolean superseded);
+
+ boolean isSuperseded();
+}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/tree/FilterTreeCellRenderer.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/tree/FilterTreeCellRenderer.java b/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/tree/FilterTreeCellRenderer.java
new file mode 100644
index 0000000..ce1f8cd
--- /dev/null
+++ b/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/tree/FilterTreeCellRenderer.java
@@ -0,0 +1,58 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+package org.apache.taverna.workbench.ui.servicepanel.tree;
+
+import static org.apache.taverna.workbench.icons.WorkbenchIcons.folderClosedIcon;
+import static org.apache.taverna.workbench.icons.WorkbenchIcons.folderOpenIcon;
+
+import java.awt.Component;
+
+import javax.swing.JTree;
+import javax.swing.tree.DefaultTreeCellRenderer;
+
+@SuppressWarnings("serial")
+public class FilterTreeCellRenderer extends DefaultTreeCellRenderer {
+ private Filter filter = null;
+
+ @Override
+ public Component getTreeCellRendererComponent(JTree tree, Object value,
+ boolean sel, boolean expanded, boolean leaf, int row,
+ boolean hasFocus) {
+
+ super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf,
+ row, hasFocus);
+ Filter filter = getFilter();
+ if (filter != null)
+ setText(filter.filterRepresentation(getText()));
+ if (expanded)
+ setIcon(folderOpenIcon);
+ else
+ setIcon(folderClosedIcon);
+ return this;
+ }
+
+ public Filter getFilter() {
+ return filter;
+ }
+
+ public void setFilter(Filter currentFilter) {
+ this.filter = currentFilter;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/tree/FilterTreeModel.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/tree/FilterTreeModel.java b/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/tree/FilterTreeModel.java
new file mode 100644
index 0000000..e57701e
--- /dev/null
+++ b/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/tree/FilterTreeModel.java
@@ -0,0 +1,91 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+package org.apache.taverna.workbench.ui.servicepanel.tree;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.swing.tree.DefaultTreeModel;
+import javax.swing.tree.TreePath;
+
+import org.apache.log4j.Logger;
+
+public final class FilterTreeModel extends DefaultTreeModel {
+ private static final long serialVersionUID = -8931308369832839862L;
+ private static final Logger logger = Logger
+ .getLogger(FilterTreeModel.class);
+
+ Filter currentFilter;
+
+ public FilterTreeModel(FilterTreeNode node) {
+ this(node, null);
+ }
+
+ public FilterTreeModel(FilterTreeNode node, Filter filter) {
+ super(node);
+ currentFilter = filter;
+ node.setFilter(filter);
+ }
+
+ public void setFilter(Filter filter) {
+ if (root != null) {
+ currentFilter = filter;
+ ((FilterTreeNode) root).setFilter(filter);
+ Object[] path = { root };
+ fireTreeStructureChanged(this, path, null, null);
+ }
+ }
+
+ @Override
+ public int getChildCount(Object parent) {
+ if (parent instanceof FilterTreeNode)
+ return (((FilterTreeNode) parent).getChildCount());
+ return 0;
+ }
+
+ @Override
+ public Object getChild(Object parent, int index) {
+ if (parent instanceof FilterTreeNode)
+ return (((FilterTreeNode) parent).getChildAt(index));
+ return null;
+ }
+
+ /**
+ * @return the currentFilter
+ */
+ public Filter getCurrentFilter() {
+ return currentFilter;
+ }
+
+ public TreePath getTreePathForObjectPath(List<Object> path) {
+ List<FilterTreeNode> resultList = new ArrayList<>();
+ FilterTreeNode current = (FilterTreeNode) root;
+ resultList.add(current);
+ for (int i = 1; (i < path.size()) && (current != null); i++) {
+ logger.debug("Looking in " + current.getUserObject() + " for " + path.get(i));
+ current = current.getChildForObject(path.get(i));
+ if (current != null)
+ resultList.add(current);
+ }
+ if (current != null)
+ return new TreePath(resultList.toArray());
+ return null;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/tree/FilterTreeNode.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/tree/FilterTreeNode.java b/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/tree/FilterTreeNode.java
new file mode 100644
index 0000000..9df6423
--- /dev/null
+++ b/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/tree/FilterTreeNode.java
@@ -0,0 +1,141 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+package org.apache.taverna.workbench.ui.servicepanel.tree;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import javax.swing.tree.DefaultMutableTreeNode;
+
+import org.apache.log4j.Logger;
+
+public class FilterTreeNode extends DefaultMutableTreeNode {
+ private static final long serialVersionUID = 1933553584349932151L;
+ @SuppressWarnings("unused")
+ private static Logger logger = Logger.getLogger(FilterTreeNode.class);
+
+ private Filter filter;
+ private boolean passed = true;
+ private List<FilterTreeNode> filteredChildren = new ArrayList<>();
+
+ public FilterTreeNode(Object userObject) {
+ super(userObject);
+ userObject.toString();
+ }
+
+ public Filter getFilter() {
+ return filter;
+ }
+
+ public void setFilter(Filter filter) {
+ if ((filter == null) || !filter.isSuperseded()) {
+ this.filter = filter;
+ passed = false;
+ filteredChildren.clear();
+ if (filter == null) {
+ passed = true;
+ passFilterDown(null);
+ } else if (filter.pass(this)) {
+ passed = true;
+ passFilterDown(null);
+ } else {
+ passFilterDown(filter);
+ passed = filteredChildren.size() != 0;
+ }
+ }
+ }
+
+ private void passFilterDown(Filter filter) {
+ int realChildCount = super.getChildCount();
+ for (int i = 0; i < realChildCount; i++) {
+ FilterTreeNode realChild = (FilterTreeNode) super.getChildAt(i);
+ realChild.setFilter(filter);
+ if (realChild.isPassed())
+ filteredChildren.add(realChild);
+ }
+ }
+
+ public void add(FilterTreeNode node) {
+ super.add(node);
+ node.setFilter(filter);
+ // TODO work up
+ if (node.isPassed())
+ filteredChildren.add(node);
+ }
+
+ @Override
+ public void remove(int childIndex) {
+ if (filter != null)
+ // as child indexes might be inconsistent..
+ throw new IllegalStateException("Can't remove while the filter is active");
+ super.remove(childIndex);
+ }
+
+ @Override
+ public int getChildCount() {
+ if (filter == null)
+ return super.getChildCount();
+ return filteredChildren.size();
+ }
+
+ @Override
+ public FilterTreeNode getChildAt(int index) {
+ if (filter == null)
+ return (FilterTreeNode) super.getChildAt(index);
+ return filteredChildren.get(index);
+ }
+
+ public boolean isPassed() {
+ return passed;
+ }
+
+ public Set<FilterTreeNode> getLeaves() {
+ Set<FilterTreeNode> result = new HashSet<>();
+ if (super.getChildCount() == 0) {
+ result.add(this);
+ return result;
+ }
+
+ for (int i = 0; i < super.getChildCount(); i++) {
+ FilterTreeNode child = (FilterTreeNode) super.getChildAt(i);
+ result.addAll(child.getLeaves());
+ }
+ return result;
+ }
+
+ public FilterTreeNode getChildForObject(Object userObject) {
+ FilterTreeNode result = null;
+ for (int i=0; (i < super.getChildCount()) && (result == null); i++) {
+ FilterTreeNode child = (FilterTreeNode) super.getChildAt(i);
+ Object nodeObject = child.getUserObject();
+// logger.info("nodeObject is a " + nodeObject.getClass() + " - " +
+// "userObject is a " + userObject.getClass());
+ if (nodeObject.toString().equals(userObject.toString())) {
+ result = child;
+// logger.info(nodeObject + " is equal to " + userObject);
+// } else {
+// logger.info(nodeObject + " is not equal to " + userObject);
+ }
+ }
+ return result;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/tree/FilterTreeSelectionModel.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/tree/FilterTreeSelectionModel.java b/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/tree/FilterTreeSelectionModel.java
new file mode 100644
index 0000000..c9a1315
--- /dev/null
+++ b/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/tree/FilterTreeSelectionModel.java
@@ -0,0 +1,45 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+package org.apache.taverna.workbench.ui.servicepanel.tree;
+
+import javax.swing.tree.DefaultTreeSelectionModel;
+import javax.swing.tree.TreePath;
+import javax.swing.tree.TreeSelectionModel;
+
+public class FilterTreeSelectionModel extends DefaultTreeSelectionModel{
+ private static final long serialVersionUID = 3127644524735089630L;
+
+ public FilterTreeSelectionModel(){
+ super();
+ setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
+ }
+
+ @Override
+ public void setSelectionPath(TreePath path) {
+ /*
+ * Nothing happens here - only calls to mySetSelectionPath() will have
+ * the effect of a node being selected.
+ */
+ }
+
+ public void mySetSelectionPath(TreePath path) {
+ super.setSelectionPath(path);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/tree/MyFilter.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/tree/MyFilter.java b/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/tree/MyFilter.java
new file mode 100644
index 0000000..9c1a170
--- /dev/null
+++ b/taverna-activity-palette-ui/src/main/java/org/apache/taverna/workbench/ui/servicepanel/tree/MyFilter.java
@@ -0,0 +1,88 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+package org.apache.taverna.workbench.ui.servicepanel.tree;
+
+import javax.swing.tree.DefaultMutableTreeNode;
+
+public class MyFilter implements Filter {
+ private static final String HTML_MATCH_END = "</font><font color=\"black\">";
+ private static final String HTML_MATCH_START = "</font><font color=\"red\">";
+ private static final String HTML_POSTFIX = "</font></html>";
+ private static final String HTML_PREFIX = "<html><font color=\"black\">";
+
+ private String filterString;
+ private boolean superseded;
+ private String filterLowerCase;
+
+ public MyFilter(String filterString) {
+ this.filterString = filterString;
+ this.filterLowerCase = filterString.toLowerCase();
+ this.superseded = false;
+ }
+
+ private boolean basicFilter(DefaultMutableTreeNode node) {
+ if (filterString.isEmpty())
+ return true;
+ return node.getUserObject().toString().toLowerCase()
+ .contains(filterLowerCase);
+ }
+
+ @Override
+ public boolean pass(DefaultMutableTreeNode node) {
+ return basicFilter(node);
+ }
+
+ @Override
+ public String filterRepresentation(String original) {
+ StringBuilder sb = new StringBuilder(HTML_PREFIX);
+ int from = 0;
+ String originalLowerCase = original.toLowerCase();
+ int index = originalLowerCase.indexOf(filterLowerCase, from);
+ while (index > -1) {
+ sb.append(original.substring(from, index));
+ sb.append(HTML_MATCH_START);
+ sb.append(original.substring(index,
+ index + filterLowerCase.length()));
+ sb.append(HTML_MATCH_END);
+ from = index + filterLowerCase.length();
+ index = originalLowerCase.indexOf(filterLowerCase, from);
+ }
+ if (from < original.length())
+ sb.append(original.substring(from, original.length()));
+ return sb.append(HTML_POSTFIX).toString();
+ }
+
+ /**
+ * @return the superseded
+ */
+ @Override
+ public boolean isSuperseded() {
+ return superseded;
+ }
+
+ /**
+ * @param superseded
+ * the superseded to set
+ */
+ @Override
+ public void setSuperseded(boolean superseded) {
+ this.superseded = superseded;
+ }
+}