You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@taverna.apache.org by re...@apache.org on 2015/03/27 17:22:19 UTC

[06/23] incubator-taverna-workbench-common-activities git commit:

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/163747de/taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/actions/AddXMLSplitterEdit.java
----------------------------------------------------------------------
diff --git a/taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/actions/AddXMLSplitterEdit.java b/taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/actions/AddXMLSplitterEdit.java
new file mode 100644
index 0000000..0d526d3
--- /dev/null
+++ b/taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/actions/AddXMLSplitterEdit.java
@@ -0,0 +1,314 @@
+/*
+* 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.activities.wsdl.actions;
+
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.taverna.activities.wsdl.servicedescriptions.WSDLServiceDescription;
+import org.apache.taverna.workbench.edits.CompoundEdit;
+import org.apache.taverna.workbench.edits.Edit;
+import org.apache.taverna.workbench.edits.EditException;
+import org.apache.taverna.workflow.edits.AddChildEdit;
+import org.apache.taverna.workflow.edits.AddDataLinkEdit;
+import org.apache.taverna.workflow.edits.AddProcessorEdit;
+import org.apache.taverna.wsdl.parser.ArrayTypeDescriptor;
+import org.apache.taverna.wsdl.parser.TypeDescriptor;
+import org.apache.taverna.wsdl.xmlsplitter.XMLSplitterSerialisationHelper;
+
+import org.jdom.Element;
+
+import org.apache.taverna.scufl2.api.activity.Activity;
+import org.apache.taverna.scufl2.api.common.Scufl2Tools;
+import org.apache.taverna.scufl2.api.configurations.Configuration;
+import org.apache.taverna.scufl2.api.core.DataLink;
+import org.apache.taverna.scufl2.api.core.Processor;
+import org.apache.taverna.scufl2.api.core.Workflow;
+import org.apache.taverna.scufl2.api.iterationstrategy.CrossProduct;
+import org.apache.taverna.scufl2.api.port.InputProcessorPort;
+import org.apache.taverna.scufl2.api.port.OutputProcessorPort;
+import org.apache.taverna.scufl2.api.profiles.ProcessorBinding;
+import org.apache.taverna.scufl2.api.profiles.Profile;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import org.apache.taverna.activities.wsdl.xmlsplitter.XMLSplitterConfigurationBeanBuilder;
+
+public class AddXMLSplitterEdit implements Edit<Workflow> {
+
+	public static final URI INPUT_SPLITTER_TYPE = URI
+			.create("http://ns.taverna.org.uk/2010/activity/xml-splitter/in");
+	public static final URI OUTPUT_SPLITTER_TYPE = URI
+			.create("http://ns.taverna.org.uk/2010/activity/xml-splitter/out");
+	public static final URI SPLITTER_CONFIG_TYPE = URI
+			.create("http://ns.taverna.org.uk/2010/activity/xml-splitter#Config");
+
+	private Scufl2Tools scufl2Tools = new Scufl2Tools();
+
+	private final Workflow workflow;
+	private final Profile profile;
+	private final Activity activity;
+	private TypeDescriptor typeDescriptor;
+	private final String portName;
+	private final boolean isInput;
+
+	private CompoundEdit compoundEdit1 = null;
+	private Edit<?> linkUpEdit;
+	private boolean applied = false;
+
+	public AddXMLSplitterEdit(Workflow workflow, Profile profile, Activity activity,
+			TypeDescriptor typeDescriptor, String portName, boolean isInput) {
+		this.workflow = workflow;
+		this.profile = profile;
+		this.activity = activity;
+		this.typeDescriptor = typeDescriptor;
+		this.portName = portName;
+		this.isInput = isInput;
+	}
+
+	@Override
+	public Workflow doEdit() throws EditException {
+		if (applied) {
+			throw new EditException("Edit has already been applied!");
+		}
+
+		Activity splitter = null;
+		Configuration splitterConfiguration = null;
+		String sourcePortName = "";
+		Processor sourceProcessor = null;
+
+		String sinkPortName = "";
+		Processor sinkProcessor = null;
+
+		Processor activityProcessor = null;
+		List<ProcessorBinding> processorBindingsToActivity = scufl2Tools
+				.processorBindingsToActivity(activity);
+		for (ProcessorBinding processorBinding : processorBindingsToActivity) {
+			activityProcessor = processorBinding.getBoundProcessor();
+			break;
+		}
+		if (activityProcessor == null) {
+			throw new EditException("Cannot find the processor that the activity belongs to");
+		}
+
+		String displayName = portName;
+		if (portName.equals("parameters")) {
+			displayName = isInput ? "input" : "output";
+		}
+		String processorName = activityProcessor.getName();
+		String candidateName;
+		if (displayName.startsWith(processorName)) {
+			// No need to make GetRequest_GetRequestResponse
+			candidateName = displayName;
+		} else {
+			// Combine with processor name
+			String displayProcessorName;
+			if (activity.getType().equals(INPUT_SPLITTER_TYPE)
+					|| activity.getType().equals(OUTPUT_SPLITTER_TYPE)) {
+				// For splitters on splitters - avoid adding up blah_bluh_blih_more_stuff
+				String[] processorNameSplit = processorName.replace("_input", "")
+						.replace("_output", "").split("_");
+				displayProcessorName = processorNameSplit[processorNameSplit.length - 1];
+			} else {
+				displayProcessorName = activityProcessor.getName();
+			}
+			candidateName = displayProcessorName + "_" + displayName;
+		}
+
+		Processor splitterProcessor = new Processor();
+		splitterProcessor.setName(candidateName);
+
+		CrossProduct crossProduct = new CrossProduct();
+		crossProduct.setParent(splitterProcessor.getIterationStrategyStack());
+
+		ProcessorBinding processorBinding = new ProcessorBinding();
+		processorBinding.setBoundProcessor(splitterProcessor);
+
+		try {
+			if (activity.getType().equals(INPUT_SPLITTER_TYPE)) {
+				if (!isInput) {
+					throw new EditException(
+							"Can only add an input splitter to another input splitter");
+				}
+				if (typeDescriptor instanceof ArrayTypeDescriptor
+						&& !((ArrayTypeDescriptor) typeDescriptor).isWrapped()) {
+					typeDescriptor = ((ArrayTypeDescriptor) typeDescriptor).getElementType();
+				}
+
+				Element element = XMLSplitterSerialisationHelper
+						.typeDescriptorToExtensionXML(typeDescriptor);
+//				String wrappedType = new XMLOutputter().outputString(element);
+
+				splitter = new Activity();
+				splitter.setType(INPUT_SPLITTER_TYPE);
+				splitterConfiguration = new Configuration();
+				splitterConfiguration.setType(SPLITTER_CONFIG_TYPE);
+				splitterConfiguration.setConfigures(splitter);
+//				((ObjectNode) splitterConfiguration.getJson()).put("wrappedType", wrappedType);
+
+				JsonNode bean = XMLSplitterConfigurationBeanBuilder.buildBeanForInput(element);
+				splitterConfiguration.setJson(bean);
+
+				XMLSplitterPortBuilder.addPortsForInput(element, splitter, splitterProcessor,
+						processorBinding);
+
+			} else if (activity.getType().equals(OUTPUT_SPLITTER_TYPE)) {
+				if (isInput) {
+					throw new EditException(
+							"Can only add an output splitter to another output splitter");
+				}
+				if (typeDescriptor instanceof ArrayTypeDescriptor
+						&& !((ArrayTypeDescriptor) typeDescriptor).isWrapped()) {
+					typeDescriptor = ((ArrayTypeDescriptor) typeDescriptor).getElementType();
+				}
+
+				Element element = XMLSplitterSerialisationHelper
+						.typeDescriptorToExtensionXML(typeDescriptor);
+//				String wrappedType = new XMLOutputter().outputString(element);
+
+				splitter = new Activity();
+				splitter.setType(OUTPUT_SPLITTER_TYPE);
+				splitterConfiguration = new Configuration();
+				splitterConfiguration.setType(SPLITTER_CONFIG_TYPE);
+				splitterConfiguration.setConfigures(splitter);
+//				((ObjectNode) splitterConfiguration.getJson()).put("wrappedType", wrappedType);
+
+				JsonNode bean = XMLSplitterConfigurationBeanBuilder.buildBeanForOutput(element);
+				splitterConfiguration.setJson(bean);
+
+				XMLSplitterPortBuilder.addPortsForOutput(element, splitter, splitterProcessor,
+						processorBinding);
+
+			} else if (activity.getType().equals(WSDLServiceDescription.ACTIVITY_TYPE)) {
+				if (isInput) {
+					Element element = XMLSplitterSerialisationHelper
+							.typeDescriptorToExtensionXML(typeDescriptor);
+//					String wrappedType = new XMLOutputter().outputString(element);
+
+					splitter = new Activity();
+					splitter.setType(WSDLServiceDescription.INPUT_SPLITTER_TYPE);
+					splitterConfiguration = new Configuration();
+					splitterConfiguration.setType(SPLITTER_CONFIG_TYPE);
+					splitterConfiguration.setConfigures(splitter);
+//					((ObjectNode) splitterConfiguration.getJson()).put("wrappedType", wrappedType);
+
+					JsonNode bean = XMLSplitterConfigurationBeanBuilder.buildBeanForInput(element);
+					splitterConfiguration.setJson(bean);
+
+					XMLSplitterPortBuilder.addPortsForInput(element, splitter, splitterProcessor,
+							processorBinding);
+
+				} else {
+					Element element = XMLSplitterSerialisationHelper
+							.typeDescriptorToExtensionXML(typeDescriptor);
+//					String wrappedType = new XMLOutputter().outputString(element);
+
+					splitter = new Activity();
+					splitter.setType(WSDLServiceDescription.OUTPUT_SPLITTER_TYPE);
+					splitterConfiguration = new Configuration();
+					splitterConfiguration.setType(SPLITTER_CONFIG_TYPE);
+					splitterConfiguration.setConfigures(splitter);
+//					((ObjectNode) splitterConfiguration.getJson()).put("wrappedType", wrappedType);
+
+					JsonNode bean = XMLSplitterConfigurationBeanBuilder.buildBeanForOutput(element);
+					splitterConfiguration.setJson(bean);
+
+					XMLSplitterPortBuilder.addPortsForOutput(element, splitter, splitterProcessor,
+							processorBinding);
+				}
+			} else {
+				throw new EditException(
+						"The activity type is not suitable for adding xml processing processors");
+			}
+		} catch (Exception e) {
+			throw new EditException(
+					"An error occured whilst tyring to add an XMLSplitter to the activity:"
+							+ activity, e);
+		}
+
+		if (isInput) {
+			sourcePortName = "output";
+			sinkPortName = portName;
+			sinkProcessor = activityProcessor;
+			sourceProcessor = splitterProcessor;
+		} else {
+			sourcePortName = portName;
+			sinkPortName = "input";
+			sinkProcessor = splitterProcessor;
+			sourceProcessor = activityProcessor;
+		}
+
+		processorBinding.setBoundActivity(splitter);
+
+		List<Edit<?>> editList = new ArrayList<Edit<?>>();
+		editList.add(new AddChildEdit<Profile>(profile, splitter));
+		editList.add(new AddChildEdit<Profile>(profile, splitterConfiguration));
+		editList.add(new AddChildEdit<Profile>(profile, processorBinding));
+		editList.add(new AddProcessorEdit(workflow, splitterProcessor));
+
+		compoundEdit1 = new CompoundEdit(editList);
+		compoundEdit1.doEdit();
+
+		List<Edit<?>> linkUpEditList = new ArrayList<Edit<?>>();
+
+		OutputProcessorPort source = sourceProcessor.getOutputPorts().getByName(sourcePortName);
+		InputProcessorPort sink = sinkProcessor.getInputPorts().getByName(sinkPortName);
+
+		if (source == null)
+			throw new EditException("Unable to find the source port when linking up "
+					+ sourcePortName + " to " + sinkPortName);
+		if (sink == null)
+			throw new EditException("Unable to find the sink port when linking up "
+					+ sourcePortName + " to " + sinkPortName);
+
+		DataLink dataLink = new DataLink();
+		dataLink.setReceivesFrom(source);
+		dataLink.setSendsTo(sink);
+		linkUpEditList.add(new AddDataLinkEdit(workflow, dataLink));
+
+		linkUpEdit = new CompoundEdit(linkUpEditList);
+		linkUpEdit.doEdit();
+		applied = true;
+		return workflow;
+	}
+
+	@Override
+	public void undo() {
+		if (!applied) {
+			throw new RuntimeException("Attempt to undo edit that was never applied");
+		}
+		if (linkUpEdit.isApplied())
+			linkUpEdit.undo();
+		if (compoundEdit1.isApplied())
+			compoundEdit1.undo();
+		applied = false;
+	}
+
+	@Override
+	public boolean isApplied() {
+		return applied;
+	}
+
+	@Override
+	public Object getSubject() {
+		return workflow;
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/163747de/taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/actions/WSDLActivityConfigureAction.java
----------------------------------------------------------------------
diff --git a/taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/actions/WSDLActivityConfigureAction.java b/taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/actions/WSDLActivityConfigureAction.java
new file mode 100644
index 0000000..ddf6002
--- /dev/null
+++ b/taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/actions/WSDLActivityConfigureAction.java
@@ -0,0 +1,70 @@
+/*
+* 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.activities.wsdl.actions;
+
+import java.awt.Frame;
+import java.awt.event.ActionEvent;
+
+import javax.swing.Action;
+import javax.swing.JDialog;
+
+import org.apache.taverna.activities.wsdl.views.WSDLActivityConfigurationView;
+import org.apache.taverna.security.credentialmanager.CredentialManager;
+import org.apache.taverna.servicedescriptions.ServiceDescriptionRegistry;
+import org.apache.taverna.workbench.activityicons.ActivityIconManager;
+import org.apache.taverna.workbench.edits.EditManager;
+import org.apache.taverna.workbench.file.FileManager;
+import org.apache.taverna.workbench.ui.actions.activity.ActivityConfigurationAction;
+import org.apache.taverna.workbench.ui.views.contextualviews.activity.ActivityConfigurationDialog;
+import org.apache.taverna.workbench.ui.views.contextualviews.activity.ActivityConfigurationPanel;
+import org.apache.taverna.scufl2.api.activity.Activity;
+
+@SuppressWarnings("serial")
+public class WSDLActivityConfigureAction extends ActivityConfigurationAction {
+
+	private final EditManager editManager;
+	private final FileManager fileManager;
+	private final CredentialManager credentialManager;
+
+	public WSDLActivityConfigureAction(Activity activity, Frame owner, EditManager editManager,
+			FileManager fileManager, ActivityIconManager activityIconManager,
+			ServiceDescriptionRegistry serviceDescriptionRegistry, CredentialManager credentialManager) {
+		super(activity, activityIconManager, serviceDescriptionRegistry);
+		this.editManager = editManager;
+		this.fileManager = fileManager;
+		this.credentialManager = credentialManager;
+		putValue(Action.NAME, "Configure security");
+	}
+
+	public void actionPerformed(ActionEvent e) {
+		JDialog currentDialog = ActivityConfigurationAction.getDialog(getActivity());
+		if (currentDialog != null) {
+			currentDialog.toFront();
+			return;
+		}
+		final ActivityConfigurationPanel rshellConfigView = new WSDLActivityConfigurationView(
+				getActivity(), credentialManager);
+		final ActivityConfigurationDialog dialog = new ActivityConfigurationDialog(getActivity(),
+				rshellConfigView, editManager);
+
+		ActivityConfigurationAction.setDialog(getActivity(), dialog, fileManager);
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/163747de/taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/actions/XMLSplitterPortBuilder.java
----------------------------------------------------------------------
diff --git a/taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/actions/XMLSplitterPortBuilder.java b/taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/actions/XMLSplitterPortBuilder.java
new file mode 100644
index 0000000..fe89b5f
--- /dev/null
+++ b/taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/actions/XMLSplitterPortBuilder.java
@@ -0,0 +1,126 @@
+/*
+* 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.activities.wsdl.actions;
+
+import org.apache.taverna.wsdl.parser.ArrayTypeDescriptor;
+import org.apache.taverna.wsdl.parser.BaseTypeDescriptor;
+import org.apache.taverna.wsdl.parser.ComplexTypeDescriptor;
+import org.apache.taverna.wsdl.parser.TypeDescriptor;
+import org.apache.taverna.wsdl.xmlsplitter.XMLSplitterSerialisationHelper;
+
+import org.jdom.Element;
+
+import org.apache.taverna.scufl2.api.activity.Activity;
+import org.apache.taverna.scufl2.api.common.NamedSet;
+import org.apache.taverna.scufl2.api.core.Processor;
+import org.apache.taverna.scufl2.api.port.InputActivityPort;
+import org.apache.taverna.scufl2.api.port.InputProcessorPort;
+import org.apache.taverna.scufl2.api.port.OutputActivityPort;
+import org.apache.taverna.scufl2.api.port.OutputProcessorPort;
+import org.apache.taverna.scufl2.api.profiles.ProcessorBinding;
+import org.apache.taverna.scufl2.api.profiles.ProcessorInputPortBinding;
+import org.apache.taverna.scufl2.api.profiles.ProcessorOutputPortBinding;
+
+/**
+ * A helper class to facilitate in building XMLSplitter ports
+ * from the type descriptor XML.
+ *
+ * @author Stuart Owen
+ * @author David Withers
+ */
+public class XMLSplitterPortBuilder {
+
+	public static void addPortsForInput(Element element, Activity activity, Processor processor,
+			ProcessorBinding binding) {
+		TypeDescriptor descriptor = XMLSplitterSerialisationHelper.extensionXMLToTypeDescriptor(element);
+		addOutputPort("output", 0, activity, processor, binding);
+
+		if (descriptor instanceof ComplexTypeDescriptor) {
+			for (TypeDescriptor typeDescriptor : ((ComplexTypeDescriptor) descriptor).getElements()) {
+				addInputPort(typeDescriptor.getName(), depthForDescriptor(typeDescriptor), activity, processor,
+						binding);
+			}
+			NamedSet<InputActivityPort> inputPorts = activity.getInputPorts();
+			for (TypeDescriptor typeDescriptor : ((ComplexTypeDescriptor) descriptor).getAttributes()) {
+				String name = typeDescriptor.getName();
+				if (inputPorts.containsName(name)) {
+					name = "1" + name;
+				}
+				addInputPort(name, depthForDescriptor(typeDescriptor), activity, processor, binding);
+			}
+		} else if (descriptor instanceof ArrayTypeDescriptor) {
+			addInputPort(descriptor.getName(), 1, activity, processor, binding);
+		}
+	}
+
+	public static void addPortsForOutput(Element element, Activity activity, Processor processor,
+			ProcessorBinding binding) {
+		TypeDescriptor descriptor = XMLSplitterSerialisationHelper.extensionXMLToTypeDescriptor(element);
+		addInputPort("input", 0, activity, processor, binding);
+
+		if (descriptor instanceof ComplexTypeDescriptor) {
+			for (TypeDescriptor typeDescriptor : ((ComplexTypeDescriptor) descriptor).getElements()) {
+				addOutputPort(typeDescriptor.getName(), depthForDescriptor(typeDescriptor), activity, processor,
+						binding);
+			}
+			NamedSet<OutputActivityPort> outputPorts = activity.getOutputPorts();
+			for (TypeDescriptor typeDescriptor : ((ComplexTypeDescriptor) descriptor).getAttributes()) {
+				String name = typeDescriptor.getName();
+				if (outputPorts.containsName(name)) {
+					name = "1" + name;
+				}
+				addOutputPort(name, depthForDescriptor(typeDescriptor), activity, processor, binding);
+			}
+		} else if (descriptor instanceof ArrayTypeDescriptor) {
+			addOutputPort(descriptor.getName(), 1, activity, processor, binding);
+		}
+	}
+
+	private static int depthForDescriptor(TypeDescriptor desc) {
+		if (desc instanceof ArrayTypeDescriptor
+				&& (!((ArrayTypeDescriptor) desc).isWrapped() || ((ArrayTypeDescriptor) desc)
+						.getElementType() instanceof BaseTypeDescriptor)) {
+			return 1;
+		} else {
+			return 0;
+		}
+	}
+
+	private static void addOutputPort(String name, int depth, Activity activity,
+			Processor processor, ProcessorBinding binding) {
+		OutputActivityPort activityPort = new OutputActivityPort(activity, name);
+		activityPort.setDepth(depth);
+		activityPort.setGranularDepth(depth);
+		OutputProcessorPort processorPort = new OutputProcessorPort(processor, name);
+		processorPort.setDepth(depth);
+		processorPort.setGranularDepth(depth);
+		new ProcessorOutputPortBinding(binding, activityPort, processorPort);
+	}
+
+	private static void addInputPort(String name, int depth, Activity activity,
+			Processor processor, ProcessorBinding binding) {
+		InputActivityPort activityPort = new InputActivityPort(activity, name);
+		activityPort.setDepth(depth);
+		InputProcessorPort processorPort = new InputProcessorPort(processor, name);
+		processorPort.setDepth(depth);
+		new ProcessorInputPortBinding(binding, processorPort, activityPort);
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/163747de/taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/menu/AddXMLInputSplitterForWSDLActivityMenuAction.java
----------------------------------------------------------------------
diff --git a/taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/menu/AddXMLInputSplitterForWSDLActivityMenuAction.java b/taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/menu/AddXMLInputSplitterForWSDLActivityMenuAction.java
new file mode 100644
index 0000000..60212b3
--- /dev/null
+++ b/taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/menu/AddXMLInputSplitterForWSDLActivityMenuAction.java
@@ -0,0 +1,30 @@
+/*
+* 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.activities.wsdl.menu;
+
+import org.apache.taverna.activities.wsdl.servicedescriptions.WSDLServiceDescription;
+
+public class AddXMLInputSplitterForWSDLActivityMenuAction extends AddXMLInputSplitterMenuAction {
+
+	public AddXMLInputSplitterForWSDLActivityMenuAction() {
+		super(WSDLServiceDescription.ACTIVITY_TYPE);
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/163747de/taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/menu/AddXMLInputSplitterForXMLInputSplitterMenuAction.java
----------------------------------------------------------------------
diff --git a/taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/menu/AddXMLInputSplitterForXMLInputSplitterMenuAction.java b/taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/menu/AddXMLInputSplitterForXMLInputSplitterMenuAction.java
new file mode 100644
index 0000000..8f3892f
--- /dev/null
+++ b/taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/menu/AddXMLInputSplitterForXMLInputSplitterMenuAction.java
@@ -0,0 +1,30 @@
+/*
+* 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.activities.wsdl.menu;
+
+import org.apache.taverna.activities.wsdl.servicedescriptions.WSDLServiceDescription;
+
+public class AddXMLInputSplitterForXMLInputSplitterMenuAction extends AddXMLInputSplitterMenuAction {
+
+	public AddXMLInputSplitterForXMLInputSplitterMenuAction() {
+		super(WSDLServiceDescription.INPUT_SPLITTER_TYPE);
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/163747de/taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/menu/AddXMLInputSplitterMenuAction.java
----------------------------------------------------------------------
diff --git a/taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/menu/AddXMLInputSplitterMenuAction.java b/taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/menu/AddXMLInputSplitterMenuAction.java
new file mode 100644
index 0000000..be6b4be
--- /dev/null
+++ b/taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/menu/AddXMLInputSplitterMenuAction.java
@@ -0,0 +1,85 @@
+/*
+* 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.activities.wsdl.menu;
+
+import java.io.IOException;
+import java.net.URI;
+import java.util.Map;
+
+import javax.swing.Action;
+import javax.wsdl.WSDLException;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.jdom.JDOMException;
+import org.xml.sax.SAXException;
+
+import org.apache.taverna.activities.wsdl.actions.AbstractAddXMLSplitterAction;
+import org.apache.taverna.activities.wsdl.actions.AddXMLInputSplitterAction;
+import org.apache.taverna.ui.menu.ContextualMenuComponent;
+import org.apache.taverna.ui.menu.MenuComponent;
+import org.apache.taverna.workbench.activitytools.AbstractConfigureActivityMenuAction;
+import org.apache.taverna.workbench.edits.EditManager;
+import org.apache.taverna.workbench.selection.SelectionManager;
+import org.apache.taverna.wsdl.parser.TypeDescriptor;
+import org.apache.taverna.wsdl.parser.UnknownOperationException;
+
+/**
+ * @author alanrw
+ */
+public abstract class AddXMLInputSplitterMenuAction extends AbstractConfigureActivityMenuAction
+		implements MenuComponent, ContextualMenuComponent {
+
+	private static final String ADD_XML_INPUT_SPLITTER = "Add XML Input Splitter";
+	private EditManager editManager;
+	private SelectionManager selectionManager;
+
+	public AddXMLInputSplitterMenuAction(URI activityType) {
+		super(activityType);
+	}
+
+	@Override
+	protected Action createAction() {
+		AddXMLInputSplitterAction configAction = new AddXMLInputSplitterAction(findActivity(),
+				null, editManager, selectionManager);
+		Map<String, TypeDescriptor> descriptors;
+		try {
+			descriptors = configAction.getTypeDescriptors();
+		} catch (UnknownOperationException | IOException | ParserConfigurationException
+				| WSDLException | SAXException | JDOMException e) {
+			return null;
+		}
+		if (!AbstractAddXMLSplitterAction.filterDescriptors(descriptors).isEmpty()) {
+			configAction.putValue(Action.NAME, ADD_XML_INPUT_SPLITTER);
+			addMenuDots(configAction);
+			return configAction;
+		} else {
+			return null;
+		}
+	}
+
+	public void setEditManager(EditManager editManager) {
+		this.editManager = editManager;
+	}
+
+	public void setSelectionManager(SelectionManager selectionManager) {
+		this.selectionManager = selectionManager;
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/163747de/taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/menu/AddXMLOutputSplitterForWSDLActivityMenuAction.java
----------------------------------------------------------------------
diff --git a/taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/menu/AddXMLOutputSplitterForWSDLActivityMenuAction.java b/taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/menu/AddXMLOutputSplitterForWSDLActivityMenuAction.java
new file mode 100644
index 0000000..ba92806
--- /dev/null
+++ b/taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/menu/AddXMLOutputSplitterForWSDLActivityMenuAction.java
@@ -0,0 +1,30 @@
+/*
+* 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.activities.wsdl.menu;
+
+import org.apache.taverna.activities.wsdl.servicedescriptions.WSDLServiceDescription;
+
+public class AddXMLOutputSplitterForWSDLActivityMenuAction extends AddXMLOutputSplitterMenuAction {
+
+	public AddXMLOutputSplitterForWSDLActivityMenuAction() {
+		super(WSDLServiceDescription.ACTIVITY_TYPE);
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/163747de/taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/menu/AddXMLOutputSplitterForXMLOutputSplitterMenuAction.java
----------------------------------------------------------------------
diff --git a/taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/menu/AddXMLOutputSplitterForXMLOutputSplitterMenuAction.java b/taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/menu/AddXMLOutputSplitterForXMLOutputSplitterMenuAction.java
new file mode 100644
index 0000000..8ac883d
--- /dev/null
+++ b/taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/menu/AddXMLOutputSplitterForXMLOutputSplitterMenuAction.java
@@ -0,0 +1,30 @@
+/*
+* 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.activities.wsdl.menu;
+
+import org.apache.taverna.activities.wsdl.servicedescriptions.WSDLServiceDescription;
+
+public class AddXMLOutputSplitterForXMLOutputSplitterMenuAction extends AddXMLOutputSplitterMenuAction {
+
+	public AddXMLOutputSplitterForXMLOutputSplitterMenuAction() {
+		super(WSDLServiceDescription.OUTPUT_SPLITTER_TYPE);
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/163747de/taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/menu/AddXMLOutputSplitterMenuAction.java
----------------------------------------------------------------------
diff --git a/taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/menu/AddXMLOutputSplitterMenuAction.java b/taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/menu/AddXMLOutputSplitterMenuAction.java
new file mode 100644
index 0000000..6acaad7
--- /dev/null
+++ b/taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/menu/AddXMLOutputSplitterMenuAction.java
@@ -0,0 +1,82 @@
+/*
+* 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.activities.wsdl.menu;
+
+import java.io.IOException;
+import java.net.URI;
+import java.util.Map;
+
+import javax.swing.Action;
+import javax.wsdl.WSDLException;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.apache.taverna.activities.wsdl.actions.AbstractAddXMLSplitterAction;
+import org.apache.taverna.activities.wsdl.actions.AddXMLOutputSplitterAction;
+import org.apache.taverna.workbench.activitytools.AbstractConfigureActivityMenuAction;
+import org.apache.taverna.workbench.edits.EditManager;
+import org.apache.taverna.workbench.selection.SelectionManager;
+import org.apache.taverna.wsdl.parser.TypeDescriptor;
+import org.apache.taverna.wsdl.parser.UnknownOperationException;
+
+import org.jdom.JDOMException;
+import org.xml.sax.SAXException;
+
+/**
+ * @author alanrw
+ */
+public abstract class AddXMLOutputSplitterMenuAction extends AbstractConfigureActivityMenuAction {
+
+	private static final String ADD_XML_OUTPUT_SPLITTER = "Add XML Output Splitter";
+	private EditManager editManager;
+	private SelectionManager selectionManager;
+
+	public AddXMLOutputSplitterMenuAction(URI activityType) {
+		super(activityType);
+	}
+
+	@Override
+	protected Action createAction() {
+		AddXMLOutputSplitterAction configAction = new AddXMLOutputSplitterAction(
+				findActivity(), null, editManager, selectionManager);
+		Map<String, TypeDescriptor> descriptors;
+		try {
+			descriptors = configAction.getTypeDescriptors();
+		} catch (UnknownOperationException | IOException | ParserConfigurationException
+				| WSDLException | SAXException | JDOMException e) {
+			return null;
+		}
+		if (!AbstractAddXMLSplitterAction.filterDescriptors(descriptors).isEmpty()) {
+			configAction.putValue(Action.NAME, ADD_XML_OUTPUT_SPLITTER);
+			addMenuDots(configAction);
+			return configAction;
+		} else {
+			return null;
+		}
+	}
+
+	public void setEditManager(EditManager editManager) {
+		this.editManager = editManager;
+	}
+
+	public void setSelectionManager(SelectionManager selectionManager) {
+		this.selectionManager = selectionManager;
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/163747de/taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/menu/ConfigureWSDLMenuAction.java
----------------------------------------------------------------------
diff --git a/taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/menu/ConfigureWSDLMenuAction.java b/taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/menu/ConfigureWSDLMenuAction.java
new file mode 100644
index 0000000..fd110f6
--- /dev/null
+++ b/taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/menu/ConfigureWSDLMenuAction.java
@@ -0,0 +1,77 @@
+/*
+* 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.activities.wsdl.menu;
+
+import javax.swing.Action;
+
+import org.apache.taverna.activities.wsdl.actions.WSDLActivityConfigureAction;
+import org.apache.taverna.activities.wsdl.servicedescriptions.WSDLServiceDescription;
+import org.apache.taverna.security.credentialmanager.CredentialManager;
+import org.apache.taverna.servicedescriptions.ServiceDescriptionRegistry;
+import org.apache.taverna.ui.menu.ContextualMenuComponent;
+import org.apache.taverna.ui.menu.MenuComponent;
+import org.apache.taverna.workbench.activityicons.ActivityIconManager;
+import org.apache.taverna.workbench.activitytools.AbstractConfigureActivityMenuAction;
+import org.apache.taverna.workbench.edits.EditManager;
+import org.apache.taverna.workbench.file.FileManager;
+
+public class ConfigureWSDLMenuAction extends AbstractConfigureActivityMenuAction implements
+		MenuComponent, ContextualMenuComponent {
+
+	private EditManager editManager;
+	private ActivityIconManager activityIconManager;
+	private ServiceDescriptionRegistry serviceDescriptionRegistry;
+	private CredentialManager credentialManager;
+	private FileManager fileManager;
+
+	public ConfigureWSDLMenuAction() {
+		super(WSDLServiceDescription.ACTIVITY_TYPE);
+	}
+
+	@Override
+	protected Action createAction() {
+		WSDLActivityConfigureAction configAction = new WSDLActivityConfigureAction(findActivity(),
+				getParentFrame(), editManager, fileManager, activityIconManager,
+				serviceDescriptionRegistry, credentialManager);
+		addMenuDots(configAction);
+		return configAction;
+	}
+
+	public void setEditManager(EditManager editManager) {
+		this.editManager = editManager;
+	}
+
+	public void setFileManager(FileManager fileManager) {
+		this.fileManager = fileManager;
+	}
+
+	public void setActivityIconManager(ActivityIconManager activityIconManager) {
+		this.activityIconManager = activityIconManager;
+	}
+
+	public void setServiceDescriptionRegistry(ServiceDescriptionRegistry serviceDescriptionRegistry) {
+		this.serviceDescriptionRegistry = serviceDescriptionRegistry;
+	}
+
+	public void setCredentialManager(CredentialManager credentialManager) {
+		this.credentialManager = credentialManager;
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/163747de/taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/servicedescriptions/AddWSDLServiceDialog.java
----------------------------------------------------------------------
diff --git a/taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/servicedescriptions/AddWSDLServiceDialog.java b/taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/servicedescriptions/AddWSDLServiceDialog.java
new file mode 100644
index 0000000..0965f35
--- /dev/null
+++ b/taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/servicedescriptions/AddWSDLServiceDialog.java
@@ -0,0 +1,302 @@
+/*
+* 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.activities.wsdl.servicedescriptions;
+
+import java.awt.BorderLayout;
+import java.awt.FlowLayout;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.Insets;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.KeyEvent;
+import java.io.IOException;
+import java.net.URL;
+import java.net.URLConnection;
+
+import javax.swing.JButton;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JTextField;
+import javax.swing.border.EmptyBorder;
+
+import org.apache.taverna.workbench.MainWindow;
+import org.apache.taverna.workbench.helper.HelpEnabledDialog;
+
+import org.apache.log4j.Logger;
+
+/**
+ * Dialog that lets user specify a URL of a WSDL service they want
+ * to add to the Service Panel. In the case the WSDL URL is behind
+ * HTTPS or service's endpoints require HTTPS it will ask user to confirm
+ * if they want to trust it.
+ *
+ * @author Alex Nenadic
+ *
+ */
+@SuppressWarnings("serial")
+public abstract class AddWSDLServiceDialog extends HelpEnabledDialog {
+
+	private JTextField wsdlLocationField;
+	private Logger logger = Logger.getLogger(AddWSDLServiceDialog.class);
+
+	public AddWSDLServiceDialog()  {
+		super(MainWindow.getMainWindow(), "Add WSDL service", true, null); // create a non-modal dialog
+		initComponents();
+		setLocationRelativeTo(getParent());
+	}
+
+	private void initComponents() {
+		JPanel mainPanel = new JPanel(new GridBagLayout());
+		mainPanel.setBorder(new EmptyBorder(10,10,10,10));
+
+		JLabel wsdlLocatitionLabel = new JLabel("WSDL location",WSDLActivityIcon.getWSDLIcon(), JLabel.LEFT);
+		GridBagConstraints gbc = new GridBagConstraints();
+		gbc.weighty = 0.0;
+
+		gbc.weightx = 0.0;
+		gbc.gridx = 0;
+		gbc.gridy = 0;
+		gbc.fill = GridBagConstraints.NONE;
+		gbc.anchor = GridBagConstraints.WEST;
+		gbc.insets = new Insets(5, 10, 0, 0);
+		mainPanel.add(wsdlLocatitionLabel, gbc);
+
+		wsdlLocationField = new JTextField("http://somehost/service?wsdl");
+		gbc.weightx = 1.0;
+		gbc.gridx = 1;
+		gbc.gridy = 0;
+		gbc.fill = GridBagConstraints.HORIZONTAL;
+		gbc.anchor = GridBagConstraints.WEST;
+		gbc.insets = new Insets(5, 10, 0, 5);
+		mainPanel.add(wsdlLocationField, gbc);
+
+	    final JButton addServiceButton = new JButton("Add");
+	    addServiceButton.addActionListener(new ActionListener()
+	        {
+	            public void actionPerformed(ActionEvent evt)
+	            {
+	                addPressed();
+	            }
+	        });
+
+	    // When user presses "Return" key fire the action on the "Add" button
+	    addServiceButton.addKeyListener(new java.awt.event.KeyAdapter() {
+			public void keyPressed(java.awt.event.KeyEvent evt) {
+				if (evt.getKeyCode() == KeyEvent.VK_ENTER) {
+					addPressed();
+				}
+			}
+		});
+		getRootPane().setDefaultButton(addServiceButton);
+
+        JPanel buttonsPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
+        buttonsPanel.add(addServiceButton);
+
+        getContentPane().setLayout(new BorderLayout());
+        getContentPane().add(mainPanel, BorderLayout.CENTER);
+        getContentPane().add(buttonsPanel, BorderLayout.SOUTH);
+
+		setSize(getPreferredSize());
+        pack();
+	}
+
+    /**
+     * 'Add service' button pressed or otherwise activated.
+     */
+    private void addPressed()
+    {
+		final String wsdlURLString = wsdlLocationField.getText().trim();
+		new Thread("Adding WSDL " + wsdlURLString) {
+			public void run() {
+				// Only add the service provider for this service if service URL
+				// starts with 'http'
+				// or if it starts with 'https' and user explicitly said they
+				// wanted to trust this service.
+				/*
+				 * if (shouldTrust(wsdlURLString)){ addRegistry(wsdlURLString);
+				 * }
+				 */
+				try {
+					URL url = new URL(wsdlURLString);
+					URLConnection connection = url.openConnection();
+					try {
+						// If the url starts with 'https' - security hook for
+						// https connection's trust manager
+						// will be engaged and user will be asked automatically
+						// if they want
+						// to trust the connection (if it is not already
+						// trusted). If the urls starts with 'http' -
+						// this will not have any effect apart from checking if
+						// we can open a connection.
+						connection.connect(); // if this does not fail - add the
+						// WSDL
+						// service provider for this service to
+						// the registry
+					} finally {
+						try {
+							connection.getInputStream().close();
+						} catch (IOException ex) {
+						}
+					}
+					addRegistry(wsdlURLString);
+				} catch (Exception ex) { // anything failed
+					JOptionPane.showMessageDialog(null,
+							"Could not read the WSDL definition from "
+									+ wsdlURLString + ":\n" + ex,
+							"Could not add WSDL service",
+							JOptionPane.ERROR_MESSAGE);
+
+					logger.error(
+							"Failed to add WSDL service provider for service: "
+									+ wsdlURLString, ex);
+
+				}
+			};
+		}.start();
+		closeDialog();
+    }
+
+    /**
+     * If WSDL service's URL starts with 'https' - asks user
+     * whether to trust it or not. If it starts with 'http' -
+     * does not ask anything as the service is implicitly trusted (weird but true).
+     */
+	protected abstract void addRegistry(String wsdl);
+
+	/**
+	 * Checks if a service is trusted and if not - asks user if they want to trust it.
+	 */
+//	public boolean shouldTrust(String wsdlURLString){
+//		try {
+//			URI wsdlURI = new URI(wsdlURLString);
+//			URL wsdlURL = wsdlURI.toURL();
+//			String protocol = wsdlURL.getProtocol();
+//			if (protocol.toLowerCase().startsWith("https")){
+//				logger.info("Checking if service " + wsdlURLString + " is already trusted.");
+//				// Check if opening an HTTPS connection will cause a SSLHandshakeException.
+//				// This is most probably due to the fact that we do not have this service's
+//				// certificate in Credential Manager's truststore
+//				try {
+//					HttpsURLConnection httpsConnection;
+//					httpsConnection = (HttpsURLConnection) wsdlURL.openConnection();
+//					httpsConnection.connect();
+//					logger.info("HTTPS works out of the box for service " + wsdlURLString);
+//					return true; // Opening HTTPS connection worked - so we trust this service already
+//				}
+//				catch (SSLException sslex) { // most probably due to the fact that service is not trusted, i.e. its certificate is not in Credential Manager's Truststore
+//					logger.info("Service " + wsdlURLString + " is not trusted out of the box. Trying to fetch its certificate.");
+//					logger.info("The SSLException was caused by: " + sslex.getCause());
+//						// Handshake most probably failed as we do not already trust this service -
+//						// fetch its certificate and ask user if they want to add this service as trusted
+//					try {
+//
+//						// This controls SSL socket creation for HTTPS connections
+//						// per thread so the damage of switching off certificates
+//						// verification is limited
+//						ThreadLocalSSLSocketFactory.install();
+//						// switch certificate checking off for a moment so we can fetch
+//						// service's certificate
+//						ThreadLocalSSLSocketFactory.startTrustingEverything();
+//
+//						HttpsURLConnection httpsConnection;
+//						httpsConnection = (HttpsURLConnection) wsdlURL
+//								.openConnection();
+//						httpsConnection.connect();
+//						// Stop being overly trusting
+//						ThreadLocalSSLSocketFactory.stopTrustingEverything();
+//						Certificate[] certificates = httpsConnection
+//								.getServerCertificates();
+//						logger.info("Need to ask user if they want to trust service " + wsdlURLString);
+//						// Ask user if they want to trust this service
+//						ConfirmTrustedCertificateDialog confirmCertTrustDialog = new ConfirmTrustedCertificateDialog(
+//								this, "Untrusted HTTPS connection", true,
+//								(X509Certificate) certificates[0]);
+//						confirmCertTrustDialog.setLocationRelativeTo(null);
+//						confirmCertTrustDialog.setVisible(true);
+//						boolean shouldTrust = confirmCertTrustDialog
+//								.shouldTrust();
+//						if (shouldTrust) {
+//							try {
+//								CredentialManager credManager = CredentialManager
+//										.getInstance();
+//								credManager
+//										.saveTrustedCertificate((X509Certificate) certificates[0]);
+//								return true;
+//							} catch (CMException cme) {
+//								logger
+//										.error(
+//												"Failed to add WSDL service provider for service: "
+//														+ wsdlURLString
+//														+ " . Credential Manager failed to "
+//														+ "save trusted certificate.",
+//												cme);
+//								return false;
+//							}
+//						} else {
+//							// Do not even add a WSDL service provider for this
+//							// service and tell user the service will not be
+//							// added to Service Panel
+//							JOptionPane
+//									.showMessageDialog(
+//											this,
+//											"As you refused to trust it, the service will not be added to Service Panel.",
+//											"Add WSDL service",
+//											JOptionPane.INFORMATION_MESSAGE);
+//							return false;
+//						}
+//					} catch (Exception e1) {
+//						logger
+//								.error(
+//										"Failed to add WSDL service provider for service: "
+//												+ wsdlURLString
+//												+ ". 'Trust everyone' HTTPS connection failed.",
+//										e1);
+//						return false;
+//					} finally {// switch it off here as well if some unexpected exception occurred
+//						ThreadLocalSSLSocketFactory.stopTrustingEverything();
+//					}
+//
+//				} catch (Exception e2) {
+//					logger.error("Failed to add WSDL service provider for service: "+ wsdlURLString+". Connecting to service failed.", e2);
+//					return false;
+//				}
+//			}
+//			else{ // protocol starts with 'http'
+//				return true;
+//			}
+//		} catch (MalformedURLException e3) {
+//			logger.error("Failed to add WSDL service provider: URL "+ wsdlURLString+" was malformed.", e3);
+//			return false;
+//		} catch (URISyntaxException e4) {
+//			logger.error("Failed to add WSDL service provider: URI "+ wsdlURLString+" could not be parsed.", e4);
+//			return false;
+//		}
+//	}
+
+	/**
+	 * Closes the dialog.
+	 */
+	private void closeDialog() {
+		setVisible(false);
+		dispose();
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/163747de/taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/servicedescriptions/ConfirmTrustedCertificateDialog.java
----------------------------------------------------------------------
diff --git a/taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/servicedescriptions/ConfirmTrustedCertificateDialog.java b/taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/servicedescriptions/ConfirmTrustedCertificateDialog.java
new file mode 100644
index 0000000..62c620a
--- /dev/null
+++ b/taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/servicedescriptions/ConfirmTrustedCertificateDialog.java
@@ -0,0 +1,585 @@
+/*
+* 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.activities.wsdl.servicedescriptions;
+
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Dialog;
+import java.awt.FlowLayout;
+import java.awt.Frame;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.Insets;
+import java.awt.Font;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.math.BigInteger;
+import java.util.HashMap;
+
+import javax.swing.JButton;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JTextField;
+import javax.swing.border.CompoundBorder;
+import javax.swing.border.EmptyBorder;
+import javax.swing.border.EtchedBorder;
+import javax.swing.JSeparator;
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.security.cert.CertificateEncodingException;
+import java.security.cert.X509Certificate;
+import javax.security.auth.x500.X500Principal;
+
+import org.apache.taverna.lang.ui.DialogTextArea;
+import org.apache.taverna.security.credentialmanager.CMException;
+import org.apache.taverna.security.credentialmanager.CMUtils;
+import org.apache.taverna.workbench.helper.HelpEnabledDialog;
+
+import org.apache.log4j.Logger;
+import org.bouncycastle.asn1.ASN1OctetString;
+import org.bouncycastle.asn1.DERBitString;
+import org.bouncycastle.asn1.DEROctetString;
+import org.bouncycastle.asn1.misc.NetscapeCertType;
+
+/**
+ * Displays the details of a X.509 certificate and asks user if they want to
+ * trust it.
+ * 
+ * @author Alex Nenadic
+ */
+@SuppressWarnings("serial")
+public class ConfirmTrustedCertificateDialog extends HelpEnabledDialog {
+	
+	private static Logger logger = Logger.getLogger(ConfirmTrustedCertificateDialog.class);
+
+	// Stores certificate to display
+	private X509Certificate cert;
+
+	// Stores user's decision as whether to trust this service's certificaet or not.
+	private boolean shouldTrust;
+
+	/**
+	 * Creates new ConfirmTrustedCertificateDialog where parent is a Frame.
+	 */
+	public ConfirmTrustedCertificateDialog(Frame parent, String title,
+			boolean modal, X509Certificate crt)
+			throws CMException {
+		super(parent, title, modal, null);
+		this.cert = crt;
+		initComponents();
+	}
+	
+	/**
+	 * Creates new ConfirmTrustedCertificateDialog where parent is a Dialog.
+	 */
+	public ConfirmTrustedCertificateDialog(Dialog parent, String title,
+			boolean modal, X509Certificate crt)
+			throws CMException {
+		super(parent, title, modal, null);
+		this.cert = crt;
+		initComponents();
+	}
+
+	/**
+	 * Initialise the dialog's GUI components.
+	 */
+	private void initComponents(){
+		
+		// title panel
+		JPanel titlePanel = new JPanel(new BorderLayout());
+		titlePanel.setBackground(Color.WHITE);
+		JLabel titleLabel = new JLabel("View service's certificate");
+		titleLabel.setFont(titleLabel.getFont().deriveFont(Font.BOLD, 13.5f));
+		titleLabel.setBorder(new EmptyBorder(10, 10, 0, 10));
+		DialogTextArea titleMessage = new DialogTextArea("This service requires HTTPS connection and has identified itself with the certificate below.\n" +
+				"Do you want to trust this service? (Refusing to trust means you will not be able to invoke it from a workflow.)");
+		titleMessage.setMargin(new Insets(5, 20, 10, 10));
+		titleMessage.setFont(titleMessage.getFont().deriveFont(11f));
+		titleMessage.setEditable(false);
+		titleMessage.setFocusable(false);
+		titlePanel.setBorder( new EmptyBorder(10, 10, 0, 10));
+		titlePanel.add(titleLabel, BorderLayout.NORTH);
+		titlePanel.add(titleMessage, BorderLayout.CENTER);
+		
+		// Certificate details:
+
+		// Grid Bag Constraints templates for labels (column 1) and
+		// values (column 2) of certificate details
+		GridBagConstraints gbcLabel = new GridBagConstraints();
+		gbcLabel.gridx = 0;
+		gbcLabel.ipadx = 20;
+		gbcLabel.gridwidth = 1;
+		gbcLabel.gridheight = 1;
+		gbcLabel.insets = new Insets(2, 15, 2, 2);
+		gbcLabel.anchor = GridBagConstraints.LINE_START;
+
+		GridBagConstraints gbcValue = new GridBagConstraints();
+		gbcValue.gridx = 1;
+		gbcValue.gridwidth = 1;
+		gbcValue.gridheight = 1;
+		gbcValue.insets = new Insets(2, 5, 2, 2);
+		gbcValue.anchor = GridBagConstraints.LINE_START;
+
+		// Netscape Certificate Type non-critical extension (if any)
+		// defines the intended uses of the certificate - to make it look like
+		// firefox's view certificate dialog
+		byte[] intendedUses = cert.getExtensionValue("2.16.840.1.113730.1.1"); // Netscape Certificate Type OID
+		JLabel jlIntendedUses = null;
+		JTextField jtfIntendedUsesValue = null;
+		JPanel jpUses = null;
+		GridBagConstraints gbc_jpUses = null;
+		if (intendedUses != null) {
+			jlIntendedUses = new JLabel(
+					"This certificate has been approved for the following uses:");
+			jlIntendedUses.setFont(new Font(null, Font.BOLD, 11));
+			jlIntendedUses.setBorder(new EmptyBorder(5, 5, 5, 5));
+
+			jtfIntendedUsesValue = new JTextField(45);
+			jtfIntendedUsesValue.setText(getIntendedUses(intendedUses));
+			jtfIntendedUsesValue.setEditable(false);
+			jtfIntendedUsesValue.setFont(new Font(null, Font.PLAIN, 11));
+
+			jpUses = new JPanel(new BorderLayout());
+			jpUses.add(jlIntendedUses, BorderLayout.NORTH);
+			jpUses.add(jtfIntendedUsesValue, BorderLayout.CENTER);
+			JSeparator jsp = new JSeparator(JSeparator.HORIZONTAL);
+			jpUses.add(jsp, BorderLayout.SOUTH);
+
+			gbc_jpUses = (GridBagConstraints) gbcLabel.clone();
+			gbc_jpUses.gridy = 0;
+			gbc_jpUses.gridwidth = 2; // takes two columns
+			gbc_jpUses.insets = new Insets(5, 5, 5, 5);// has slightly bigger insets
+		}
+
+		// Issued To
+		JLabel jlIssuedTo = new JLabel("Issued To");
+		jlIssuedTo.setFont(new Font(null, Font.BOLD, 11));
+		GridBagConstraints gbc_jlIssuedTo = (GridBagConstraints) gbcLabel
+				.clone();
+		gbc_jlIssuedTo.gridy = 1;
+		gbc_jlIssuedTo.gridwidth = 2; // takes two columns
+		gbc_jlIssuedTo.insets = new Insets(5, 5, 5, 5);// has slightly bigger insets
+		// Distinguished Name (DN)
+		String sDN = cert.getSubjectX500Principal().getName(
+				X500Principal.RFC2253);
+		CMUtils util = new CMUtils();
+		util.parseDN(sDN);
+		// Extract the CN, O, OU and EMAILADDRESS fields
+		String sCN = util.getCN();
+		String sOrg = util.getO();
+		String sOU = util.getOU();
+		// String sEMAILADDRESS = CMX509Util.getEmilAddress();
+		// Common Name (CN)
+		JLabel jlCN = new JLabel("Common Name (CN)");
+		jlCN.setFont(new Font(null, Font.PLAIN, 11));
+		GridBagConstraints gbc_jlCN = (GridBagConstraints) gbcLabel.clone();
+		gbc_jlCN.gridy = 2;
+		JLabel jlCNValue = new JLabel(sCN);
+		jlCNValue.setFont(new Font(null, Font.PLAIN, 11));
+		GridBagConstraints gbc_jlCNValue = (GridBagConstraints) gbcValue
+				.clone();
+		gbc_jlCNValue.gridy = 2;
+		// Organisation (O)
+		JLabel jlOrg = new JLabel("Organisation (O)");
+		jlOrg.setFont(new Font(null, Font.PLAIN, 11));
+		GridBagConstraints gbc_jlOrg = (GridBagConstraints) gbcLabel.clone();
+		gbc_jlOrg.gridy = 3;
+		JLabel jlOrgValue = new JLabel(sOrg);
+		jlOrgValue.setFont(new Font(null, Font.PLAIN, 11));
+		GridBagConstraints gbc_jlOrgValue = (GridBagConstraints) gbcValue
+				.clone();
+		gbc_jlOrgValue.gridy = 3;
+		// Organisation Unit (OU)
+		JLabel jlOU = new JLabel("Organisation Unit (OU)");
+		jlOU.setFont(new Font(null, Font.PLAIN, 11));
+		GridBagConstraints gbc_jlOU = (GridBagConstraints) gbcLabel.clone();
+		gbc_jlOU.gridy = 4;
+		JLabel jlOUValue = new JLabel(sOU);
+		jlOUValue.setFont(new Font(null, Font.PLAIN, 11));
+		GridBagConstraints gbc_jlOUValue = (GridBagConstraints) gbcValue
+				.clone();
+		gbc_jlOUValue.gridy = 4;
+		// E-mail Address
+		// JLabel jlEmail = new JLabel("E-mail Address");
+		// jlEmail.setFont(new Font(null, Font.PLAIN, 11));
+		// GridBagConstraints gbc_jlEmail = (GridBagConstraints)
+		// gbcLabel.clone();
+		// gbc_jlEmail.gridy = 5;
+		// JLabel jlEmailValue = new JLabel(sEMAILADDRESS);
+		// jlEmailValue.setFont(new Font(null, Font.PLAIN, 11));
+		// GridBagConstraints gbc_jlEmailValue = (GridBagConstraints)
+		// gbcValue.clone();
+		// gbc_jlEmailValue.gridy = 5;
+		// Serial Number
+		JLabel jlSN = new JLabel("Serial Number");
+		jlSN.setFont(new Font(null, Font.PLAIN, 11));
+		GridBagConstraints gbc_jlSN = (GridBagConstraints) gbcLabel.clone();
+		gbc_jlSN.gridy = 6;
+		JLabel jlSNValue = new JLabel();
+		// Get the hexadecimal serial number
+		StringBuffer strBuff = new StringBuffer(new BigInteger(1, cert
+				.getSerialNumber().toByteArray()).toString(16).toUpperCase());
+		// Place colons at every two hexadecimal characters
+		if (strBuff.length() > 2) {
+			for (int iCnt = 2; iCnt < strBuff.length(); iCnt += 3) {
+				strBuff.insert(iCnt, ':');
+			}
+		}
+		jlSNValue.setText(strBuff.toString());
+		jlSNValue.setFont(new Font(null, Font.PLAIN, 11));
+		GridBagConstraints gbc_jlSNValue = (GridBagConstraints) gbcValue
+				.clone();
+		gbc_jlSNValue.gridy = 6;
+		// Version
+		JLabel jlVersion = new JLabel("Version");
+		jlVersion.setFont(new Font(null, Font.PLAIN, 11));
+		GridBagConstraints gbc_jlVersion = (GridBagConstraints) gbcLabel
+				.clone();
+		gbc_jlVersion.gridy = 7;
+		JLabel jlVersionValue = new JLabel(Integer.toString(cert.getVersion()));
+		jlVersionValue.setFont(new Font(null, Font.PLAIN, 11));
+		GridBagConstraints gbc_jlVersionValue = (GridBagConstraints) gbcValue
+				.clone();
+		gbc_jlVersionValue.gridy = 7;
+
+		// Issued By
+		JLabel jlIssuedBy = new JLabel("Issued By");
+		jlIssuedBy.setFont(new Font(null, Font.BOLD, 11));
+		GridBagConstraints gbc_jlIssuedBy = (GridBagConstraints) gbcLabel
+				.clone();
+		gbc_jlIssuedBy.gridy = 8;
+		gbc_jlIssuedBy.gridwidth = 2; // takes two columns
+		gbc_jlIssuedBy.insets = new Insets(5, 5, 5, 5);// has slightly bigger
+														// insets
+		// Distinguished Name (DN)
+		String iDN = cert.getIssuerX500Principal().getName(
+				X500Principal.RFC2253);
+		util.parseDN(iDN);
+		// Extract the CN, O and OU fields
+		String iCN = util.getCN();
+		String iOrg = util.getO();
+		String iOU = util.getOU();
+		// Common Name (CN)
+		JLabel jlICN = new JLabel("Common Name (CN)");
+		jlICN.setFont(new Font(null, Font.PLAIN, 11));
+		GridBagConstraints gbc_jlICN = (GridBagConstraints) gbcLabel.clone();
+		gbc_jlICN.gridy = 9;
+		JLabel jlICNValue = new JLabel(iCN);
+		jlICNValue.setFont(new Font(null, Font.PLAIN, 11));
+		GridBagConstraints gbc_jlICNValue = (GridBagConstraints) gbcValue
+				.clone();
+		gbc_jlICNValue.gridy = 9;
+		// Organisation (O)
+		JLabel jlIOrg = new JLabel("Organisation (O)");
+		jlIOrg.setFont(new Font(null, Font.PLAIN, 11));
+		GridBagConstraints gbc_jlIOrg = (GridBagConstraints) gbcLabel.clone();
+		gbc_jlIOrg.gridy = 10;
+		JLabel jlIOrgValue = new JLabel(iOrg);
+		jlIOrgValue.setFont(new Font(null, Font.PLAIN, 11));
+		GridBagConstraints gbc_jlIOrgValue = (GridBagConstraints) gbcValue
+				.clone();
+		gbc_jlIOrgValue.gridy = 10;
+		// Organisation Unit (OU)
+		JLabel jlIOU = new JLabel("Organisation Unit (OU)");
+		jlIOU.setFont(new Font(null, Font.PLAIN, 11));
+		GridBagConstraints gbc_jlIOU = (GridBagConstraints) gbcLabel.clone();
+		gbc_jlIOU.gridy = 11;
+		JLabel jlIOUValue = new JLabel(iOU);
+		jlIOUValue.setFont(new Font(null, Font.PLAIN, 11));
+		GridBagConstraints gbc_jlIOUValue = (GridBagConstraints) gbcValue
+				.clone();
+		gbc_jlIOUValue.gridy = 11;
+		// Validity
+		JLabel jlValidity = new JLabel("Validity");
+		jlValidity.setFont(new Font(null, Font.BOLD, 11));
+		GridBagConstraints gbc_jlValidity = (GridBagConstraints) gbcLabel
+				.clone();
+		gbc_jlValidity.gridy = 12;
+		gbc_jlValidity.gridwidth = 2; // takes two columns
+		gbc_jlValidity.insets = new Insets(5, 5, 5, 5);// has slightly bigger
+														// insets
+		// Issued On
+		JLabel jlIssuedOn = new JLabel("Issued On");
+		jlIssuedOn.setFont(new Font(null, Font.PLAIN, 11));
+		GridBagConstraints gbc_jlIssuedOn = (GridBagConstraints) gbcLabel
+				.clone();
+		gbc_jlIssuedOn.gridy = 13;
+		JLabel jlIssuedOnValue = new JLabel(cert.getNotBefore().toString());
+		jlIssuedOnValue.setFont(new Font(null, Font.PLAIN, 11));
+		GridBagConstraints gbc_jlIssuedOnValue = (GridBagConstraints) gbcValue
+				.clone();
+		gbc_jlIssuedOnValue.gridy = 13;
+		// Expires On
+		JLabel jlExpiresOn = new JLabel("Expires On");
+		jlExpiresOn.setFont(new Font(null, Font.PLAIN, 11));
+		GridBagConstraints gbc_jlExpiresOn = (GridBagConstraints) gbcLabel
+				.clone();
+		gbc_jlExpiresOn.gridy = 14;
+		JLabel jlExpiresOnValue = new JLabel(cert.getNotAfter().toString());
+		jlExpiresOnValue.setFont(new Font(null, Font.PLAIN, 11));
+		GridBagConstraints gbc_jlExpiresOnValue = (GridBagConstraints) gbcValue
+				.clone();
+		gbc_jlExpiresOnValue.gridy = 14;
+
+		// Fingerprints
+		byte[] bCert = new byte[0];
+		try {
+			bCert = cert.getEncoded();
+		} catch (CertificateEncodingException ex) {
+			logger.error("Could not get the encoded form of the certificate.", ex);
+		}
+		JLabel jlFingerprints = new JLabel("Fingerprints");
+		jlFingerprints.setFont(new Font(null, Font.BOLD, 11));
+		GridBagConstraints gbc_jlFingerprints = (GridBagConstraints) gbcLabel
+				.clone();
+		gbc_jlFingerprints.gridy = 15;
+		gbc_jlFingerprints.gridwidth = 2; // takes two columns
+		gbc_jlFingerprints.insets = new Insets(5, 5, 5, 5);// has slightly
+															// bigger insets
+		// SHA-1 Fingerprint
+		JLabel jlSHA1Fingerprint = new JLabel("SHA1 Fingerprint");
+		jlSHA1Fingerprint.setFont(new Font(null, Font.PLAIN, 11));
+		GridBagConstraints gbc_jlSHA1Fingerprint = (GridBagConstraints) gbcLabel
+				.clone();
+		gbc_jlSHA1Fingerprint.gridy = 16;
+		JLabel jlSHA1FingerprintValue = new JLabel(getMessageDigest(bCert,
+				"SHA1"));
+		jlSHA1FingerprintValue.setFont(new Font(null, Font.PLAIN, 11));
+		GridBagConstraints gbc_jlSHA1FingerprintValue = (GridBagConstraints) gbcValue
+				.clone();
+		gbc_jlSHA1FingerprintValue.gridy = 16;
+		// MD5 Fingerprint
+		JLabel jlMD5Fingerprint = new JLabel("MD5 Fingerprint");
+		jlMD5Fingerprint.setFont(new Font(null, Font.PLAIN, 11));
+		GridBagConstraints gbc_jlMD5Fingerprint = (GridBagConstraints) gbcLabel
+				.clone();
+		gbc_jlMD5Fingerprint.gridy = 17;
+		JLabel jlMD5FingerprintValue = new JLabel(
+				getMessageDigest(bCert, "MD5"));
+		jlMD5FingerprintValue.setFont(new Font(null, Font.PLAIN, 11));
+		GridBagConstraints gbc_jlMD5FingerprintValue = (GridBagConstraints) gbcValue
+				.clone();
+		gbc_jlMD5FingerprintValue.gridy = 17;
+
+		// Empty label to add a bit space at the bottom of the panel
+		// to make it look like firefox's view certificate dialog
+		JLabel jlEmpty = new JLabel("");
+		GridBagConstraints gbc_jlEmpty = (GridBagConstraints) gbcLabel.clone();
+		gbc_jlEmpty.gridy = 18;
+		gbc_jlEmpty.gridwidth = 2; // takes two columns
+		gbc_jlEmpty.ipady = 40;
+
+		JPanel jpCertificate = new JPanel(new GridBagLayout());
+		jpCertificate.setBorder(new CompoundBorder(new EmptyBorder(15, 15, 15,
+				15), new EtchedBorder()));
+
+		if (intendedUses != null) {
+			jpCertificate.add(jpUses, gbc_jpUses);
+		}
+		jpCertificate.add(jlIssuedTo, gbc_jlIssuedTo); // Issued To
+		jpCertificate.add(jlCN, gbc_jlCN);
+		jpCertificate.add(jlCNValue, gbc_jlCNValue);
+		jpCertificate.add(jlOrg, gbc_jlOrg);
+		jpCertificate.add(jlOrgValue, gbc_jlOrgValue);
+		jpCertificate.add(jlOU, gbc_jlOU);
+		jpCertificate.add(jlOUValue, gbc_jlOUValue);
+		// jpCertificate.add(jlEmail, gbc_jlEmail);
+		// jpCertificate.add(jlEmailValue, gbc_jlEmailValue);
+		jpCertificate.add(jlSN, gbc_jlSN);
+		jpCertificate.add(jlSNValue, gbc_jlSNValue);
+		jpCertificate.add(jlVersion, gbc_jlVersion);
+		jpCertificate.add(jlVersionValue, gbc_jlVersionValue);
+		jpCertificate.add(jlIssuedBy, gbc_jlIssuedBy); // Issued By
+		jpCertificate.add(jlICN, gbc_jlICN);
+		jpCertificate.add(jlICNValue, gbc_jlICNValue);
+		jpCertificate.add(jlIOrg, gbc_jlIOrg);
+		jpCertificate.add(jlIOrgValue, gbc_jlIOrgValue);
+		jpCertificate.add(jlIOU, gbc_jlIOU);
+		jpCertificate.add(jlIOUValue, gbc_jlIOUValue);
+		jpCertificate.add(jlValidity, gbc_jlValidity); // Validity
+		jpCertificate.add(jlIssuedOn, gbc_jlIssuedOn);
+		jpCertificate.add(jlIssuedOnValue, gbc_jlIssuedOnValue);
+		jpCertificate.add(jlExpiresOn, gbc_jlExpiresOn);
+		jpCertificate.add(jlExpiresOnValue, gbc_jlExpiresOnValue);
+		jpCertificate.add(jlFingerprints, gbc_jlFingerprints); // Fingerprints
+		jpCertificate.add(jlSHA1Fingerprint, gbc_jlSHA1Fingerprint);
+		jpCertificate.add(jlSHA1FingerprintValue, gbc_jlSHA1FingerprintValue);
+		jpCertificate.add(jlMD5Fingerprint, gbc_jlMD5Fingerprint);
+		jpCertificate.add(jlMD5FingerprintValue, gbc_jlMD5FingerprintValue);
+		jpCertificate.add(jlEmpty, gbc_jlEmpty); // Empty label to get some vertical space on the frame
+
+		// OK button
+		JPanel jpButtons = new JPanel(new FlowLayout(FlowLayout.CENTER));
+
+		final JButton jbTrust = new JButton("Trust");
+		jbTrust.addActionListener(new ActionListener() {
+			public void actionPerformed(ActionEvent evt) {
+				trustPressed();
+			}
+		});
+		final JButton jbDontTrust = new JButton("Do not trust");
+		jbDontTrust.addActionListener(new ActionListener() {
+			public void actionPerformed(ActionEvent evt) {
+				dontTrustPressed();
+			}
+		});
+
+		jpButtons.add(jbTrust);
+		jpButtons.add(jbDontTrust);
+
+		// Put it all together
+		getContentPane().add(titlePanel, BorderLayout.NORTH);
+		getContentPane().add(jpCertificate, BorderLayout.CENTER);
+		getContentPane().add(jpButtons, BorderLayout.SOUTH);
+
+		// Resizing wreaks havoc
+		setResizable(false);
+
+		addWindowListener(new WindowAdapter() {
+			public void windowClosing(WindowEvent evt) {
+				closeDialog();
+			}
+		});
+
+		getRootPane().setDefaultButton(jbTrust);
+
+		pack();
+	}
+
+	/**
+	 * Get the digest of a message as a formatted String.
+	 * 
+	 * @param bMessage
+	 *            The message to digest
+	 * @param digestType
+	 *            The message digest algorithm
+	 * @return The message digest
+	 */
+	public static String getMessageDigest(byte[] bMessage, String digestType) {
+		// Create message digest object using the supplied algorithm
+		MessageDigest messageDigest;
+		try {
+			messageDigest = MessageDigest.getInstance(digestType);
+		} catch (NoSuchAlgorithmException ex) {
+			logger.error("Failed to create message digest.", ex);
+			return "";
+		}
+
+		// Create raw message digest
+		byte[] bFingerPrint = messageDigest.digest(bMessage);
+
+		// Place the raw message digest into a StringBuffer as a Hex number
+		StringBuffer strBuff = new StringBuffer(new BigInteger(1, bFingerPrint)
+				.toString(16).toUpperCase());
+
+		// Odd number of characters so add in a padding "0"
+		if ((strBuff.length() % 2) != 0) {
+			strBuff.insert(0, '0');
+		}
+
+		// Place colons at every two hex characters
+		if (strBuff.length() > 2) {
+			for (int iCnt = 2; iCnt < strBuff.length(); iCnt += 3) {
+				strBuff.insert(iCnt, ':');
+			}
+		}
+
+		// Return the formatted message digest
+		return strBuff.toString();
+	}
+
+	/**
+	 * Gets the intended certificate uses, i.e. Netscape Certificate Type
+	 * extension (2.16.840.1.113730.1.1) value as a string
+	 * 
+	 * @param value
+	 *            Extension value as a DER-encoded OCTET string
+	 * @return Extension value as a string
+	 */
+	private String getIntendedUses(byte[] value) {
+
+		// Netscape Certificate Types (2.16.840.1.113730.1.1)
+		int[] INTENDED_USES = new int[] { NetscapeCertType.sslClient,
+				NetscapeCertType.sslServer, NetscapeCertType.smime,
+				NetscapeCertType.objectSigning, NetscapeCertType.reserved,
+				NetscapeCertType.sslCA, NetscapeCertType.smimeCA,
+				NetscapeCertType.objectSigningCA, };
+
+		// Netscape Certificate Type strings (2.16.840.1.113730.1.1)
+		HashMap<String, String> INTENDED_USES_STRINGS = new HashMap<String, String>();
+		INTENDED_USES_STRINGS.put("128", "SSL Client");
+		INTENDED_USES_STRINGS.put("64", "SSL Server");
+		INTENDED_USES_STRINGS.put("32", "S/MIME");
+		INTENDED_USES_STRINGS.put("16", "Object Signing");
+		INTENDED_USES_STRINGS.put("8", "Reserved");
+		INTENDED_USES_STRINGS.put("4", "SSL CA");
+		INTENDED_USES_STRINGS.put("2", "S/MIME CA");
+		INTENDED_USES_STRINGS.put("1", "Object Signing CA");
+
+		// Get octet string from extension value
+		ASN1OctetString fromByteArray = new DEROctetString(value);
+		byte[] octets = fromByteArray.getOctets();
+		DERBitString fromByteArray2 = new DERBitString(octets);
+		int val = new NetscapeCertType(fromByteArray2).intValue();
+		StringBuffer strBuff = new StringBuffer();
+		for (int i = 0, len = INTENDED_USES.length; i < len; i++) {
+			int use = INTENDED_USES[i];
+			if ((val & use) == use) {
+				strBuff.append(INTENDED_USES_STRINGS.get(String.valueOf(use))
+						+ ", \n");
+			}
+		}
+		// remove the last ", \n" from the end of the buffer
+		String str = strBuff.toString();
+		str = str.substring(0, str.length() - 3);
+		return str;
+	}
+
+	/**
+	 * 'Trust' button pressed.
+	 */
+	private void trustPressed() {
+		shouldTrust = true;
+		closeDialog();
+	}
+
+	/**
+	 * 'Do not trust' button pressed.
+	 */
+	private void dontTrustPressed() {
+		shouldTrust = false;
+		closeDialog();
+	}	
+	
+	/**
+	 * Closes the dialog.
+	 */
+	public void closeDialog() {
+		setVisible(false);
+		dispose();
+	}
+
+	public boolean shouldTrust() {
+		return shouldTrust;
+	}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/163747de/taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/servicedescriptions/WSDLActivityIcon.java
----------------------------------------------------------------------
diff --git a/taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/servicedescriptions/WSDLActivityIcon.java b/taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/servicedescriptions/WSDLActivityIcon.java
new file mode 100644
index 0000000..7994e55
--- /dev/null
+++ b/taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/servicedescriptions/WSDLActivityIcon.java
@@ -0,0 +1,59 @@
+/*
+* 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.activities.wsdl.servicedescriptions;
+
+import java.net.URI;
+
+import javax.swing.Icon;
+import javax.swing.ImageIcon;
+
+import org.apache.taverna.workbench.activityicons.ActivityIconSPI;
+
+/**
+ *
+ * @author Alex Nenadic
+ * @author alanrw
+ *
+ */
+public class WSDLActivityIcon implements ActivityIconSPI {
+
+	private static Icon icon;
+
+	public int canProvideIconScore(URI activityType) {
+		if (activityType.equals(WSDLServiceDescription.ACTIVITY_TYPE))
+			return DEFAULT_ICON + 1;
+		else
+			return NO_ICON;
+	}
+
+	public Icon getIcon(URI activityType) {
+		return getWSDLIcon();
+	}
+
+	public static Icon getWSDLIcon() {
+		if (icon == null) {
+			icon = new ImageIcon(WSDLActivityIcon.class.getResource("/wsdl.png"));
+		}
+		return icon;
+	}
+}
+
+
+

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench-common-activities/blob/163747de/taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/servicedescriptions/WSDLServiceDescription.java
----------------------------------------------------------------------
diff --git a/taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/servicedescriptions/WSDLServiceDescription.java b/taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/servicedescriptions/WSDLServiceDescription.java
new file mode 100644
index 0000000..8b6af7f
--- /dev/null
+++ b/taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/servicedescriptions/WSDLServiceDescription.java
@@ -0,0 +1,153 @@
+/*
+* 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.activities.wsdl.servicedescriptions;
+
+import java.net.URI;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import javax.swing.Icon;
+
+import org.apache.taverna.security.credentialmanager.CMException;
+import org.apache.taverna.security.credentialmanager.CredentialManager;
+import org.apache.taverna.servicedescriptions.ServiceDescription;
+
+import org.apache.log4j.Logger;
+
+import org.apache.taverna.scufl2.api.configurations.Configuration;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
+public class WSDLServiceDescription extends ServiceDescription {
+
+	public static final URI ACTIVITY_TYPE = URI.create("http://ns.taverna.org.uk/2010/activity/wsdl");
+	public static final URI INPUT_SPLITTER_TYPE = URI.create("http://ns.taverna.org.uk/2010/activity/xml-splitter/in");
+	public static final URI OUTPUT_SPLITTER_TYPE = URI.create("http://ns.taverna.org.uk/2010/activity/xml-splitter/out");
+
+	private static final String WSDL = "WSDL @ ";
+
+	private String use;
+	private URI uri;
+	private String style;
+	private String operation;
+	private final CredentialManager credentialManager;
+
+	private static Logger logger = Logger.getLogger(WSDLServiceDescription.class);
+
+	public WSDLServiceDescription(CredentialManager credentialManager) {
+		this.credentialManager = credentialManager;
+	}
+
+	public String getUse() {
+		return use;
+	}
+
+	public void setUse(String use) {
+		this.use = use;
+	}
+
+	public URI getURI() {
+		return uri;
+	}
+
+	public void setURI(URI url) {
+		this.uri = url;
+	}
+
+	public String getStyle() {
+		return style;
+	}
+
+	public void setStyle(String style) {
+		this.style = style;
+	}
+
+	public String getType() {
+		return "WSDL";
+	}
+
+	@Override
+	public String toString() {
+		return operation;
+	}
+
+	public String getOperation() {
+		return operation;
+	}
+
+	public void setOperation(String operation) {
+		this.operation = operation;
+	}
+
+	public Icon getIcon() {
+		return WSDLActivityIcon.getWSDLIcon();
+	}
+
+	@Override
+	public URI getActivityType() {
+		return ACTIVITY_TYPE;
+	}
+
+	@Override
+	public Configuration getActivityConfiguration() {
+		Configuration configuration = new Configuration();
+		configuration.setType(ACTIVITY_TYPE.resolve("#Config"));
+		ObjectNode json = (ObjectNode) configuration.getJson();
+		ObjectNode operation = json.objectNode();
+		json.put("operation", operation);
+		operation.put("wsdl", getURI().toString());
+		operation.put("name", getOperation());
+		return configuration;
+	}
+
+	public String getName() {
+		return getOperation();
+	}
+
+	public List<? extends Comparable<?>> getPath() {
+		return Collections.singletonList(WSDL + getURI());
+	}
+
+	protected List<Object> getIdentifyingData() {
+		return Arrays.<Object> asList(getURI(), getOperation());
+	}
+
+	@Override
+	public boolean isTemplateService() {
+		return needsSecurity();
+	}
+
+	protected boolean needsSecurity() {
+		if (credentialManager == null) {
+			// We don't know if it needs security or not
+			return false;
+		}
+		// A match is a good indicator that security configuration is needed
+		try {
+			return credentialManager.hasUsernamePasswordForService(getURI());
+		} catch (CMException e) {
+			logger.warn("Could not check if credential manager has username/password for " + getURI(), e);
+			return false;
+		}
+	}
+
+
+}