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

Reply via email to