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); - } - } -}
