You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@taverna.apache.org by st...@apache.org on 2015/02/17 12:46:38 UTC

[11/50] [abbrv] incubator-taverna-plugin-bioinformatics git commit: taverna-biomart-martservice/

http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-bioinformatics/blob/9e08cac0/taverna-biomart-martservice/src/main/java/org/biomart/martservice/MartServiceXMLHandler.java
----------------------------------------------------------------------
diff --git a/taverna-biomart-martservice/src/main/java/org/biomart/martservice/MartServiceXMLHandler.java b/taverna-biomart-martservice/src/main/java/org/biomart/martservice/MartServiceXMLHandler.java
new file mode 100644
index 0000000..e8a5189
--- /dev/null
+++ b/taverna-biomart-martservice/src/main/java/org/biomart/martservice/MartServiceXMLHandler.java
@@ -0,0 +1,390 @@
+/*
+ * Copyright (C) 2003 The University of Manchester 
+ *
+ * Modifications to the initial code base are copyright of their
+ * respective authors, or their employers as appropriate.  Authorship
+ * of the modifications may be determined from the ChangeLog placed at
+ * the end of this file.
+ *
+ * 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
+ * USA.
+ *
+ ****************************************************************
+ * Source code information
+ * -----------------------
+ * Filename           $RCSfile: MartServiceXMLHandler.java,v $
+ * Revision           $Revision: 1.4 $
+ * Release status     $State: Exp $
+ * Last modified on   $Date: 2007/12/13 11:38:55 $
+ *               by   $Author: davidwithers $
+ * Created on 28-Apr-2006
+ *****************************************************************/
+package org.biomart.martservice;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import org.biomart.martservice.query.QueryXMLHandler;
+import org.jdom.Element;
+import org.jdom.Namespace;
+
+/**
+ * Utility class for serializing mart service classes to XML.
+ * 
+ * @author David Withers
+ */
+public class MartServiceXMLHandler {
+	public static final String MART_SERVICE_ELEMENT = "MartService";
+
+	public static final String MART_URL_LOCATION_ELEMENT = "MartURLLocation";
+
+	public static final String MART_DATASET_ELEMENT = "MartDataset";
+
+	public static final String MART_QUERY_ELEMENT = "MartQuery";
+
+	public static final String LINKED_DATASETS_ELEMENT = "LinkedDatasets";
+
+	public static final String LINKED_DATASET_ELEMENT = "LinkedDataset";
+
+	public static final String VIRTUAL_SCHEMA_ELEMENT = "virtualSchema";
+
+	public static final String LOCATION_ATTRIBUTE = "location";
+
+	public static final String DATABASE_ATTRIBUTE = "database";
+
+	public static final String DEFAULT_ATTRIBUTE = "default";
+
+	public static final String DEFAULT_VALUE_ATTRIBUTE = "defaultValue";
+
+	public static final String DISPLAY_NAME_ATTRIBUTE = "displayName";
+
+	public static final String HOST_ATTRIBUTE = "host";
+
+	public static final String INCLUDE_DATASETS_ATTRIBUTE = "includeDatasets";
+
+	public static final String LINK_ATTRIBUTE = "LINK";
+
+	public static final String MART_USER_ATTRIBUTE = "martUser";
+
+	public static final String NAME_ATTRIBUTE = "name";
+
+	public static final String PATH_ATTRIBUTE = "path";
+
+	public static final String PORT_ATTRIBUTE = "port";
+
+	public static final String TYPE_ATTRIBUTE = "type";
+
+	public static final String INITIAL_BATCH_SIZE_ATTRIBUTE = "initialBatchSize";
+
+	public static final String MAXIMUM_BATCH_SIZE_ATTRIBUTE = "maximumBatchSize";
+
+	public static final String VIRTUAL_SCHEMA_ATTRIBUTE = "virtualSchema";
+
+	public static final String SERVER_VIRTUAL_SCHEMA_ATTRIBUTE = "serverVirtualSchema";
+
+	public static final String VISIBLE_ATTRIBUTE = "visible";
+
+	public static final String REDIRECT_ATTRIBUTE = "redirect";
+
+	public static final String INTERFACE_ATTRIBUTE = "interface";
+
+	public static final String MODIFIED_ATTRIBUTE = "modified";
+
+	/**
+	 * Converts a <code>MartService</code> to an XML element.
+	 * 
+	 * @param martService
+	 *            the <code>MartService</code> to serialize
+	 * @param namespace
+	 *            the <code>Namespace</code> to use when constructing the
+	 *            <code>Element</code>
+	 * @return an XML serialization of the <code>MartService</code>
+	 */
+	public static Element martServiceToElement(MartService martService,
+			Namespace namespace) {
+		Element element = new Element(MART_SERVICE_ELEMENT, namespace);
+		element.setAttribute(LOCATION_ATTRIBUTE, martService.getLocation());
+		return element;
+	}
+
+	/**
+	 * Creates a <code>MartService</code> from an XML element.
+	 * 
+	 * @param element
+	 *            the <code>Element</code> to deserialize
+	 * @return a deserialized <code>MartService</code>
+	 */
+	public static MartService elementToMartService(Element element) {
+		return MartService.getMartService(element
+				.getAttributeValue(LOCATION_ATTRIBUTE));
+	}
+
+	/**
+	 * Converts a <code>MartDataset</code> to an XML element.
+	 * 
+	 * @param dataset
+	 *            the <code>MartDataset</code> to serialize
+	 * @param namespace
+	 *            the <code>Namespace</code> to use when constructing the
+	 *            <code>Element</code>
+	 * @return an XML serialization of the <code>MartDataset</code>
+	 */
+	public static Element datasetToElement(MartDataset dataset,
+			Namespace namespace) {
+		Element element = new Element(MART_DATASET_ELEMENT, namespace);
+		element.setAttribute(DISPLAY_NAME_ATTRIBUTE, dataset.getDisplayName());
+		element.setAttribute(NAME_ATTRIBUTE, dataset.getName());
+		element.setAttribute(TYPE_ATTRIBUTE, dataset.getType());
+		element.setAttribute(INITIAL_BATCH_SIZE_ATTRIBUTE, String
+				.valueOf(dataset.getInitialBatchSize()));
+		element.setAttribute(MAXIMUM_BATCH_SIZE_ATTRIBUTE, String
+				.valueOf(dataset.getMaximumBatchSize()));
+		element.setAttribute(VISIBLE_ATTRIBUTE, String.valueOf(dataset
+				.isVisible()));
+		if (dataset.getInterface() != null) {
+			element.setAttribute(INTERFACE_ATTRIBUTE, dataset.getInterface());
+		}
+		if (dataset.getModified() != null) {
+			element.setAttribute(MODIFIED_ATTRIBUTE, dataset.getModified());
+		}
+		element.addContent(locationToElement(dataset.getMartURLLocation(),
+				namespace));
+		return element;
+	}
+
+	/**
+	 * Creates a <code>MartDataset</code> from an XML element.
+	 * 
+	 * @param element
+	 *            the <code>Element</code> to deserialize
+	 * @param namespace
+	 *            the <code>Namespace</code> containing the
+	 *            <code>Element</code>
+	 * @return a deserialized <code>MartDataset</code>
+	 */
+	public static MartDataset elementToDataset(Element element,
+			Namespace namespace) {
+		MartDataset dataset = new MartDataset();
+		dataset.setDisplayName(element
+				.getAttributeValue(DISPLAY_NAME_ATTRIBUTE));
+		dataset.setName(element.getAttributeValue(NAME_ATTRIBUTE));
+		dataset.setType(element.getAttributeValue(TYPE_ATTRIBUTE));
+		dataset.setInitialBatchSize(Long.parseLong(element
+				.getAttributeValue(INITIAL_BATCH_SIZE_ATTRIBUTE)));
+		dataset.setMaximumBatchSize(Long.parseLong(element
+				.getAttributeValue(MAXIMUM_BATCH_SIZE_ATTRIBUTE)));
+		dataset.setVisible(Boolean.getBoolean(element
+				.getAttributeValue(VISIBLE_ATTRIBUTE)));
+		dataset.setInterface(element.getAttributeValue(INTERFACE_ATTRIBUTE));
+		dataset.setModified(element.getAttributeValue(MODIFIED_ATTRIBUTE));
+		dataset.setMartURLLocation(elementToLocation(element.getChild(
+				MART_URL_LOCATION_ELEMENT, namespace)));
+		return dataset;
+	}
+
+	/**
+	 * Creates a <code>MartRegistry</code> from an XML element.
+	 * 
+	 * @param element
+	 *            the <code>Element</code> to deserialize
+	 * @param namespace
+	 *            the <code>Namespace</code> containing the
+	 *            <code>Element</code>
+	 * @return a deserialized <code>MartRegistry</code>
+	 */
+	public static MartRegistry elementToRegistry(Element root,
+			Namespace namespace) {
+		MartRegistry registry = new MartRegistry();
+		List<Element> children = root.getChildren();
+		for (Element childElement : children) {
+			if (childElement.getNamespace().equals(namespace)) {
+				if (childElement.getName().equals(MART_URL_LOCATION_ELEMENT)) {
+					MartURLLocation martURLLocation = MartServiceXMLHandler
+							.elementToLocation(childElement);
+					martURLLocation.setVirtualSchema("default");
+					registry.addMartURLLocation(martURLLocation);
+				} else if (childElement.getName()
+						.equals(VIRTUAL_SCHEMA_ELEMENT)) {
+					String virtualSchema = childElement
+							.getAttributeValue(NAME_ATTRIBUTE);
+					List<Element> locations = childElement.getChildren(
+							MART_URL_LOCATION_ELEMENT, namespace);
+					for (Element location : locations) {
+						MartURLLocation martURLLocation = MartServiceXMLHandler
+								.elementToLocation(location);
+						martURLLocation.setVirtualSchema(virtualSchema);
+						registry.addMartURLLocation(martURLLocation);
+					}
+				}
+			}
+		}
+		return registry;
+	}
+
+	/**
+	 * Converts a <code>MartURLLocation</code> to an XML element.
+	 * 
+	 * @param location
+	 *            the <code>MartURLLocation</code> to serialize
+	 * @param namespace
+	 *            the <code>Namespace</code> to use when constructing the
+	 *            <code>Element</code>
+	 * @return an XML serialization of the <code>MartURLLocation</code>
+	 */
+	public static Element locationToElement(MartURLLocation location,
+			Namespace namespace) {
+		Element element = new Element(MART_URL_LOCATION_ELEMENT, namespace);
+		if (location.getDatabase() != null) {
+			element.setAttribute(DATABASE_ATTRIBUTE, location.getDatabase());
+		}
+		element.setAttribute(DEFAULT_ATTRIBUTE, location.isDefault() ? "1"
+				: "0");
+		element.setAttribute(DISPLAY_NAME_ATTRIBUTE, location.getDisplayName());
+		element.setAttribute(HOST_ATTRIBUTE, location.getHost());
+		if (location.getIncludeDatasets() != null) {
+			element.setAttribute(INCLUDE_DATASETS_ATTRIBUTE, location
+					.getIncludeDatasets());
+		}
+		if (location.getMartUser() != null) {
+			element.setAttribute(MART_USER_ATTRIBUTE, location.getMartUser());
+		}
+		element.setAttribute(NAME_ATTRIBUTE, location.getName());
+		if (location.getPath() != null) {
+			element.setAttribute(PATH_ATTRIBUTE, location.getPath());
+		}
+		element
+				.setAttribute(PORT_ATTRIBUTE, String
+						.valueOf(location.getPort()));
+		element.setAttribute(SERVER_VIRTUAL_SCHEMA_ATTRIBUTE, location
+				.getServerVirtualSchema());
+		if (location.getVirtualSchema() != null) {
+			element.setAttribute(VIRTUAL_SCHEMA_ATTRIBUTE, location
+					.getVirtualSchema());
+		}
+		element.setAttribute(VISIBLE_ATTRIBUTE, location.isVisible() ? "1"
+				: "0");
+		element.setAttribute(REDIRECT_ATTRIBUTE, location.isRedirect() ? "1"
+				: "0");
+		return element;
+	}
+
+	/**
+	 * Creates a <code>MartURLLocation</code> from an XML element.
+	 * 
+	 * @param element
+	 *            the <code>Element</code> to deserialize
+	 * @return a deserialized <code>MartURLLocation</code>
+	 */
+	public static MartURLLocation elementToLocation(Element element) {
+		MartURLLocation location = new MartURLLocation();
+		location.setDatabase(element.getAttributeValue(DATABASE_ATTRIBUTE));
+		location.setDefault("1".equals(element
+				.getAttributeValue(DEFAULT_ATTRIBUTE)));
+		location.setDisplayName(element
+				.getAttributeValue(DISPLAY_NAME_ATTRIBUTE));
+		location.setHost(element.getAttributeValue(HOST_ATTRIBUTE));
+		location.setIncludeDatasets(element
+				.getAttributeValue(INCLUDE_DATASETS_ATTRIBUTE));
+		location.setMartUser(element.getAttributeValue(MART_USER_ATTRIBUTE));
+		location.setName(element.getAttributeValue(NAME_ATTRIBUTE));
+		location.setPath(element.getAttributeValue(PATH_ATTRIBUTE));
+		try {
+			location.setPort(Integer.parseInt(element
+					.getAttributeValue(PORT_ATTRIBUTE)));
+		} catch (NumberFormatException e) {
+			location.setPort(80);
+		}
+		location.setServerVirtualSchema(element
+				.getAttributeValue(SERVER_VIRTUAL_SCHEMA_ATTRIBUTE));
+		location.setVirtualSchema(element
+				.getAttributeValue(VIRTUAL_SCHEMA_ATTRIBUTE));
+		location.setVisible("1".equals(element
+				.getAttributeValue(VISIBLE_ATTRIBUTE)));
+		location.setRedirect("1".equals(element
+				.getAttributeValue(REDIRECT_ATTRIBUTE)));
+		return location;
+	}
+
+	/**
+	 * Creates a <code>MartQuery</code> from an XML element.
+	 * 
+	 * @param element
+	 *            the <code>Element</code> to deserialize
+	 * @param namespace
+	 *            the <code>Namespace</code> containing the
+	 *            <code>Element</code>
+	 * @return a deserialized <code>MartQuery</code>
+	 */
+	public static MartQuery elementToMartQuery(Element element,
+			Namespace namespace) {
+		MartQuery martQuery = new MartQuery();
+		martQuery.setMartService(MartServiceXMLHandler
+				.elementToMartService(element.getChild(MART_SERVICE_ELEMENT,
+						namespace)));
+		martQuery.setMartDataset(elementToDataset(element.getChild(
+				MART_DATASET_ELEMENT, namespace), namespace));
+		martQuery.setQuery(QueryXMLHandler.elementToQuery(element.getChild(
+				QueryXMLHandler.QUERY_ELEMENT, namespace), namespace));
+		Element linksElement = element.getChild(LINKED_DATASETS_ELEMENT, namespace);
+		if (linksElement != null) {
+			List linkedDatasets = linksElement.getChildren(LINKED_DATASETS_ELEMENT,
+					namespace);
+			for (Iterator iter = linkedDatasets.iterator(); iter.hasNext();) {
+				Element datasetElement = (Element) iter.next();
+				String datasetName = datasetElement.getAttributeValue(NAME_ATTRIBUTE);
+				String linkId = datasetElement.getAttributeValue(LINK_ATTRIBUTE);
+				martQuery.addLinkedDataset(datasetName, linkId);
+			}
+		}
+		return martQuery;
+	}
+
+	/**
+	 * Converts a <code>MartQuery</code> to an XML element.
+	 * 
+	 * @param martQuery
+	 *            the <code>MartQuery</code> to serialize
+	 * @param namespace
+	 *            the <code>Namespace</code> to use when constructing the
+	 *            <code>Element</code>
+	 * @return an XML serialization of the <code>MartQuery</code>
+	 */
+	public static Element martQueryToElement(MartQuery martQuery,
+			Namespace namespace) {
+		Element element = new Element(MART_QUERY_ELEMENT, namespace);
+		element.addContent(martServiceToElement(martQuery.getMartService(),
+				namespace));
+		element.addContent(datasetToElement(martQuery.getMartDataset(),
+				namespace));
+		element.addContent(QueryXMLHandler.queryToElement(martQuery.getQuery(),
+				namespace));
+		Set linkedDatasets = martQuery.getLinkedDatasets();
+		if (linkedDatasets.size() > 0) {
+			Element linksElement = new Element(LINKED_DATASETS_ELEMENT, namespace);
+			for (Iterator iter = linkedDatasets.iterator(); iter.hasNext();) {
+				String datasetName = (String) iter.next();
+				Element datasetElement = new Element(LINKED_DATASETS_ELEMENT, namespace);
+				datasetElement.setAttribute(NAME_ATTRIBUTE, datasetName);
+				datasetElement.setAttribute(LINK_ATTRIBUTE, martQuery
+						.getLink(datasetName));
+				linksElement.addContent(datasetElement);
+			}
+			element.addContent(linksElement);
+		}
+		return element;
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-bioinformatics/blob/9e08cac0/taverna-biomart-martservice/src/main/java/org/biomart/martservice/MartURLLocation.java
----------------------------------------------------------------------
diff --git a/taverna-biomart-martservice/src/main/java/org/biomart/martservice/MartURLLocation.java b/taverna-biomart-martservice/src/main/java/org/biomart/martservice/MartURLLocation.java
new file mode 100644
index 0000000..476956d
--- /dev/null
+++ b/taverna-biomart-martservice/src/main/java/org/biomart/martservice/MartURLLocation.java
@@ -0,0 +1,422 @@
+/*
+ * Copyright (C) 2003 The University of Manchester 
+ *
+ * Modifications to the initial code base are copyright of their
+ * respective authors, or their employers as appropriate.  Authorship
+ * of the modifications may be determined from the ChangeLog placed at
+ * the end of this file.
+ *
+ * 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
+ * USA.
+ *
+ ****************************************************************
+ * Source code information
+ * -----------------------
+ * Filename           $RCSfile: MartURLLocation.java,v $
+ * Revision           $Revision: 1.2 $
+ * Release status     $State: Exp $
+ * Last modified on   $Date: 2007/10/04 14:15:59 $
+ *               by   $Author: davidwithers $
+ * Created on 17-Mar-2006
+ *****************************************************************/
+package org.biomart.martservice;
+
+import org.ensembl.mart.lib.config.MartLocation;
+
+/**
+ * The MartURLLocation contained by the MartRegistry returned by a BioMart web
+ * service.
+ * 
+ * @author David Withers
+ */
+public class MartURLLocation implements MartLocation {
+	private static final String URL_TYPE = "URL";
+
+	private String database;
+
+	private boolean defaultValue;
+
+	private String displayName;
+
+	private String host;
+
+	private String includeDatasets;
+
+	private String martUser;
+
+	private String name;
+
+	private String path;
+
+	private int port;
+
+	private String serverVirtualSchema;
+
+	private String virtualSchema;
+
+	private boolean visible;
+
+	private boolean redirect;
+
+	/**
+	 * Returns the database.
+	 *
+	 * @return the database
+	 */
+	public String getDatabase() {
+		return database;
+	}
+
+	/**
+	 * Sets the database.
+	 *
+	 * @param database the new database
+	 */
+	public void setDatabase(String database) {
+		this.database = database;
+	}
+
+	/**
+	 * Returns true if the default flag is set.
+	 * 
+	 * @return true if the default flag is set
+	 */
+	public boolean isDefault() {
+		return defaultValue;
+	}
+
+	/**
+	 * Sets the default flag.
+	 * 
+	 * @param defaultValue
+	 *            the value of the default flag
+	 */
+	public void setDefault(boolean defaultValue) {
+		this.defaultValue = defaultValue;
+	}
+
+	/**
+	 * Returns the displayName.
+	 * 
+	 * @return the displayName.
+	 */
+	public String getDisplayName() {
+		return displayName;
+	}
+
+	/**
+	 * Sets the displayName.
+	 * 
+	 * @param displayName
+	 *            the displayName to set.
+	 */
+	public void setDisplayName(String displayName) {
+		this.displayName = displayName;
+	}
+
+	/**
+	 * Returns the host.
+	 * 
+	 * @return the host.
+	 */
+	public String getHost() {
+		return host;
+	}
+
+	/**
+	 * Sets the host.
+	 * 
+	 * @param host
+	 *            the host to set.
+	 */
+	public void setHost(String host) {
+		this.host = host;
+	}
+
+	/**
+	 * Returns the includeDatasets.
+	 *
+	 * @return the includeDatasets
+	 */
+	public String getIncludeDatasets() {
+		return includeDatasets;
+	}
+
+	/**
+	 * Sets the includeDatasets.
+	 *
+	 * @param includeDatasets the new includeDatasets
+	 */
+	public void setIncludeDatasets(String includeDatasets) {
+		this.includeDatasets = includeDatasets;
+	}
+
+	/**
+	 * Returns the martUser.
+	 *
+	 * @return the martUser
+	 */
+	public String getMartUser() {
+		return martUser;
+	}
+
+	/**
+	 * Sets the martUser.
+	 *
+	 * @param martUser the new martUser
+	 */
+	public void setMartUser(String martUser) {
+		this.martUser = martUser;
+	}
+
+	/**
+	 * Returns the name
+	 * 
+	 * @return the name.
+	 */
+	public String getName() {
+		return name;
+	}
+
+	/**
+	 * Sets the name.
+	 * 
+	 * @param name
+	 *            the name to set.
+	 */
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	/**
+	 * Returns the path.
+	 *
+	 * @return the path
+	 */
+	public String getPath() {
+		return path;
+	}
+
+	/**
+	 * Sets the path.
+	 *
+	 * @param path the new path
+	 */
+	public void setPath(String path) {
+		this.path = path;
+	}
+
+	/**
+	 * Returns the port.
+	 * 
+	 * @return the port.
+	 */
+	public int getPort() {
+		return port;
+	}
+
+	/**
+	 * Sets the port.
+	 * 
+	 * @param port
+	 *            the port to set.
+	 */
+	public void setPort(int port) {
+		this.port = port;
+	}
+
+	/**
+	 * Returns the serverVirtualSchema.
+	 * 
+	 * @return the serverVirtualSchema.
+	 */
+	public String getServerVirtualSchema() {
+		return serverVirtualSchema;
+	}
+
+	/**
+	 * Sets the serverVirtualSchema.
+	 * 
+	 * @param serverVirtualSchema
+	 *            the serverVirtualSchema to set.
+	 */
+	public void setServerVirtualSchema(String serverVirtualSchema) {
+		this.serverVirtualSchema = serverVirtualSchema;
+	}
+
+	/**
+	 * Returns the virtualSchema.
+	 * 
+	 * @return the virtualSchema.
+	 */
+	public String getVirtualSchema() {
+		return virtualSchema;
+	}
+
+	/**
+	 * Sets the virtualSchema.
+	 * 
+	 * @param virtualSchema
+	 *            the virtualSchema to set.
+	 */
+	public void setVirtualSchema(String virtualSchema) {
+		this.virtualSchema = virtualSchema;
+	}
+
+	/**
+	 * Returns true if the location is visible.
+	 * 
+	 * @return Returns the visible.
+	 */
+	public boolean isVisible() {
+		return visible;
+	}
+
+	/**
+	 * @param visible
+	 *            The visible to set.
+	 */
+	public void setVisible(boolean visible) {
+		this.visible = visible;
+	}
+
+	/**
+	 * Returns true if this location is redirected.
+	 * 
+	 * @return the redirect
+	 */
+	public boolean isRedirect() {
+		return redirect;
+	}
+
+	/**
+	 * @param redirect the redirect to set
+	 */
+	public void setRedirect(boolean redirect) {
+		this.redirect = redirect;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.ensembl.mart.lib.config.MartLocation#getType()
+	 */
+	public String getType() {
+		return URL_TYPE;
+	}
+
+	/**
+	 * Returns the display name.
+	 * 
+	 * @return the display name
+	 */
+	public String toString() {
+		return getDisplayName();
+	}
+
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = 1;
+		result = prime * result
+				+ ((database == null) ? 0 : database.hashCode());
+		result = prime * result + (defaultValue ? 1231 : 1237);
+		result = prime * result
+				+ ((displayName == null) ? 0 : displayName.hashCode());
+		result = prime * result + ((host == null) ? 0 : host.hashCode());
+		result = prime * result
+				+ ((includeDatasets == null) ? 0 : includeDatasets.hashCode());
+		result = prime * result
+				+ ((martUser == null) ? 0 : martUser.hashCode());
+		result = prime * result + ((name == null) ? 0 : name.hashCode());
+		result = prime * result + ((path == null) ? 0 : path.hashCode());
+		result = prime * result + port;
+		result = prime * result + (redirect ? 1231 : 1237);
+		result = prime
+				* result
+				+ ((serverVirtualSchema == null) ? 0 : serverVirtualSchema
+						.hashCode());
+		result = prime * result
+				+ ((virtualSchema == null) ? 0 : virtualSchema.hashCode());
+		result = prime * result + (visible ? 1231 : 1237);
+		return result;
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if (obj == null)
+			return false;
+		if (getClass() != obj.getClass())
+			return false;
+		final MartURLLocation other = (MartURLLocation) obj;
+		if (database == null) {
+			if (other.database != null)
+				return false;
+		} else if (!database.equals(other.database))
+			return false;
+		if (defaultValue != other.defaultValue)
+			return false;
+		if (displayName == null) {
+			if (other.displayName != null)
+				return false;
+		} else if (!displayName.equals(other.displayName))
+			return false;
+		if (host == null) {
+			if (other.host != null)
+				return false;
+		} else if (!host.equals(other.host))
+			return false;
+		if (includeDatasets == null) {
+			if (other.includeDatasets != null)
+				return false;
+		} else if (!includeDatasets.equals(other.includeDatasets))
+			return false;
+		if (martUser == null) {
+			if (other.martUser != null)
+				return false;
+		} else if (!martUser.equals(other.martUser))
+			return false;
+		if (name == null) {
+			if (other.name != null)
+				return false;
+		} else if (!name.equals(other.name))
+			return false;
+		if (path == null) {
+			if (other.path != null)
+				return false;
+		} else if (!path.equals(other.path))
+			return false;
+		if (port != other.port)
+			return false;
+		if (redirect != other.redirect)
+			return false;
+		if (serverVirtualSchema == null) {
+			if (other.serverVirtualSchema != null)
+				return false;
+		} else if (!serverVirtualSchema.equals(other.serverVirtualSchema))
+			return false;
+		if (virtualSchema == null) {
+			if (other.virtualSchema != null)
+				return false;
+		} else if (!virtualSchema.equals(other.virtualSchema))
+			return false;
+		if (visible != other.visible)
+			return false;
+		return true;
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-bioinformatics/blob/9e08cac0/taverna-biomart-martservice/src/main/java/org/biomart/martservice/ResultReceiver.java
----------------------------------------------------------------------
diff --git a/taverna-biomart-martservice/src/main/java/org/biomart/martservice/ResultReceiver.java b/taverna-biomart-martservice/src/main/java/org/biomart/martservice/ResultReceiver.java
new file mode 100644
index 0000000..cc1d062
--- /dev/null
+++ b/taverna-biomart-martservice/src/main/java/org/biomart/martservice/ResultReceiver.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2003 The University of Manchester 
+ *
+ * Modifications to the initial code base are copyright of their
+ * respective authors, or their employers as appropriate.  Authorship
+ * of the modifications may be determined from the ChangeLog placed at
+ * the end of this file.
+ *
+ * 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
+ * USA.
+ *
+ ****************************************************************
+ * Source code information
+ * -----------------------
+ * Filename           $RCSfile: ResultReceiver.java,v $
+ * Revision           $Revision: 1.2 $
+ * Release status     $State: Exp $
+ * Last modified on   $Date: 2008/07/31 15:06:49 $
+ *               by   $Author: davidwithers $
+ * Created on Jan 18, 2008
+ *****************************************************************/
+package org.biomart.martservice;
+
+/**
+ * An interface for receiving results of a Query.
+ * 
+ * @author David Withers
+ */
+public interface ResultReceiver {
+
+	/**
+	 * Receives a single row from the results of executing a Query.
+	 * 
+	 * This method will be called frequently and should not block.
+	 * 
+	 * @param resultRow
+	 */
+	public void receiveResult(Object[] resultRow, long index) throws ResultReceiverException;
+	
+	/**
+	 * Receives an error for a single row from the results of executing a Query.
+	 * 
+	 * This method will be called frequently and should not block.
+	 * 
+	 * @param resultRow
+	 */
+	public void receiveError(String errorMessage, long index) throws ResultReceiverException;
+	
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-bioinformatics/blob/9e08cac0/taverna-biomart-martservice/src/main/java/org/biomart/martservice/ResultReceiverException.java
----------------------------------------------------------------------
diff --git a/taverna-biomart-martservice/src/main/java/org/biomart/martservice/ResultReceiverException.java b/taverna-biomart-martservice/src/main/java/org/biomart/martservice/ResultReceiverException.java
new file mode 100644
index 0000000..c3498e6
--- /dev/null
+++ b/taverna-biomart-martservice/src/main/java/org/biomart/martservice/ResultReceiverException.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2003 The University of Manchester 
+ *
+ * Modifications to the initial code base are copyright of their
+ * respective authors, or their employers as appropriate.  Authorship
+ * of the modifications may be determined from the ChangeLog placed at
+ * the end of this file.
+ *
+ * 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
+ * USA.
+ *
+ ****************************************************************
+ * Source code information
+ * -----------------------
+ * Filename           $RCSfile: ResultReceiverException.java,v $
+ * Revision           $Revision: 1.1 $
+ * Release status     $State: Exp $
+ * Last modified on   $Date: 2008/03/04 16:47:57 $
+ *               by   $Author: davidwithers $
+ * Created on 05-May-2006
+ *****************************************************************/
+package org.biomart.martservice;
+
+/**
+ * 
+ * @author David Withers
+ */
+public class ResultReceiverException extends Exception {
+	private static final long serialVersionUID = 7151337259555845771L;
+
+	/**
+	 * Constructs a new exception with no detail message.
+	 * 
+	 */
+	public ResultReceiverException() {
+		super();
+	}
+
+	/**
+	 * Constructs a new exception with the specified detail message.
+	 * 
+	 * @param message
+	 *            the detail message
+	 * @param cause
+	 *            the cause (a null value is permitted, and indicates that the
+	 *            cause is nonexistent or unknown)
+	 */
+	public ResultReceiverException(String message, Throwable cause) {
+		super(message, cause);
+	}
+
+	/**
+	 * Constructs a new exception with the specified detail message and cause.
+	 * 
+	 * @param message
+	 *            the detail message
+	 */
+	public ResultReceiverException(String message) {
+		super(message);
+	}
+
+	/**
+	 * Constructs a new exception with the specified cause.
+	 * 
+	 * @param cause
+	 *            the cause (a null value is permitted, and indicates that the
+	 *            cause is nonexistent or unknown)
+	 */
+	public ResultReceiverException(Throwable cause) {
+		super(cause);
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-bioinformatics/blob/9e08cac0/taverna-biomart-martservice/src/main/java/org/biomart/martservice/config/QueryConfigController.java
----------------------------------------------------------------------
diff --git a/taverna-biomart-martservice/src/main/java/org/biomart/martservice/config/QueryConfigController.java b/taverna-biomart-martservice/src/main/java/org/biomart/martservice/config/QueryConfigController.java
new file mode 100644
index 0000000..450b2ba
--- /dev/null
+++ b/taverna-biomart-martservice/src/main/java/org/biomart/martservice/config/QueryConfigController.java
@@ -0,0 +1,388 @@
+/*
+ * Copyright (C) 2003 The University of Manchester 
+ *
+ * Modifications to the initial code base are copyright of their
+ * respective authors, or their employers as appropriate.  Authorship
+ * of the modifications may be determined from the ChangeLog placed at
+ * the end of this file.
+ *
+ * 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
+ * USA.
+ *
+ ****************************************************************
+ * Source code information
+ * -----------------------
+ * Filename           $RCSfile: QueryConfigController.java,v $
+ * Revision           $Revision: 1.4 $
+ * Release status     $State: Exp $
+ * Last modified on   $Date: 2007/12/13 11:38:57 $
+ *               by   $Author: davidwithers $
+ * Created on 27-Mar-2006
+ *****************************************************************/
+package org.biomart.martservice.config;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.apache.log4j.Logger;
+import org.biomart.martservice.MartQuery;
+import org.biomart.martservice.config.event.QueryComponentEvent;
+import org.biomart.martservice.config.event.QueryComponentListener;
+import org.biomart.martservice.config.ui.QueryComponent;
+import org.biomart.martservice.query.Attribute;
+import org.biomart.martservice.query.Dataset;
+import org.biomart.martservice.query.Filter;
+import org.biomart.martservice.query.Query;
+import org.biomart.martservice.query.QueryListener;
+import org.ensembl.mart.lib.config.FilterDescription;
+
+/**
+ * Controls the interaction between graphical <code>QueryComponent</code>s
+ * and <code>Query</code>s.
+ * 
+ * @author David Withers
+ */
+public class QueryConfigController {
+	private static Logger logger = Logger
+			.getLogger("org.biomart.martservice.config");
+
+	private static QueryListener queryListener = new QueryHandler();
+
+	private MartQuery martQuery;
+
+	private Query query;
+
+	private Map<String, Attribute> initialAttributeMap = new HashMap<String, Attribute>();
+
+	private Map<String, Filter> initialFilterMap = new HashMap<String, Filter>();
+
+	private Map<String, Attribute> nameToAttributeMap = new HashMap<String, Attribute>();
+
+	private Map	<String, Filter> nameToFilterMap = new HashMap<String, Filter>();
+
+	private QueryComponentHandler queryComponenHandler = new QueryComponentHandler();
+
+	/**
+	 * Constructs an instance of a <code>QueryConfigController</code>.
+	 * 
+	 * @param martQuery
+	 */
+	public QueryConfigController(MartQuery martQuery) {
+		this.martQuery = martQuery;
+		query = martQuery.getQuery();
+		query.addQueryListener(queryListener);
+
+		for (Attribute attribute : query.getAttributes()) {
+			initialAttributeMap.put(attribute.getQualifiedName(), attribute);
+			nameToAttributeMap.put(attribute.getQualifiedName(), attribute);
+		}
+		for (Filter filter : query.getFilters()) {
+			initialFilterMap.put(filter.getQualifiedName(), filter);
+			nameToFilterMap.put(filter.getQualifiedName(), filter);
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see java.lang.Object#finalize()
+	 */
+	protected void finalize() throws Throwable {
+		super.finalize();
+		query.removeQueryListener(queryListener);
+	}
+
+	/**
+	 * Returns the <code>MartQuery</code> under control.
+	 * 
+	 * @return the <code>MartQuery</code> under control
+	 */
+	public MartQuery getMartQuery() {
+		return martQuery;
+	}
+
+	/**
+	 * Removes a <code>QueryComponent</code> from the controller.
+	 * 
+	 * @param queryComponent
+	 *            the <code>QueryComponent</code> to remove
+	 */
+	public void deregister(QueryComponent queryComponent) {
+		queryComponent.removeQueryComponentListener(queryComponenHandler);
+	}
+
+	/**
+	 * Registers a <code>QueryComponent</code> with the controller.
+	 * 
+	 * If the <code>Query</code> already contains an <code>Attribute</code>
+	 * or <code>Filter</code> with the corresponding name the
+	 * <code>QueryComponent</code> is set as selected.
+	 * 
+	 * @param queryComponent
+	 *            the <code>QueryComponent</code> to register
+	 */
+	public void register(QueryComponent queryComponent) {
+		if (queryComponent.getType() == QueryComponent.ATTRIBUTE) {
+			getAttribute(queryComponent);
+
+			// if query already contains attribute then set the component as
+			// selected
+			if (initialAttributeMap.containsKey(queryComponent
+					.getQualifiedName())) {
+				queryComponent.setSelected(true);
+			}
+
+		} else if (queryComponent.getType() == QueryComponent.FILTER) {
+			Filter filter = getFilter(queryComponent);
+
+			String value = filter.getValue();
+			if (value != null) {
+				if (filter.isBoolean()) {
+					if ("excluded".equals(value)) {
+						queryComponent.setValue("excluded");
+					} else {
+						queryComponent.setValue("only");
+					}
+				} else {
+					queryComponent.setValue(value);
+				}
+			}
+
+			if (initialFilterMap.containsKey(queryComponent.getQualifiedName())) {
+				queryComponent.setSelected(true);
+			}
+		} else if (queryComponent.getType() == QueryComponent.LINK) {
+			Iterator<String> linkedDatasets = martQuery.getLinkedDatasets().iterator();
+			// only one linked dataset allowed for now
+			if (linkedDatasets.hasNext()) {
+				String dataset = linkedDatasets.next();
+				queryComponent.setName(dataset);
+				queryComponent.setValue(martQuery.getLink(dataset));
+			}
+		}
+
+		queryComponent.addQueryComponentListener(queryComponenHandler);
+
+	}
+
+	/**
+	 * Returns the <code>Attribute</code> mapped to the
+	 * <code>QueryComponent</code>. If no <code>Attribute</code> is mapped
+	 * a new <code>Attribute</code> is created and added to the map.
+	 * 
+	 * @param queryComponent
+	 * @return
+	 */
+	private Attribute getAttribute(QueryComponent queryComponent) {
+		String internalName = queryComponent.getQualifiedName();
+		Attribute attribute = null;
+		if (nameToAttributeMap.containsKey(internalName)) {
+			attribute = (Attribute) nameToAttributeMap.get(internalName);
+		} else {
+			attribute = new Attribute(queryComponent.getName());
+			if (queryComponent.getValue() != null) {
+				attribute.setAttributes(queryComponent.getValue());
+			}
+			nameToAttributeMap.put(internalName, attribute);
+		}
+		return attribute;
+	}
+
+	/**
+	 * Returns the <code>Filter</code> mapped to the
+	 * <code>QueryComponent</code>. If no <code>Filter</code> is mapped a
+	 * new <code>Filter</code> is created and added to the map.
+	 * 
+	 * @param queryComponent
+	 * @return
+	 */
+	private Filter getFilter(QueryComponent queryComponent) {
+		FilterDescription filterDescription = (FilterDescription) queryComponent
+				.getConfigObject();
+		String internalName = queryComponent.getQualifiedName();
+		Filter filter;
+		if (nameToFilterMap.containsKey(internalName)) {
+			filter = (Filter) nameToFilterMap.get(internalName);
+		} else {
+			if ("boolean".equals(filterDescription.getType())) {
+				if ("excluded".equals(queryComponent.getValue())) {
+					filter = new Filter(queryComponent.getName(), "excluded", true);
+				} else {
+					filter = new Filter(queryComponent.getName(), "only", true);
+				}
+			} else {
+				String defaultValue = filterDescription.getDefaultValue();
+				if (defaultValue == null
+						&& !QueryConfigUtils.isNestedList(filterDescription)) {
+					// if there is no default value but there are options then
+					// choose the first option as the filter value
+//					Option[] options = filterDescription.getOptions();
+//					if (options != null && options.length > 0) {
+//						defaultValue = options[0].getValue();
+//					} else {
+						defaultValue = queryComponent.getValue();
+//					}
+				}
+				filter = new Filter(queryComponent.getName(), defaultValue);
+				if ("id_list".equals(filterDescription.getType())) {
+					filter.setList(true);
+				}
+			}
+			nameToFilterMap.put(internalName, filter);
+		}
+		return filter;
+	}
+
+	class QueryComponentHandler implements QueryComponentListener {
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see org.embl.ebi.escience.scuflworkers.biomartservice.config.QueryComponentListener#attributeAdded(org.embl.ebi.escience.scuflworkers.biomartservice.config.QueryComponentEvent)
+		 */
+		public void attributeAdded(QueryComponentEvent event) {
+			Attribute attribute = (Attribute) nameToAttributeMap.get(event
+					.getDataset().getName()
+					+ "." + event.getName());
+			synchronized (query) {
+				martQuery.addAttribute(event.getDataset().getName(), attribute);
+			}
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see org.embl.ebi.escience.scuflworkers.biomartservice.config.QueryComponentListener#attributeRemoved(org.embl.ebi.escience.scuflworkers.biomartservice.config.QueryComponentEvent)
+		 */
+		public void attributeRemoved(QueryComponentEvent event) {
+			Attribute attribute = (Attribute) nameToAttributeMap.get(event
+					.getDataset().getName()
+					+ "." + event.getName());
+			synchronized (query) {
+				martQuery.removeAttribute(attribute);
+			}
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see org.embl.ebi.escience.scuflworkers.biomartservice.config.QueryComponentListener#filterAdded(org.embl.ebi.escience.scuflworkers.biomartservice.config.QueryComponentEvent)
+		 */
+		public void filterAdded(QueryComponentEvent event) {
+			Filter filter = (Filter) nameToFilterMap.get(event.getDataset()
+					.getName()
+					+ "." + event.getName());
+			synchronized (query) {
+				martQuery.addFilter(event.getDataset().getName(), filter);
+			}
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see org.embl.ebi.escience.scuflworkers.biomartservice.config.QueryComponentListener#filterRemoved(org.embl.ebi.escience.scuflworkers.biomartservice.config.QueryComponentEvent)
+		 */
+		public void filterRemoved(QueryComponentEvent event) {
+			Filter filter = (Filter) nameToFilterMap.get(event.getDataset()
+					.getName()
+					+ "." + event.getName());
+			synchronized (query) {
+				martQuery.removeFilter(filter);
+			}
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see org.embl.ebi.escience.scuflworkers.biomartservice.config.QueryComponentListener#filterChanged(org.embl.ebi.escience.scuflworkers.biomartservice.config.QueryComponentEvent)
+		 */
+		public void filterChanged(QueryComponentEvent event) {
+			Filter filter = (Filter) nameToFilterMap.get(event.getDataset()
+					.getName()
+					+ "." + event.getName());
+			synchronized (query) {
+				filter.setValue(event.getValue());
+			}
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see org.biomart.martservice.config.event.QueryComponentListener#linkAdded(org.biomart.martservice.config.event.QueryComponentEvent)
+		 */
+		public void linkAdded(QueryComponentEvent event) {
+			martQuery.addLinkedDataset(event.getName(), event.getValue());
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see org.biomart.martservice.config.event.QueryComponentListener#linkRemoved(org.biomart.martservice.config.event.QueryComponentEvent)
+		 */
+		public void linkRemoved(QueryComponentEvent event) {
+			martQuery.removeLinkedDataset(event.getName());
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see org.biomart.martservice.config.QueryComponentListener#linkChanged(org.biomart.martservice.config.QueryComponentEvent)
+		 */
+		public void linkChanged(QueryComponentEvent event) {
+			martQuery.changeLinkedDataset(event.getName(), event.getValue());
+		}
+
+	}
+
+	static class QueryHandler implements QueryListener {
+
+		public void attributeAdded(Attribute attribute, Dataset dataset) {
+			logger.info("Attribute Added " + attribute.getQualifiedName());
+		}
+
+		public void attributeRemoved(Attribute attribute, Dataset dataset) {
+			logger.info("Attribute Removed " + attribute.getQualifiedName());
+		}
+
+		public void filterAdded(Filter filter, Dataset dataset) {
+			logger.info("Filter Added " + filter.getQualifiedName() + " "
+					+ filter.getValue());
+		}
+
+		public void filterRemoved(Filter filter, Dataset dataset) {
+			logger.info("Filter Removed " + filter.getQualifiedName());
+		}
+
+		public void filterChanged(Filter filter, Dataset dataset) {
+			logger.info("Filter Changed " + filter.getQualifiedName() + " "
+					+ filter.getValue());
+		}
+
+		public void formatterAdded(String formatter) {
+			logger.info("Formatter Added " + formatter);
+		}
+
+		public void formatterRemoved(String formatter) {
+			logger.info("Formatter Removed " + formatter);
+		}
+
+		public void formatterChanged(String formatter) {
+			logger.info("Formatter Changed to " + formatter);
+		}
+
+	}
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-bioinformatics/blob/9e08cac0/taverna-biomart-martservice/src/main/java/org/biomart/martservice/config/QueryConfigUtils.java
----------------------------------------------------------------------
diff --git a/taverna-biomart-martservice/src/main/java/org/biomart/martservice/config/QueryConfigUtils.java b/taverna-biomart-martservice/src/main/java/org/biomart/martservice/config/QueryConfigUtils.java
new file mode 100644
index 0000000..2bc7d71
--- /dev/null
+++ b/taverna-biomart-martservice/src/main/java/org/biomart/martservice/config/QueryConfigUtils.java
@@ -0,0 +1,598 @@
+/*
+ * Copyright (C) 2003 The University of Manchester 
+ *
+ * Modifications to the initial code base are copyright of their
+ * respective authors, or their employers as appropriate.  Authorship
+ * of the modifications may be determined from the ChangeLog placed at
+ * the end of this file.
+ *
+ * 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
+ * USA.
+ *
+ ****************************************************************
+ * Source code information
+ * -----------------------
+ * Filename           $RCSfile: QueryConfigUtils.java,v $
+ * Revision           $Revision: 1.3 $
+ * Release status     $State: Exp $
+ * Last modified on   $Date: 2007/12/13 11:38:57 $
+ *               by   $Author: davidwithers $
+ * Created on 30-Mar-2006
+ *****************************************************************/
+package org.biomart.martservice.config;
+
+import java.awt.Component;
+import java.awt.Font;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.swing.JMenu;
+import javax.swing.JMenuBar;
+import javax.swing.JMenuItem;
+import javax.swing.border.EtchedBorder;
+
+import org.biomart.martservice.MartDataset;
+import org.biomart.martservice.MartService;
+import org.biomart.martservice.MartServiceException;
+import org.biomart.martservice.config.ui.QueryComponent;
+import org.ensembl.mart.lib.config.AttributeDescription;
+import org.ensembl.mart.lib.config.AttributePage;
+import org.ensembl.mart.lib.config.BaseNamedConfigurationObject;
+import org.ensembl.mart.lib.config.DatasetConfig;
+import org.ensembl.mart.lib.config.FilterDescription;
+import org.ensembl.mart.lib.config.Option;
+
+/**
+ * Utility class for configuration objects.
+ * 
+ * @author David Withers
+ */
+public abstract class QueryConfigUtils {
+	public static final String LINE_END = System.getProperty("line.separator");
+
+	private static int DISPLAY_WIDTH = 35;
+	
+	public static String splitSentence(String sentence) {
+		return splitSentence(sentence, DISPLAY_WIDTH);
+	}
+
+	public static String splitSentence(String sentence, int limit) {
+		StringBuffer sb = new StringBuffer();
+		sb.append("<html>");
+
+		int width = 0;
+		String[] split = sentence.split(" ");
+		for (int i = 0; i < split.length; i++) {
+			if (width == 0) {
+				sb.append(split[i]);
+				width += split[i].length();
+			} else if (width + split[i].length() + 1 > limit) {
+				sb.append("<br>");
+				sb.append(split[i]);
+				width = split[i].length();
+			} else {
+				sb.append(" ");
+				sb.append(split[i]);
+				width += split[i].length() + 1;
+			}
+		}
+
+		return sb.toString();
+	}
+
+	/**
+	 * Returns name truncated to DISPLAY_WIDTH.
+	 * 
+	 * @param name
+	 * @return
+	 */
+	public static String truncateName(String name) {
+		if (name.length() > DISPLAY_WIDTH) {
+			return name.substring(0, DISPLAY_WIDTH);
+		} else {
+			return name;
+		}
+	}
+
+	public static List<String> getOutputFormats(AttributePage attributePage) {
+		List<String> outputFormats = new ArrayList<String>();
+		
+		String[] formats = attributePage.getOutFormats().split(",");
+		for (int i = 0; i < formats.length; i++) {
+			outputFormats.add(formats[i]);
+		}
+		return outputFormats;
+	}
+	
+	/**
+	 * Returns true if filterDescription has no options.
+	 * 
+	 * @param filterDescription
+	 * @return true if filterDescription has no options
+	 */
+	public static boolean isList(FilterDescription filterDescription) {
+		return filterDescription.getOptions().length > 0;
+	}
+
+	/**
+	 * Returns true if filterDescription has options and at least one option
+	 * also has options.
+	 * 
+	 * @param filterDescription
+	 * @return true if filterDescription has options and at least one option
+	 *         also has options
+	 */
+	public static boolean isNestedList(FilterDescription filterDescription) {
+		Option[] options = filterDescription.getOptions();
+		for (int i = 0; i < options.length; i++) {
+			if (options[i].getOptions().length > 0) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * Returns true if filterDescription has options and the first option has a
+	 * type equal to "boolean".
+	 * 
+	 * @param filterDescription
+	 * @return true if filterDescription has options and the first option has a
+	 *         type equal to "boolean"
+	 */
+	public static boolean isBooleanList(FilterDescription filterDescription) {
+		Option[] options = filterDescription.getOptions();
+		if (options.length > 0) {
+			if ("boolean".equals(options[0].getType())) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * Returns true if filterDescription has options and the first option has a
+	 * value equal to null.
+	 * 
+	 * @param filterDescription
+	 * @return true if filterDescription has options and the first option has a
+	 *         value equal to null
+	 */
+	public static boolean isIdList(FilterDescription filterDescription) {
+		Option[] options = filterDescription.getOptions();
+		if (options.length > 0) {
+			if (options[0].getValue() == null) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	public static Option[] fixOptionLength(Option[] options, int length) {
+		if (options.length > length) {
+			Option[] firstOptions = new Option[length];
+			Option[] otherOptions = new Option[options.length - (length - 1)];
+			for (int i = 0; i < length - 1; i++) {
+				firstOptions[i] = options[i];
+				fixOptionLength(options[i].getOptions(), length);
+			}
+			for (int i = length - 1; i < options.length; i++) {
+				otherOptions[i - (length - 1)] = options[i];
+			}
+			Option newOption = new Option();
+			newOption.setInternalName("more");
+			newOption.setDisplayName("more");
+			newOption.addOptions(fixOptionLength(otherOptions, length));
+			firstOptions[length - 1] = newOption;
+			return firstOptions;
+		} else {
+			return options;
+		}
+	}
+
+	public static Component getOptionButton(
+			FilterDescription filterDescription, QueryComponent queryComponent) {
+		JMenuBar menuBar = new JMenuBar();
+		menuBar.setBorder(new EtchedBorder());
+		JMenu menu = new JMenu("browse");
+		menu.setFont(menu.getFont().deriveFont(Font.PLAIN));
+		menuBar.add(menu);
+		Option[] options = fixOptionLength(filterDescription.getOptions(), 20);
+		for (int i = 0; i < options.length; i++) {
+			menu.add(getMenuItem(options[i], queryComponent));
+		}
+		return menuBar;
+	}
+
+	public static JMenuItem getMenuItem(final Option option,
+			final QueryComponent queryComponent) {
+		JMenuItem menuItem;
+
+		Option[] options = option.getOptions();
+		if (options.length > 0) {
+			JMenu menu = new JMenu(option.getDisplayName());
+			menu.setFont(menu.getFont().deriveFont(Font.PLAIN));
+			for (int i = 0; i < options.length; i++) {
+				menu.add(getMenuItem(options[i], queryComponent));
+			}
+			menuItem = menu;
+		} else {
+			menuItem = new JMenuItem(option.getDisplayName());
+			menuItem.setFont(menuItem.getFont().deriveFont(Font.PLAIN));
+			menuItem.addActionListener(new ActionListener() {
+
+				public void actionPerformed(ActionEvent e) {
+					queryComponent.setValue(option.getValue());
+				}
+
+			});
+		}
+
+		return menuItem;
+	}
+
+	/**
+	 * Returns the dataset referenced by a configuration object or null if the
+	 * configuration object does not reference a dataset.
+	 * 
+	 * @param martService
+	 *            the MartService to fetch the referenced dataset from
+	 * @param referencedFromDataset
+	 *            the datset containing the configuration object
+	 * @param bnco
+	 *            the configuration object
+	 * @return the dataset referenced by a configuration object or null if the
+	 *         configuration object does not reference a dataset.
+	 * @throws MartServiceException
+	 *             if and exception occurs while fetching the dataset
+	 */
+	public static MartDataset getReferencedDataset(MartService martService,
+			MartDataset referencedFromDataset,
+			BaseNamedConfigurationObject bnco, String softwareVersion)
+			throws MartServiceException {
+		if ("0.5".equals(softwareVersion)) {
+			String pointerDataset = bnco.getAttribute("pointerDataset");
+			if (pointerDataset != null) {
+				return martService.getDataset(referencedFromDataset
+						.getVirtualSchema(), pointerDataset);
+			} else {
+				return null;
+			}
+		} else {
+			String[] splitName = bnco.getInternalName().split("\\.");
+			if (splitName.length > 1) {
+				return martService.getDataset(referencedFromDataset
+						.getVirtualSchema(), splitName[0]);
+			} else {
+				return null;
+			}
+		}
+	}
+
+	/**
+	 * Returns the filter description referenced by the filter description.
+	 * 
+	 * @param martService
+	 *            the MartService to fetch the referenced filter description
+	 *            from
+	 * @param dataset
+	 *            the datset containing the referenced filter description
+	 * @param filterDescription
+	 *            the filter description
+	 * @return the filter description referenced by the filter description
+	 * @throws MartServiceException
+	 *             if and exception occurs while fetching the filter description
+	 */
+	public static FilterDescription getReferencedFilterDescription(
+			MartService martService, MartDataset dataset,
+			FilterDescription filterDescription, String softwareVersion)
+			throws MartServiceException {
+		if ("0.5".equals(softwareVersion)) {
+			String pointerFilter = filterDescription
+					.getAttribute("pointerFilter");
+			if (pointerFilter != null) {
+				return getReferencedFilterDescription(martService, dataset,
+						pointerFilter);
+			} else {
+				return null;
+			}
+		} else {
+			String[] splitName = filterDescription.getInternalName().split(
+					"\\.");
+			FilterDescription ref = getReferencedFilterDescription(martService,
+					dataset, splitName[1]);
+			return ref;
+		}
+	}
+
+	/**
+	 * Returns the filter description referenced by the attribute description.
+	 * 
+	 * @param martService
+	 *            the MartService to fetch the referenced filter description
+	 *            from
+	 * @param dataset
+	 *            the datset containing the referenced filter description
+	 * @param attributeDescription
+	 *            the attribute description
+	 * @return the filter description referenced by the attribute description
+	 * @throws MartServiceException
+	 *             if and exception occurs while fetching the filter description
+	 */
+	public static FilterDescription getReferencedFilterDescription(
+			MartService martService, MartDataset dataset,
+			AttributeDescription attributeDescription, String softwareVersion)
+			throws MartServiceException {
+		if ("0.5".equals(softwareVersion)) {
+			String pointerFilter = attributeDescription
+					.getAttribute("pointerFilter");
+			if (pointerFilter != null) {
+				return getReferencedFilterDescription(martService, dataset,
+						pointerFilter);
+			} else {
+				return null;
+			}
+		} else {
+			String[] splitName = attributeDescription.getInternalName().split(
+					"\\.");
+			return getReferencedFilterDescription(martService, dataset,
+					splitName[2]);
+		}
+	}
+
+	public static FilterDescription getReferencedFilterDescription(
+			MartService martService, MartDataset dataset, String filterName)
+			throws MartServiceException {
+		FilterDescription referencedFilter = null;
+		DatasetConfig datasetConfig = martService.getDatasetConfig(dataset);
+		List<FilterDescription> filterDescriptions = datasetConfig.getAllFilterDescriptions();
+		for (FilterDescription filterDescription : filterDescriptions) {
+			if (filterName.equals(filterDescription.getInternalName())) {
+				if (!"true".equals(filterDescription.getHidden())) {
+					referencedFilter = filterDescription;
+					break;
+				}
+			}
+		}
+		return referencedFilter;
+	}
+
+	public static FilterDescription getReferencedFilterDescription(
+			AttributeDescription attributeDescription, String softwareVersion) {
+		FilterDescription filterDescription = new FilterDescription();
+		if ("0.5".equals(softwareVersion)) {
+			filterDescription.setInternalName(attributeDescription
+					.getInternalName());
+			filterDescription.setAttribute(attributeDescription
+					.getAttribute("pointerDataset"));
+			filterDescription.setAttribute(attributeDescription
+					.getAttribute("pointerFilter"));
+			filterDescription.setAttribute(attributeDescription
+					.getAttribute("pointerInterface"));
+		} else {
+			String[] splitName = attributeDescription.getInternalName().split(
+					"\\.");
+			filterDescription
+					.setInternalName(splitName[0] + "." + splitName[2]);
+		}
+		return filterDescription;
+	}
+
+	public static AttributeDescription getReferencedAttributeDescription(
+			MartService martService, MartDataset dataset,
+			AttributeDescription attributeDescription, String softwareVersion)
+			throws MartServiceException {
+		AttributeDescription referencedAttributeDescription = null;
+		String attributeName = null;
+		if ("0.5".equals(softwareVersion)) {
+			attributeName = attributeDescription
+					.getAttribute("pointerAttribute");
+		} else {
+			String internalName = attributeDescription.getInternalName();
+			String[] splitName = internalName.split("\\.");
+			if (splitName.length == 2) {
+				attributeName = splitName[1];
+			}
+		}
+		if (attributeName != null) {
+			DatasetConfig datasetConfig = martService.getDatasetConfig(dataset);
+			if (datasetConfig.containsAttributeDescription(attributeName)) {
+				referencedAttributeDescription = datasetConfig
+						.getAttributeDescriptionByInternalName(attributeName);
+			}
+		}
+		return referencedAttributeDescription;
+	}
+
+	/**
+	 * Returns true if the internal name of the configuration object contains a
+	 * '.' character.
+	 * 
+	 * @param bnco
+	 *            the configuration object
+	 * @return true if the internal name of the configuration object contains a
+	 *         '.' character
+	 */
+	public static boolean isReference(BaseNamedConfigurationObject bnco,
+			String softwareVersion) {
+		if ("0.5".equals(softwareVersion)) {
+			return bnco.getAttribute("pointerDataset") != null 
+			&& (bnco.getAttribute("pointerAttribute") != null || bnco.getAttribute("pointerFilter") != null);
+		} else {
+			return bnco.getInternalName().indexOf(".") != -1;
+		}
+	}
+
+	/**
+	 * Returns true if the internal name of the AttributeDescription has the
+	 * format "[datasetName].[attributeName]".
+	 * 
+	 * @param attributeDescription
+	 * @return true if the internal name of the AttributeDescription has the
+	 *         format "[datasetName].[attributeName]"
+	 */
+	public static boolean isAttributeReference(
+			AttributeDescription attributeDescription, String softwareVersion) {
+		if ("0.5".equals(softwareVersion)) {
+			return attributeDescription.getAttribute("pointerAttribute") != null;
+		} else {
+			return attributeDescription.getInternalName().split("\\.").length == 2;
+		}
+	}
+
+	/**
+	 * Returns true if the internal name of the AttributeDescription has the
+	 * format "[datasetName].filter.[filterName]".
+	 * 
+	 * @param attributeDescription
+	 * @return true if the internal name of the AttributeDescription has the
+	 *         format "[datasetName].filter.[filterName]"
+	 */
+	public static boolean isFilterReference(
+			AttributeDescription attributeDescription, String softwareVersion) {
+		if ("0.5".equals(softwareVersion)) {
+			return attributeDescription.getAttribute("pointerFilter") != null;
+		} else {
+			return attributeDescription.getInternalName().split("\\.").length == 3;
+		}
+	}
+
+//	/**
+//	 * Returns the qualified name of the AttributeDescription in the format
+//	 * "[datasetName].[attributeName]".
+//	 * 
+//	 * @param dataset
+//	 * @param attributeDescription
+//	 * @return true if the qualified name of the AttributeDescription in the
+//	 *         format "[datasetName].[attributeName]"
+//	 */
+//	public static String getQualifiedName(MartDataset dataset,
+//			AttributeDescription attributeDescription, String softwareVersion) {
+//		if ("0.5".equals(softwareVersion)) {
+//			if (isAttributeReference(attributeDescription, softwareVersion)) {
+//				return attributeDescription.getAttribute("pointerDataset")
+//						+ "."
+//						+ attributeDescription.getAttribute("pointerAttribute");
+//			} else if (isFilterReference(attributeDescription, softwareVersion)) {
+//				return attributeDescription.getAttribute("pointerDataset")
+//						+ "."
+//						+ attributeDescription.getAttribute("pointerFilter");
+//			} else {
+//				return dataset.getName()
+//						+ attributeDescription.getInternalName();
+//			}
+//		} else {
+//			if (isAttributeReference(attributeDescription, softwareVersion)) {
+//				return attributeDescription.getInternalName();
+//			} else if (isFilterReference(attributeDescription, softwareVersion)) {
+//				String[] splitName = attributeDescription.getInternalName()
+//						.split("\\.");
+//				return splitName[0] + "." + splitName[2];
+//			} else {
+//				return dataset.getName()
+//						+ attributeDescription.getInternalName();
+//			}
+//		}
+//	}
+
+	public static String csvToValuePerLine(String csv) {
+		StringBuffer list = new StringBuffer();
+
+		String[] splitString = csv.split(",");
+		for (int i = 0; i < splitString.length; i++) {
+			if (i > 0) {
+				list.append(LINE_END);
+			}
+			list.append(splitString[i].trim());
+		}
+
+		return list.toString();
+	}
+
+	public static String valuePerLineToCsv(String list) {
+		return list.trim().replaceAll("\\s", ",");
+	}
+
+	public static List<String> csvToList(String csv) {
+		List<String> list = new ArrayList<String>();
+
+		String[] splitString = csv.split(",");
+		for (int i = 0; i < splitString.length; i++) {
+			list.add(splitString[i].trim());
+		}
+
+		return list;
+	}
+
+	/**
+	 * Converts a List of objects to a comma separated string of the objects'
+	 * string representations in the order given by the List's iterator. For
+	 * example:
+	 * 
+	 * <blockquote>
+	 * 
+	 * <pre>
+	 *          List list = Arrays.toList(new String[] {&quot;one&quot;, &quot;two&quot;, &quot;three&quot;};
+	 *          System.out.println(listToCsv(list));
+	 * </pre>
+	 * 
+	 * </blockquote> would return the string "one,two,three".
+	 * 
+	 * @param list
+	 * @return a List of objects to a comma separated string of the object's
+	 *         string representations
+	 */
+	public static String listToCsv(List<?> list) {
+		StringBuffer sb = new StringBuffer();
+		for (Iterator<?> iter = list.iterator(); iter.hasNext();) {
+			sb.append(iter.next().toString());
+			if (iter.hasNext()) {
+				sb.append(',');
+			}
+		}
+		return sb.toString();
+	}
+
+	/**
+	 * Returns true iff the 'display' or 'hidden' value of the configuration
+	 * object is not "true".
+	 * 
+	 * @param bnco
+	 *            the configuration object
+	 * @return true iff the 'display' or 'hidden' value of configuration object
+	 *         is "true"
+	 */
+	public static boolean display(BaseNamedConfigurationObject bnco) {
+		boolean display = true;
+		String hideDisplay = bnco.getDisplay();
+		if (hideDisplay != null) {
+			if (hideDisplay.equals("true")) {
+				display = false;
+			}
+		} else {
+			String hidden = bnco.getHidden();
+			if (hidden != null) {
+				if (hidden.equals("true")) {
+					display = false;
+				}
+			}
+		}
+		return display;
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-bioinformatics/blob/9e08cac0/taverna-biomart-martservice/src/main/java/org/biomart/martservice/config/event/QueryComponentAdapter.java
----------------------------------------------------------------------
diff --git a/taverna-biomart-martservice/src/main/java/org/biomart/martservice/config/event/QueryComponentAdapter.java b/taverna-biomart-martservice/src/main/java/org/biomart/martservice/config/event/QueryComponentAdapter.java
new file mode 100644
index 0000000..201cc1d
--- /dev/null
+++ b/taverna-biomart-martservice/src/main/java/org/biomart/martservice/config/event/QueryComponentAdapter.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C) 2003 The University of Manchester 
+ *
+ * Modifications to the initial code base are copyright of their
+ * respective authors, or their employers as appropriate.  Authorship
+ * of the modifications may be determined from the ChangeLog placed at
+ * the end of this file.
+ *
+ * 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
+ * USA.
+ *
+ ****************************************************************
+ * Source code information
+ * -----------------------
+ * Filename           $RCSfile: QueryComponentAdapter.java,v $
+ * Revision           $Revision: 1.1 $
+ * Release status     $State: Exp $
+ * Last modified on   $Date: 2007/01/31 14:12:06 $
+ *               by   $Author: davidwithers $
+ * Created on 04-Apr-2006
+ *****************************************************************/
+package org.biomart.martservice.config.event;
+
+/**
+ * An abstract adapter class for receiving <code>QueryComponent</code> events.
+ * The methods in this class are empty. This class exists as convenience for
+ * creating listener objects.
+ * 
+ * @author David Withers
+ */
+public class QueryComponentAdapter implements QueryComponentListener {
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.embl.ebi.escience.scuflworkers.biomartservice.config.QueryComponentListener#attributeAdded(org.embl.ebi.escience.scuflworkers.biomartservice.config.QueryComponentEvent)
+	 */
+	public void attributeAdded(QueryComponentEvent event) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.embl.ebi.escience.scuflworkers.biomartservice.config.QueryComponentListener#attributeRemoved(org.embl.ebi.escience.scuflworkers.biomartservice.config.QueryComponentEvent)
+	 */
+	public void attributeRemoved(QueryComponentEvent event) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.embl.ebi.escience.scuflworkers.biomartservice.config.QueryComponentListener#filterAdded(org.embl.ebi.escience.scuflworkers.biomartservice.config.QueryComponentEvent)
+	 */
+	public void filterAdded(QueryComponentEvent event) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.embl.ebi.escience.scuflworkers.biomartservice.config.QueryComponentListener#filterRemoved(org.embl.ebi.escience.scuflworkers.biomartservice.config.QueryComponentEvent)
+	 */
+	public void filterRemoved(QueryComponentEvent event) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.embl.ebi.escience.scuflworkers.biomartservice.config.QueryComponentListener#filterChanged(org.embl.ebi.escience.scuflworkers.biomartservice.config.QueryComponentEvent)
+	 */
+	public void filterChanged(QueryComponentEvent event) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.biomart.martservice.config.event.QueryComponentListener#linkAdded(org.biomart.martservice.config.event.QueryComponentEvent)
+	 */
+	public void linkAdded(QueryComponentEvent event) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.biomart.martservice.config.event.QueryComponentListener#linkRemoved(org.biomart.martservice.config.event.QueryComponentEvent)
+	 */
+	public void linkRemoved(QueryComponentEvent event) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.biomart.martservice.config.QueryComponentListener#linkChanged(org.biomart.martservice.config.QueryComponentEvent)
+	 */
+	public void linkChanged(QueryComponentEvent event) {
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-bioinformatics/blob/9e08cac0/taverna-biomart-martservice/src/main/java/org/biomart/martservice/config/event/QueryComponentEvent.java
----------------------------------------------------------------------
diff --git a/taverna-biomart-martservice/src/main/java/org/biomart/martservice/config/event/QueryComponentEvent.java b/taverna-biomart-martservice/src/main/java/org/biomart/martservice/config/event/QueryComponentEvent.java
new file mode 100644
index 0000000..6fc5d18
--- /dev/null
+++ b/taverna-biomart-martservice/src/main/java/org/biomart/martservice/config/event/QueryComponentEvent.java
@@ -0,0 +1,120 @@
+/*
+ * Copyright (C) 2003 The University of Manchester 
+ *
+ * Modifications to the initial code base are copyright of their
+ * respective authors, or their employers as appropriate.  Authorship
+ * of the modifications may be determined from the ChangeLog placed at
+ * the end of this file.
+ *
+ * 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
+ * USA.
+ *
+ ****************************************************************
+ * Source code information
+ * -----------------------
+ * Filename           $RCSfile: QueryComponentEvent.java,v $
+ * Revision           $Revision: 1.1 $
+ * Release status     $State: Exp $
+ * Last modified on   $Date: 2007/01/31 14:12:06 $
+ *               by   $Author: davidwithers $
+ * Created on 03-Apr-2006
+ *****************************************************************/
+package org.biomart.martservice.config.event;
+
+import java.util.EventObject;
+
+import org.biomart.martservice.MartDataset;
+
+/**
+ * An event which indicates that a <code>QueryComponent</code> has been
+ * selected, deselected or its value has been modified.
+ * 
+ * @author David Withers
+ */
+public class QueryComponentEvent extends EventObject {
+	private static final long serialVersionUID = -7576317475836030298L;
+
+	private String name;
+
+	private MartDataset dataset;
+
+	private String value;
+
+	/**
+	 * Constructs a new <code>QueryComponentEvent</code> instance.
+	 * 
+	 * @param source
+	 *            the source of the event
+	 * @param name
+	 *            the name of the attribute or filter affected by this event
+	 * @param dataset
+	 *            the dataset containing the attribute or filter affected by
+	 *            this event
+	 */
+	public QueryComponentEvent(Object source, String name, MartDataset dataset) {
+		this(source, name, dataset, null);
+	}
+
+	/**
+	 * Constructs a new <code>QueryComponentEvent</code> instance.
+	 * 
+	 * @param source
+	 *            the source of the event
+	 * @param name
+	 *            the name of the attribute or filter affected by this event
+	 * @param dataset
+	 *            the dataset containing the attribute or filter affected by
+	 *            this event
+	 * @param value
+	 *            the value of the filter affected by this event
+	 */
+	public QueryComponentEvent(Object source, String name, MartDataset dataset,
+			String value) {
+		super(source);
+		this.name = name;
+		this.dataset = dataset;
+		this.value = value;
+	}
+
+	/**
+	 * Returns the name of the attribute or filter affected by this event.
+	 * 
+	 * @return the name of the attribute or filter affected by this event.
+	 */
+	public String getName() {
+		return name;
+	}
+
+	/**
+	 * Returns the dataset containing the attribute or filter affected by this
+	 * event.
+	 * 
+	 * @return the dataset containing the attribute or filter affected by this
+	 *         event.
+	 */
+	public MartDataset getDataset() {
+		return dataset;
+	}
+
+	/**
+	 * Returns the value of the filter affected by this event.
+	 * 
+	 * @return the value of the filter affected by this event.
+	 */
+	public String getValue() {
+		return value;
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-bioinformatics/blob/9e08cac0/taverna-biomart-martservice/src/main/java/org/biomart/martservice/config/event/QueryComponentListener.java
----------------------------------------------------------------------
diff --git a/taverna-biomart-martservice/src/main/java/org/biomart/martservice/config/event/QueryComponentListener.java b/taverna-biomart-martservice/src/main/java/org/biomart/martservice/config/event/QueryComponentListener.java
new file mode 100644
index 0000000..af63326
--- /dev/null
+++ b/taverna-biomart-martservice/src/main/java/org/biomart/martservice/config/event/QueryComponentListener.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2003 The University of Manchester 
+ *
+ * Modifications to the initial code base are copyright of their
+ * respective authors, or their employers as appropriate.  Authorship
+ * of the modifications may be determined from the ChangeLog placed at
+ * the end of this file.
+ *
+ * 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
+ * USA.
+ *
+ ****************************************************************
+ * Source code information
+ * -----------------------
+ * Filename           $RCSfile: QueryComponentListener.java,v $
+ * Revision           $Revision: 1.1 $
+ * Release status     $State: Exp $
+ * Last modified on   $Date: 2007/01/31 14:12:06 $
+ *               by   $Author: davidwithers $
+ * Created on 03-Apr-2006
+ *****************************************************************/
+package org.biomart.martservice.config.event;
+
+import java.util.EventListener;
+
+/**
+ * The listener interface for receiving QueryComponent events.
+ * 
+ * @author David Withers
+ */
+public interface QueryComponentListener extends EventListener {
+
+	/**
+	 * Invoked when a <code>QueryComponent</code> for an attribute is
+	 * selected.
+	 * 
+	 * @param event the query component event
+	 */
+	public void attributeAdded(QueryComponentEvent event);
+
+	/**
+	 * Invoked when a <code>QueryComponent</code> for an attribute is
+	 * deselected.
+	 * 
+	 * @param event the query component event
+	 */
+	public void attributeRemoved(QueryComponentEvent event);
+
+	/**
+	 * Invoked when a <code>QueryComponent</code> for a filter is selected.
+	 * 
+	 * @param event the query component event
+	 */
+	public void filterAdded(QueryComponentEvent event);
+
+	/**
+	 * Invoked when a <code>QueryComponent</code> for a filter is deselected.
+	 * 
+	 * @param event the query component event
+	 */
+	public void filterRemoved(QueryComponentEvent event);
+
+	/**
+	 * Invoked when a <code>QueryComponent</code> for a filter is changed.
+	 * 
+	 * @param event the query component event
+	 */
+	public void filterChanged(QueryComponentEvent event);
+
+	/**
+	 * Invoked when a <code>QueryComponent</code> for a link is selected.
+	 * 
+	 * @param event the query component event
+	 */
+	public void linkAdded(QueryComponentEvent event);
+
+	/**
+	 * Invoked when a <code>QueryComponent</code> for a link is deselected.
+	 * 
+	 * @param event the query component event
+	 */
+	public void linkRemoved(QueryComponentEvent event);
+
+	/**
+	 * Invoked when a <code>QueryComponent</code> for a dataset link id is
+	 * changed.
+	 * 
+	 * @param event the query component event
+	 */
+	public void linkChanged(QueryComponentEvent event);
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-bioinformatics/blob/9e08cac0/taverna-biomart-martservice/src/main/java/org/biomart/martservice/config/ui/ConfigDisplayObject.java
----------------------------------------------------------------------
diff --git a/taverna-biomart-martservice/src/main/java/org/biomart/martservice/config/ui/ConfigDisplayObject.java b/taverna-biomart-martservice/src/main/java/org/biomart/martservice/config/ui/ConfigDisplayObject.java
new file mode 100644
index 0000000..89820d3
--- /dev/null
+++ b/taverna-biomart-martservice/src/main/java/org/biomart/martservice/config/ui/ConfigDisplayObject.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright (C) 2003 The University of Manchester 
+ *
+ * Modifications to the initial code base are copyright of their
+ * respective authors, or their employers as appropriate.  Authorship
+ * of the modifications may be determined from the ChangeLog placed at
+ * the end of this file.
+ *
+ * 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
+ * USA.
+ *
+ ****************************************************************
+ * Source code information
+ * -----------------------
+ * Filename           $RCSfile: ConfigDisplayObject.java,v $
+ * Revision           $Revision: 1.1 $
+ * Release status     $State: Exp $
+ * Last modified on   $Date: 2007/01/31 14:12:09 $
+ *               by   $Author: davidwithers $
+ * Created on 17-Mar-2006
+ *****************************************************************/
+package org.biomart.martservice.config.ui;
+
+import java.awt.Component;
+
+import org.ensembl.mart.lib.config.BaseNamedConfigurationObject;
+
+/**
+ * An object containing a configuration object and it's graphical component.
+ * 
+ * @author David Withers
+ */
+public class ConfigDisplayObject {
+	private BaseNamedConfigurationObject configObject;
+
+	private Component component;
+
+	/**
+	 * Constructs an instance of a <code>ConfigDisplayObject</code> with the
+	 * specified configuration object and a <code>null</code> component.
+	 * 
+	 * @param configObject
+	 *            the configuration object; must not be <code>null</code>
+	 */
+	public ConfigDisplayObject(BaseNamedConfigurationObject configObject) {
+		this(configObject, null);
+	}
+
+	/**
+	 * Constructs an instance of a <code>ConfigDisplayObject</code> with the
+	 * specified configuration object and component.
+	 * 
+	 * @param configObject
+	 *            the configuration object; must not be <code>null</code>
+	 * @param component
+	 *            the component
+	 */
+	public ConfigDisplayObject(BaseNamedConfigurationObject configObject,
+			Component component) {
+		if (configObject == null) {
+			throw new IllegalArgumentException(
+					"Parameter 'configObject' must not be null");
+		}
+		this.configObject = configObject;
+		this.component = component;
+	}
+
+	/**
+	 * Returns the display name.
+	 * 
+	 * @return the display name
+	 */
+	public String getDisplayName() {
+		return configObject.getDisplayName();
+	}
+
+	/**
+	 * Returns the internal name.
+	 * 
+	 * @return the internal name
+	 */
+	public String getInternalName() {
+		return configObject.getInternalName();
+	}
+
+	/**
+	 * Returns the display name.
+	 * 
+	 * @return the display name
+	 */
+	public String toString() {
+		return getDisplayName();
+	}
+
+	/**
+	 * Returns the configuration object.
+	 * 
+	 * @return the configuration object
+	 */
+	public BaseNamedConfigurationObject getConfigObject() {
+		return configObject;
+	}
+
+	/**
+	 * Returns the component.
+	 * 
+	 * @return the component.
+	 */
+	public Component getComponent() {
+		return component;
+	}
+
+}