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

[49/51] [partial] incubator-taverna-workbench git commit: all packages are moved to org.apache.taverna.*

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/events/PartialServiceDescriptionsNotification.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/events/PartialServiceDescriptionsNotification.java b/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/events/PartialServiceDescriptionsNotification.java
new file mode 100644
index 0000000..763b32a
--- /dev/null
+++ b/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/events/PartialServiceDescriptionsNotification.java
@@ -0,0 +1,41 @@
+/*
+* 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.servicedescriptions.events;
+
+import java.util.Collection;
+
+import org.apache.taverna.servicedescriptions.ServiceDescription;
+import org.apache.taverna.servicedescriptions.ServiceDescriptionProvider;
+
+public class PartialServiceDescriptionsNotification extends
+		AbstractProviderNotification {
+	private final Collection<? extends ServiceDescription> serviceDescriptions;
+
+	public PartialServiceDescriptionsNotification(
+			ServiceDescriptionProvider provider,
+			Collection<? extends ServiceDescription> serviceDescriptions) {
+		super(provider, "Found " + serviceDescriptions.size() + " services");
+		this.serviceDescriptions = serviceDescriptions;
+	}
+
+	public Collection<? extends ServiceDescription> getServiceDescriptions() {
+		return serviceDescriptions;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/events/ProviderErrorNotification.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/events/ProviderErrorNotification.java b/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/events/ProviderErrorNotification.java
new file mode 100644
index 0000000..ed786f5
--- /dev/null
+++ b/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/events/ProviderErrorNotification.java
@@ -0,0 +1,38 @@
+/*
+* 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.servicedescriptions.events;
+
+import org.apache.taverna.servicedescriptions.ServiceDescriptionProvider;
+
+public class ProviderErrorNotification extends AbstractProviderNotification {
+
+	private final Throwable cause;
+
+	public ProviderErrorNotification(ServiceDescriptionProvider provider,
+			String message, Throwable cause) {
+		super(provider, message);
+		this.cause = cause;
+	}
+
+	public Throwable getCause() {
+		return cause;
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/events/ProviderStatusNotification.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/events/ProviderStatusNotification.java b/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/events/ProviderStatusNotification.java
new file mode 100644
index 0000000..384631e
--- /dev/null
+++ b/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/events/ProviderStatusNotification.java
@@ -0,0 +1,31 @@
+/*
+* 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.servicedescriptions.events;
+
+import org.apache.taverna.servicedescriptions.ServiceDescriptionProvider;
+
+public class ProviderStatusNotification extends AbstractProviderNotification {
+
+	public ProviderStatusNotification(ServiceDescriptionProvider provider,
+			String message) {
+		super(provider, message);
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/events/ProviderUpdatingNotification.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/events/ProviderUpdatingNotification.java b/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/events/ProviderUpdatingNotification.java
new file mode 100644
index 0000000..3e35c5d
--- /dev/null
+++ b/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/events/ProviderUpdatingNotification.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.servicedescriptions.events;
+
+import org.apache.taverna.servicedescriptions.ServiceDescriptionProvider;
+
+public class ProviderUpdatingNotification extends AbstractProviderNotification {
+
+	public ProviderUpdatingNotification(ServiceDescriptionProvider provider) {
+		super(provider, "Updating");
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/events/ProviderWarningNotification.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/events/ProviderWarningNotification.java b/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/events/ProviderWarningNotification.java
new file mode 100644
index 0000000..3348504
--- /dev/null
+++ b/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/events/ProviderWarningNotification.java
@@ -0,0 +1,31 @@
+/*
+* 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.servicedescriptions.events;
+
+import org.apache.taverna.servicedescriptions.ServiceDescriptionProvider;
+
+public class ProviderWarningNotification extends AbstractProviderNotification {
+
+	public ProviderWarningNotification(ServiceDescriptionProvider provider,
+			String message) {
+		super(provider, message);
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/events/RemovedProviderEvent.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/events/RemovedProviderEvent.java b/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/events/RemovedProviderEvent.java
new file mode 100644
index 0000000..b2b0494
--- /dev/null
+++ b/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/events/RemovedProviderEvent.java
@@ -0,0 +1,29 @@
+/*
+* 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.servicedescriptions.events;
+
+import org.apache.taverna.servicedescriptions.ServiceDescriptionProvider;
+
+public class RemovedProviderEvent extends AbstractProviderEvent {
+
+	public RemovedProviderEvent(ServiceDescriptionProvider provider) {
+		super(provider);
+	}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/events/ServiceDescriptionProvidedEvent.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/events/ServiceDescriptionProvidedEvent.java b/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/events/ServiceDescriptionProvidedEvent.java
new file mode 100644
index 0000000..520906c
--- /dev/null
+++ b/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/events/ServiceDescriptionProvidedEvent.java
@@ -0,0 +1,39 @@
+/*
+* 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.servicedescriptions.events;
+
+import java.util.Set;
+
+import org.apache.taverna.servicedescriptions.ServiceDescription;
+import org.apache.taverna.servicedescriptions.ServiceDescriptionProvider;
+
+public class ServiceDescriptionProvidedEvent extends AbstractProviderEvent {
+	private final Set<ServiceDescription> serviceDescriptions;
+
+	public ServiceDescriptionProvidedEvent(ServiceDescriptionProvider provider,
+			Set<ServiceDescription> serviceDescriptions) {
+		super(provider);
+		this.serviceDescriptions = serviceDescriptions;
+	}
+
+	public Set<ServiceDescription> getServiceDescriptions() {
+		return serviceDescriptions;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/events/ServiceDescriptionRegistryEvent.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/events/ServiceDescriptionRegistryEvent.java b/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/events/ServiceDescriptionRegistryEvent.java
new file mode 100644
index 0000000..68c98b2
--- /dev/null
+++ b/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/events/ServiceDescriptionRegistryEvent.java
@@ -0,0 +1,23 @@
+/*
+* 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.servicedescriptions.events;
+
+public abstract class ServiceDescriptionRegistryEvent {
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-impl/src/main/java/net/sf/taverna/t2/servicedescriptions/impl/ServiceDescriptionConstants.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-impl/src/main/java/net/sf/taverna/t2/servicedescriptions/impl/ServiceDescriptionConstants.java b/taverna-activity-palette-impl/src/main/java/net/sf/taverna/t2/servicedescriptions/impl/ServiceDescriptionConstants.java
deleted file mode 100644
index c5221be..0000000
--- a/taverna-activity-palette-impl/src/main/java/net/sf/taverna/t2/servicedescriptions/impl/ServiceDescriptionConstants.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package net.sf.taverna.t2.servicedescriptions.impl;
-
-public interface ServiceDescriptionConstants {
-	String SERVICE_PANEL_CONFIGURATION = "servicePanelConfiguration";
-	String PROVIDERS = "providers";
-	String IGNORED = "ignored";
-	String PROVIDER_ID = "providerID";
-	String CONFIGURATION = "configuration";
-	String TYPE = "type";
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-impl/src/main/java/net/sf/taverna/t2/servicedescriptions/impl/ServiceDescriptionDeserializer.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-impl/src/main/java/net/sf/taverna/t2/servicedescriptions/impl/ServiceDescriptionDeserializer.java b/taverna-activity-palette-impl/src/main/java/net/sf/taverna/t2/servicedescriptions/impl/ServiceDescriptionDeserializer.java
deleted file mode 100644
index 379888a..0000000
--- a/taverna-activity-palette-impl/src/main/java/net/sf/taverna/t2/servicedescriptions/impl/ServiceDescriptionDeserializer.java
+++ /dev/null
@@ -1,167 +0,0 @@
-package net.sf.taverna.t2.servicedescriptions.impl;
-
-import static net.sf.taverna.t2.servicedescriptions.impl.ServiceDescriptionConstants.CONFIGURATION;
-import static net.sf.taverna.t2.servicedescriptions.impl.ServiceDescriptionConstants.IGNORED;
-import static net.sf.taverna.t2.servicedescriptions.impl.ServiceDescriptionConstants.PROVIDERS;
-import static net.sf.taverna.t2.servicedescriptions.impl.ServiceDescriptionConstants.PROVIDER_ID;
-import static net.sf.taverna.t2.servicedescriptions.impl.ServiceDescriptionConstants.TYPE;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URI;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-import org.apache.taverna.scufl2.api.configurations.Configuration;
-import net.sf.taverna.t2.servicedescriptions.ConfigurableServiceProvider;
-import net.sf.taverna.t2.servicedescriptions.ServiceDescriptionProvider;
-import net.sf.taverna.t2.servicedescriptions.ServiceDescriptionRegistry;
-
-import com.fasterxml.jackson.core.JsonFactory;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ArrayNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-
-class ServiceDescriptionDeserializer {
-	private List<ServiceDescriptionProvider> serviceDescriptionProviders;
-
-	ServiceDescriptionDeserializer(
-			List<ServiceDescriptionProvider> serviceDescriptionProviders) {
-		this.serviceDescriptionProviders = serviceDescriptionProviders;
-	}
-
-	public void deserialize(ServiceDescriptionRegistry registry,
-			File serviceDescriptionsFile) throws DeserializationException {
-		try (FileInputStream serviceDescriptionFileStream = new FileInputStream(
-				serviceDescriptionsFile)) {
-			deserialize(registry, serviceDescriptionFileStream);
-		} catch (FileNotFoundException ex) {
-			throw new DeserializationException("Could not locate file "
-					+ serviceDescriptionsFile.getAbsolutePath()
-					+ " containing service descriptions.");
-		} catch (IOException ex) {
-			throw new DeserializationException(
-					"Could not read stream containing service descriptions from "
-							+ serviceDescriptionsFile.getAbsolutePath(), ex);
-		}
-	}
-
-	public void deserialize(ServiceDescriptionRegistry registry,
-			URL serviceDescriptionsURL) throws DeserializationException {
-		try (InputStream serviceDescriptionInputStream = serviceDescriptionsURL
-				.openStream()) {
-			deserialize(registry, serviceDescriptionInputStream);
-		} catch (FileNotFoundException ex) {
-			throw new DeserializationException("Could not open URL "
-					+ serviceDescriptionsURL
-					+ " containing service descriptions.");
-		} catch (IOException ex) {
-			throw new DeserializationException(
-					"Could not read stream containing service descriptions from "
-							+ serviceDescriptionsURL, ex);
-		}
-	}
-
-	private static final JsonFactory factory = new JsonFactory();
-
-	private void deserialize(ServiceDescriptionRegistry registry,
-			InputStream serviceDescriptionsInputStream) throws IOException,
-			DeserializationException {
-		ObjectNode node = (ObjectNode) new ObjectMapper(factory)
-				.readTree(serviceDescriptionsInputStream);
-		List<ServiceDescriptionProvider> providers = deserializeProviders(node,
-				true);
-		for (ServiceDescriptionProvider provider : providers)
-			registry.addServiceDescriptionProvider(provider);
-	}
-
-	public Collection<? extends ServiceDescriptionProvider> deserializeDefaults(
-			ServiceDescriptionRegistry registry,
-			File defaultConfigurableServiceProvidersFile)
-			throws DeserializationException {
-		ObjectNode node;
-		try (FileInputStream serviceDescriptionStream = new FileInputStream(
-				defaultConfigurableServiceProvidersFile)) {
-			node = (ObjectNode) new ObjectMapper(factory)
-					.readTree(serviceDescriptionStream);
-		} catch (IOException e) {
-			throw new DeserializationException("Can't read "
-					+ defaultConfigurableServiceProvidersFile);
-		}
-		return deserializeProviders(node, false);
-	}
-
-	private List<ServiceDescriptionProvider> deserializeProviders(
-			ObjectNode rootNode, boolean obeyIgnored)
-			throws DeserializationException {
-		List<ServiceDescriptionProvider> providers = new ArrayList<>();
-
-		ArrayNode providersNode = (ArrayNode) rootNode.get(PROVIDERS);
-		if (providersNode != null)
-			for (JsonNode provider : providersNode)
-				providers.add(deserializeProvider((ObjectNode) provider));
-
-		if (obeyIgnored) {
-			ArrayNode ignoredNode = (ArrayNode) rootNode.get(IGNORED);
-			if (ignoredNode != null)
-				for (JsonNode provider : ignoredNode)
-					providers
-							.remove(deserializeProvider((ObjectNode) provider));
-		}
-
-		return providers;
-	}
-
-	private ServiceDescriptionProvider deserializeProvider(
-			ObjectNode providerNode) throws DeserializationException {
-		String providerId = providerNode.get(PROVIDER_ID).asText().trim();
-		ServiceDescriptionProvider provider = null;
-		for (ServiceDescriptionProvider serviceProvider : serviceDescriptionProviders)
-			if (serviceProvider.getId().equals(providerId)) {
-				provider = serviceProvider;
-				break;
-			}
-		if (provider == null)
-			throw new DeserializationException(
-					"Could not find provider with id " + providerId);
-
-		/*
-		 * So we know the service provider now, but we need a separate instance
-		 * of that provider for each providerElem. E.g. we can have 2 or more
-		 * WSDL provider elements and need to return a separate provider
-		 * instance for each as they will have different configurations.
-		 */
-		ServiceDescriptionProvider instance = provider.newInstance();
-
-		if (instance instanceof ConfigurableServiceProvider)
-			try {
-				Configuration config = new Configuration();
-				config.setType(URI.create(providerNode.get(TYPE).textValue()));
-				config.setJson(providerNode.get(CONFIGURATION));
-				if (config != null)
-					((ConfigurableServiceProvider) instance).configure(config);
-			} catch (Exception e) {
-				throw new DeserializationException(
-						"Could not configure provider " + providerId
-								+ " using bean " + providerNode, e);
-			}
-		return instance;
-	}
-
-	@SuppressWarnings("serial")
-	static class DeserializationException extends Exception {
-		public DeserializationException(String string) {
-			super(string);
-		}
-
-		public DeserializationException(String string, Exception ex) {
-			super(string, ex);
-		}
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-impl/src/main/java/net/sf/taverna/t2/servicedescriptions/impl/ServiceDescriptionRegistryImpl.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-impl/src/main/java/net/sf/taverna/t2/servicedescriptions/impl/ServiceDescriptionRegistryImpl.java b/taverna-activity-palette-impl/src/main/java/net/sf/taverna/t2/servicedescriptions/impl/ServiceDescriptionRegistryImpl.java
deleted file mode 100644
index d481727..0000000
--- a/taverna-activity-palette-impl/src/main/java/net/sf/taverna/t2/servicedescriptions/impl/ServiceDescriptionRegistryImpl.java
+++ /dev/null
@@ -1,652 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester
- *
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- *
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.servicedescriptions.impl;
-
-import static java.lang.System.currentTimeMillis;
-import static java.lang.Thread.MIN_PRIORITY;
-import static java.lang.Thread.currentThread;
-
-import java.io.File;
-import java.io.IOException;
-import java.lang.Thread.UncaughtExceptionHandler;
-import java.lang.reflect.InvocationTargetException;
-import java.net.URI;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.taverna.lang.observer.MultiCaster;
-import org.apache.taverna.lang.observer.Observer;
-import net.sf.taverna.t2.servicedescriptions.ConfigurableServiceProvider;
-import net.sf.taverna.t2.servicedescriptions.ServiceDescription;
-import net.sf.taverna.t2.servicedescriptions.ServiceDescriptionProvider;
-import net.sf.taverna.t2.servicedescriptions.ServiceDescriptionsConfiguration;
-import net.sf.taverna.t2.servicedescriptions.ServiceDescriptionProvider.FindServiceDescriptionsCallBack;
-import net.sf.taverna.t2.servicedescriptions.ServiceDescriptionRegistry;
-import net.sf.taverna.t2.servicedescriptions.events.AddedProviderEvent;
-import net.sf.taverna.t2.servicedescriptions.events.PartialServiceDescriptionsNotification;
-import net.sf.taverna.t2.servicedescriptions.events.ProviderErrorNotification;
-import net.sf.taverna.t2.servicedescriptions.events.ProviderStatusNotification;
-import net.sf.taverna.t2.servicedescriptions.events.ProviderUpdatingNotification;
-import net.sf.taverna.t2.servicedescriptions.events.ProviderWarningNotification;
-import net.sf.taverna.t2.servicedescriptions.events.RemovedProviderEvent;
-import net.sf.taverna.t2.servicedescriptions.events.ServiceDescriptionProvidedEvent;
-import net.sf.taverna.t2.servicedescriptions.events.ServiceDescriptionRegistryEvent;
-import net.sf.taverna.t2.servicedescriptions.impl.ServiceDescriptionDeserializer.DeserializationException;
-
-import org.apache.commons.beanutils.BeanUtils;
-import org.apache.log4j.Logger;
-
-import uk.org.taverna.configuration.app.ApplicationConfiguration;
-
-public class ServiceDescriptionRegistryImpl implements ServiceDescriptionRegistry {
-	/**
-	 * If a writable property of this name on a provider exists (ie. the provider has a method
-	 * setServiceDescriptionRegistry(ServiceDescriptionRegistry registry) - then this property will
-	 * be set to the current registry.
-	 */
-	public static final String SERVICE_DESCRIPTION_REGISTRY = "serviceDescriptionRegistry";
-	public static Logger logger = Logger.getLogger(ServiceDescriptionRegistryImpl.class);
-	public static final ThreadGroup threadGroup = new ThreadGroup("Service description providers");
-	/**
-	 * Total maximum timeout while waiting for description threads to finish
-	 */
-	private static final long DESCRIPTION_THREAD_TIMEOUT_MS = 3000;
-	protected static final String CONF_DIR = "conf";
-	protected static final String SERVICE_PROVIDERS_FILENAME = "service_providers.xml";
-	private static final String DEFAULT_CONFIGURABLE_SERVICE_PROVIDERS_FILENAME = "default_service_providers.xml";
-
-	private ServiceDescriptionsConfiguration serviceDescriptionsConfig;
-	private ApplicationConfiguration applicationConfiguration;
-	/**
-	 * <code>false</code> until first call to {@link #loadServiceProviders()} - which is done by
-	 * first call to {@link #getServiceDescriptionProviders()}.
-	 */
-	private boolean hasLoadedProviders = false;
-	/**
-	 * <code>true</code> while {@link #loadServiceProviders(File)},
-	 * {@link #loadServiceProviders(URL)} or {@link #loadServiceProviders()} is in progress, avoids
-	 * triggering {@link #saveServiceDescriptions()} on
-	 * {@link #addServiceDescriptionProvider(ServiceDescriptionProvider)} calls.
-	 */
-	private boolean loading = false;
-	private MultiCaster<ServiceDescriptionRegistryEvent> observers = new MultiCaster<>(this);
-	private List<ServiceDescriptionProvider> serviceDescriptionProviders;
-	private Set<ServiceDescriptionProvider> allServiceProviders;
-	private Map<ServiceDescriptionProvider, Set<ServiceDescription>> providerDescriptions = new HashMap<>();
-	private Map<ServiceDescriptionProvider, Thread> serviceDescriptionThreads = new HashMap<>();
-	/**
-	 * Service providers added by the user, should be saved
-	 */
-	private Set<ServiceDescriptionProvider> userAddedProviders = new HashSet<>();
-	private Set<ServiceDescriptionProvider> userRemovedProviders = new HashSet<>();
-	private Set<ServiceDescriptionProvider> defaultServiceDescriptionProviders;
-	/**
-	 * File containing a list of configured ConfigurableServiceProviders which is used to get the
-	 * default set of service descriptions together with those provided by AbstractTemplateServiceS.
-	 * This file is located in the conf directory of the Taverna startup directory.
-	 */
-	private File defaultConfigurableServiceProvidersFile;
-	private boolean defaultSystemConfigurableProvidersLoaded = false;
-
-	static {
-		threadGroup.setMaxPriority(MIN_PRIORITY);
-	}
-
-	public ServiceDescriptionRegistryImpl(
-			ApplicationConfiguration applicationConfiguration) {
-		this.applicationConfiguration = applicationConfiguration;
-		defaultConfigurableServiceProvidersFile = new File(
-				getTavernaStartupConfigurationDirectory(),
-				DEFAULT_CONFIGURABLE_SERVICE_PROVIDERS_FILENAME);
-	}
-
-	/**
-	 * Get the Taverna distribution (startup) configuration directory.
-	 */
-	private File getTavernaStartupConfigurationDirectory() {
-		File distroHome = null;
-		File configDirectory = null;
-		distroHome = applicationConfiguration.getStartupDir();
-		configDirectory = new File(distroHome, "conf");
-		if (!configDirectory.exists())
-			configDirectory.mkdir();
-		return configDirectory;
-	}
-
-	private static void joinThreads(Collection<? extends Thread> threads,
-			long descriptionThreadTimeoutMs) {
-		long finishJoinBy = currentTimeMillis() + descriptionThreadTimeoutMs;
-		for (Thread thread : threads) {
-			// No shorter timeout than 1 ms (thread.join(0) waits forever!)
-			long timeout = Math.max(1, finishJoinBy - currentTimeMillis());
-			try {
-				thread.join(timeout);
-			} catch (InterruptedException e) {
-				currentThread().interrupt();
-				return;
-			}
-			if (thread.isAlive())
-				logger.debug("Thread did not finish " + thread);
-		}
-	}
-
-
-	@Override
-	public void addObserver(Observer<ServiceDescriptionRegistryEvent> observer) {
-		observers.addObserver(observer);
-	}
-
-	@Override
-	public void addServiceDescriptionProvider(ServiceDescriptionProvider provider) {
-		synchronized (this) {
-			userRemovedProviders.remove(provider);
-			if (!getDefaultServiceDescriptionProviders().contains(provider))
-				userAddedProviders.add(provider);
-			allServiceProviders.add(provider);
-		}
-
-		// Spring-like auto-config
-		try {
-			// BeanUtils should ignore this if provider does not have that property
-			BeanUtils.setProperty(provider, SERVICE_DESCRIPTION_REGISTRY, this);
-		} catch (IllegalAccessException | InvocationTargetException e) {
-			logger.warn("Could not set serviceDescriptionRegistry on "
-					+ provider, e);
-		}
-
-		if (!loading)
-			saveServiceDescriptions();
-		observers.notify(new AddedProviderEvent(provider));
-		updateServiceDescriptions(false, false);
-	}
-
-	private File findServiceDescriptionsFile() {
-		File confDir = new File(
-				applicationConfiguration.getApplicationHomeDir(), CONF_DIR);
-		confDir.mkdirs();
-		if (!confDir.isDirectory())
-			throw new RuntimeException("Invalid directory: " + confDir);
-		File serviceDescriptionsFile = new File(confDir,
-				SERVICE_PROVIDERS_FILENAME);
-		return serviceDescriptionsFile;
-	}
-
-	@Override
-	public List<Observer<ServiceDescriptionRegistryEvent>> getObservers() {
-		return observers.getObservers();
-	}
-
-	// Fallback to this method that uses hardcoded default services if you cannot read them from
-	// the file.
-//	@SuppressWarnings("unchecked")
-//	public synchronized Set<ServiceDescriptionProvider> getDefaultServiceDescriptionProvidersFallback() {
-//		/*if (defaultServiceDescriptionProviders != null) {
-//	 return defaultServiceDescriptionProviders;
-//	 }
-//	 defaultServiceDescriptionProviders = new HashSet<ServiceDescriptionProvider>();
-//		 */
-//		for (ServiceDescriptionProvider provider : serviceDescriptionProviders) {
-//
-//			/* We do not need these - already loaded them from getDefaultServiceDescriptionProviders()
-//	 if (!(provider instanceof ConfigurableServiceProvider)) {
-//	 defaultServiceDescriptionProviders.add(provider);
-//	 continue;
-//	 }*/
-//
-//			// Just load the hard coded default configurable service providers
-//			if (provider instanceof ConfigurableServiceProvider){
-//				ConfigurableServiceProvider<Object> template = ((ConfigurableServiceProvider<Object>)
-//						provider);
-//				// Get configurations
-//				List<Object> configurables = template.getDefaultConfigurations();
-//				for (Object config : configurables) {
-//					// Make a copy that we can configure
-//					ConfigurableServiceProvider<Object> configurableProvider = template.clone();
-//					try {
-//						configurableProvider.configure(config);
-//					} catch (ConfigurationException e) {
-//						logger.warn("Can't configure provider "
-//								+ configurableProvider + " with " + config);
-//						continue;
-//					}
-//					defaultServiceDescriptionProviders.add(configurableProvider);
-//				}
-//			}
-//		}
-//		return defaultServiceDescriptionProviders;
-//	}
-
-	// Get the default services.
-	@Override
-	public synchronized Set<ServiceDescriptionProvider> getDefaultServiceDescriptionProviders() {
-		if (defaultServiceDescriptionProviders != null)
-			return defaultServiceDescriptionProviders;
-		defaultServiceDescriptionProviders = new HashSet<>();
-
-		/*
-		 * Add default configurable service description providers from the
-		 * default_service_providers.xml file
-		 */
-		if (defaultConfigurableServiceProvidersFile.exists()) {
-			try {
-				ServiceDescriptionDeserializer deserializer = new ServiceDescriptionDeserializer(
-						serviceDescriptionProviders);
-				defaultServiceDescriptionProviders.addAll(deserializer
-						.deserializeDefaults(this,
-								defaultConfigurableServiceProvidersFile));
-				/*
-				 * We have successfully loaded the defaults for system
-				 * configurable providers. Note that there are still defaults
-				 * for third party configurable providers, which will be loaded
-				 * below using getDefaultConfigurations().
-				 */
-				defaultSystemConfigurableProvidersLoaded = true;
-			} catch (Exception e) {
-				logger.error("Could not load default service providers from "
-						+ defaultConfigurableServiceProvidersFile.getAbsolutePath(), e);
-
-				/*
-				 * Fallback on the old hardcoded method of loading default
-				 * system configurable service providers using
-				 * getDefaultConfigurations().
-				 */
-				defaultSystemConfigurableProvidersLoaded = false;
-			}
-		} else {
-			logger.warn("Could not find the file "
-					+ defaultConfigurableServiceProvidersFile.getAbsolutePath()
-					+ " containing default system service providers. "
-					+ "Using the hardcoded list of default system providers.");
-
-			/*
-			 * Fallback on the old hardcoded method of loading default system
-			 * configurable service providers using getDefaultConfigurations().
-			 */
-			defaultSystemConfigurableProvidersLoaded = false;
-		}
-
-		/*
-		 * Load other default service description providers - template, local
-		 * workers and third party configurable service providers
-		 */
-		for (ServiceDescriptionProvider provider : serviceDescriptionProviders) {
-			/*
-			 * Template service providers (beanshell, string constant, etc. )
-			 * and providers of local workers.
-			 */
-			if (!(provider instanceof ConfigurableServiceProvider)) {
-				defaultServiceDescriptionProviders.add(provider);
-				continue;
-			}
-
-			/*
-			 * Default system or third party configurable service description
-			 * provider. System ones are read from the
-			 * default_service_providers.xml file so getDefaultConfigurations()
-			 * on them will not have much effect here unless
-			 * defaultSystemConfigurableProvidersLoaded is set to false.
-			 */
-			//FIXME needs to be designed to work using Configuration instances
-			//FIXME needs to get configurations via OSGi discovery
-			/*
-			ConfigurableServiceProvider template = (ConfigurableServiceProvider) provider;
-			// Get configurations
-			for (ObjectNode config : template.getDefaultConfigurations()) {
-				// Make a copy that we can configure
-				ConfigurableServiceProvider configurableProvider = template.clone();
-				try {
-					configurableProvider.configure(config);
-				} catch (ConfigurationException e) {
-					logger.warn("Can't configure provider "
-							+ configurableProvider + " with " + config);
-					continue;
-				}
-				defaultServiceDescriptionProviders.add(configurableProvider);
-			}
-			*/
-		}
-
-		return defaultServiceDescriptionProviders;
-	}
-
-	@Override
-	public synchronized Set<ServiceDescriptionProvider> getServiceDescriptionProviders() {
-		if (allServiceProviders != null)
-			return new HashSet<>(allServiceProviders);
-		allServiceProviders = new HashSet<>(userAddedProviders);
-		synchronized (this) {
-			if (!hasLoadedProviders)
-				try {
-					loadServiceProviders();
-				} catch (Exception e) {
-					logger.error("Could not load service providers", e);
-				} finally {
-					hasLoadedProviders = true;
-				}
-		}
-		for (ServiceDescriptionProvider provider : getDefaultServiceDescriptionProviders()) {
-			if (userRemovedProviders.contains(provider))
-				continue;
-			if (provider instanceof ConfigurableServiceProvider
-					&& !serviceDescriptionsConfig.isIncludeDefaults())
-				// We'll skip the default configurable service provders
-				continue;
-			allServiceProviders.add(provider);
-		}
-		return new HashSet<>(allServiceProviders);
-	}
-
-	@Override
-	public Set<ServiceDescriptionProvider> getServiceDescriptionProviders(
-			ServiceDescription sd) {
-		Set<ServiceDescriptionProvider> result = new HashSet<>();
-		for (ServiceDescriptionProvider sdp : providerDescriptions.keySet())
-			if (providerDescriptions.get(sdp).contains(sd))
-				result.add(sdp);
-		return result;
-	}
-
-	@Override
-	public Set<ServiceDescription> getServiceDescriptions() {
-		updateServiceDescriptions(false, true);
-		Set<ServiceDescription> serviceDescriptions = new HashSet<>();
-		synchronized (providerDescriptions) {
-			for (Set<ServiceDescription> providerDesc : providerDescriptions
-					.values())
-				serviceDescriptions.addAll(providerDesc);
-		}
-		return serviceDescriptions;
-	}
-
-	@Override
-	public ServiceDescription getServiceDescription(URI serviceType) {
-		for (ServiceDescription serviceDescription : getServiceDescriptions())
-			if (serviceDescription.getActivityType().equals(serviceType))
-				return serviceDescription;
-		return null;
-	}
-
-	@Override
-	public List<ConfigurableServiceProvider> getUnconfiguredServiceProviders() {
-		List<ConfigurableServiceProvider> providers = new ArrayList<>();
-		for (ServiceDescriptionProvider provider : serviceDescriptionProviders)
-			if (provider instanceof ConfigurableServiceProvider)
-				providers.add((ConfigurableServiceProvider) provider);
-		return providers;
-	}
-
-	@Override
-	public Set<ServiceDescriptionProvider> getUserAddedServiceProviders() {
-		return new HashSet<>(userAddedProviders);
-	}
-
-	@Override
-	public Set<ServiceDescriptionProvider> getUserRemovedServiceProviders() {
-		return new HashSet<>(userRemovedProviders);
-	}
-
-	@Override
-	public void loadServiceProviders() {
-		File serviceProviderFile = findServiceDescriptionsFile();
-		if (serviceProviderFile.isFile())
-			loadServiceProviders(serviceProviderFile);
-		hasLoadedProviders = true;
-	}
-
-	@Override
-	public void loadServiceProviders(File serviceProvidersFile) {
-		ServiceDescriptionDeserializer deserializer = new ServiceDescriptionDeserializer(
-				serviceDescriptionProviders);
-		loading = true;
-		try {
-			deserializer.deserialize(this, serviceProvidersFile);
-		} catch (DeserializationException e) {
-			logger.error("failed to deserialize configuration", e);
-		}
-		loading = false;
-	}
-
-	@Override
-	public void loadServiceProviders(URL serviceProvidersURL) {
-		ServiceDescriptionDeserializer deserializer = new ServiceDescriptionDeserializer(
-				serviceDescriptionProviders);
-		loading = true;
-		try {
-			deserializer.deserialize(this, serviceProvidersURL);
-		} catch (DeserializationException e) {
-			logger.error("failed to deserialize configuration", e);
-		}
-		loading = false;
-	}
-
-	@Override
-	public void refresh() {
-		updateServiceDescriptions(true, false);
-	}
-
-	@Override
-	public void removeObserver(Observer<ServiceDescriptionRegistryEvent> observer) {
-		observers.removeObserver(observer);
-	}
-
-	@Override
-	public synchronized void removeServiceDescriptionProvider(
-			ServiceDescriptionProvider provider) {
-		if (!userAddedProviders.remove(provider))
-			// Not previously added - must be a default one.. but should we remove it?
-			if (loading || serviceDescriptionsConfig.isRemovePermanently()
-					&& serviceDescriptionsConfig.isIncludeDefaults())
-				userRemovedProviders.add(provider);
-		if (allServiceProviders.remove(provider)) {
-			synchronized (providerDescriptions) {
-				Thread thread = serviceDescriptionThreads.remove(provider);
-				if (thread != null)
-					thread.interrupt();
-				providerDescriptions.remove(provider);
-			}
-			observers.notify(new RemovedProviderEvent(provider));
-		}
-		if (!loading)
-			saveServiceDescriptions();
-	}
-
-	@Override
-	public void saveServiceDescriptions() {
-		File serviceDescriptionsFile = findServiceDescriptionsFile();
-		saveServiceDescriptions(serviceDescriptionsFile);
-	}
-
-	@Override
-	public void saveServiceDescriptions(File serviceDescriptionsFile) {
-		ServiceDescriptionSerializer serializer = new ServiceDescriptionSerializer();
-		try {
-			serializer.serializeRegistry(this, serviceDescriptionsFile);
-		} catch (IOException e) {
-			throw new RuntimeException("Can't save service descriptions to "
-					+ serviceDescriptionsFile);
-		}
-	}
-
-	/**
-	 * Exports all configurable service providers (that give service
-	 * descriptions) currently found in the Service Registry (apart from service
-	 * templates and local services) regardless of who added them (user or
-	 * default system providers).
-	 * <p>
-	 * Unlike {@link #saveServiceDescriptions}, this export does not have the
-	 * "ignored providers" section as this is just a plain export of everything
-	 * in the Service Registry.
-	 * 
-	 * @param serviceDescriptionsFile
-	 */
-	@Override
-	public void exportCurrentServiceDescriptions(File serviceDescriptionsFile) {
-		ServiceDescriptionSerializer serializer = new ServiceDescriptionSerializer();
-		try {
-			serializer.serializeFullRegistry(this, serviceDescriptionsFile);
-		} catch (IOException e) {
-			throw new RuntimeException("Could not save service descriptions to "
-					+ serviceDescriptionsFile);
-		}
-	}
-
-	public void setServiceDescriptionProvidersList(
-			List<ServiceDescriptionProvider> serviceDescriptionProviders) {
-		this.serviceDescriptionProviders = serviceDescriptionProviders;
-	}
-
-	private void updateServiceDescriptions(boolean refreshAll, boolean waitFor) {
-		List<Thread> threads = new ArrayList<>();
-		for (ServiceDescriptionProvider provider : getServiceDescriptionProviders()) {
-			synchronized (providerDescriptions) {
-				if (providerDescriptions.containsKey(provider) && !refreshAll)
-					// We'll used the cached values
-					continue;
-				Thread oldThread = serviceDescriptionThreads.get(provider);
-				if (oldThread != null && oldThread.isAlive()) {
-					if (refreshAll)
-						// New thread will override the old thread
-						oldThread.interrupt();
-					else {
-						// observers.notify(new ProviderStatusNotification(provider, "Waiting for provider"));
-						continue;
-					}
-				}
-				// Not run yet - we'll start a new tread
-				Thread thread = new FindServiceDescriptionsThread(provider);
-				threads.add(thread);
-				serviceDescriptionThreads.put(provider, thread);
-				thread.start();
-			}
-		}
-		if (waitFor)
-			joinThreads(threads, DESCRIPTION_THREAD_TIMEOUT_MS);
-	}
-
-	@Override
-	public boolean isDefaultSystemConfigurableProvidersLoaded() {
-		return defaultSystemConfigurableProvidersLoaded;
-	}
-
-	/**
-	 * Sets the serviceDescriptionsConfig.
-	 * 
-	 * @param serviceDescriptionsConfig
-	 *            the new value of serviceDescriptionsConfig
-	 */
-	public void setServiceDescriptionsConfig(
-			ServiceDescriptionsConfiguration serviceDescriptionsConfig) {
-		this.serviceDescriptionsConfig = serviceDescriptionsConfig;
-	}
-
-	class FindServiceDescriptionsThread extends Thread implements
-			UncaughtExceptionHandler, FindServiceDescriptionsCallBack {
-		private final ServiceDescriptionProvider provider;
-		private boolean aborting = false;
-		private final Set<ServiceDescription> providerDescs = new HashSet<>();
-
-		FindServiceDescriptionsThread(ServiceDescriptionProvider provider) {
-			super(threadGroup, "Find service descriptions from " + provider);
-			this.provider = provider;
-			setUncaughtExceptionHandler(this);
-			setDaemon(true);
-		}
-
-		@Override
-		public void fail(String message, Throwable ex) {
-			logger.warn("Provider " + getProvider() + ": " + message, ex);
-			if (aborting)
-				return;
-			observers.notify(new ProviderErrorNotification(getProvider(),
-					message, ex));
-		}
-
-		@Override
-		public void finished() {
-			if (aborting)
-				return;
-			synchronized (providerDescriptions) {
-				providerDescriptions.put(getProvider(), providerDescs);
-			}
-			observers.notify(new ServiceDescriptionProvidedEvent(getProvider(),
-					providerDescs));
-		}
-
-		@Override
-		public void partialResults(
-				Collection<? extends ServiceDescription> serviceDescriptions) {
-			if (aborting)
-				return;
-			providerDescs.addAll(serviceDescriptions);
-			synchronized (providerDescriptions) {
-				providerDescriptions.put(getProvider(), providerDescs);
-			}
-			observers.notify(new PartialServiceDescriptionsNotification(
-					getProvider(), serviceDescriptions));
-		}
-
-		@Override
-		public void status(String message) {
-			logger.debug("Provider " + getProvider() + ": " + message);
-			if (aborting)
-				return;
-			observers.notify(new ProviderStatusNotification(getProvider(),
-					message));
-		}
-
-		@Override
-		public void warning(String message) {
-			logger.warn("Provider " + getProvider() + ": " + message);
-			if (aborting)
-				return;
-			observers.notify(new ProviderWarningNotification(getProvider(),
-					message));
-		}
-
-		public ServiceDescriptionProvider getProvider() {
-			return provider;
-		}
-
-		@Override
-		public void interrupt() {
-			aborting = true;
-			super.interrupt();
-		}
-
-		@Override
-		public void run() {
-			observers.notify(new ProviderUpdatingNotification(provider));
-			getProvider().findServiceDescriptionsAsync(this);
-		}
-
-		@Override
-		public void uncaughtException(Thread t, Throwable ex) {
-			logger.error("Uncaught exception in " + t, ex);
-			fail("Uncaught exception", ex);
-		}
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-impl/src/main/java/net/sf/taverna/t2/servicedescriptions/impl/ServiceDescriptionSerializer.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-impl/src/main/java/net/sf/taverna/t2/servicedescriptions/impl/ServiceDescriptionSerializer.java b/taverna-activity-palette-impl/src/main/java/net/sf/taverna/t2/servicedescriptions/impl/ServiceDescriptionSerializer.java
deleted file mode 100644
index 8a047a3..0000000
--- a/taverna-activity-palette-impl/src/main/java/net/sf/taverna/t2/servicedescriptions/impl/ServiceDescriptionSerializer.java
+++ /dev/null
@@ -1,102 +0,0 @@
-package net.sf.taverna.t2.servicedescriptions.impl;
-
-import static net.sf.taverna.t2.servicedescriptions.impl.ServiceDescriptionConstants.CONFIGURATION;
-import static net.sf.taverna.t2.servicedescriptions.impl.ServiceDescriptionConstants.IGNORED;
-import static net.sf.taverna.t2.servicedescriptions.impl.ServiceDescriptionConstants.PROVIDERS;
-import static net.sf.taverna.t2.servicedescriptions.impl.ServiceDescriptionConstants.PROVIDER_ID;
-import static net.sf.taverna.t2.servicedescriptions.impl.ServiceDescriptionConstants.SERVICE_PANEL_CONFIGURATION;
-import static net.sf.taverna.t2.servicedescriptions.impl.ServiceDescriptionConstants.TYPE;
-
-import java.io.BufferedOutputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.Set;
-
-import net.sf.taverna.t2.servicedescriptions.ConfigurableServiceProvider;
-import net.sf.taverna.t2.servicedescriptions.ServiceDescriptionProvider;
-import net.sf.taverna.t2.servicedescriptions.ServiceDescriptionRegistry;
-
-import org.apache.log4j.Logger;
-import org.jdom.JDOMException;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.ArrayNode;
-import com.fasterxml.jackson.databind.node.JsonNodeFactory;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-
-class ServiceDescriptionSerializer {
-	private static Logger logger = Logger
-			.getLogger(ServiceDescriptionSerializer.class);
-
-	public void serializeRegistry(ServiceDescriptionRegistry registry, File file)
-			throws IOException {
-		Set<ServiceDescriptionProvider> ignoreProviders = registry
-				.getUserRemovedServiceProviders();
-		JsonNode registryElement = serializeRegistry(registry, ignoreProviders);
-		try (BufferedOutputStream bufferedOutStream = new BufferedOutputStream(
-				new FileOutputStream(file))) {
-			bufferedOutStream.write(registryElement.toString()
-					.getBytes("UTF-8"));
-		}
-	}
-
-	/**
-	 * Export the whole service registry to an xml file, regardless of who added
-	 * the service provider (user or system default). In this case there will be
-	 * no "ignored providers" in the saved file.
-	 */
-	public void serializeFullRegistry(ServiceDescriptionRegistry registry,
-			File file) throws IOException {
-		JsonNode registryElement = serializeRegistry(registry, ALL_PROVIDERS);
-		try (BufferedOutputStream bufferedOutStream = new BufferedOutputStream(
-				new FileOutputStream(file))) {
-			bufferedOutStream.write(registryElement.toString()
-					.getBytes("UTF-8"));
-		}
-	}
-
-	private static final JsonNodeFactory factory = JsonNodeFactory.instance;
-	private static final Set<ServiceDescriptionProvider> ALL_PROVIDERS = null;
-
-	private JsonNode serializeRegistry(ServiceDescriptionRegistry registry,
-			Set<ServiceDescriptionProvider> ignoreProviders) {
-		ObjectNode overallConfiguration = factory.objectNode();
-		overallConfiguration.put(SERVICE_PANEL_CONFIGURATION,
-				ignoreProviders != ALL_PROVIDERS ? "full" : "defaults only");
-		ArrayNode providers = overallConfiguration.putArray(PROVIDERS);
-
-		for (ServiceDescriptionProvider provider : registry
-				.getUserAddedServiceProviders())
-			try {
-				providers.add(serializeProvider(provider));
-			} catch (JDOMException | IOException e) {
-				logger.warn("Could not serialize " + provider, e);
-			}
-
-		if (ignoreProviders != ALL_PROVIDERS) {
-			ArrayNode ignored = overallConfiguration.putArray(IGNORED);
-			for (ServiceDescriptionProvider provider : ignoreProviders)
-				try {
-					ignored.add(serializeProvider(provider));
-				} catch (JDOMException | IOException e) {
-					logger.warn("Could not serialize " + provider, e);
-				}
-		}
-
-		return overallConfiguration;
-	}
-
-	private JsonNode serializeProvider(ServiceDescriptionProvider provider)
-			throws JDOMException, IOException {
-		ObjectNode node = factory.objectNode();
-		node.put(PROVIDER_ID, provider.getId());
-
-		if (provider instanceof ConfigurableServiceProvider) {
-			ConfigurableServiceProvider configurable = (ConfigurableServiceProvider) provider;
-			node.put(TYPE, configurable.getConfiguration().getType().toString());
-			node.put(CONFIGURATION, configurable.getConfiguration().getJson());
-		}
-		return node;
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-impl/src/main/java/net/sf/taverna/t2/servicedescriptions/impl/ServiceDescriptionXMLConstants.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-impl/src/main/java/net/sf/taverna/t2/servicedescriptions/impl/ServiceDescriptionXMLConstants.java b/taverna-activity-palette-impl/src/main/java/net/sf/taverna/t2/servicedescriptions/impl/ServiceDescriptionXMLConstants.java
deleted file mode 100644
index ee180a7..0000000
--- a/taverna-activity-palette-impl/src/main/java/net/sf/taverna/t2/servicedescriptions/impl/ServiceDescriptionXMLConstants.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package net.sf.taverna.t2.servicedescriptions.impl;
-
-import org.jdom.Namespace;
-
-public interface ServiceDescriptionXMLConstants {
-
-	public static final Namespace SERVICE_DESCRIPTION_NS = Namespace
-			.getNamespace("http://taverna.sf.net/2009/xml/servicedescription");
-	public static final String PROVIDER = "provider";
-	public static final String PROVIDERS = "providers";
-	public static final String SERVICE_DESCRIPTIONS = "serviceDescriptions";
-	public static final String IGNORED_PROVIDERS = "ignoredProviders";
-	public static final String PROVIDER_IDENTIFIER = "providerId";
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-impl/src/main/java/net/sf/taverna/t2/servicedescriptions/impl/ServiceDescriptionsConfigurationImpl.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-impl/src/main/java/net/sf/taverna/t2/servicedescriptions/impl/ServiceDescriptionsConfigurationImpl.java b/taverna-activity-palette-impl/src/main/java/net/sf/taverna/t2/servicedescriptions/impl/ServiceDescriptionsConfigurationImpl.java
deleted file mode 100644
index ef0295c..0000000
--- a/taverna-activity-palette-impl/src/main/java/net/sf/taverna/t2/servicedescriptions/impl/ServiceDescriptionsConfigurationImpl.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester
- *
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- *
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.servicedescriptions.impl;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import net.sf.taverna.t2.servicedescriptions.ServiceDescriptionsConfiguration;
-
-import uk.org.taverna.configuration.AbstractConfigurable;
-import uk.org.taverna.configuration.ConfigurationManager;
-
-public class ServiceDescriptionsConfigurationImpl extends AbstractConfigurable
-		implements ServiceDescriptionsConfiguration {
-	private static final String INCLUDE_DEFAULTS = "includeDefaults";
-	private static final String SERVICE_PALETTE = "Service providers";
-	private static final String SERVICE_PALETTE_PREFIX = "ServiceProviders";
-	private static final String CATEGORY = "Services";
-	private static final String UUID = "f0d1ef24-9337-412f-b2c3-220a01e2efd0";
-	private static final String REMOVE_PERMANENTLY = "removePermanently";
-
-	public ServiceDescriptionsConfigurationImpl(
-			ConfigurationManager configurationManager) {
-		super(configurationManager);
-	}
-
-	@Override
-	public String getCategory() {
-		return CATEGORY;
-	}
-
-	@Override
-	public Map<String, String> getDefaultPropertyMap() {
-		Map<String, String> defaults = new HashMap<String, String>();
-		defaults.put(INCLUDE_DEFAULTS, "true");
-		defaults.put(REMOVE_PERMANENTLY, "true");
-		return defaults;
-	}
-
-	@Override
-	public String getDisplayName() {
-		return SERVICE_PALETTE;
-	}
-
-	@Override
-	public String getFilePrefix() {
-		return SERVICE_PALETTE_PREFIX;
-	}
-
-	@Override
-	public String getUUID() {
-		return UUID;
-	}
-
-	@Override
-	public boolean isIncludeDefaults() {
-		return Boolean.parseBoolean(getProperty(INCLUDE_DEFAULTS));
-	}
-
-	@Override
-	public void setIncludeDefaults(boolean includeDefaults) {
-		setProperty(INCLUDE_DEFAULTS, Boolean.toString(includeDefaults));
-	}
-
-	@Override
-	public boolean isRemovePermanently() {
-		return Boolean.parseBoolean(getProperty(REMOVE_PERMANENTLY));
-	}
-
-	@Override
-	public void setRemovePermanently(boolean removePermanently) {
-		setProperty(REMOVE_PERMANENTLY, Boolean.toString(removePermanently));
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-impl/src/main/java/net/sf/taverna/t2/workbench/ui/activitypalette/ActivityPaletteConfiguration.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-impl/src/main/java/net/sf/taverna/t2/workbench/ui/activitypalette/ActivityPaletteConfiguration.java b/taverna-activity-palette-impl/src/main/java/net/sf/taverna/t2/workbench/ui/activitypalette/ActivityPaletteConfiguration.java
deleted file mode 100644
index 46f82c4..0000000
--- a/taverna-activity-palette-impl/src/main/java/net/sf/taverna/t2/workbench/ui/activitypalette/ActivityPaletteConfiguration.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester
- *
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- *
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workbench.ui.activitypalette;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import uk.org.taverna.configuration.AbstractConfigurable;
-import uk.org.taverna.configuration.ConfigurationManager;
-
-public class ActivityPaletteConfiguration extends AbstractConfigurable {
-	private Map<String,String> defaultPropertyMap;
-
-	public ActivityPaletteConfiguration(ConfigurationManager configurationManager) {
-		super(configurationManager);
-	}
-
-	@Override
-	public String getCategory() {
-		return "Services";
-	}
-
-	@Override
-	public Map<String, String> getDefaultPropertyMap() {
-		if (defaultPropertyMap == null) {
-			defaultPropertyMap = new HashMap<>();
-
-			// //wsdl
-			//defaultPropertyMap.put("taverna.defaultwsdl", "http://www.ebi.ac.uk/xembl/XEMBL.wsdl,"+
-			//                    "http://soap.genome.jp/KEGG.wsdl,"+
-			//                    "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/soap/eutils.wsdl,"+
-			//                    "http://soap.bind.ca/wsdl/bind.wsdl,"+
-			//                    "http://www.ebi.ac.uk/ws/services/urn:Dbfetch?wsdl");
-
-			// //soaplab
-			//defaultPropertyMap.put("taverna.defaultsoaplab", "http://www.ebi.ac.uk/soaplab/services/");
-
-			// //biomart
-			//defaultPropertyMap.put("taverna.defaultmartregistry","http://www.biomart.org/biomart");
-
-			//add property names
-			//defaultPropertyMap.put("name.taverna.defaultwsdl", "WSDL");
-			//defaultPropertyMap.put("name.taverna.defaultsoaplab","Soaplab");
-			//defaultPropertyMap.put("name.taverna.defaultmartregistry", "Biomart");
-		}
-		return defaultPropertyMap;
-	}
-
-	@Override
-	public String getDisplayName() {
-		return "Activity Palette";
-	}
-
-	@Override
-	public String getFilePrefix() {
-		return "ActivityPalette";
-	}
-
-	@Override
-	public String getUUID() {
-		return "ad9f3a60-5967-11dd-ae16-0800200c9a66";
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-impl/src/main/java/net/sf/taverna/t2/workbench/ui/activitypalette/ActivityPaletteConfigurationPanel.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-impl/src/main/java/net/sf/taverna/t2/workbench/ui/activitypalette/ActivityPaletteConfigurationPanel.java b/taverna-activity-palette-impl/src/main/java/net/sf/taverna/t2/workbench/ui/activitypalette/ActivityPaletteConfigurationPanel.java
deleted file mode 100644
index 6166e60..0000000
--- a/taverna-activity-palette-impl/src/main/java/net/sf/taverna/t2/workbench/ui/activitypalette/ActivityPaletteConfigurationPanel.java
+++ /dev/null
@@ -1,284 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester
- *
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- *
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workbench.ui.activitypalette;
-
-import static java.awt.BorderLayout.CENTER;
-import static java.awt.BorderLayout.EAST;
-import static java.awt.BorderLayout.NORTH;
-import static java.awt.BorderLayout.SOUTH;
-import static java.awt.FlowLayout.LEFT;
-import static java.awt.FlowLayout.RIGHT;
-import static javax.swing.BoxLayout.Y_AXIS;
-import static javax.swing.JOptionPane.INFORMATION_MESSAGE;
-import static javax.swing.JOptionPane.WARNING_MESSAGE;
-import static javax.swing.JOptionPane.YES_NO_OPTION;
-import static javax.swing.JOptionPane.YES_OPTION;
-import static javax.swing.JOptionPane.showConfirmDialog;
-import static javax.swing.JOptionPane.showInputDialog;
-import static javax.swing.border.BevelBorder.LOWERED;
-
-import java.awt.BorderLayout;
-import java.awt.Component;
-import java.awt.FlowLayout;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.swing.BoxLayout;
-import javax.swing.DefaultComboBoxModel;
-import javax.swing.DefaultListCellRenderer;
-import javax.swing.DefaultListModel;
-import javax.swing.JButton;
-import javax.swing.JComboBox;
-import javax.swing.JLabel;
-import javax.swing.JList;
-import javax.swing.JPanel;
-import javax.swing.border.BevelBorder;
-
-import org.apache.log4j.Logger;
-
-@SuppressWarnings("serial")
-public class ActivityPaletteConfigurationPanel extends JPanel {
-	private static Logger logger = Logger
-			.getLogger(ActivityPaletteConfigurationPanel.class);
-
-	private Map<String,List<String>> values = new HashMap<>();
-	private Map<String,String> names = new HashMap<>();
-	private DefaultComboBoxModel<String> model;
-	private DefaultListModel<String> listModel;
-	private JList<String> propertyListItems;
-	private String selectedKey;
-	private JButton deleteTypeButton;
-	private final ActivityPaletteConfiguration config;
-
-	public ActivityPaletteConfigurationPanel(ActivityPaletteConfiguration config) {
-		super(new BorderLayout());
-		this.config = config;
-
-		model = new DefaultComboBoxModel<>();
-		for (String key : config.getInternalPropertyMap().keySet()) {
-			if (key.startsWith("taverna.")
-					&& config.getPropertyStringList(key) != null) {
-				model.addElement(key);
-				values.put(key,
-						new ArrayList<>(config.getPropertyStringList(key)));
-			}
-			if (key.startsWith("name.taverna."))
-				names.put(key, config.getProperty(key).toString());
-		}
-		deleteTypeButton = new JButton("Delete");
-
-		final JButton addTypeButton = new JButton("Add");
-		final JComboBox<String> comboBox = new JComboBox<>(model);
-		comboBox.setRenderer(new DefaultListCellRenderer() {
-			@Override
-			public Component getListCellRendererComponent(JList<?> list,
-					Object value, int index, boolean isSelected,
-					boolean cellHasFocus) {
-				if (value != null && value instanceof String) {
-					String name = names.get("name." + value);
-					if (name != null)
-						value = name;
-				}
-				return super.getListCellRendererComponent(list, value, index,
-						isSelected, cellHasFocus);
-			}
-		});
-
-		deleteTypeButton.addActionListener(new ActionListener() {
-			@Override
-			public void actionPerformed(ActionEvent e) {
-				String displayText = names.get("name." + selectedKey);
-				if (displayText == null)
-					displayText = selectedKey;
-				if (confirm("Confirm removal",
-						"Are you sure you wish to remove the type "
-								+ displayText + "?")) {
-					names.remove("name." + selectedKey);
-					values.remove(selectedKey);
-					model.removeElement(selectedKey);
-					comboBox.setSelectedIndex(0);
-				}
-			}
-		});
-
-		addTypeButton.addActionListener(new ActionListener() {
-			@Override
-			public void actionPerformed(ActionEvent e) {
-				String key = input("New key", "Provide the new key.");
-				if (key == null)
-					return;
-				String name = input("Name for the key",
-						"Provide the name for the key: " + key);
-				if (name == null)
-					return;
-
-				values.put(key, new ArrayList<String>());
-				names.put("name." + key, name);
-				model.addElement(key);
-				comboBox.setSelectedItem(key);
-			}
-		});
-
-		comboBox.addActionListener(new ActionListener() {
-			@Override
-			public void actionPerformed(ActionEvent e) {
-				if (comboBox.getSelectedItem() != null
-						&& comboBox.getSelectedItem() instanceof String) {
-					selectedKey = (String) comboBox.getSelectedItem();
-					List<String> selectedList = values.get(selectedKey);
-					populateList(selectedList);
-					deleteTypeButton.setEnabled(selectedList.size() == 0);
-				}
-			}
-		});
-
-		JPanel propertySelectionPanel = new JPanel(new FlowLayout(LEFT));
-		propertySelectionPanel.add(new JLabel("Activity type:"));
-		propertySelectionPanel.add(comboBox);
-		propertySelectionPanel.add(addTypeButton);
-		propertySelectionPanel.add(deleteTypeButton);
-		add(propertySelectionPanel, NORTH);
-
-		JPanel listPanel = new JPanel(new BorderLayout());
-		listModel = new DefaultListModel<>();
-		propertyListItems = new JList<>(listModel);
-		propertyListItems.setBorder(new BevelBorder(LOWERED));
-
-		listPanel.add(propertyListItems, CENTER);
-		listPanel.add(listButtons(), EAST);
-
-		add(listPanel, CENTER);
-
-		add(applyButtonPanel(), SOUTH);
-
-		if (model.getSize() > 0)
-			comboBox.setSelectedItem(model.getElementAt(0));
-	}
-
-	private void populateList(List<String> selectedList) {
-		listModel.removeAllElements();
-		for (String item : selectedList)
-			listModel.addElement(item);
-	}
-
-	private JPanel applyButtonPanel() {
-		JPanel applyPanel = new JPanel(new FlowLayout(RIGHT));
-		JButton applyButton = new JButton("Apply");
-
-		applyButton.addActionListener(new ActionListener() {
-			@Override
-			public void actionPerformed(ActionEvent e) {
-				config.getInternalPropertyMap().clear();
-				for (String key : values.keySet()) {
-					List<String> properties = values.get(key);
-					config.setPropertyStringList(key, new ArrayList<>(
-							properties));
-				}
-				for (String key : names.keySet())
-					config.setProperty(key, names.get(key));
-				store();
-			}
-		});
-
-		applyPanel.add(applyButton);
-		return applyPanel;
-	}
-
-	private void store() {
-		try {
-			//FIXME
-			//ConfigurationManager.getInstance().store(config);
-		} catch (Exception e1) {
-			logger.error("There was an error storing the configuration:"
-					+ config.getFilePrefix() + " (UUID=" + config.getUUID()
-					+ ")", e1);
-		}
-	}
-
-	private JPanel listButtons() {
-		JPanel panel = new JPanel();
-		panel.setLayout(new BoxLayout(panel, Y_AXIS));
-		JButton addButton = new JButton("+");
-		addButton.addActionListener(new ActionListener() {
-			@Override
-			public void actionPerformed(ActionEvent e) {
-				String value = input("New property", "Provide new value for: "
-						+ selectedKey);
-				if (value != null) {
-					listModel.addElement(value);
-					values.get(selectedKey).add(value);
-					deleteTypeButton.setEnabled(false);
-				}
-			}
-		});
-
-		JButton deleteButton = new JButton("-");
-		deleteButton.addActionListener(new ActionListener() {
-			@Override
-			public void actionPerformed(ActionEvent e) {
-				Object value = propertyListItems.getSelectedValue();
-				if (confirm("Confirm removal",
-						"Are you sure you wish to remove " + value + "?")) {
-					listModel.removeElement(value);
-					values.get(selectedKey).remove(value);
-					if (values.get(selectedKey).size() == 0)
-						deleteTypeButton.setEnabled(true);
-				}
-			}
-		});
-
-		panel.add(addButton);
-		panel.add(deleteButton);
-
-		return panel;
-	}
-
-	private boolean confirm(String title, String message) {
-		return showConfirmDialog(this, message, title, YES_NO_OPTION,
-				WARNING_MESSAGE) == YES_OPTION;
-	}
-
-	private String input(String title, String message) {
-		return showInputDialog(this, message, title, INFORMATION_MESSAGE);
-	}
-
-/*	private JButton getAddTypeButton() {
-		JButton result = new JButton("Add");
-		result.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent e) {
-				String val = input("New property value","New property value");
-				if (val!=null) {
-					if (values.get(val) == null) {
-						model.addElement(val);
-						values.put(val, new ArrayList<String>());
-					} else
-						showMessageDialog(ActivityPaletteConfigurationPanel.this, "This property already exists");
-				}
-			}
-		});
-		return result;
-	}
-*/
-}

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

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-impl/src/main/java/org/apache/taverna/servicedescriptions/impl/ServiceDescriptionConstants.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-impl/src/main/java/org/apache/taverna/servicedescriptions/impl/ServiceDescriptionConstants.java b/taverna-activity-palette-impl/src/main/java/org/apache/taverna/servicedescriptions/impl/ServiceDescriptionConstants.java
new file mode 100644
index 0000000..8331c88
--- /dev/null
+++ b/taverna-activity-palette-impl/src/main/java/org/apache/taverna/servicedescriptions/impl/ServiceDescriptionConstants.java
@@ -0,0 +1,10 @@
+package org.apache.taverna.servicedescriptions.impl;
+
+public interface ServiceDescriptionConstants {
+	String SERVICE_PANEL_CONFIGURATION = "servicePanelConfiguration";
+	String PROVIDERS = "providers";
+	String IGNORED = "ignored";
+	String PROVIDER_ID = "providerID";
+	String CONFIGURATION = "configuration";
+	String TYPE = "type";
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-impl/src/main/java/org/apache/taverna/servicedescriptions/impl/ServiceDescriptionDeserializer.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-impl/src/main/java/org/apache/taverna/servicedescriptions/impl/ServiceDescriptionDeserializer.java b/taverna-activity-palette-impl/src/main/java/org/apache/taverna/servicedescriptions/impl/ServiceDescriptionDeserializer.java
new file mode 100644
index 0000000..546a278
--- /dev/null
+++ b/taverna-activity-palette-impl/src/main/java/org/apache/taverna/servicedescriptions/impl/ServiceDescriptionDeserializer.java
@@ -0,0 +1,167 @@
+package org.apache.taverna.servicedescriptions.impl;
+
+import static org.apache.taverna.servicedescriptions.impl.ServiceDescriptionConstants.CONFIGURATION;
+import static org.apache.taverna.servicedescriptions.impl.ServiceDescriptionConstants.IGNORED;
+import static org.apache.taverna.servicedescriptions.impl.ServiceDescriptionConstants.PROVIDERS;
+import static org.apache.taverna.servicedescriptions.impl.ServiceDescriptionConstants.PROVIDER_ID;
+import static org.apache.taverna.servicedescriptions.impl.ServiceDescriptionConstants.TYPE;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URI;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.apache.taverna.scufl2.api.configurations.Configuration;
+import org.apache.taverna.servicedescriptions.ConfigurableServiceProvider;
+import org.apache.taverna.servicedescriptions.ServiceDescriptionProvider;
+import org.apache.taverna.servicedescriptions.ServiceDescriptionRegistry;
+
+import com.fasterxml.jackson.core.JsonFactory;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
+class ServiceDescriptionDeserializer {
+	private List<ServiceDescriptionProvider> serviceDescriptionProviders;
+
+	ServiceDescriptionDeserializer(
+			List<ServiceDescriptionProvider> serviceDescriptionProviders) {
+		this.serviceDescriptionProviders = serviceDescriptionProviders;
+	}
+
+	public void deserialize(ServiceDescriptionRegistry registry,
+			File serviceDescriptionsFile) throws DeserializationException {
+		try (FileInputStream serviceDescriptionFileStream = new FileInputStream(
+				serviceDescriptionsFile)) {
+			deserialize(registry, serviceDescriptionFileStream);
+		} catch (FileNotFoundException ex) {
+			throw new DeserializationException("Could not locate file "
+					+ serviceDescriptionsFile.getAbsolutePath()
+					+ " containing service descriptions.");
+		} catch (IOException ex) {
+			throw new DeserializationException(
+					"Could not read stream containing service descriptions from "
+							+ serviceDescriptionsFile.getAbsolutePath(), ex);
+		}
+	}
+
+	public void deserialize(ServiceDescriptionRegistry registry,
+			URL serviceDescriptionsURL) throws DeserializationException {
+		try (InputStream serviceDescriptionInputStream = serviceDescriptionsURL
+				.openStream()) {
+			deserialize(registry, serviceDescriptionInputStream);
+		} catch (FileNotFoundException ex) {
+			throw new DeserializationException("Could not open URL "
+					+ serviceDescriptionsURL
+					+ " containing service descriptions.");
+		} catch (IOException ex) {
+			throw new DeserializationException(
+					"Could not read stream containing service descriptions from "
+							+ serviceDescriptionsURL, ex);
+		}
+	}
+
+	private static final JsonFactory factory = new JsonFactory();
+
+	private void deserialize(ServiceDescriptionRegistry registry,
+			InputStream serviceDescriptionsInputStream) throws IOException,
+			DeserializationException {
+		ObjectNode node = (ObjectNode) new ObjectMapper(factory)
+				.readTree(serviceDescriptionsInputStream);
+		List<ServiceDescriptionProvider> providers = deserializeProviders(node,
+				true);
+		for (ServiceDescriptionProvider provider : providers)
+			registry.addServiceDescriptionProvider(provider);
+	}
+
+	public Collection<? extends ServiceDescriptionProvider> deserializeDefaults(
+			ServiceDescriptionRegistry registry,
+			File defaultConfigurableServiceProvidersFile)
+			throws DeserializationException {
+		ObjectNode node;
+		try (FileInputStream serviceDescriptionStream = new FileInputStream(
+				defaultConfigurableServiceProvidersFile)) {
+			node = (ObjectNode) new ObjectMapper(factory)
+					.readTree(serviceDescriptionStream);
+		} catch (IOException e) {
+			throw new DeserializationException("Can't read "
+					+ defaultConfigurableServiceProvidersFile);
+		}
+		return deserializeProviders(node, false);
+	}
+
+	private List<ServiceDescriptionProvider> deserializeProviders(
+			ObjectNode rootNode, boolean obeyIgnored)
+			throws DeserializationException {
+		List<ServiceDescriptionProvider> providers = new ArrayList<>();
+
+		ArrayNode providersNode = (ArrayNode) rootNode.get(PROVIDERS);
+		if (providersNode != null)
+			for (JsonNode provider : providersNode)
+				providers.add(deserializeProvider((ObjectNode) provider));
+
+		if (obeyIgnored) {
+			ArrayNode ignoredNode = (ArrayNode) rootNode.get(IGNORED);
+			if (ignoredNode != null)
+				for (JsonNode provider : ignoredNode)
+					providers
+							.remove(deserializeProvider((ObjectNode) provider));
+		}
+
+		return providers;
+	}
+
+	private ServiceDescriptionProvider deserializeProvider(
+			ObjectNode providerNode) throws DeserializationException {
+		String providerId = providerNode.get(PROVIDER_ID).asText().trim();
+		ServiceDescriptionProvider provider = null;
+		for (ServiceDescriptionProvider serviceProvider : serviceDescriptionProviders)
+			if (serviceProvider.getId().equals(providerId)) {
+				provider = serviceProvider;
+				break;
+			}
+		if (provider == null)
+			throw new DeserializationException(
+					"Could not find provider with id " + providerId);
+
+		/*
+		 * So we know the service provider now, but we need a separate instance
+		 * of that provider for each providerElem. E.g. we can have 2 or more
+		 * WSDL provider elements and need to return a separate provider
+		 * instance for each as they will have different configurations.
+		 */
+		ServiceDescriptionProvider instance = provider.newInstance();
+
+		if (instance instanceof ConfigurableServiceProvider)
+			try {
+				Configuration config = new Configuration();
+				config.setType(URI.create(providerNode.get(TYPE).textValue()));
+				config.setJson(providerNode.get(CONFIGURATION));
+				if (config != null)
+					((ConfigurableServiceProvider) instance).configure(config);
+			} catch (Exception e) {
+				throw new DeserializationException(
+						"Could not configure provider " + providerId
+								+ " using bean " + providerNode, e);
+			}
+		return instance;
+	}
+
+	@SuppressWarnings("serial")
+	static class DeserializationException extends Exception {
+		public DeserializationException(String string) {
+			super(string);
+		}
+
+		public DeserializationException(String string, Exception ex) {
+			super(string, ex);
+		}
+	}
+}