http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-helper-api/src/main/java/org/apache/taverna/workbench/helper/HelpCollator.java
----------------------------------------------------------------------
diff --git 
a/taverna-helper-api/src/main/java/org/apache/taverna/workbench/helper/HelpCollator.java
 
b/taverna-helper-api/src/main/java/org/apache/taverna/workbench/helper/HelpCollator.java
new file mode 100644
index 0000000..90f7874
--- /dev/null
+++ 
b/taverna-helper-api/src/main/java/org/apache/taverna/workbench/helper/HelpCollator.java
@@ -0,0 +1,326 @@
+/*
+* 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.helper;
+
+import java.awt.Component;
+import java.io.IOException;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.MissingResourceException;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.help.BadIDException;
+import javax.help.HelpSet;
+import javax.help.HelpSetException;
+import javax.help.Map.ID;
+import javax.help.TryMap;
+import javax.swing.JTree;
+import javax.swing.tree.DefaultMutableTreeNode;
+import javax.swing.tree.TreePath;
+
+import org.apache.log4j.Logger;
+
+/**
+ * This class loads the {@link HelpSet} and also deals with the registration of
+ * ids and the decoding from a {@link Component} to the corresponding id. These
+ * two sets of functionality should possibly be separated.
+ * 
+ * @author alanrw
+ */
+// TODO Convert to a bean
+public final class HelpCollator {
+       private static Logger logger = Logger.getLogger(HelpCollator.class);
+       /**
+        * The HelpSet that is being used.
+        */
+       private static HelpSet hs = null;
+       /**
+        * The mapping from components to ids. This is used because of problems 
with
+        * CSH throwing exceptions because it tried to use ids that were not in 
the
+        * map.
+        */
+       private static Map<Component, String> idMap;
+       /**
+        * Indicates whether the HelpCollator has been initialized.
+        */
+       private static boolean initialized = false;
+       /**
+        * A Pattern for normalizing the ids.
+        */
+       private static Pattern nonAlphanumeric;
+       /**
+        * The emptyHelp is set if the HelpCollator was unable to read the
+        */
+       private static boolean emptyHelp = true;
+       private static int TIMEOUT = 5000;
+
+       private static String externalHelpSetURL = 
"http://www.mygrid.org.uk/taverna/helpset/";
+                       + version() + "/helpset.hs";
+
+       // private static Profile profile = 
ProfileFactory.getInstance().getProfile();
+       private static String version() {
+               return "NO-VERSION";//profile.getVersion();
+               // TODO find a better way to find the version
+       }
+
+       /**
+        * Attempt to read the up-to-date HelpSet from the web
+        */
+       private static void readExternalHelpSet() {
+               try {
+                       URL url = new URL(externalHelpSetURL);
+                       checkConnection(url);
+                       hs = new HelpSet(null, url);
+                       if (hs.getLocalMap() == null) {
+                           hs = null;
+                               logger.error("Helpset from " + 
externalHelpSetURL
+                                               + " local map was null");
+                       } else
+                               logger.info("Read external help set from " + 
externalHelpSetURL);
+               } catch (MissingResourceException e) {
+                   logger.error("No external HelpSet URL specified", e);
+               } catch (MalformedURLException e) {
+                   logger.error("External HelpSet URL is malformed", e);
+               } catch (HelpSetException e) {
+                   logger.error("External HelpSet could not be read", e);
+               } catch (IOException e) {
+                       logger.error("IOException reading External HelpSet", e);
+               }
+       }
+
+       private static void checkConnection(URL url) throws IOException {
+               if (!url.getProtocol().startsWith("http"))
+                       return;
+               HttpURLConnection connection = (HttpURLConnection) 
url.openConnection();
+               connection.setReadTimeout(TIMEOUT);
+               connection.setConnectTimeout(TIMEOUT);
+               connection.setRequestMethod("HEAD");
+               connection.getInputStream().close();
+               connection.disconnect();
+       }
+
+       /**
+        * This methods creates a HelpSet based upon, in priority, the external
+        * HelpSet, then a newly created empty HelpSet.
+        */
+       private static void initialize() {
+               if (initialized)
+                       return;
+               readExternalHelpSet();
+               if (hs == null) {
+                       hs = new HelpSet();
+                       hs.setLocalMap(new TryMap());
+               } else {
+                       logger.trace("EmptyHelp set to false");
+                       emptyHelp = false;
+               }
+               idMap = new HashMap<>();
+               nonAlphanumeric = Pattern.compile("[^a-z0-9\\.]");
+               initialized = true;
+       }
+
+       /**
+        * Indicates if an empty HelpSet is being used
+        *
+        * @return
+        */
+       public static boolean isEmptyHelp() {
+               return emptyHelp;
+       }
+
+       public static URL getURLFromID(String id) throws BadIDException,
+                       MalformedURLException {
+               initialize();
+               logger.trace("Looking for id: " + id);
+               ID theId = ID.create(id, hs);
+               if (theId == null)
+                       return null;
+               return hs.getCombinedMap().getURLFromID(theId);
+       }
+
+       /**
+        * Register a component under the specified id. The method checks that 
the
+        * id is known to the HelpSet's map.
+        * 
+        * @param component
+        * @param id
+        */
+       public static void registerComponent(Component component, String id) {
+               logger.trace("Attempting to register " + id);
+               initialize();
+               String normalizedId = normalizeString(id.toLowerCase());
+               if (idMap.containsKey(component)) {
+                       logger.info("Registered " + normalizedId);
+                       return;
+               }
+
+               /*
+                * If Workbench is started up while there is no network 
connection -
+                * hs.getLocalMap() is null for some reason
+                */
+               if (hs != null && hs.getLocalMap() != null
+                               && hs.getLocalMap().isValidID(normalizedId, 
hs)) {
+                       idMap.put(component, normalizedId);
+                       logger.info("Registered " + normalizedId);
+               } else
+                       logger.warn("Refused to register component as " + 
normalizedId
+                                       + " not in map");
+       }
+
+       /**
+        * Register a component. Since no id is specified, the HelpCollator 
takes
+        * the canonical name of the component's class. This is useful when an
+        * explicit hierarchy-based approach has been taken.
+        *
+        * @param component
+        */
+       public static void registerComponent(Component component) {
+               String canonicalName = component.getClass().getCanonicalName();
+               if (canonicalName != null)
+                       registerComponent(component, canonicalName);
+       }
+
+       /**
+        * Register a component based upon its parent's class and a suffix
+        * indicating the component's purpose in the parent.
+        *
+        * @param component
+        * @param parent
+        * @param suffix
+        */
+       public static void registerComponent(Component component, Object parent,
+                       String suffix) {
+               String canonicalName = parent.getClass().getCanonicalName();
+               if (canonicalName != null)
+                       registerComponent(component, canonicalName + "-" + 
suffix);
+       }
+
+       /**
+        * Try to find an id for the Component. This code should be re-written 
when
+        * we have more experience in how to couple the UI and HelpSets.
+        *
+        * @param c
+        * @return
+        */
+       static String getHelpID(Component c) {
+               initialize();
+               boolean found = false;
+               String result = null;
+               if (c instanceof JTree) {
+                       String idInTree = getHelpIDInTree((JTree) c);
+                       if (idInTree != null) {
+                               found = true;
+                               result = idInTree;
+                       }
+               }
+               Component working = c;
+               if (c != null)
+                       logger.trace("Starting at a " + working.getClass());
+               while (!found && (working != null)) {
+                       if (idMap.containsKey(working)) {
+                               result = idMap.get(working);
+                               found = true;
+                               logger.trace("Found component id " + result);
+                       } else {
+                               String className = 
working.getClass().getCanonicalName();
+                               if (hs.getLocalMap().isValidID(className, hs)) {
+                                       result = className;
+                                       found = true;
+                                       logger.trace("Found class name " + 
result);
+                               }
+                       }
+                       if (!found) {
+                               working = working.getParent();
+                               if (working != null)
+                                       logger.trace("Moved up to a " + 
working.getClass());
+                       }
+               }
+               return result;
+       }
+
+       /**
+        * Change the input String into an id that contains only alphanumeric
+        * characters or hyphens.
+        *
+        * @param input
+        * @return
+        */
+       private static String normalizeString(String input) {
+               Matcher m = nonAlphanumeric.matcher(input);
+               return m.replaceAll("-");
+       }
+
+       /**
+        * If help is sought on part of a JTree, then this method attempts to 
find a
+        * node of the tree that can be mapped to an id. The possibilities are 
ad
+        * hoc and should be re-examined when more experience is gained.
+        * 
+        * @param c
+        * @return
+        */
+       private static String getHelpIDInTree(JTree c) {
+               initialize();
+
+               TreePath tp = c.getSelectionPath();
+               if (tp == null)
+                       return null;
+
+               Object o = tp.getLastPathComponent();
+               if (o == null)
+                       return null;
+
+               if (o instanceof DefaultMutableTreeNode) {
+                       DefaultMutableTreeNode dmtn = (DefaultMutableTreeNode) 
o;
+                       if (dmtn.getUserObject() != null)
+                               o = dmtn.getUserObject();
+               }
+
+               String className = o.getClass().getCanonicalName();
+
+               logger.trace("Tree node as a string is " + o);
+
+               String possibility = 
normalizeString(o.toString().toLowerCase());
+
+               logger.trace("Normalized is " + possibility);
+               logger.trace("Tree node class name is " + className);
+
+               possibility = className + "-" + possibility;
+
+               logger.trace("Possibility is " + possibility);
+
+               String result;
+               if (hs.getLocalMap().isValidID(possibility, hs)) {
+                       result = possibility;
+                       logger.trace("Accepted tree node " + result);
+               } else if (hs.getLocalMap().isValidID(className, hs)) {
+                       result = className;
+                       logger.trace("Found tree node class name " + result);
+               } else {
+                       result = null;
+               }
+
+               logger.debug("Tree node is a " + o.getClass());
+               return result;
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-helper-api/src/main/java/org/apache/taverna/workbench/helper/HelpEnabledDialog.java
----------------------------------------------------------------------
diff --git 
a/taverna-helper-api/src/main/java/org/apache/taverna/workbench/helper/HelpEnabledDialog.java
 
b/taverna-helper-api/src/main/java/org/apache/taverna/workbench/helper/HelpEnabledDialog.java
new file mode 100644
index 0000000..0d3bbdf
--- /dev/null
+++ 
b/taverna-helper-api/src/main/java/org/apache/taverna/workbench/helper/HelpEnabledDialog.java
@@ -0,0 +1,117 @@
+/*
+* 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.helper;
+
+import static org.apache.taverna.workbench.MainWindow.getMainWindow;
+import static 
org.apache.taverna.workbench.helper.HelpCollator.registerComponent;
+import static org.apache.taverna.workbench.helper.Helper.setKeyCatcher;
+
+import java.awt.Dialog;
+import java.awt.Frame;
+import java.awt.HeadlessException;
+
+import javax.swing.JDialog;
+
+/**
+ * This class extends JDialog to register the dialog and also attach a key
+ * catcher so that F1 is interpreted as help
+ *
+ * @author alanrw
+ */
+public class HelpEnabledDialog extends JDialog {
+       private static final long serialVersionUID = -5068807887477419800L;
+
+       /**
+        * Create a HelpEnabledDialog, register it (if possible) with the
+        * HelpCollator and attach a keycatcher.
+        *
+        * @param owner
+        * @param title
+        * @param modal
+        * @param id
+        * @throws HeadlessException
+        */
+       public HelpEnabledDialog(Frame owner, String title, boolean modal, 
String id)
+                       throws HeadlessException {
+               super(owner == null ? getMainWindow() : owner, title, modal);
+
+               if (id != null)
+                       registerComponent(this, id);
+               else if (owner != null)
+                       registerComponent(this, 
owner.getClass().getCanonicalName()
+                                       + "-dialog");
+               else if (title != null && !title.isEmpty())
+                       registerComponent(this, title);
+               setKeyCatcher(this);
+       }
+
+       /**
+        * Create a HelpEnabledDialog, register it (if possible) with the
+        * HelpCollator and attach a keycatcher.
+        *
+        * @param owner
+        * @param title
+        * @param modal
+        * @param id
+        * @throws HeadlessException
+        */
+       public HelpEnabledDialog(Dialog owner, String title, boolean modal,
+                       String id) throws HeadlessException {
+               super(owner, title, modal);
+               if (id != null)
+                       registerComponent(this, id);
+               else if (owner != null)
+                       registerComponent(this, 
owner.getClass().getCanonicalName()
+                                       + "-dialog");
+               setKeyCatcher(this);
+       }
+
+       /**
+        * Create a HelpEnabledDialog, register it (if possible) with the
+        * HelpCollator and attach a keycatcher.
+        *
+        * @param owner
+        * @param title
+        * @param modal
+        * @throws HeadlessException
+        */
+       public HelpEnabledDialog(Frame parent, String title, boolean modal) {
+               this(parent, title, modal, null);
+       }
+
+       /**
+        * Create a HelpEnabledDialog, register it (if possible) with the
+        * HelpCollator and attach a keycatcher.
+        *
+        * @param owner
+        * @param title
+        * @param modal
+        * @throws HeadlessException
+        */
+       public HelpEnabledDialog(Dialog parent, String title, boolean modal) {
+               this(parent, title, modal, null);
+       }
+
+       @Override
+       public void setVisible(boolean b) {
+               setLocationRelativeTo(getParent());
+               super.setVisible(b);
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-helper-api/src/main/java/org/apache/taverna/workbench/helper/Helper.java
----------------------------------------------------------------------
diff --git 
a/taverna-helper-api/src/main/java/org/apache/taverna/workbench/helper/Helper.java
 
b/taverna-helper-api/src/main/java/org/apache/taverna/workbench/helper/Helper.java
new file mode 100644
index 0000000..f5315d5
--- /dev/null
+++ 
b/taverna-helper-api/src/main/java/org/apache/taverna/workbench/helper/Helper.java
@@ -0,0 +1,203 @@
+/*
+* 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.helper;
+
+import static java.awt.Desktop.getDesktop;
+import static java.awt.MouseInfo.getPointerInfo;
+import static javax.swing.JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT;
+import static javax.swing.KeyStroke.getKeyStroke;
+import static org.apache.taverna.workbench.helper.HelpCollator.getHelpID;
+import static org.apache.taverna.workbench.helper.HelpCollator.getURLFromID;
+
+import java.awt.AWTEvent;
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.Point;
+import java.awt.event.ActionEvent;
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.net.URL;
+
+import javax.help.BadIDException;
+import javax.swing.AbstractAction;
+import javax.swing.ActionMap;
+import javax.swing.InputMap;
+import javax.swing.JComponent;
+import javax.swing.JRootPane;
+import javax.swing.RootPaneContainer;
+
+import org.apache.log4j.Logger;
+
+/**
+ * This class creates the dialogs for the presentation of the HelpSet held by
+ * the HelpCollator.
+ *
+ * @author alanrw
+ */
+public final class Helper {
+       private static Helper instance;
+       private static Logger logger = Logger.getLogger(Helper.class);
+
+       /**
+        * Create a Helper and initialize the static variables.
+        */
+       private Helper() {
+       }
+
+       /**
+        * Get the singleton instance of Helper. In theory there could be more 
than
+        * one.
+        *
+        * @return
+        */
+       private static Helper getInstance() {
+               if (instance == null)
+                       instance = new Helper();
+               return instance;
+       }
+
+       /**
+        * Show in the current dialog the entry (if any) corresponding to the
+        * specified id.
+        *
+        * @param id
+        */
+       private static void showID(String id) {
+               getInstance();
+               try {
+                       URL result = getURLFromID(id);
+                       if (result == null)
+                               result = getURLFromID("home");
+                       getDesktop().browse(result.toURI());
+               } catch (BadIDException | IOException | URISyntaxException e) {
+                       logger.error(e);
+               }
+       }
+
+       /**
+        * Show the most suitable help for the specified component.
+        *
+        * @param c
+        */
+       public static void showHelp(Component c) {
+               showID(getHelpID(c));
+       }
+
+       /**
+        * Display the default home page help.
+        *
+        * @param e
+        */
+       public static void displayDefaultHelp(AWTEvent e) {
+               showID("home");
+       }
+
+       public static void displayFieldLevelHelp(ActionEvent e) {
+               //
+       }
+
+       private static final String HELP_KEY = "F1";
+
+       /**
+        * Associated the specified action with key presses in the specified
+        * component.
+        * 
+        * @param component
+        * @param theAction
+        */
+       public static void setKeyCatcher(final JComponent component,
+                       final AbstractAction theAction) {
+               InputMap oldInputMap = component
+                               
.getInputMap(WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
+               InputMap newInputMap = new InputMap();
+               newInputMap.setParent(oldInputMap);
+               newInputMap.put(getKeyStroke(HELP_KEY), "doSomething");
+               component.setInputMap(WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, 
newInputMap);
+               ActionMap oldActionMap = component.getActionMap();
+               ActionMap newActionMap = new ActionMap();
+               newActionMap.setParent(oldActionMap);
+               newActionMap.put("doSomething", theAction);
+               component.setActionMap(newActionMap);
+       }
+
+       /**
+        * Set up a key-press catcher for the specified component such that 
when F1
+        * is pressed it should help for the component where the cursor is.
+        *
+        * @param rootpanecontainer
+        */
+       public static void setKeyCatcher(final RootPaneContainer 
rootpanecontainer) {
+               @SuppressWarnings("serial")
+               AbstractAction theAction = new AbstractAction() {
+                       @Override
+                       public void actionPerformed(ActionEvent evt) {
+                               Component component = (Component) 
rootpanecontainer;
+                               Container container = (Container) 
rootpanecontainer;
+                               logger.info("frame action F1 pressed with 
source "
+                                               + 
evt.getSource().getClass().getName());
+                               Point mousePosition = 
getPointerInfo().getLocation();
+                               Point framePosition = component.getLocation();
+                               Point relativePosition = (Point) 
mousePosition.clone();
+                               relativePosition.translate(-framePosition.x, 
-framePosition.y);
+                               Component c = 
container.findComponentAt(relativePosition);
+                               if (c != null)
+                                       logger.info("F1 pressed in a " + 
c.getClass().getName());
+                               showHelpWithinContainer(rootpanecontainer, c);
+                       }
+               };
+
+               JRootPane pane = rootpanecontainer.getRootPane();
+               setKeyCatcher(pane, theAction);
+       }
+
+       /**
+        * Show the help most associated with the specific component within the 
container.
+        *
+        * @param root
+        * @param c
+        */
+       static void showHelpWithinContainer(RootPaneContainer root, Component 
c) {
+               getInstance();
+               showHelp(c);
+       }
+
+       /**
+        * Register a component with the {@link HelpCollator} under the 
specified
+        * id.
+        * 
+        * @param component
+        * @param id
+        */
+       public static void registerComponent(Component component, final String 
id) {
+               HelpCollator.registerComponent(component, id);
+       }
+
+       /**
+        * Register a component with the {@link HelpCollator}.
+        *
+        * @param component
+        * @param parent
+        * @param suffix
+        */
+       public static void registerComponent(Component component, Object parent,
+                       String suffix) {
+               HelpCollator.registerComponent(component, parent, suffix);
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-helper-api/src/main/java/org/apache/taverna/workbench/helper/NonBlockedHelpEnabledDialog.java
----------------------------------------------------------------------
diff --git 
a/taverna-helper-api/src/main/java/org/apache/taverna/workbench/helper/NonBlockedHelpEnabledDialog.java
 
b/taverna-helper-api/src/main/java/org/apache/taverna/workbench/helper/NonBlockedHelpEnabledDialog.java
new file mode 100644
index 0000000..6e94ab2
--- /dev/null
+++ 
b/taverna-helper-api/src/main/java/org/apache/taverna/workbench/helper/NonBlockedHelpEnabledDialog.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.helper;
+
+import static java.awt.Dialog.ModalExclusionType.APPLICATION_EXCLUDE;
+
+import java.awt.Dialog;
+import java.awt.Frame;
+import java.awt.HeadlessException;
+
+/**
+ * @author alanrw
+ */
+public class NonBlockedHelpEnabledDialog extends HelpEnabledDialog {
+       private static final long serialVersionUID = -2455471377333940417L;
+
+       public NonBlockedHelpEnabledDialog(Dialog owner, String title,
+                       boolean modal, String id) throws HeadlessException {
+               super(owner, title, modal, id);
+               this.setModalExclusionType(APPLICATION_EXCLUDE);
+       }
+
+       public NonBlockedHelpEnabledDialog(Frame owner, String title,
+                       boolean modal, String id) throws HeadlessException {
+               super(owner, title, modal, id);
+               this.setModalExclusionType(APPLICATION_EXCLUDE);
+       }
+
+       public NonBlockedHelpEnabledDialog(Frame parent, String title, boolean 
modal) {
+               super(parent, title, modal, null);
+               this.setModalExclusionType(APPLICATION_EXCLUDE);
+       }
+
+       public NonBlockedHelpEnabledDialog(Dialog parent, String title,
+                       boolean modal) {
+               super(parent, title, modal, null);
+               this.setModalExclusionType(APPLICATION_EXCLUDE);
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-httpproxy-config/src/main/java/net/sf/taverna/t2/workbench/httpproxy/config/HttpProxyConfigurationPanel.java
----------------------------------------------------------------------
diff --git 
a/taverna-httpproxy-config/src/main/java/net/sf/taverna/t2/workbench/httpproxy/config/HttpProxyConfigurationPanel.java
 
b/taverna-httpproxy-config/src/main/java/net/sf/taverna/t2/workbench/httpproxy/config/HttpProxyConfigurationPanel.java
deleted file mode 100644
index 18ceeb4..0000000
--- 
a/taverna-httpproxy-config/src/main/java/net/sf/taverna/t2/workbench/httpproxy/config/HttpProxyConfigurationPanel.java
+++ /dev/null
@@ -1,582 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester
- *
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- *
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- 
******************************************************************************/
-package net.sf.taverna.t2.workbench.httpproxy.config;
-
-import static java.awt.GridBagConstraints.BOTH;
-import static java.awt.GridBagConstraints.CENTER;
-import static java.awt.GridBagConstraints.HORIZONTAL;
-import static java.awt.GridBagConstraints.NONE;
-import static java.awt.GridBagConstraints.WEST;
-import static javax.swing.JOptionPane.showMessageDialog;
-import static javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED;
-import static javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED;
-import static net.sf.taverna.t2.workbench.helper.Helper.showHelp;
-import static 
uk.org.taverna.configuration.proxy.HttpProxyConfiguration.PROXY_USE_OPTION;
-import static 
uk.org.taverna.configuration.proxy.HttpProxyConfiguration.SYSTEM_NON_PROXY_HOSTS;
-import static 
uk.org.taverna.configuration.proxy.HttpProxyConfiguration.SYSTEM_PROXY_HOST;
-import static 
uk.org.taverna.configuration.proxy.HttpProxyConfiguration.SYSTEM_PROXY_PASSWORD;
-import static 
uk.org.taverna.configuration.proxy.HttpProxyConfiguration.SYSTEM_PROXY_PORT;
-import static 
uk.org.taverna.configuration.proxy.HttpProxyConfiguration.SYSTEM_PROXY_USER;
-import static 
uk.org.taverna.configuration.proxy.HttpProxyConfiguration.TAVERNA_NON_PROXY_HOSTS;
-import static 
uk.org.taverna.configuration.proxy.HttpProxyConfiguration.TAVERNA_PROXY_HOST;
-import static 
uk.org.taverna.configuration.proxy.HttpProxyConfiguration.TAVERNA_PROXY_PASSWORD;
-import static 
uk.org.taverna.configuration.proxy.HttpProxyConfiguration.TAVERNA_PROXY_PORT;
-import static 
uk.org.taverna.configuration.proxy.HttpProxyConfiguration.TAVERNA_PROXY_USER;
-import static 
uk.org.taverna.configuration.proxy.HttpProxyConfiguration.USE_NO_PROXY_OPTION;
-import static 
uk.org.taverna.configuration.proxy.HttpProxyConfiguration.USE_SPECIFIED_VALUES_OPTION;
-import static 
uk.org.taverna.configuration.proxy.HttpProxyConfiguration.USE_SYSTEM_PROPERTIES_OPTION;
-
-import java.awt.GridBagConstraints;
-import java.awt.GridBagLayout;
-import java.awt.Insets;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-
-import javax.swing.AbstractAction;
-import javax.swing.ButtonGroup;
-import javax.swing.JButton;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JRadioButton;
-import javax.swing.JScrollPane;
-import javax.swing.JTextArea;
-import javax.swing.JTextField;
-import javax.swing.border.EmptyBorder;
-
-import net.sf.taverna.t2.lang.ui.DialogTextArea;
-import org..taverna.configuration.proxy.HttpProxyConfiguration;
-
-/**
- * The HttpProxyConfigurationPanel provides the user interface to a
- * {@link HttpProxyConfiguration} to determine how HTTP Connections are made by
- * Taverna.
- * 
- * @author alanrw
- * @author David Withers
- */
-public class HttpProxyConfigurationPanel extends JPanel {
-       static final long serialVersionUID = 3668473431971125038L;
-       /**
-        * The size of the field for the JTextFields.
-        */
-       private static int TEXTFIELD_SIZE = 25;
-
-       private final HttpProxyConfiguration httpProxyConfiguration;
-       /**
-        * RadioButtons that are in a common ButtonGroup. Selecting one of them
-        * indicates whether the system http proxy settings, the ad hoc 
specified
-        * values or no proxy settings at all should be used.
-        */
-       private JRadioButton useSystemProperties;
-       private JRadioButton useSpecifiedValues;
-       private JRadioButton useNoProxy;
-       /**
-        * JTextFields and one DialogTextArea to hold the settings for the HTTP
-        * proxy properties. The values are only editable if the user picks
-        * useSpecifiedValues.
-        */
-       private JTextField proxyHostField;
-       private JTextField proxyPortField;
-       private JTextField proxyUserField;
-       private JTextField proxyPasswordField;
-       private DialogTextArea nonProxyHostsArea;
-       private JScrollPane nonProxyScrollPane;
-       /**
-        * A string that indicates which HTTP setting option the user has 
currently
-        * picked. This does not necesarily match that which has been applied.
-        */
-       private String shownOption = USE_SYSTEM_PROPERTIES_OPTION;
-
-       /**
-        * The HttpProxyConfigurationPanel consists of a set of properties 
where the
-        * configuration values for HTTP can be specified and a set of buttons 
where
-        * the more general apply, help etc. appear.
-        */
-       public HttpProxyConfigurationPanel(
-                       HttpProxyConfiguration httpProxyConfiguration) {
-               this.httpProxyConfiguration = httpProxyConfiguration;
-               initComponents();
-       }
-
-       /**
-        * Populates the panel with a representation of the current HTTP proxy
-        * settings for the specified {@link HttpProxyConfiguration} and also 
the
-        * capability to alter them.
-        */
-       private void initComponents() {
-               shownOption = 
httpProxyConfiguration.getProperty(PROXY_USE_OPTION);
-
-               this.setLayout(new GridBagLayout());
-
-               GridBagConstraints gbc = new GridBagConstraints();
-
-               // Title describing what kind of settings we are configuring 
here
-               JTextArea descriptionText = new JTextArea("HTTP proxy 
configuration");
-               descriptionText.setLineWrap(true);
-               descriptionText.setWrapStyleWord(true);
-               descriptionText.setEditable(false);
-               descriptionText.setFocusable(false);
-               descriptionText.setBorder(new EmptyBorder(10, 10, 10, 10));
-               gbc.anchor = WEST;
-               gbc.gridx = 0;
-               gbc.gridy = 0;
-               gbc.gridwidth = 2;
-               gbc.weightx = 1.0;
-               gbc.weighty = 0.0;
-               gbc.fill = HORIZONTAL;
-               this.add(descriptionText, gbc);
-
-               /**
-                * Generate the three radio buttons and put them in a group. 
Each button
-                * is bound to an action that alters the shownOption and 
re-populates
-                * the shown HTTP property fields.
-                */
-               useNoProxy = new JRadioButton("Do not use a proxy");
-               useNoProxy.setAlignmentX(LEFT_ALIGNMENT);
-               gbc.gridx = 0;
-               gbc.gridy = 1;
-               gbc.gridwidth = 2;
-               gbc.weightx = 0.0;
-               gbc.weighty = 0.0;
-               gbc.fill = NONE;
-               gbc.insets = new Insets(10, 0, 0, 0);
-               this.add(useNoProxy, gbc);
-               ActionListener useNoProxyListener = new ActionListener() {
-                       @Override
-                       public void actionPerformed(ActionEvent arg0) {
-                               shownOption = USE_NO_PROXY_OPTION;
-                               populateFields();
-                       }
-               };
-               useNoProxy.addActionListener(useNoProxyListener);
-
-               useSystemProperties = new JRadioButton("Use system properties");
-               useSystemProperties.setAlignmentX(LEFT_ALIGNMENT);
-               gbc.gridx = 0;
-               gbc.gridy = 2;
-               gbc.insets = new Insets(0, 0, 0, 0);
-               this.add(useSystemProperties, gbc);
-               ActionListener systemPropertiesListener = new ActionListener() {
-                       @Override
-                       public void actionPerformed(ActionEvent arg0) {
-                               shownOption = USE_SYSTEM_PROPERTIES_OPTION;
-                               populateFields();
-                       }
-               };
-               useSystemProperties.addActionListener(systemPropertiesListener);
-
-               useSpecifiedValues = new JRadioButton("Use specified values");
-               useSpecifiedValues.setAlignmentX(LEFT_ALIGNMENT);
-               gbc.gridx = 0;
-               gbc.gridy = 3;
-               this.add(useSpecifiedValues, gbc);
-               ActionListener specifiedValuesListener = new ActionListener() {
-                       @Override
-                       public void actionPerformed(ActionEvent arg0) {
-                               shownOption = USE_SPECIFIED_VALUES_OPTION;
-                               populateFields();
-                       }
-               };
-               useSpecifiedValues.addActionListener(specifiedValuesListener);
-
-               ButtonGroup bg = new ButtonGroup();
-               bg.add(useSystemProperties);
-               bg.add(useSpecifiedValues);
-               bg.add(useNoProxy);
-
-               /**
-                * Create the fields to show the HTTP proxy property values. 
These
-                * become editable if the shown option is to use specified 
values.
-                */
-               proxyHostField = new JTextField(TEXTFIELD_SIZE);
-               gbc.gridx = 0;
-               gbc.gridy = 4;
-               gbc.gridwidth = 1;
-               gbc.fill = NONE;
-               gbc.insets = new Insets(10, 0, 0, 0);
-               this.add(new JLabel("Proxy host"), gbc);
-               gbc.gridx = 1;
-               gbc.gridy = 4;
-               gbc.gridwidth = 1;
-               gbc.fill = HORIZONTAL;
-               this.add(proxyHostField, gbc);
-
-               proxyPortField = new JTextField(TEXTFIELD_SIZE);
-               gbc.gridx = 0;
-               gbc.gridy = 5;
-               gbc.gridwidth = 1;
-               gbc.fill = NONE;
-               gbc.insets = new Insets(0, 0, 0, 0);
-               this.add(new JLabel("Proxy port"), gbc);
-               gbc.gridx = 1;
-               gbc.gridy = 5;
-               gbc.gridwidth = 1;
-               gbc.fill = HORIZONTAL;
-               this.add(proxyPortField, gbc);
-
-               proxyUserField = new JTextField(TEXTFIELD_SIZE);
-               gbc.gridx = 0;
-               gbc.gridy = 6;
-               gbc.gridwidth = 1;
-               gbc.fill = NONE;
-               this.add(new JLabel("Proxy user"), gbc);
-               gbc.gridx = 1;
-               gbc.gridy = 6;
-               gbc.gridwidth = 1;
-               gbc.fill = HORIZONTAL;
-               this.add(proxyUserField, gbc);
-
-               proxyPasswordField = new JTextField(TEXTFIELD_SIZE);
-               gbc.gridx = 0;
-               gbc.gridy = 7;
-               gbc.gridwidth = 1;
-               gbc.fill = NONE;
-               this.add(new JLabel("Proxy password"), gbc);
-               gbc.gridx = 1;
-               gbc.gridy = 7;
-               gbc.gridwidth = 1;
-               gbc.fill = HORIZONTAL;
-               this.add(proxyPasswordField, gbc);
-
-               nonProxyHostsArea = new DialogTextArea(10, 40);
-               nonProxyScrollPane = new JScrollPane(nonProxyHostsArea);
-               nonProxyScrollPane
-                               
.setHorizontalScrollBarPolicy(HORIZONTAL_SCROLLBAR_AS_NEEDED);
-               nonProxyScrollPane
-                               
.setVerticalScrollBarPolicy(VERTICAL_SCROLLBAR_AS_NEEDED);
-               // nonProxyScrollPane.setPreferredSize(new Dimension(300, 500));
-               gbc.gridx = 0;
-               gbc.gridy = 8;
-               gbc.gridwidth = 2;
-               gbc.fill = NONE;
-               gbc.insets = new Insets(10, 0, 0, 0);
-               this.add(new JLabel("Non-proxy hosts"), gbc);
-               gbc.gridx = 0;
-               gbc.gridy = 9;
-               gbc.weightx = 1.0;
-               gbc.weighty = 1.0;
-               gbc.gridwidth = 2;
-               gbc.insets = new Insets(0, 0, 0, 0);
-               gbc.fill = BOTH;
-               this.add(nonProxyScrollPane, gbc);
-
-               // Add buttons panel
-               gbc.gridx = 0;
-               gbc.gridy = 10;
-               gbc.weightx = 0.0;
-               gbc.weighty = 0.0;
-               gbc.gridwidth = 2;
-               gbc.fill = HORIZONTAL;
-               gbc.anchor = CENTER;
-               gbc.insets = new Insets(10, 0, 0, 0);
-               this.add(createButtonPanel(), gbc);
-
-               setFields();
-       }
-
-       /**
-        * Populate the fields in the property panel according to which option 
is
-        * being shown and the stored values within the
-        * {@link HttpProxyConfiguration}.
-        */
-       private void populateFields() {
-               /**
-                * Editing of the property fields is only available when the 
option is
-                * to use the specified values.
-                */
-               boolean editingEnabled = shownOption
-                               .equals(USE_SPECIFIED_VALUES_OPTION);
-
-               if (shownOption.equals(USE_SYSTEM_PROPERTIES_OPTION)) {
-                       proxyHostField.setText(httpProxyConfiguration
-                                       .getProperty(SYSTEM_PROXY_HOST));
-                       proxyPortField.setText(httpProxyConfiguration
-                                       .getProperty(SYSTEM_PROXY_PORT));
-                       proxyUserField.setText(httpProxyConfiguration
-                                       .getProperty(SYSTEM_PROXY_USER));
-                       proxyPasswordField.setText(httpProxyConfiguration
-                                       .getProperty(SYSTEM_PROXY_PASSWORD));
-                       nonProxyHostsArea.setText(httpProxyConfiguration
-                                       .getProperty(SYSTEM_NON_PROXY_HOSTS));
-               } else if (shownOption.equals(USE_SPECIFIED_VALUES_OPTION)) {
-                       proxyHostField.setText(httpProxyConfiguration
-                                       .getProperty(TAVERNA_PROXY_HOST));
-                       proxyPortField.setText(httpProxyConfiguration
-                                       .getProperty(TAVERNA_PROXY_PORT));
-                       proxyUserField.setText(httpProxyConfiguration
-                                       .getProperty(TAVERNA_PROXY_USER));
-                       proxyPasswordField.setText(httpProxyConfiguration
-                                       .getProperty(TAVERNA_PROXY_PASSWORD));
-                       nonProxyHostsArea.setText(httpProxyConfiguration
-                                       .getProperty(TAVERNA_NON_PROXY_HOSTS));
-               } else {
-                       proxyHostField.setText(null);
-                       proxyPortField.setText(null);
-                       proxyUserField.setText(null);
-                       proxyPasswordField.setText(null);
-                       nonProxyHostsArea.setText(null);
-               }
-
-               proxyHostField.setEnabled(editingEnabled);
-               proxyPortField.setEnabled(editingEnabled);
-               proxyUserField.setEnabled(editingEnabled);
-               proxyPasswordField.setEnabled(editingEnabled);
-               nonProxyHostsArea.setEnabled(editingEnabled);
-               nonProxyHostsArea.setEditable(editingEnabled);
-               nonProxyScrollPane.setEnabled(editingEnabled);
-       }
-
-       /**
-        * Create the panel to contain the buttons
-        * 
-        * @return
-        */
-       @SuppressWarnings("serial")
-       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) {
-                               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();
-                       }
-               });
-               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();
-                       }
-               });
-               panel.add(applyButton);
-
-               return panel;
-       }
-
-       /**
-        * Checks that the specified values for the HTTP properties are a valid
-        * combination and, if so, saves them for future use. It does not apply 
them
-        * to the currently executing Taverna.
-        */
-       private void saveSettings() {
-               if (useSystemProperties.isSelected()) {
-                       httpProxyConfiguration.setProperty(PROXY_USE_OPTION,
-                                       USE_SYSTEM_PROPERTIES_OPTION);
-               } else if (useNoProxy.isSelected()) {
-                       httpProxyConfiguration.setProperty(PROXY_USE_OPTION,
-                                       USE_NO_PROXY_OPTION);
-               } else {
-                       if (validateFields()) {
-                               
httpProxyConfiguration.setProperty(PROXY_USE_OPTION,
-                                               USE_SPECIFIED_VALUES_OPTION);
-                               
httpProxyConfiguration.setProperty(TAVERNA_PROXY_HOST,
-                                               proxyHostField.getText());
-                               
httpProxyConfiguration.setProperty(TAVERNA_PROXY_PORT,
-                                               proxyPortField.getText());
-                               
httpProxyConfiguration.setProperty(TAVERNA_PROXY_USER,
-                                               proxyUserField.getText());
-                               
httpProxyConfiguration.setProperty(TAVERNA_PROXY_PASSWORD,
-                                               proxyPasswordField.getText());
-                               
httpProxyConfiguration.setProperty(TAVERNA_NON_PROXY_HOSTS,
-                                               nonProxyHostsArea.getText());
-                       }
-               }
-       }
-
-       /**
-        * Validates and, where appropriate formats, the properties values 
specified
-        * for HTTP Proxy configuration.
-        * 
-        * @return
-        */
-       private boolean validateFields() {
-               boolean result = true;
-               result = result && validateHostField();
-               result = result && validatePortField();
-               result = result && validateUserField();
-               result = result && validatePasswordField();
-               result = result && validateNonProxyHostsArea();
-               return result;
-       }
-
-       /**
-        * Checks that, if a value is specified for non-proxy hosts then a proxy
-        * host has also been specified. Formats the non-proxy hosts string so 
that
-        * if the user has entered the hosts on separate lines, then the stored
-        * values are separated by bars.
-        * 
-        * @return
-        */
-       private boolean validateNonProxyHostsArea() {
-               boolean result = true;
-               String value = nonProxyHostsArea.getText();
-               if ((value != null) && (!value.equals(""))) {
-                       value = value.replaceAll("\\n", "|");
-                       nonProxyHostsArea.setText(value);
-                       result = result
-                                       && dependsUpon("non-proxy host", "host",
-                                                       
proxyHostField.getText());
-               }
-               return result;
-       }
-
-       /**
-        * Checks that, if a password has been specified, then a user has also 
been
-        * specified.
-        * 
-        * @return
-        */
-       private boolean validatePasswordField() {
-               boolean result = true;
-               String value = proxyPasswordField.getText();
-               if ((value != null) && !value.isEmpty())
-                       result = result
-                                       && dependsUpon("password", "user", 
proxyHostField.getText());
-               return result;
-       }
-
-       /**
-        * Checks that if a user has been specified, then a host has also been
-        * specified.
-        * 
-        * @return
-        */
-       private boolean validateUserField() {
-               boolean result = true;
-               String value = proxyUserField.getText();
-               if ((value != null) && !value.isEmpty())
-                       result = result
-                                       && dependsUpon("user", "host", 
proxyHostField.getText());
-               return result;
-       }
-
-       /**
-        * Checks that if a port has been specified then a host has also been
-        * specified. Checks that the port number is a non-negative integer. If 
the
-        * port has not been specified, then if a host has been specified, the
-        * default value 80 is used.
-        * 
-        * @return
-        */
-       private boolean validatePortField() {
-               boolean result = true;
-               String value = proxyPortField.getText();
-               if ((value != null) && (!value.equals(""))) {
-                       result = result
-                                       && dependsUpon("port", "host", 
proxyHostField.getText());
-                       try {
-                               int parsedNumber = Integer.parseInt(value);
-                               if (parsedNumber <= 0) {
-                                       showMessageDialog(this, "The port must 
be non-negative");
-                                       result = false;
-                               }
-                       } catch (NumberFormatException e) {
-                               showMessageDialog(this, "The port must be an 
integer");
-                               result = false;
-                       }
-               } else {
-                       String hostField = proxyHostField.getText();
-                       if ((hostField != null) && !hostField.isEmpty())
-                               proxyPortField.setText("80");
-               }
-               return result;
-       }
-
-       /**
-        * Checks if the targetValue has been specified. If not then a message 
is
-        * displayed indicating that the dependent cannot be specified with the
-        * target.
-        * 
-        * @param dependent
-        * @param target
-        * @param targetValue
-        * @return
-        */
-       private boolean dependsUpon(String dependent, String target,
-                       String targetValue) {
-               boolean result = true;
-               if ((targetValue == null) || target.equals("")) {
-                       showMessageDialog(this, "A " + dependent
-                                       + " cannot be specified without a " + 
target);
-                       result = false;
-               }
-               return result;
-       }
-
-       /**
-        * Could validate the host field e.g. by establishing a connection.
-        * Currently no validation is done.
-        * 
-        * @return
-        */
-       private boolean validateHostField() {
-               boolean result = true;
-               // String value = proxyHostField.getText();
-               return result;
-       }
-
-       /**
-        * Save the currently set field values (if valid) to the
-        * {@link HttpProxyConfiguration}. Also applies those values to the
-        * currently running Taverna.
-        */
-       private void applySettings() {
-               if (validateFields()) {
-                       saveSettings();
-                       httpProxyConfiguration.changeProxySettings();
-               }
-       }
-
-       /**
-        * Set the shown field values to those currently in use (i.e. last saved
-        * configuration).
-        */
-       private void setFields() {
-               shownOption = 
httpProxyConfiguration.getProperty(PROXY_USE_OPTION);
-               useSystemProperties.setSelected(shownOption
-                               .equals(USE_SYSTEM_PROPERTIES_OPTION));
-               useSpecifiedValues.setSelected(shownOption
-                               .equals(USE_SPECIFIED_VALUES_OPTION));
-               useNoProxy.setSelected(shownOption.equals(USE_NO_PROXY_OPTION));
-               populateFields();
-       }
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-httpproxy-config/src/main/java/net/sf/taverna/t2/workbench/httpproxy/config/HttpProxyConfigurationUIFactory.java
----------------------------------------------------------------------
diff --git 
a/taverna-httpproxy-config/src/main/java/net/sf/taverna/t2/workbench/httpproxy/config/HttpProxyConfigurationUIFactory.java
 
b/taverna-httpproxy-config/src/main/java/net/sf/taverna/t2/workbench/httpproxy/config/HttpProxyConfigurationUIFactory.java
deleted file mode 100644
index 4cf3967..0000000
--- 
a/taverna-httpproxy-config/src/main/java/net/sf/taverna/t2/workbench/httpproxy/config/HttpProxyConfigurationUIFactory.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester
- *
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- *
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- 
******************************************************************************/
-package net.sf.taverna.t2.workbench.httpproxy.config;
-
-import javax.swing.JPanel;
-
-import org.apache.taverna.configuration.Configurable;
-import uk.org.taverna.configuration.ConfigurationUIFactory;
-import uk.org.taverna.configuration.proxy.HttpProxyConfiguration;
-
-/**
- * A Factory to create a HttpProxyConfiguration
- *
- * @author alanrw
- * @author David Withers
- */
-public class HttpProxyConfigurationUIFactory implements ConfigurationUIFactory 
{
-       private HttpProxyConfiguration httpProxyConfiguration;
-
-       @Override
-       public boolean canHandle(String uuid) {
-               return uuid.equals(getConfigurable().getUUID());
-       }
-
-       @Override
-       public JPanel getConfigurationPanel() {
-               return new HttpProxyConfigurationPanel(httpProxyConfiguration);
-       }
-
-       @Override
-       public Configurable getConfigurable() {
-               return httpProxyConfiguration;
-       }
-
-       public void setHttpProxyConfiguration(HttpProxyConfiguration 
httpProxyConfiguration) {
-               this.httpProxyConfiguration = httpProxyConfiguration;
-       }
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-httpproxy-config/src/main/java/org/apache/taverna/workbench/httpproxy/config/HttpProxyConfigurationPanel.java
----------------------------------------------------------------------
diff --git 
a/taverna-httpproxy-config/src/main/java/org/apache/taverna/workbench/httpproxy/config/HttpProxyConfigurationPanel.java
 
b/taverna-httpproxy-config/src/main/java/org/apache/taverna/workbench/httpproxy/config/HttpProxyConfigurationPanel.java
new file mode 100644
index 0000000..4c57cb2
--- /dev/null
+++ 
b/taverna-httpproxy-config/src/main/java/org/apache/taverna/workbench/httpproxy/config/HttpProxyConfigurationPanel.java
@@ -0,0 +1,582 @@
+/*******************************************************************************
+ * 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.httpproxy.config;
+
+import static java.awt.GridBagConstraints.BOTH;
+import static java.awt.GridBagConstraints.CENTER;
+import static java.awt.GridBagConstraints.HORIZONTAL;
+import static java.awt.GridBagConstraints.NONE;
+import static java.awt.GridBagConstraints.WEST;
+import static javax.swing.JOptionPane.showMessageDialog;
+import static javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED;
+import static javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED;
+import static org.apache.taverna.workbench.helper.Helper.showHelp;
+import static 
uk.org.taverna.configuration.proxy.HttpProxyConfiguration.PROXY_USE_OPTION;
+import static 
uk.org.taverna.configuration.proxy.HttpProxyConfiguration.SYSTEM_NON_PROXY_HOSTS;
+import static 
uk.org.taverna.configuration.proxy.HttpProxyConfiguration.SYSTEM_PROXY_HOST;
+import static 
uk.org.taverna.configuration.proxy.HttpProxyConfiguration.SYSTEM_PROXY_PASSWORD;
+import static 
uk.org.taverna.configuration.proxy.HttpProxyConfiguration.SYSTEM_PROXY_PORT;
+import static 
uk.org.taverna.configuration.proxy.HttpProxyConfiguration.SYSTEM_PROXY_USER;
+import static 
uk.org.taverna.configuration.proxy.HttpProxyConfiguration.TAVERNA_NON_PROXY_HOSTS;
+import static 
uk.org.taverna.configuration.proxy.HttpProxyConfiguration.TAVERNA_PROXY_HOST;
+import static 
uk.org.taverna.configuration.proxy.HttpProxyConfiguration.TAVERNA_PROXY_PASSWORD;
+import static 
uk.org.taverna.configuration.proxy.HttpProxyConfiguration.TAVERNA_PROXY_PORT;
+import static 
uk.org.taverna.configuration.proxy.HttpProxyConfiguration.TAVERNA_PROXY_USER;
+import static 
uk.org.taverna.configuration.proxy.HttpProxyConfiguration.USE_NO_PROXY_OPTION;
+import static 
uk.org.taverna.configuration.proxy.HttpProxyConfiguration.USE_SPECIFIED_VALUES_OPTION;
+import static 
uk.org.taverna.configuration.proxy.HttpProxyConfiguration.USE_SYSTEM_PROPERTIES_OPTION;
+
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.Insets;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.AbstractAction;
+import javax.swing.ButtonGroup;
+import javax.swing.JButton;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JRadioButton;
+import javax.swing.JScrollPane;
+import javax.swing.JTextArea;
+import javax.swing.JTextField;
+import javax.swing.border.EmptyBorder;
+
+import org.apache.taverna.lang.ui.DialogTextArea;
+import org..taverna.configuration.proxy.HttpProxyConfiguration;
+
+/**
+ * The HttpProxyConfigurationPanel provides the user interface to a
+ * {@link HttpProxyConfiguration} to determine how HTTP Connections are made by
+ * Taverna.
+ * 
+ * @author alanrw
+ * @author David Withers
+ */
+public class HttpProxyConfigurationPanel extends JPanel {
+       static final long serialVersionUID = 3668473431971125038L;
+       /**
+        * The size of the field for the JTextFields.
+        */
+       private static int TEXTFIELD_SIZE = 25;
+
+       private final HttpProxyConfiguration httpProxyConfiguration;
+       /**
+        * RadioButtons that are in a common ButtonGroup. Selecting one of them
+        * indicates whether the system http proxy settings, the ad hoc 
specified
+        * values or no proxy settings at all should be used.
+        */
+       private JRadioButton useSystemProperties;
+       private JRadioButton useSpecifiedValues;
+       private JRadioButton useNoProxy;
+       /**
+        * JTextFields and one DialogTextArea to hold the settings for the HTTP
+        * proxy properties. The values are only editable if the user picks
+        * useSpecifiedValues.
+        */
+       private JTextField proxyHostField;
+       private JTextField proxyPortField;
+       private JTextField proxyUserField;
+       private JTextField proxyPasswordField;
+       private DialogTextArea nonProxyHostsArea;
+       private JScrollPane nonProxyScrollPane;
+       /**
+        * A string that indicates which HTTP setting option the user has 
currently
+        * picked. This does not necesarily match that which has been applied.
+        */
+       private String shownOption = USE_SYSTEM_PROPERTIES_OPTION;
+
+       /**
+        * The HttpProxyConfigurationPanel consists of a set of properties 
where the
+        * configuration values for HTTP can be specified and a set of buttons 
where
+        * the more general apply, help etc. appear.
+        */
+       public HttpProxyConfigurationPanel(
+                       HttpProxyConfiguration httpProxyConfiguration) {
+               this.httpProxyConfiguration = httpProxyConfiguration;
+               initComponents();
+       }
+
+       /**
+        * Populates the panel with a representation of the current HTTP proxy
+        * settings for the specified {@link HttpProxyConfiguration} and also 
the
+        * capability to alter them.
+        */
+       private void initComponents() {
+               shownOption = 
httpProxyConfiguration.getProperty(PROXY_USE_OPTION);
+
+               this.setLayout(new GridBagLayout());
+
+               GridBagConstraints gbc = new GridBagConstraints();
+
+               // Title describing what kind of settings we are configuring 
here
+               JTextArea descriptionText = new JTextArea("HTTP proxy 
configuration");
+               descriptionText.setLineWrap(true);
+               descriptionText.setWrapStyleWord(true);
+               descriptionText.setEditable(false);
+               descriptionText.setFocusable(false);
+               descriptionText.setBorder(new EmptyBorder(10, 10, 10, 10));
+               gbc.anchor = WEST;
+               gbc.gridx = 0;
+               gbc.gridy = 0;
+               gbc.gridwidth = 2;
+               gbc.weightx = 1.0;
+               gbc.weighty = 0.0;
+               gbc.fill = HORIZONTAL;
+               this.add(descriptionText, gbc);
+
+               /**
+                * Generate the three radio buttons and put them in a group. 
Each button
+                * is bound to an action that alters the shownOption and 
re-populates
+                * the shown HTTP property fields.
+                */
+               useNoProxy = new JRadioButton("Do not use a proxy");
+               useNoProxy.setAlignmentX(LEFT_ALIGNMENT);
+               gbc.gridx = 0;
+               gbc.gridy = 1;
+               gbc.gridwidth = 2;
+               gbc.weightx = 0.0;
+               gbc.weighty = 0.0;
+               gbc.fill = NONE;
+               gbc.insets = new Insets(10, 0, 0, 0);
+               this.add(useNoProxy, gbc);
+               ActionListener useNoProxyListener = new ActionListener() {
+                       @Override
+                       public void actionPerformed(ActionEvent arg0) {
+                               shownOption = USE_NO_PROXY_OPTION;
+                               populateFields();
+                       }
+               };
+               useNoProxy.addActionListener(useNoProxyListener);
+
+               useSystemProperties = new JRadioButton("Use system properties");
+               useSystemProperties.setAlignmentX(LEFT_ALIGNMENT);
+               gbc.gridx = 0;
+               gbc.gridy = 2;
+               gbc.insets = new Insets(0, 0, 0, 0);
+               this.add(useSystemProperties, gbc);
+               ActionListener systemPropertiesListener = new ActionListener() {
+                       @Override
+                       public void actionPerformed(ActionEvent arg0) {
+                               shownOption = USE_SYSTEM_PROPERTIES_OPTION;
+                               populateFields();
+                       }
+               };
+               useSystemProperties.addActionListener(systemPropertiesListener);
+
+               useSpecifiedValues = new JRadioButton("Use specified values");
+               useSpecifiedValues.setAlignmentX(LEFT_ALIGNMENT);
+               gbc.gridx = 0;
+               gbc.gridy = 3;
+               this.add(useSpecifiedValues, gbc);
+               ActionListener specifiedValuesListener = new ActionListener() {
+                       @Override
+                       public void actionPerformed(ActionEvent arg0) {
+                               shownOption = USE_SPECIFIED_VALUES_OPTION;
+                               populateFields();
+                       }
+               };
+               useSpecifiedValues.addActionListener(specifiedValuesListener);
+
+               ButtonGroup bg = new ButtonGroup();
+               bg.add(useSystemProperties);
+               bg.add(useSpecifiedValues);
+               bg.add(useNoProxy);
+
+               /**
+                * Create the fields to show the HTTP proxy property values. 
These
+                * become editable if the shown option is to use specified 
values.
+                */
+               proxyHostField = new JTextField(TEXTFIELD_SIZE);
+               gbc.gridx = 0;
+               gbc.gridy = 4;
+               gbc.gridwidth = 1;
+               gbc.fill = NONE;
+               gbc.insets = new Insets(10, 0, 0, 0);
+               this.add(new JLabel("Proxy host"), gbc);
+               gbc.gridx = 1;
+               gbc.gridy = 4;
+               gbc.gridwidth = 1;
+               gbc.fill = HORIZONTAL;
+               this.add(proxyHostField, gbc);
+
+               proxyPortField = new JTextField(TEXTFIELD_SIZE);
+               gbc.gridx = 0;
+               gbc.gridy = 5;
+               gbc.gridwidth = 1;
+               gbc.fill = NONE;
+               gbc.insets = new Insets(0, 0, 0, 0);
+               this.add(new JLabel("Proxy port"), gbc);
+               gbc.gridx = 1;
+               gbc.gridy = 5;
+               gbc.gridwidth = 1;
+               gbc.fill = HORIZONTAL;
+               this.add(proxyPortField, gbc);
+
+               proxyUserField = new JTextField(TEXTFIELD_SIZE);
+               gbc.gridx = 0;
+               gbc.gridy = 6;
+               gbc.gridwidth = 1;
+               gbc.fill = NONE;
+               this.add(new JLabel("Proxy user"), gbc);
+               gbc.gridx = 1;
+               gbc.gridy = 6;
+               gbc.gridwidth = 1;
+               gbc.fill = HORIZONTAL;
+               this.add(proxyUserField, gbc);
+
+               proxyPasswordField = new JTextField(TEXTFIELD_SIZE);
+               gbc.gridx = 0;
+               gbc.gridy = 7;
+               gbc.gridwidth = 1;
+               gbc.fill = NONE;
+               this.add(new JLabel("Proxy password"), gbc);
+               gbc.gridx = 1;
+               gbc.gridy = 7;
+               gbc.gridwidth = 1;
+               gbc.fill = HORIZONTAL;
+               this.add(proxyPasswordField, gbc);
+
+               nonProxyHostsArea = new DialogTextArea(10, 40);
+               nonProxyScrollPane = new JScrollPane(nonProxyHostsArea);
+               nonProxyScrollPane
+                               
.setHorizontalScrollBarPolicy(HORIZONTAL_SCROLLBAR_AS_NEEDED);
+               nonProxyScrollPane
+                               
.setVerticalScrollBarPolicy(VERTICAL_SCROLLBAR_AS_NEEDED);
+               // nonProxyScrollPane.setPreferredSize(new Dimension(300, 500));
+               gbc.gridx = 0;
+               gbc.gridy = 8;
+               gbc.gridwidth = 2;
+               gbc.fill = NONE;
+               gbc.insets = new Insets(10, 0, 0, 0);
+               this.add(new JLabel("Non-proxy hosts"), gbc);
+               gbc.gridx = 0;
+               gbc.gridy = 9;
+               gbc.weightx = 1.0;
+               gbc.weighty = 1.0;
+               gbc.gridwidth = 2;
+               gbc.insets = new Insets(0, 0, 0, 0);
+               gbc.fill = BOTH;
+               this.add(nonProxyScrollPane, gbc);
+
+               // Add buttons panel
+               gbc.gridx = 0;
+               gbc.gridy = 10;
+               gbc.weightx = 0.0;
+               gbc.weighty = 0.0;
+               gbc.gridwidth = 2;
+               gbc.fill = HORIZONTAL;
+               gbc.anchor = CENTER;
+               gbc.insets = new Insets(10, 0, 0, 0);
+               this.add(createButtonPanel(), gbc);
+
+               setFields();
+       }
+
+       /**
+        * Populate the fields in the property panel according to which option 
is
+        * being shown and the stored values within the
+        * {@link HttpProxyConfiguration}.
+        */
+       private void populateFields() {
+               /**
+                * Editing of the property fields is only available when the 
option is
+                * to use the specified values.
+                */
+               boolean editingEnabled = shownOption
+                               .equals(USE_SPECIFIED_VALUES_OPTION);
+
+               if (shownOption.equals(USE_SYSTEM_PROPERTIES_OPTION)) {
+                       proxyHostField.setText(httpProxyConfiguration
+                                       .getProperty(SYSTEM_PROXY_HOST));
+                       proxyPortField.setText(httpProxyConfiguration
+                                       .getProperty(SYSTEM_PROXY_PORT));
+                       proxyUserField.setText(httpProxyConfiguration
+                                       .getProperty(SYSTEM_PROXY_USER));
+                       proxyPasswordField.setText(httpProxyConfiguration
+                                       .getProperty(SYSTEM_PROXY_PASSWORD));
+                       nonProxyHostsArea.setText(httpProxyConfiguration
+                                       .getProperty(SYSTEM_NON_PROXY_HOSTS));
+               } else if (shownOption.equals(USE_SPECIFIED_VALUES_OPTION)) {
+                       proxyHostField.setText(httpProxyConfiguration
+                                       .getProperty(TAVERNA_PROXY_HOST));
+                       proxyPortField.setText(httpProxyConfiguration
+                                       .getProperty(TAVERNA_PROXY_PORT));
+                       proxyUserField.setText(httpProxyConfiguration
+                                       .getProperty(TAVERNA_PROXY_USER));
+                       proxyPasswordField.setText(httpProxyConfiguration
+                                       .getProperty(TAVERNA_PROXY_PASSWORD));
+                       nonProxyHostsArea.setText(httpProxyConfiguration
+                                       .getProperty(TAVERNA_NON_PROXY_HOSTS));
+               } else {
+                       proxyHostField.setText(null);
+                       proxyPortField.setText(null);
+                       proxyUserField.setText(null);
+                       proxyPasswordField.setText(null);
+                       nonProxyHostsArea.setText(null);
+               }
+
+               proxyHostField.setEnabled(editingEnabled);
+               proxyPortField.setEnabled(editingEnabled);
+               proxyUserField.setEnabled(editingEnabled);
+               proxyPasswordField.setEnabled(editingEnabled);
+               nonProxyHostsArea.setEnabled(editingEnabled);
+               nonProxyHostsArea.setEditable(editingEnabled);
+               nonProxyScrollPane.setEnabled(editingEnabled);
+       }
+
+       /**
+        * Create the panel to contain the buttons
+        * 
+        * @return
+        */
+       @SuppressWarnings("serial")
+       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) {
+                               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();
+                       }
+               });
+               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();
+                       }
+               });
+               panel.add(applyButton);
+
+               return panel;
+       }
+
+       /**
+        * Checks that the specified values for the HTTP properties are a valid
+        * combination and, if so, saves them for future use. It does not apply 
them
+        * to the currently executing Taverna.
+        */
+       private void saveSettings() {
+               if (useSystemProperties.isSelected()) {
+                       httpProxyConfiguration.setProperty(PROXY_USE_OPTION,
+                                       USE_SYSTEM_PROPERTIES_OPTION);
+               } else if (useNoProxy.isSelected()) {
+                       httpProxyConfiguration.setProperty(PROXY_USE_OPTION,
+                                       USE_NO_PROXY_OPTION);
+               } else {
+                       if (validateFields()) {
+                               
httpProxyConfiguration.setProperty(PROXY_USE_OPTION,
+                                               USE_SPECIFIED_VALUES_OPTION);
+                               
httpProxyConfiguration.setProperty(TAVERNA_PROXY_HOST,
+                                               proxyHostField.getText());
+                               
httpProxyConfiguration.setProperty(TAVERNA_PROXY_PORT,
+                                               proxyPortField.getText());
+                               
httpProxyConfiguration.setProperty(TAVERNA_PROXY_USER,
+                                               proxyUserField.getText());
+                               
httpProxyConfiguration.setProperty(TAVERNA_PROXY_PASSWORD,
+                                               proxyPasswordField.getText());
+                               
httpProxyConfiguration.setProperty(TAVERNA_NON_PROXY_HOSTS,
+                                               nonProxyHostsArea.getText());
+                       }
+               }
+       }
+
+       /**
+        * Validates and, where appropriate formats, the properties values 
specified
+        * for HTTP Proxy configuration.
+        * 
+        * @return
+        */
+       private boolean validateFields() {
+               boolean result = true;
+               result = result && validateHostField();
+               result = result && validatePortField();
+               result = result && validateUserField();
+               result = result && validatePasswordField();
+               result = result && validateNonProxyHostsArea();
+               return result;
+       }
+
+       /**
+        * Checks that, if a value is specified for non-proxy hosts then a proxy
+        * host has also been specified. Formats the non-proxy hosts string so 
that
+        * if the user has entered the hosts on separate lines, then the stored
+        * values are separated by bars.
+        * 
+        * @return
+        */
+       private boolean validateNonProxyHostsArea() {
+               boolean result = true;
+               String value = nonProxyHostsArea.getText();
+               if ((value != null) && (!value.equals(""))) {
+                       value = value.replaceAll("\\n", "|");
+                       nonProxyHostsArea.setText(value);
+                       result = result
+                                       && dependsUpon("non-proxy host", "host",
+                                                       
proxyHostField.getText());
+               }
+               return result;
+       }
+
+       /**
+        * Checks that, if a password has been specified, then a user has also 
been
+        * specified.
+        * 
+        * @return
+        */
+       private boolean validatePasswordField() {
+               boolean result = true;
+               String value = proxyPasswordField.getText();
+               if ((value != null) && !value.isEmpty())
+                       result = result
+                                       && dependsUpon("password", "user", 
proxyHostField.getText());
+               return result;
+       }
+
+       /**
+        * Checks that if a user has been specified, then a host has also been
+        * specified.
+        * 
+        * @return
+        */
+       private boolean validateUserField() {
+               boolean result = true;
+               String value = proxyUserField.getText();
+               if ((value != null) && !value.isEmpty())
+                       result = result
+                                       && dependsUpon("user", "host", 
proxyHostField.getText());
+               return result;
+       }
+
+       /**
+        * Checks that if a port has been specified then a host has also been
+        * specified. Checks that the port number is a non-negative integer. If 
the
+        * port has not been specified, then if a host has been specified, the
+        * default value 80 is used.
+        * 
+        * @return
+        */
+       private boolean validatePortField() {
+               boolean result = true;
+               String value = proxyPortField.getText();
+               if ((value != null) && (!value.equals(""))) {
+                       result = result
+                                       && dependsUpon("port", "host", 
proxyHostField.getText());
+                       try {
+                               int parsedNumber = Integer.parseInt(value);
+                               if (parsedNumber <= 0) {
+                                       showMessageDialog(this, "The port must 
be non-negative");
+                                       result = false;
+                               }
+                       } catch (NumberFormatException e) {
+                               showMessageDialog(this, "The port must be an 
integer");
+                               result = false;
+                       }
+               } else {
+                       String hostField = proxyHostField.getText();
+                       if ((hostField != null) && !hostField.isEmpty())
+                               proxyPortField.setText("80");
+               }
+               return result;
+       }
+
+       /**
+        * Checks if the targetValue has been specified. If not then a message 
is
+        * displayed indicating that the dependent cannot be specified with the
+        * target.
+        * 
+        * @param dependent
+        * @param target
+        * @param targetValue
+        * @return
+        */
+       private boolean dependsUpon(String dependent, String target,
+                       String targetValue) {
+               boolean result = true;
+               if ((targetValue == null) || target.equals("")) {
+                       showMessageDialog(this, "A " + dependent
+                                       + " cannot be specified without a " + 
target);
+                       result = false;
+               }
+               return result;
+       }
+
+       /**
+        * Could validate the host field e.g. by establishing a connection.
+        * Currently no validation is done.
+        * 
+        * @return
+        */
+       private boolean validateHostField() {
+               boolean result = true;
+               // String value = proxyHostField.getText();
+               return result;
+       }
+
+       /**
+        * Save the currently set field values (if valid) to the
+        * {@link HttpProxyConfiguration}. Also applies those values to the
+        * currently running Taverna.
+        */
+       private void applySettings() {
+               if (validateFields()) {
+                       saveSettings();
+                       httpProxyConfiguration.changeProxySettings();
+               }
+       }
+
+       /**
+        * Set the shown field values to those currently in use (i.e. last saved
+        * configuration).
+        */
+       private void setFields() {
+               shownOption = 
httpProxyConfiguration.getProperty(PROXY_USE_OPTION);
+               useSystemProperties.setSelected(shownOption
+                               .equals(USE_SYSTEM_PROPERTIES_OPTION));
+               useSpecifiedValues.setSelected(shownOption
+                               .equals(USE_SPECIFIED_VALUES_OPTION));
+               useNoProxy.setSelected(shownOption.equals(USE_NO_PROXY_OPTION));
+               populateFields();
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-httpproxy-config/src/main/java/org/apache/taverna/workbench/httpproxy/config/HttpProxyConfigurationUIFactory.java
----------------------------------------------------------------------
diff --git 
a/taverna-httpproxy-config/src/main/java/org/apache/taverna/workbench/httpproxy/config/HttpProxyConfigurationUIFactory.java
 
b/taverna-httpproxy-config/src/main/java/org/apache/taverna/workbench/httpproxy/config/HttpProxyConfigurationUIFactory.java
new file mode 100644
index 0000000..dabe6a8
--- /dev/null
+++ 
b/taverna-httpproxy-config/src/main/java/org/apache/taverna/workbench/httpproxy/config/HttpProxyConfigurationUIFactory.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * 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.httpproxy.config;
+
+import javax.swing.JPanel;
+
+import org.apache.taverna.configuration.Configurable;
+import uk.org.taverna.configuration.ConfigurationUIFactory;
+import uk.org.taverna.configuration.proxy.HttpProxyConfiguration;
+
+/**
+ * A Factory to create a HttpProxyConfiguration
+ *
+ * @author alanrw
+ * @author David Withers
+ */
+public class HttpProxyConfigurationUIFactory implements ConfigurationUIFactory 
{
+       private HttpProxyConfiguration httpProxyConfiguration;
+
+       @Override
+       public boolean canHandle(String uuid) {
+               return uuid.equals(getConfigurable().getUUID());
+       }
+
+       @Override
+       public JPanel getConfigurationPanel() {
+               return new HttpProxyConfigurationPanel(httpProxyConfiguration);
+       }
+
+       @Override
+       public Configurable getConfigurable() {
+               return httpProxyConfiguration;
+       }
+
+       public void setHttpProxyConfiguration(HttpProxyConfiguration 
httpProxyConfiguration) {
+               this.httpProxyConfiguration = httpProxyConfiguration;
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-httpproxy-config/src/main/resources/META-INF/services/net.sf.taverna.t2.workbench.configuration.ConfigurationUIFactory
----------------------------------------------------------------------
diff --git 
a/taverna-httpproxy-config/src/main/resources/META-INF/services/net.sf.taverna.t2.workbench.configuration.ConfigurationUIFactory
 
b/taverna-httpproxy-config/src/main/resources/META-INF/services/net.sf.taverna.t2.workbench.configuration.ConfigurationUIFactory
deleted file mode 100644
index d87772b..0000000
--- 
a/taverna-httpproxy-config/src/main/resources/META-INF/services/net.sf.taverna.t2.workbench.configuration.ConfigurationUIFactory
+++ /dev/null
@@ -1 +0,0 @@
-net.sf.taverna.t2.workbench.httpproxy.config.HttpProxyConfigurationUIFactory
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-httpproxy-config/src/main/resources/META-INF/services/org.apache.taverna.workbench.configuration.ConfigurationUIFactory
----------------------------------------------------------------------
diff --git 
a/taverna-httpproxy-config/src/main/resources/META-INF/services/org.apache.taverna.workbench.configuration.ConfigurationUIFactory
 
b/taverna-httpproxy-config/src/main/resources/META-INF/services/org.apache.taverna.workbench.configuration.ConfigurationUIFactory
new file mode 100644
index 0000000..d6cdb0c
--- /dev/null
+++ 
b/taverna-httpproxy-config/src/main/resources/META-INF/services/org.apache.taverna.workbench.configuration.ConfigurationUIFactory
@@ -0,0 +1 @@
+org.apache.taverna.workbench.httpproxy.config.HttpProxyConfigurationUIFactory
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-httpproxy-config/src/main/resources/META-INF/spring/httpproxy-config-context.xml
----------------------------------------------------------------------
diff --git 
a/taverna-httpproxy-config/src/main/resources/META-INF/spring/httpproxy-config-context.xml
 
b/taverna-httpproxy-config/src/main/resources/META-INF/spring/httpproxy-config-context.xml
index 6d6060f..4eb6820 100644
--- 
a/taverna-httpproxy-config/src/main/resources/META-INF/spring/httpproxy-config-context.xml
+++ 
b/taverna-httpproxy-config/src/main/resources/META-INF/spring/httpproxy-config-context.xml
@@ -3,7 +3,7 @@
        xsi:schemaLocation="http://www.springframework.org/schema/beans
                       
http://www.springframework.org/schema/beans/spring-beans.xsd";>
 
-       <bean id="HttpProxyConfigurationUIFactory" 
class="net.sf.taverna.t2.workbench.httpproxy.config.HttpProxyConfigurationUIFactory">
+       <bean id="HttpProxyConfigurationUIFactory" 
class="org.apache.taverna.workbench.httpproxy.config.HttpProxyConfigurationUIFactory">
                <property name="httpProxyConfiguration" 
ref="httpProxyConfiguration" />
        </bean>
 

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-io/src/main/java/net/sf/taverna/t2/lang/io/StreamCopier.java
----------------------------------------------------------------------
diff --git 
a/taverna-io/src/main/java/net/sf/taverna/t2/lang/io/StreamCopier.java 
b/taverna-io/src/main/java/net/sf/taverna/t2/lang/io/StreamCopier.java
deleted file mode 100644
index b0d600d..0000000
--- a/taverna-io/src/main/java/net/sf/taverna/t2/lang/io/StreamCopier.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- 
******************************************************************************/
-package net.sf.taverna.t2.lang.io;
-
-import java.io.InputStream;
-import java.io.OutputStream;
-
-import org.apache.log4j.Logger;
-
-/**
- * Copies an InputStream to an OutputStream.
- * 
- * @author Tom Oinn
- */
-public class StreamCopier extends Thread {
-
-       private static Logger logger = Logger
-       .getLogger(StreamCopier.class);
-
-       InputStream is;
-
-       OutputStream os;
-
-       /**
-        * Create a new StreamCopier which will, when started, copy the 
specified
-        * InputStream to the specified OutputStream
-        */
-       public StreamCopier(InputStream is, OutputStream os) {
-               super("StreamCopier");
-               this.is = is;
-               this.os = os;
-       }
-
-       /**
-        * Start copying the stream, exits when the InputStream runs out of data
-        */
-       public void run() {
-               try {
-                       byte[] buffer = new byte[1024];
-                       int bytesRead;
-                       while ((bytesRead = is.read(buffer)) != -1) {
-                               os.write(buffer, 0, bytesRead);
-                       }
-                       os.flush();
-                       os.close();
-               } catch (Exception ex) {
-                       logger.error("Could not copy stream", ex);
-               }
-       }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-io/src/main/java/net/sf/taverna/t2/lang/io/StreamDevourer.java
----------------------------------------------------------------------
diff --git 
a/taverna-io/src/main/java/net/sf/taverna/t2/lang/io/StreamDevourer.java 
b/taverna-io/src/main/java/net/sf/taverna/t2/lang/io/StreamDevourer.java
deleted file mode 100644
index 8495e27..0000000
--- a/taverna-io/src/main/java/net/sf/taverna/t2/lang/io/StreamDevourer.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- 
******************************************************************************/
-package net.sf.taverna.t2.lang.io;
-
-import java.io.BufferedReader;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-
-import org.apache.log4j.Logger;
-
-/**
- * Devours an input stream and allows the contents to be read as a String once
- * the stream has completed.
- * 
- * @author Tom Oinn
- * @author Alan R Williams
- */
-public class StreamDevourer extends Thread {
-       
-       private static Logger logger = Logger.getLogger(StreamDevourer.class);
-
-       private static byte[] newLine = 
System.getProperty("line.separator").getBytes();
-
-       BufferedReader br;
-
-       ByteArrayOutputStream output;
-
-       /**
-        * Returns the current value of the internal ByteArrayOutputStream
-        */
-       @Override
-       public String toString() {
-               return output.toString();
-       }
-
-       /**
-        * Waits for the stream to close then returns the String representation 
of
-        * its contents (this is equivalent to doing a join then calling 
toString)
-        */
-       public String blockOnOutput() {
-               try {
-                       this.join();
-                       return output.toString();
-               } catch (InterruptedException ie) {
-                       logger.error("Interrupted", ie);
-                       interrupt();
-                       return "";
-               }
-       }
-
-       /**
-        * Create the StreamDevourer and point it at an InputStream to consume
-        */
-       public StreamDevourer(InputStream is) {
-               super("StreamDevourer");
-               this.br = new BufferedReader(new InputStreamReader(is));
-               this.output = new ByteArrayOutputStream();
-       }
-
-       /**
-        * When started this Thread will copy all data from the InputStream 
into a
-        * ByteArrayOutputStream via a BufferedReader. Because of the use of the
-        * BufferedReader this is only really appropriate for streams of textual
-        * data
-        */
-       @Override
-       public void run() {
-               try {
-                       String line = null;
-                       while ((line = br.readLine()) != null) {
-                               // && line.endsWith("</svg>") == false) {
-                               if (line.endsWith("\\") && 
!line.endsWith("\\\\")) {
-                                       line = line.substring(0, line.length() 
- 1);
-                                       output.write(line.getBytes());
-                               } else {
-                                       output.write(line.getBytes());
-                                       output.write(newLine);
-                               }
-                       }
-                       br.close();
-               } catch (IOException ioe) {
-                       logger.error(ioe);
-               }
-       }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-io/src/main/java/org/apache/taverna/lang/io/StreamCopier.java
----------------------------------------------------------------------
diff --git 
a/taverna-io/src/main/java/org/apache/taverna/lang/io/StreamCopier.java 
b/taverna-io/src/main/java/org/apache/taverna/lang/io/StreamCopier.java
new file mode 100644
index 0000000..616b4f3
--- /dev/null
+++ b/taverna-io/src/main/java/org/apache/taverna/lang/io/StreamCopier.java
@@ -0,0 +1,68 @@
+/*
+* 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.lang.io;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import org.apache.log4j.Logger;
+
+/**
+ * Copies an InputStream to an OutputStream.
+ * 
+ * @author Tom Oinn
+ */
+public class StreamCopier extends Thread {
+
+       private static Logger logger = Logger
+       .getLogger(StreamCopier.class);
+
+       InputStream is;
+
+       OutputStream os;
+
+       /**
+        * Create a new StreamCopier which will, when started, copy the 
specified
+        * InputStream to the specified OutputStream
+        */
+       public StreamCopier(InputStream is, OutputStream os) {
+               super("StreamCopier");
+               this.is = is;
+               this.os = os;
+       }
+
+       /**
+        * Start copying the stream, exits when the InputStream runs out of data
+        */
+       public void run() {
+               try {
+                       byte[] buffer = new byte[1024];
+                       int bytesRead;
+                       while ((bytesRead = is.read(buffer)) != -1) {
+                               os.write(buffer, 0, bytesRead);
+                       }
+                       os.flush();
+                       os.close();
+               } catch (Exception ex) {
+                       logger.error("Could not copy stream", ex);
+               }
+       }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-io/src/main/java/org/apache/taverna/lang/io/StreamDevourer.java
----------------------------------------------------------------------
diff --git 
a/taverna-io/src/main/java/org/apache/taverna/lang/io/StreamDevourer.java 
b/taverna-io/src/main/java/org/apache/taverna/lang/io/StreamDevourer.java
new file mode 100644
index 0000000..a5d9a9f
--- /dev/null
+++ b/taverna-io/src/main/java/org/apache/taverna/lang/io/StreamDevourer.java
@@ -0,0 +1,105 @@
+/*
+* 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.lang.io;
+
+import java.io.BufferedReader;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+
+import org.apache.log4j.Logger;
+
+/**
+ * Devours an input stream and allows the contents to be read as a String once
+ * the stream has completed.
+ * 
+ * @author Tom Oinn
+ * @author Alan R Williams
+ */
+public class StreamDevourer extends Thread {
+       
+       private static Logger logger = Logger.getLogger(StreamDevourer.class);
+
+       private static byte[] newLine = 
System.getProperty("line.separator").getBytes();
+
+       BufferedReader br;
+
+       ByteArrayOutputStream output;
+
+       /**
+        * Returns the current value of the internal ByteArrayOutputStream
+        */
+       @Override
+       public String toString() {
+               return output.toString();
+       }
+
+       /**
+        * Waits for the stream to close then returns the String representation 
of
+        * its contents (this is equivalent to doing a join then calling 
toString)
+        */
+       public String blockOnOutput() {
+               try {
+                       this.join();
+                       return output.toString();
+               } catch (InterruptedException ie) {
+                       logger.error("Interrupted", ie);
+                       interrupt();
+                       return "";
+               }
+       }
+
+       /**
+        * Create the StreamDevourer and point it at an InputStream to consume
+        */
+       public StreamDevourer(InputStream is) {
+               super("StreamDevourer");
+               this.br = new BufferedReader(new InputStreamReader(is));
+               this.output = new ByteArrayOutputStream();
+       }
+
+       /**
+        * When started this Thread will copy all data from the InputStream 
into a
+        * ByteArrayOutputStream via a BufferedReader. Because of the use of the
+        * BufferedReader this is only really appropriate for streams of textual
+        * data
+        */
+       @Override
+       public void run() {
+               try {
+                       String line = null;
+                       while ((line = br.readLine()) != null) {
+                               // && line.endsWith("</svg>") == false) {
+                               if (line.endsWith("\\") && 
!line.endsWith("\\\\")) {
+                                       line = line.substring(0, line.length() 
- 1);
+                                       output.write(line.getBytes());
+                               } else {
+                                       output.write(line.getBytes());
+                                       output.write(newLine);
+                               }
+                       }
+                       br.close();
+               } catch (IOException ioe) {
+                       logger.error(ioe);
+               }
+       }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-iteration-strategy-ui/src/main/java/net/sf/taverna/t2/workbench/iterationstrategy/IterationStrategyIcons.java
----------------------------------------------------------------------
diff --git 
a/taverna-iteration-strategy-ui/src/main/java/net/sf/taverna/t2/workbench/iterationstrategy/IterationStrategyIcons.java
 
b/taverna-iteration-strategy-ui/src/main/java/net/sf/taverna/t2/workbench/iterationstrategy/IterationStrategyIcons.java
deleted file mode 100644
index 350c0cc..0000000
--- 
a/taverna-iteration-strategy-ui/src/main/java/net/sf/taverna/t2/workbench/iterationstrategy/IterationStrategyIcons.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- 
******************************************************************************/
-package net.sf.taverna.t2.workbench.iterationstrategy;
-
-import javax.swing.ImageIcon;
-
-import org.apache.log4j.Logger;
-
-public class IterationStrategyIcons {
-
-       private static Logger logger = Logger
-                       .getLogger(IterationStrategyIcons.class);
-
-       public static ImageIcon joinIteratorIcon, lockStepIteratorIcon,
-                       leafnodeicon;
-
-       static {
-               try {
-                       Class<?> c = IterationStrategyIcons.class;
-                       joinIteratorIcon = new ImageIcon(c
-                                       
.getResource("icons/crossproducticon.png"));
-                       lockStepIteratorIcon = new ImageIcon(c
-                                       
.getResource("icons/dotproducticon.png"));
-                       leafnodeicon = new ImageIcon(c
-                                       .getResource("icons/leafnodeicon.png"));
-               } catch (Exception ex) {
-                       logger.warn("Could not find icon", ex);
-               }
-       }
-}

Reply via email to