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/23 11:38:22 UTC

[14/17] incubator-taverna-plugin-bioinformatics git commit: Revert "temporarily empty repository"

http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-bioinformatics/blob/a87b4151/taverna-biomart-martservice/src/main/java/org/biomart/martservice/MartService.java
----------------------------------------------------------------------
diff --git a/taverna-biomart-martservice/src/main/java/org/biomart/martservice/MartService.java b/taverna-biomart-martservice/src/main/java/org/biomart/martservice/MartService.java
new file mode 100644
index 0000000..c02bbb5
--- /dev/null
+++ b/taverna-biomart-martservice/src/main/java/org/biomart/martservice/MartService.java
@@ -0,0 +1,709 @@
+/*
+ * 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: MartService.java,v $errors/failure.html
+ * Revision           $Revision: 1.7 $
+ * Release status     $State: Exp $
+ * Last modified on   $Date: 2008/08/11 12:48:29 $
+ *               by   $Author: davidwithers $
+ * Created on 17-Mar-2006
+ *****************************************************************/
+package org.biomart.martservice;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.lang.ref.SoftReference;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.zip.GZIPInputStream;
+import java.util.zip.GZIPOutputStream;
+
+import org.apache.log4j.Logger;
+import org.biomart.martservice.query.Query;
+import org.ensembl.mart.lib.config.ConfigurationException;
+import org.ensembl.mart.lib.config.DatasetConfig;
+import org.ensembl.mart.lib.config.DatasetConfigXMLUtils;
+import org.ensembl.mart.lib.config.Exportable;
+import org.ensembl.mart.lib.config.Importable;
+import org.jdom.Document;
+import org.jdom.JDOMException;
+import org.jdom.input.SAXBuilder;
+import org.xml.sax.InputSource;
+
+/**
+ * A class for interacting with a BioMart web service.
+ * 
+ * @author David Withers
+ */
+public class MartService {
+	private static Logger logger = Logger.getLogger(MartServiceUtils.class);
+
+	private String location;
+
+	private String requestId;
+
+	private File cacheDirectory;
+
+	private MartRegistry registry;
+
+	private Map<MartURLLocation, String> versionMap = new HashMap<MartURLLocation, String>();
+
+	private Map<String, MartDataset[]> datasetsMap = new HashMap<String, MartDataset[]>();
+
+	private Map<String, SoftReference<DatasetConfig>> datasetConfigMap = new HashMap<String, SoftReference<DatasetConfig>>();
+
+	private Map<String, Importable[]> importablesMap = new HashMap<String, Importable[]>();
+
+	private Map<String, Exportable[]> exportablesMap = new HashMap<String, Exportable[]>();
+
+	private Map<MartDataset, List<DatasetLink>> linkableDatasetsMap = new HashMap<MartDataset, List<DatasetLink>>();
+
+	private Map<MartDataset, Set<DatasetLink>> datasetToLinkSetMap = new HashMap<MartDataset, Set<DatasetLink>>();
+
+	private Map<MartDataset, Map<MartDataset, MartDataset>> datasetsToPathMap = new HashMap<MartDataset, Map<MartDataset, MartDataset>>();
+
+	private static final Map<String, MartService> martServiceMap = new HashMap<String, MartService>();
+
+	private static final String fs = System.getProperty("file.separator");
+
+	private boolean linksCalculated = false;
+
+	/**
+	 * Constructs an instance of a <code>MartService</code> with the specified
+	 * location.
+	 * 
+	 * The location must be the URL of a valid BioMart MartService, e.g.
+	 * http://www.biomart.org/biomart/martservice
+	 * 
+	 * @param location
+	 *            the URL of the MartService
+	 */
+	private MartService(String location) {
+		this.location = location;
+	}
+
+	/**
+	 * Returns a <code>MartService</code> for the specified location. If a
+	 * <code>MartService</code> does not exist for the location a new one is
+	 * constructed.
+	 * 
+	 * The location must be the URL of a valid BioMart MartService, e.g.
+	 * http://www.biomart.org/biomart/martservice
+	 * 
+	 * @param location
+	 *            the URL of the MartService
+	 */
+	public static MartService getMartService(String location) {
+		if (!martServiceMap.containsKey(location)) {
+			martServiceMap.put(location, new MartService(location));
+		}
+		return martServiceMap.get(location);
+	}
+
+	/**
+	 * Returns the requestId.
+	 * 
+	 * @return the requestId
+	 */
+	public String getRequestId() {
+		return requestId;
+	}
+
+	/**
+	 * Sets the requestId.
+	 * 
+	 * @param requestId
+	 *            the new requestId
+	 */
+	public void setRequestId(String requestId) {
+		this.requestId = requestId;
+	}
+
+	/**
+	 * Returns the cacheDirectory.
+	 * 
+	 * @return the cacheDirectory
+	 */
+	public File getCacheDirectory() {
+		return cacheDirectory;
+	}
+
+	/**
+	 * Sets the cacheDirectory.
+	 * 
+	 * @param cacheDirectory
+	 *            the new cacheDirectory
+	 */
+	public void setCacheDirectory(File cacheDirectory) {
+		this.cacheDirectory = cacheDirectory;
+	}
+
+	/**
+	 * Returns the URL of the MartService.
+	 * 
+	 * @return the URL of the MartService
+	 */
+	public String getLocation() {
+		return location;
+	}
+
+	/**
+	 * Removes any cached items.
+	 */
+	public void clearCache() {
+		registry = null;
+		datasetsMap.clear();
+		datasetConfigMap.clear();
+		importablesMap.clear();
+		exportablesMap.clear();
+	}
+
+	/**
+	 * Returns the MartRegistry for this MartService.
+	 * 
+	 * @return the MartRegistry for this MartService
+	 * @throws MartServiceException
+	 *             if the MartService returns an error or is unavailable
+	 */
+	public MartRegistry getRegistry() throws MartServiceException {
+		if (registry == null) {
+			registry = MartServiceUtils.getRegistry(location, requestId);
+		}
+		return registry;
+	}
+
+	public String getVersion(MartURLLocation martURLLocation)
+			throws MartServiceException {
+		if (!versionMap.containsKey(martURLLocation)) {
+			versionMap.put(martURLLocation, MartServiceUtils.getVersion(
+					location, requestId, martURLLocation));
+		}
+		return versionMap.get(martURLLocation);
+	}
+
+	/**
+	 * Returns all the datasets available from this MartService.
+	 * 
+	 * @return all the datasets available from this MartService.
+	 * @throws MartServiceException
+	 *             if the MartService returns an error or is unavailable
+	 */
+	public MartDataset[] getDatasets() throws MartServiceException {
+		List<MartDataset> datasets = new ArrayList<MartDataset>();
+		MartURLLocation[] locations = getRegistry().getMartURLLocations();
+		for (int i = 0; i < locations.length; i++) {
+			datasets.addAll(Arrays.asList(getDatasets(locations[i])));
+		}
+		return datasets.toArray(new MartDataset[datasets.size()]);
+	}
+
+	/**
+	 * Returns the datasets belonging to the virtualSchema.
+	 * 
+	 * @param virtualSchema
+	 *            the virtual schema to include datasets from.
+	 * @return the datasets belonging to the virtualSchema.
+	 * @throws MartServiceException
+	 *             if the MartService returns an error or is unavailable
+	 */
+	public MartDataset[] getDatasets(String virtualSchema)
+			throws MartServiceException {
+		List<MartDataset> datasets = new ArrayList<MartDataset>();
+		MartURLLocation[] locations = getRegistry().getMartURLLocations();
+		for (int i = 0; i < locations.length; i++) {
+			if (virtualSchema == null
+					|| virtualSchema.equals(locations[i].getVirtualSchema())) {
+				datasets.addAll(Arrays.asList(getDatasets(locations[i])));
+			}
+		}
+		return datasets.toArray(new MartDataset[datasets.size()]);
+	}
+
+	/**
+	 * Returns the datasets specified by martURLLocation.
+	 * 
+	 * @param martURLLocation
+	 *            where to find the datasets.
+	 * @return the datasets specified by martURLLocation.
+	 * @throws MartServiceException
+	 *             if the MartService returns an error or is unavailable
+	 */
+	public MartDataset[] getDatasets(MartURLLocation martURLLocation)
+			throws MartServiceException {
+		String name = martURLLocation.getName();
+		if (!datasetsMap.containsKey(name)) {
+			datasetsMap.put(name, MartServiceUtils.getDatasets(location,
+					requestId, martURLLocation));
+		}
+		return datasetsMap.get(name);
+	}
+
+	/**
+	 * Returns the dataset specified by a virtualSchema and a dataset name.
+	 * 
+	 * @param virtualSchema
+	 *            the virtualSchema containing the dataset
+	 * @param datasetName
+	 *            the name of the dataset to return
+	 * @return a dataset
+	 * @throws MartServiceException
+	 *             if the MartService returns an error or is unavailable
+	 */
+	public MartDataset getDataset(String virtualSchema, String datasetName)
+			throws MartServiceException {
+		MartDataset result = null;
+		MartDataset[] datasets = getDatasets(virtualSchema);
+		for (int i = 0; i < datasets.length; i++) {
+			if (datasetName.equals(datasets[i].getName())) {
+				result = datasets[i];
+				break;
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * Returns the configuration for a dataset.
+	 * 
+	 * @param dataset
+	 *            the dataset to get the configuration for
+	 * @return the configuration for a dataset
+	 * @throws MartServiceException
+	 *             if the MartService returns an error or is unavailable
+	 */
+	public DatasetConfig getDatasetConfig(MartDataset dataset)
+			throws MartServiceException {
+		String qualifiedName = dataset.getQualifiedName();
+		DatasetConfig datasetConfig;
+		if (!datasetConfigMap.containsKey(qualifiedName)) {
+			if (dataset.getModified() != null && cacheDirectory != null) {
+				datasetConfig = getDatasetConfigFromCache(dataset);
+			} else {
+				datasetConfig = MartServiceUtils.getDatasetConfig(location,
+						requestId, dataset);
+			}
+			datasetConfigMap.put(qualifiedName,
+					new SoftReference<DatasetConfig>(datasetConfig));
+		} else {
+			datasetConfig = datasetConfigMap.get(qualifiedName).get();
+			if (datasetConfig == null) {
+				if (dataset.getModified() != null && cacheDirectory != null) {
+					datasetConfig = getDatasetConfigFromCache(dataset);
+				} else {
+					datasetConfig = MartServiceUtils.getDatasetConfig(location,
+							requestId, dataset);
+				}
+				datasetConfigMap.put(qualifiedName,
+						new SoftReference<DatasetConfig>(datasetConfig));
+			}
+
+		}
+		return datasetConfig;
+	}
+
+	private DatasetConfig getDatasetConfigFromCache(MartDataset dataset)
+			throws MartServiceException {
+		DatasetConfig datasetConfig = null;
+		MartURLLocation mart = dataset.getMartURLLocation();
+		String path = mart.getHost() + fs + mart.getName() + fs
+				+ mart.getVirtualSchema();
+		File martCacheDir = new File(cacheDirectory, path);
+		martCacheDir.mkdirs();
+		File cache = new File(martCacheDir, dataset.getName() + ".cfg");
+		DatasetConfigXMLUtils datasetConfigXMLUtils = new DatasetConfigXMLUtils(
+				true);
+		if (cache.exists()) {
+			try {
+				SAXBuilder builder = new SAXBuilder();
+				Document doc = builder.build(new InputSource(
+						new GZIPInputStream(new FileInputStream(cache))));
+
+				// Document doc =
+				// datasetConfigXMLUtils.getDocumentForXMLStream(new
+				// FileInputStream(cache));
+
+				datasetConfig = datasetConfigXMLUtils
+						.getDatasetConfigForDocument(doc);
+				datasetConfigXMLUtils.loadDatasetConfigWithDocument(
+						datasetConfig, doc);
+				if (!datasetConfig.getModified().trim().equals(
+						dataset.getModified().trim())) {
+					logger.info(" " + datasetConfig.getModified().trim()
+							+ " != " + dataset.getModified().trim());
+					logger.info("  Database: "
+							+ dataset.getMartURLLocation().getDatabase()
+							+ ", Dataset: " + dataset.getName());
+					datasetConfig = null;
+				}
+			} catch (IOException e) {
+				logger.debug("error reading cache from " + cache.getPath(), e);
+				datasetConfig = null;
+			} catch (ConfigurationException e) {
+				logger.debug("error parsing from " + cache.getPath(), e);
+				datasetConfig = null;
+			} catch (JDOMException e) {
+				logger.debug("error parsing from " + cache.getPath(), e);
+				datasetConfig = null;
+			}
+		}
+		if (datasetConfig == null) {
+			datasetConfig = MartServiceUtils.getDatasetConfig(location,
+					requestId, dataset);
+			try {
+				GZIPOutputStream zipOutputStream = new GZIPOutputStream(
+						new FileOutputStream(cache));
+				datasetConfigXMLUtils.writeDatasetConfigToOutputStream(
+						datasetConfig, zipOutputStream);
+				zipOutputStream.flush();
+				zipOutputStream.close();
+			} catch (IOException e) {
+				logger.debug("error writing cache to " + cache.getPath(), e);
+			} catch (ConfigurationException e) {
+				logger.debug("error writing cache to " + cache.getPath(), e);
+			}
+		}
+		return datasetConfig;
+	}
+
+	/**
+	 * Returns the importables for a dataset.
+	 * 
+	 * @param dataset
+	 * @return the importables for a dataset
+	 * @throws MartServiceException
+	 *             if the MartService returns an error or is unavailable
+	 */
+	public Importable[] getImportables(MartDataset dataset)
+			throws MartServiceException {
+		String qualifiedName = dataset.getQualifiedName();
+		if (!importablesMap.containsKey(qualifiedName)) {
+			try {
+				importablesMap.put(qualifiedName, getDatasetConfig(dataset)
+						.getImportables());
+			} catch (MartServiceException e) {
+				return new Importable[0];
+			}
+		}
+		return importablesMap.get(qualifiedName);
+	}
+
+	/**
+	 * Returns the exportables for a dataset.
+	 * 
+	 * @param dataset
+	 * @return the exportables for a dataset
+	 * @throws MartServiceException
+	 *             if the MartService returns an error or is unavailable
+	 */
+	public Exportable[] getExportables(MartDataset dataset)
+			throws MartServiceException {
+		String qualifiedName = dataset.getQualifiedName();
+		if (!exportablesMap.containsKey(qualifiedName)) {
+			try {
+				exportablesMap.put(qualifiedName, getDatasetConfig(dataset)
+						.getExportables());
+			} catch (MartServiceException e) {
+				return new Exportable[0];
+			}
+		}
+		return exportablesMap.get(qualifiedName);
+	}
+
+	/**
+	 * Sends a <code>Query</code> to the MartService and returns the results
+	 * of executing the query.
+	 * 
+	 * The results are returned as an array of lists; one list for each
+	 * attribute specified in the query.
+	 * 
+	 * @param query
+	 *            the query to execute
+	 * @return the results of executing the query
+	 * @throws MartServiceException
+	 *             if the MartService returns an error or is unavailable
+	 */
+	public Object[] executeQuery(Query query) throws MartServiceException {
+		// logger.info(MartServiceUtils.queryToXML(query));
+		return MartServiceUtils.getResults(location, requestId, query);
+	}
+
+	/**
+	 * Sends a <code>Query</code> to the MartService and writes the results to
+	 * the <code>ResultReceiver</code> as each line of the result stream is
+	 * read.
+	 * 
+	 * @param query
+	 * @param resultReceiver
+	 * @throws MartServiceException
+	 *             if the MartService returns an error or is unavailable
+	 * @throws ResultReceiverException 
+	 *             if the ResultReceiver cannot receive the result
+	 * @see ResultReceiver
+	 */
+	public void executeQuery(Query query, ResultReceiver resultReceiver)
+			throws MartServiceException, ResultReceiverException {
+		MartServiceUtils.putResults(location, requestId, query, resultReceiver);
+	}
+
+	/**
+	 * Returns a list of datasets that can be linked to the specified dataset.
+	 * 
+	 * @param martDataset
+	 * @return datasets that can be linked to the specified dataset
+	 * @throws MartServiceException
+	 */
+	public List<DatasetLink> getLinkableDatasets(MartDataset martDataset)
+			throws MartServiceException {
+		if (!linkableDatasetsMap.containsKey(martDataset)) {
+			List<DatasetLink> linkableDatasets = new ArrayList<DatasetLink>();
+
+			Set<String> importableSet = new HashSet<String>();
+			Importable[] importables = getImportables(martDataset);
+			for (int i = 0; i < importables.length; i++) {
+				importableSet.add(importables[i].getLinkName());
+			}
+
+			MartDataset[] datasets = getDatasets(martDataset.getVirtualSchema());
+			for (int j = 0; j < datasets.length; j++) {
+				if (datasets[j].isVisible()
+						&& !datasets[j].getName().equals(martDataset.getName())) {
+					DatasetLink datasetLink = new DatasetLink(datasets[j],
+							martDataset);
+					Exportable[] exportables = getExportables(datasets[j]);
+					for (int k = 0; k < exportables.length; k++) {
+						String link = exportables[k].getLinkName();
+						if (importableSet.contains(link)) {
+							datasetLink.addLink(link);
+						}
+					}
+					if (datasetLink.hasLinks()) {
+						linkableDatasets.add(datasetLink);
+					}
+				}
+			}
+			linkableDatasetsMap.put(martDataset, linkableDatasets);
+		}
+
+		return linkableDatasetsMap.get(martDataset);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see java.lang.Object#equals(java.lang.Object)
+	 */
+	public boolean equals(Object obj) {
+		boolean result = false;
+		if (obj != null) {
+			MartService other = (MartService) obj;
+			if (location == null) {
+				result = other.location == null;
+			} else {
+				result = location.equals(other.location);
+			}
+		}
+		return result;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see java.lang.Object#hashCode()
+	 */
+	public int hashCode() {
+		return location.hashCode();
+	}
+
+	public boolean linksCalculated() {
+		return linksCalculated;
+	}
+
+	// java implementation of the perl stuff that calculates links.
+	// all this should go for the next version of biomart.
+
+	public void calculateLinks() throws MartServiceException {
+		synchronized (location) {
+			if (!linksCalculated) {
+				datasetToLinkSetMap.clear();
+				datasetsToPathMap.clear();
+
+				MartDataset[] allDatasets = getDatasets();
+				for (int i = 0; i < allDatasets.length; i++) {
+					MartDataset[] datasets = getDatasets(allDatasets[i]
+							.getVirtualSchema());
+					for (int j = 0; j < datasets.length; j++) {
+						if (!allDatasets[i].getName().equals(
+								datasets[j].getName())) {
+							linkDatasets(allDatasets[i], datasets[j]);
+						}
+					}
+				}
+				for (int i = 0; i < allDatasets.length; i++) {
+					datasetsToPathMap.put(allDatasets[i],
+							dijkstra(allDatasets[i]));
+				}
+				linksCalculated = true;
+			}
+		}
+	}
+
+	public List<MartDataset> getPath(MartDataset source, MartDataset target) {
+		List<MartDataset> path = new ArrayList<MartDataset>();
+
+		Map<MartDataset, MartDataset> pathMap = datasetsToPathMap.get(source);
+
+		MartDataset currentDataset = target;
+
+		while (currentDataset != null) {
+			path.add(0, currentDataset);
+			currentDataset = (MartDataset) pathMap.get(currentDataset);
+		}
+
+		if (path.size() < 2 || !path.get(0).equals(source)
+				|| !path.get(path.size() - 1).equals(target)) {
+			return null;
+		}
+
+		return path;
+	}
+
+	public DatasetLink getLinkBetween(MartDataset exportingDataset,
+			MartDataset importingDataset) {
+		Set<DatasetLink> links = datasetToLinkSetMap.get(exportingDataset);
+		for (DatasetLink link : links) {
+			MartDataset targetDataset = link.getTargetDataset();
+			if (importingDataset.equals(targetDataset)) {
+				return link;
+			}
+		}
+
+		return null;
+	}
+
+	public List<DatasetLink> getLinksFrom(MartDataset dataset) {
+		List<DatasetLink> linksFrom = new ArrayList<DatasetLink>();
+		Set<DatasetLink> links = datasetToLinkSetMap.get(dataset);
+		if (links != null) {
+			for (DatasetLink link : links) {
+				if (link.getSourceDataset().equals(dataset)) {
+					linksFrom.add(link);
+				}
+			}
+		}
+		return linksFrom;
+	}
+
+	public void linkDatasets(MartDataset source, MartDataset target)
+			throws MartServiceException {
+		DatasetLink datasetLink = new DatasetLink(source, target);
+		Importable[] importables = getImportables(target);
+		for (int i = 0; i < importables.length; i++) {
+			Exportable[] exportables = getExportables(source);
+			for (int j = 0; j < exportables.length; j++) {
+				if (importables[i].getLinkName().equals(
+						exportables[j].getLinkName())) {
+					String importVersion = importables[i].getLinkVersion();
+					String exportVersion = exportables[j].getLinkVersion();
+					if (importVersion != null && exportVersion != null) {
+						if (importVersion.equals(exportVersion)) {
+							datasetLink.addLink(importables[i].getLinkName());
+						}
+					} else {
+						datasetLink.addLink(importables[i].getLinkName());
+					}
+				}
+			}
+		}
+		if (datasetLink.hasLinks()) {
+			if (!datasetToLinkSetMap.containsKey(source)) {
+				datasetToLinkSetMap.put(source, new HashSet<DatasetLink>());
+			}
+			if (!datasetToLinkSetMap.containsKey(target)) {
+				datasetToLinkSetMap.put(target, new HashSet<DatasetLink>());
+			}
+			datasetToLinkSetMap.get(source).add(datasetLink);
+			datasetToLinkSetMap.get(target).add(datasetLink);
+		}
+	}
+
+	public Map<MartDataset, MartDataset> dijkstra(MartDataset dataset)
+			throws MartServiceException {
+		Map<MartDataset, MartDataset> path = new HashMap<MartDataset, MartDataset>();
+		LinkedList<MartDataset> vertices = new LinkedList<MartDataset>(Arrays
+				.asList(getDatasets(dataset.getVirtualSchema())));
+		Map<MartDataset, Integer> dist = new HashMap<MartDataset, Integer>();
+		for (MartDataset vertex : vertices) {
+			dist.put(vertex, new Integer(10000));
+		}
+
+		dist.put(dataset, new Integer(0));
+
+		while (vertices.size() > 0) {
+			int min_vert_idx = 0;
+			MartDataset min_vert = (MartDataset) vertices.get(min_vert_idx);
+			int min_dist = ((Integer) dist.get(min_vert)).intValue();
+
+			for (int vertex_idx = 0; vertex_idx < vertices.size(); vertex_idx++) {
+				MartDataset vertex = (MartDataset) vertices.get(vertex_idx);
+				if (((Integer) dist.get(vertex)).intValue() < min_dist) {
+					min_vert_idx = vertex_idx;
+					min_vert = vertex;
+					min_dist = ((Integer) dist.get(vertex)).intValue();
+				}
+			}
+
+			if (min_dist == 10000) {
+				// Exhausted a disjoint set of datasets.
+				break;
+			}
+
+			vertices.remove(min_vert_idx);
+
+			List<DatasetLink> edges = getLinksFrom(min_vert);
+			for (DatasetLink edge : edges) {
+				MartDataset vertex = edge.getTargetDataset();
+
+				if (((Integer) dist.get(vertex)).intValue() > ((Integer) dist
+						.get(min_vert)).intValue() + 1) {
+					dist.put(vertex, new Integer(((Integer) dist.get(min_vert))
+							.intValue() + 1));
+					path.put(vertex, min_vert);
+				}
+			}
+		}
+
+		return path;
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-bioinformatics/blob/a87b4151/taverna-biomart-martservice/src/main/java/org/biomart/martservice/MartServiceException.java
----------------------------------------------------------------------
diff --git a/taverna-biomart-martservice/src/main/java/org/biomart/martservice/MartServiceException.java b/taverna-biomart-martservice/src/main/java/org/biomart/martservice/MartServiceException.java
new file mode 100644
index 0000000..f1f0639
--- /dev/null
+++ b/taverna-biomart-martservice/src/main/java/org/biomart/martservice/MartServiceException.java
@@ -0,0 +1,86 @@
+/*
+ * 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: MartServiceException.java,v $
+ * Revision           $Revision: 1.1 $
+ * Release status     $State: Exp $
+ * Last modified on   $Date: 2007/01/31 14:12:05 $
+ *               by   $Author: davidwithers $
+ * Created on 05-May-2006
+ *****************************************************************/
+package org.biomart.martservice;
+
+/**
+ * Thrown when a MartService is inaccessable or returns an error.
+ * 
+ * @author David Withers
+ */
+public class MartServiceException extends Exception {
+	private static final long serialVersionUID = 5535008907746588537L;
+
+	/**
+	 * Constructs a new exception with no detail message.
+	 * 
+	 */
+	public MartServiceException() {
+		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 MartServiceException(String message, Throwable cause) {
+		super(message, cause);
+	}
+
+	/**
+	 * Constructs a new exception with the specified detail message and cause.
+	 * 
+	 * @param message
+	 *            the detail message
+	 */
+	public MartServiceException(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 MartServiceException(Throwable cause) {
+		super(cause);
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-bioinformatics/blob/a87b4151/taverna-biomart-martservice/src/main/java/org/biomart/martservice/MartServiceUtils.java
----------------------------------------------------------------------
diff --git a/taverna-biomart-martservice/src/main/java/org/biomart/martservice/MartServiceUtils.java b/taverna-biomart-martservice/src/main/java/org/biomart/martservice/MartServiceUtils.java
new file mode 100644
index 0000000..cdcb400
--- /dev/null
+++ b/taverna-biomart-martservice/src/main/java/org/biomart/martservice/MartServiceUtils.java
@@ -0,0 +1,725 @@
+/*
+ * 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: MartServiceUtils.java,v $
+ * Revision           $Revision: 1.12 $
+ * Release status     $State: Exp $
+ * Last modified on   $Date: 2008/07/31 15:06:49 $
+ *               by   $Author: davidwithers $
+ * Created on 17-Mar-2006
+ *****************************************************************/
+package org.biomart.martservice;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler;
+import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.HttpMethod;
+import org.apache.commons.httpclient.HttpStatus;
+import org.apache.commons.httpclient.NameValuePair;
+import org.apache.commons.httpclient.UsernamePasswordCredentials;
+import org.apache.commons.httpclient.auth.AuthScope;
+import org.apache.commons.httpclient.methods.GetMethod;
+import org.apache.commons.httpclient.methods.PostMethod;
+import org.apache.commons.httpclient.params.HttpMethodParams;
+import org.apache.commons.io.IOUtils;
+import org.apache.log4j.Logger;
+import org.biomart.martservice.query.Attribute;
+import org.biomart.martservice.query.Dataset;
+import org.biomart.martservice.query.Query;
+import org.biomart.martservice.query.QueryXMLHandler;
+import org.ensembl.mart.lib.config.ConfigurationException;
+import org.ensembl.mart.lib.config.DatasetConfig;
+import org.ensembl.mart.lib.config.DatasetConfigXMLUtils;
+import org.jdom.DocType;
+import org.jdom.Document;
+import org.jdom.Element;
+import org.jdom.JDOMException;
+import org.jdom.Namespace;
+import org.jdom.input.SAXBuilder;
+import org.jdom.output.XMLOutputter;
+import org.xml.sax.InputSource;
+
+/**
+ * Utility class for interacting with a BioMart web service.
+ * 
+ * @author David Withers
+ */
+public class MartServiceUtils {
+	private static Logger logger = Logger.getLogger(MartServiceUtils.class);
+
+	private static String lineSeparator = System.getProperty("line.separator");
+
+	public static final String QUERY_ATTRIBUTE = "query";
+
+	public static final String DATASET_ATTRIBUTE = "dataset";
+
+	public static final String MART_ATTRIBUTE = "mart";
+
+	public static final String SCHEMA_ATTRIBUTE = "virtualschema";
+
+	public static final String TYPE_ATTRIBUTE = "type";
+
+	public static final String MART_USER_ATTRIBUTE = "martuser";
+
+	public static final String INTERFACE_ATTRIBUTE = "interface";
+
+	public static final String REQUEST_ID_ATTRIBUTE = "requestid";
+
+	public static final String REGISTRY_VALUE = "registry";
+
+	public static final String VERSION_VALUE = "version";
+
+	public static final String DATASETS_VALUE = "datasets";
+
+	public static final String DATASET_VALUE = "dataset";
+
+	public static final String CONFIGURATION_VALUE = "configuration";
+
+	/**
+	 * Sends a registry request to the Biomart webservice and constructs a
+	 * MartRegistry from the XML returned by the webservice.
+	 * 
+	 * @param martServiceLocation
+	 *            the URL of the Biomart webservice
+	 * @return a MartRegistry
+	 * @throws MartServiceException
+	 *             if the Biomart webservice returns an error or is unavailable
+	 */
+	public static MartRegistry getRegistry(String martServiceLocation,
+			String requestId) throws MartServiceException {
+		List<NameValuePair> data = new ArrayList<NameValuePair>();
+		data.add(new NameValuePair(TYPE_ATTRIBUTE, REGISTRY_VALUE));
+		if (requestId != null) {
+			data.add(new NameValuePair(REQUEST_ID_ATTRIBUTE, requestId));
+		}
+		HttpMethod method = new GetMethod(martServiceLocation);
+		method.setQueryString(data
+				.toArray(new NameValuePair[data.size()]));
+		try {
+			InputStream in = executeMethod(method, martServiceLocation);
+			Document document = new SAXBuilder().build(in);
+			Element root = document.getRootElement();
+			return MartServiceXMLHandler.elementToRegistry(root,
+					Namespace.NO_NAMESPACE);
+		} catch (IOException e) {
+			String errorMessage = "Error getting registry from "
+					+ martServiceLocation;
+			throw new MartServiceException(errorMessage, e);
+		} catch (JDOMException e) {
+			String errorMessage = "Error getting registry from "
+					+ martServiceLocation;
+			throw new MartServiceException(errorMessage, e);
+		} finally {
+			method.releaseConnection();
+		}
+
+	}
+
+	public static String getVersion(String martServiceLocation,
+			String requestId, MartURLLocation mart) throws MartServiceException {
+		String errorMessage = "Error getting version from " + martServiceLocation;
+
+		List<NameValuePair> data = new ArrayList<NameValuePair>();
+		data.add(new NameValuePair(TYPE_ATTRIBUTE, VERSION_VALUE));
+		if (mart.getVirtualSchema() != null) {
+			data.add(new NameValuePair(SCHEMA_ATTRIBUTE, mart
+					.getVirtualSchema()));
+		}
+		data.add(new NameValuePair(MART_ATTRIBUTE, mart.getName()));
+		if (requestId != null) {
+			data.add(new NameValuePair(REQUEST_ID_ATTRIBUTE, requestId));
+		}
+		if (requestId != null) {
+			data.add(new NameValuePair(REQUEST_ID_ATTRIBUTE, requestId));
+		}
+		HttpMethod method = new GetMethod(martServiceLocation);
+		method.setQueryString(data
+				.toArray(new NameValuePair[data.size()]));
+		try {
+			InputStream in = executeMethod(method, martServiceLocation);
+			BufferedReader bufferedReader = new BufferedReader(
+					new InputStreamReader(in));
+			String version = bufferedReader.readLine();
+			if (version == null) {
+				throw new MartServiceException(errorMessage + ": No version returned");
+			}
+			version = version.trim();
+			// fix for biomart's 'let's add a blank line' thing
+			if ("".equals(version)) {
+				version = bufferedReader.readLine();
+				if (version == null) {
+					throw new MartServiceException(errorMessage + ": No version returned");
+				}
+				version = version.trim();
+			}
+			bufferedReader.close();
+			return version;
+		} catch (IOException e) {
+			throw new MartServiceException(errorMessage, e);
+		} finally {
+			method.releaseConnection();
+		}
+	}
+
+	/**
+	 * Sends a datasets request to the Biomart webservice and constructs an
+	 * array of MartDataset from the tab separated rows of data returned by the
+	 * webservice.
+	 * 
+	 * @param martServiceLocation
+	 *            the URL of the Biomart webservice
+	 * @param mart
+	 *            the mart to get datasets from
+	 * @return an array of MartDataset
+	 * @throws MartServiceException
+	 *             if the Biomart webservice returns an error or is unavailable
+	 */
+	public static MartDataset[] getDatasets(String martServiceLocation,
+			String requestId, MartURLLocation mart) throws MartServiceException {
+		List<NameValuePair> data = new ArrayList<NameValuePair>();
+		data.add(new NameValuePair(TYPE_ATTRIBUTE, DATASETS_VALUE));
+		if (mart.getVirtualSchema() != null) {
+			data.add(new NameValuePair(SCHEMA_ATTRIBUTE, mart
+					.getVirtualSchema()));
+		}
+		data.add(new NameValuePair(MART_ATTRIBUTE, mart.getName()));
+		if (mart.getMartUser() != null) {
+			data
+					.add(new NameValuePair(MART_USER_ATTRIBUTE, mart
+							.getMartUser()));
+		}
+		if (requestId != null) {
+			data.add(new NameValuePair(REQUEST_ID_ATTRIBUTE, requestId));
+		}
+		HttpMethod method = new GetMethod(martServiceLocation);
+		method.setQueryString(data
+				.toArray(new NameValuePair[data.size()]));
+		try {
+			InputStream in = executeMethod(method, martServiceLocation);
+
+			MartDataset[] datasets = tabSeparatedReaderToDatasets(
+					new InputStreamReader(in), mart);
+			in.close();
+			return datasets;
+		} catch (IOException e) {
+			String errorMessage = "Error getting datasets from "
+					+ martServiceLocation;
+			throw new MartServiceException(errorMessage, e);
+		} finally {
+			method.releaseConnection();
+		}
+	}
+
+	/**
+	 * Sends a configuration request to the Biomart webservice and constructs a
+	 * DatasetConfig from the XML returned by the webservice.
+	 * 
+	 * @param martServiceLocation
+	 *            the URL of the Biomart webservice
+	 * @param dataset
+	 *            the dataset to get the configuration for
+	 * @return a DatasetConfig
+	 * @throws MartServiceException
+	 *             if the Biomart webservice returns an error or is unavailable
+	 */
+	public static DatasetConfig getDatasetConfig(String martServiceLocation,
+			String requestId, MartDataset dataset) throws MartServiceException {
+		List<NameValuePair> data = new ArrayList<NameValuePair>();
+		data.add(new NameValuePair(TYPE_ATTRIBUTE, CONFIGURATION_VALUE));
+		MartURLLocation mart = dataset.getMartURLLocation();
+		// if the dataset has a location specify the virtual schema to uniquely
+		// identify the dataset
+		if (mart != null && mart.getVirtualSchema() != null) {
+			data.add(new NameValuePair(SCHEMA_ATTRIBUTE, mart
+					.getVirtualSchema()));
+		}
+		data.add(new NameValuePair(DATASET_VALUE, dataset.getName()));
+//		if (dataset.getInterface() != null) {
+//			data.add(new NameValuePair(INTERFACE_ATTRIBUTE, dataset
+//					.getInterface()));
+//		}
+		if (mart != null && mart.getMartUser() != null) {
+			data
+					.add(new NameValuePair(MART_USER_ATTRIBUTE, mart
+							.getMartUser()));
+		}
+		if (requestId != null) {
+			data.add(new NameValuePair(REQUEST_ID_ATTRIBUTE, requestId));
+		}
+		HttpMethod method = new GetMethod(martServiceLocation);
+		method.setQueryString(data
+				.toArray(new NameValuePair[data.size()]));
+
+		try {
+			InputStream in = executeMethod(method, martServiceLocation);
+
+			DatasetConfigXMLUtils datasetConfigXMLUtils = new DatasetConfigXMLUtils(
+					true);
+			SAXBuilder builder = new SAXBuilder();
+			Document doc = builder.build(new InputSource(in));
+			// Document doc = datasetConfigXMLUtils.getDocumentForXMLStream(in);
+
+			DatasetConfig datasetConfig = datasetConfigXMLUtils
+					.getDatasetConfigForDocument(doc);
+			datasetConfigXMLUtils.loadDatasetConfigWithDocument(datasetConfig,
+					doc);
+			return datasetConfig;
+		} catch (ConfigurationException e) {
+			String errorMessage = "Error parsing configuration from "
+					+ martServiceLocation;
+			logger.debug(errorMessage, e);
+			throw new MartServiceException(errorMessage, e);
+		} catch (JDOMException e) {
+			String errorMessage = "Error parsing configuration from "
+					+ martServiceLocation;
+			logger.debug(errorMessage, e);
+			throw new MartServiceException(errorMessage, e);
+		} catch (IOException e) {
+			String errorMessage = "Error getting configuration from "
+					+ martServiceLocation;
+			logger.debug(errorMessage, e);
+			throw new MartServiceException(errorMessage, e);
+		} finally {
+			method.releaseConnection();
+		}
+	}
+
+	/**
+	 * Sends a query to the Biomart webservice and constructs an array of List
+	 * of String results from the tab separated rows of data returned by the
+	 * webservice.
+	 * 
+	 * @param martServiceLocation
+	 *            the URL of the Biomart webservice
+	 * @param query
+	 *            the query to send to the webservice
+	 * @return an array of List of String
+	 * @throws MartServiceException
+	 *             if the Biomart webservice returns an error or is unavailable
+	 */
+	public static Object[] getResults(String martServiceLocation,
+			String requestId, Query query) throws MartServiceException {
+		Object[] results = new Object[0];
+		// int attributes = query.getAttributes().size();
+		int attributes = getAttributeCount(query.getAttributes());
+		boolean count = query.getCount() == 1;
+		// if there are no attributes and we're not doing a count there's no
+		// point in doing the query
+		if (attributes > 0 || count) {
+			// The 'new' 0.5 server now resolves the attribute lists so there's
+			// no need to do the split here any more
+			// String queryXml = queryToXML(splitAttributeLists(query));
+			String queryXml = queryToXML(query);
+			logger.info(queryXml);
+			NameValuePair[] data = { new NameValuePair(QUERY_ATTRIBUTE,
+					queryXml) };
+			PostMethod method = new PostMethod(martServiceLocation);
+			method.setRequestBody(data);
+
+			try {
+				InputStream in = executeMethod(method, martServiceLocation);
+				if (query.getFormatter() == null) {
+					results = tabSeparatedReaderToResults(
+							new InputStreamReader(in), count ? 1 : attributes);
+					if (!count) {
+						results = reassembleAttributeLists(results, query);
+					}
+				} else {
+					results = readResult(in, query.getFormatter());
+				}
+				in.close();
+			} catch (IOException e) {
+				String errorMessage = "Error reading data from "
+						+ martServiceLocation;
+				throw new MartServiceException(errorMessage, e);
+			} finally {
+				method.releaseConnection();
+			}
+
+		}
+
+		return results;
+	}
+
+	public static void putResults(String martServiceLocation, String requestId,
+			Query query, ResultReceiver resultReceiver) throws MartServiceException, ResultReceiverException {
+		int attributeCount = getAttributeCount(query.getAttributes());
+		boolean count = query.getCount() == 1;
+		// if there are no attributes and we're not doing a count there's no
+		// point in doing the query
+		if (attributeCount > 0 || count) {
+			String queryXml = queryToXML(query);
+			logger.info(queryXml);
+			NameValuePair[] data = { new NameValuePair(QUERY_ATTRIBUTE,
+					queryXml) };
+			PostMethod method = new PostMethod(martServiceLocation);
+			method.setRequestBody(data);
+
+			try {
+				InputStream in = executeMethod(method, martServiceLocation);
+				if (query.getFormatter() == null) {
+					if (count) {
+						resultReceiver.receiveResult(tabSeparatedReaderToResults(new InputStreamReader(in), 1), 0);
+					} else {
+						List<Attribute> attributes = query.getAttributes();
+						Object[] result = new Object[attributes.size()];
+						BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in));
+						String line = bufferedReader.readLine();
+						for (long i = 0; line != null; line = bufferedReader.readLine(), i++) {
+							String[] tokens = line.split("\t", -1);
+							if (attributeCount == tokens.length) {
+								for (int ri = 0, ti = 0; ri < result.length && ti < tokens.length; ri++) {
+									Attribute attribute = attributes.get(ri);
+									if (attribute.getAttributes() == null) {
+										result[ri] = tokens[ti];
+										ti++;
+									} else {
+										int nestedAttributeCount = attribute.getAttributesCount();
+										List<Object> list = new ArrayList<Object>();
+										for (int j = 0; j < nestedAttributeCount; j++) {
+											list.add(tokens[ti]);
+											ti++;
+										}
+										result[ri] = list;
+									}
+								}
+								resultReceiver.receiveResult(result, i);
+							} else {
+								resultReceiver.receiveError(line, i);
+							}
+						}
+					}
+				} else {
+					resultReceiver.receiveResult(readResult(in, query.getFormatter()), 0);
+				}
+				in.close();
+			} catch (IOException e) {
+				String errorMessage = "Error reading data from "
+						+ martServiceLocation;
+				throw new MartServiceException(errorMessage, e);
+			} finally {
+				method.releaseConnection();
+			}
+
+		}
+	}
+	
+//	private static String getLocation(MartURLLocation martUrlLocation) {
+//		StringBuffer location = new StringBuffer("http://");
+//		location.append(martUrlLocation.getHost());
+//		location.append(":" + martUrlLocation.getPort());
+//		location.append(martUrlLocation.getPath());
+//		return location.toString();
+//	}
+	
+	private static int getAttributeCount(List<Attribute> attributeList) {
+		int result = 0;
+		for (Attribute attribute : attributeList) {
+			if (attribute.getAttributes() == null) {
+				result++;
+			} else {
+				result += attribute.getAttributesCount();
+			}
+		}
+		return result;
+	}
+
+	private static Object[] reassembleAttributeLists(Object[] lists, Query query) {
+		int index = 0;
+		List<Object> result = new ArrayList<Object>();
+		for (Attribute attribute : query.getAttributes()) {
+			if (attribute.getAttributes() == null) {
+				result.add(lists[index]);
+				index++;
+			} else {
+				int attributesCount = attribute.getAttributesCount();
+				List<Object> list = new ArrayList<Object>();
+				for (int i = 0; i < attributesCount; i++) {
+					list.add(lists[index]);
+					index++;
+				}
+				result.add(list);
+			}
+		}
+		return result.toArray();
+	}
+
+	public static Query splitAttributeLists(Query query) {
+		Query result = new Query(query);
+		for (Dataset dataset : result.getDatasets()) {
+			List<Attribute> attributeList = dataset.getAttributes();
+			dataset.removeAllAttributes();
+			for (Attribute attribute : attributeList) {
+				if (attribute.getAttributes() == null) {
+					dataset.addAttribute(attribute);
+				} else {
+					String[] attributes = attribute.getAttributes().split(",");
+					for (int i = 0; i < attributes.length; i++) {
+						dataset.addAttribute(new Attribute(attributes[i]));
+					}
+				}
+			}
+		}
+		return result;
+	}
+
+	public static String getMimeTypeForFormatter(String formatter) {
+		String mimeType = "'text/plain'";
+		if ("ADF".equals(formatter)) {
+			mimeType = "'text/plain'";
+		} else if ("AXT".equals(formatter)) {
+			mimeType = "'text/plain'";
+		} else if ("AXTPLUS".equals(formatter)) {
+			mimeType = "'text/plain'";
+		} else if ("CSV".equals(formatter)) {
+			mimeType = "'text/plain'";
+		} else if ("FASTA".equals(formatter)) {
+			mimeType = "'text/plain'";
+		} else if ("FASTACDNA".equals(formatter)) {
+			mimeType = "'text/plain'";
+		} else if ("GFF".equals(formatter)) {
+			mimeType = "'text/plain'";
+		} else if ("HTML".equals(formatter)) {
+			mimeType = "'text/html'";
+		} else if ("MAF".equals(formatter)) {
+			mimeType = "'text/plain'";
+		} else if ("MFA".equals(formatter)) {
+			mimeType = "'text/plain'";
+		} else if ("MFASTA".equals(formatter)) {
+			mimeType = "'text/plain'";
+		} else if ("TSV".equals(formatter)) {
+			mimeType = "'text/tab-separeted-values'";
+		} else if ("TXT".equals(formatter)) {
+			mimeType = "'text/plain'";
+		} else if ("XLS".equals(formatter)) {
+			mimeType = "'application/excel'";
+		}
+		
+		return mimeType;
+	}
+	
+	private static List<String>[] tabSeparatedReaderToResults(Reader reader,
+			int resultsCount) throws IOException {
+		List<String>[] results = new List[resultsCount];
+		for (int i = 0; i < results.length; i++) {
+			results[i] = new ArrayList<String>();
+		}
+		BufferedReader bufferedReader = new BufferedReader(reader);
+		String line = bufferedReader.readLine();
+		while (line != null) {
+			String[] tokens = line.split("\t", -1);
+			for (int i = 0; i < results.length && i < tokens.length; i++) {
+				results[i].add(tokens[i]);
+			}
+			line = bufferedReader.readLine();
+		}
+		return results;
+	}
+
+	private static Object[] readResult(InputStream inputStream, String formatter) throws IOException {
+		Object[] result = new Object[1];
+		
+		if (getMimeTypeForFormatter(formatter).contains("application/")) {
+			result[0] = IOUtils.toByteArray(inputStream);
+		} else {
+			result[0] = IOUtils.toString(inputStream);
+		}
+		return result;
+	}
+	
+	private static MartDataset[] tabSeparatedReaderToDatasets(Reader reader,
+			MartURLLocation martURLLocation) throws IOException {
+		List<MartDataset> datasetList = new ArrayList<MartDataset>();
+		BufferedReader bufferedReader = new BufferedReader(reader);
+		String line = bufferedReader.readLine();
+		while (line != null) {
+			String[] tokens = line.split("\t");
+
+			if (tokens.length >= 7) {
+				MartDataset dataset = new MartDataset();
+
+				dataset.setType(tokens[0]);
+				dataset.setName(tokens[1]);
+				dataset.setDisplayName(tokens[2]);
+				if (tokens[3].equals("1")) {
+					dataset.setVisible(true);
+				} else {
+					dataset.setVisible(false);
+				}
+				// value at position 4 is not documented so it's skipped
+				try {
+					dataset.setInitialBatchSize(Long.parseLong(tokens[5]));
+				} catch (NumberFormatException e) {
+					dataset.setInitialBatchSize(0);
+				}
+				try {
+					dataset.setMaximumBatchSize(Long.parseLong(tokens[6]));
+				} catch (NumberFormatException e) {
+					dataset.setMaximumBatchSize(0);
+				}
+
+				if (tokens.length > 7) {
+					dataset.setInterface(tokens[7]);
+					dataset.setModified(tokens[8]);
+				}
+
+				dataset.setMartURLLocation(martURLLocation);
+
+				datasetList.add(dataset);
+			}
+			line = bufferedReader.readLine();
+		}
+		return datasetList.toArray(new MartDataset[datasetList.size()]);
+	}
+
+	/**
+	 * Creates an XML string from a query
+	 * 
+	 * @param query
+	 * @return an XML string
+	 */
+	public static String queryToXML(Query query) {
+		Document document = new Document(QueryXMLHandler.queryToElement(query,
+				Namespace.NO_NAMESPACE), new DocType("Query"));
+		return new XMLOutputter().outputString(document);
+	}
+
+	/**
+	 * @param martServiceLocation
+	 * @param data
+	 * @return
+	 * @throws MartServiceException
+	 */
+	private static InputStream executeMethod(HttpMethod method,
+			String martServiceLocation) throws MartServiceException {
+		HttpClient client = new HttpClient();
+		if (isProxyHost(martServiceLocation)) {
+			setProxy(client);
+		}
+
+		method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
+				new DefaultHttpMethodRetryHandler(3, false));
+//		method.getParams().setSoTimeout(60000);
+		try {
+			int statusCode = client.executeMethod(method);
+			if (statusCode != HttpStatus.SC_OK) {
+				throw constructException(method, martServiceLocation, null);
+			}
+			return method.getResponseBodyAsStream();
+		} catch (IOException e) {
+			throw constructException(method, martServiceLocation, e);
+		}
+	}
+
+	/**
+	 * 
+	 * @param client
+	 */
+	public static void setProxy(HttpClient client) {
+		String host = System.getProperty("http.proxyHost");
+		String port = System.getProperty("http.proxyPort");
+		String user = System.getProperty("http.proxyUser");
+		String password = System.getProperty("http.proxyPassword");
+
+		if (host != null && port != null) {
+			try {
+				int portInteger = Integer.parseInt(port);
+				client.getHostConfiguration().setProxy(host, portInteger);
+				if (user != null && password != null) {
+					client.getState().setProxyCredentials(
+							new AuthScope(host, portInteger),
+							new UsernamePasswordCredentials(user, password));
+				}
+			} catch (NumberFormatException e) {
+				logger.error("Proxy port not an integer", e);
+			}
+		}
+	}
+
+	public static boolean isProxyHost(String location) {
+		String httpNonProxyHosts = System.getProperty("http.nonProxyHosts");
+		if (httpNonProxyHosts != null) {
+			try {
+				String host = new URL(location).getHost();
+				String[] nonProxyHosts = httpNonProxyHosts.split("\\|");
+				for (int i = 0; i < nonProxyHosts.length; i++) {
+					if (nonProxyHosts[i].startsWith("*")) {
+						if (host.endsWith(nonProxyHosts[i].substring(1))) {
+							return false;
+						}
+					} else if (nonProxyHosts[i].endsWith("*")) {
+						if (host.startsWith(nonProxyHosts[i].substring(0,
+								nonProxyHosts[i].length() - 1))) {
+							return false;
+						}
+					} else {
+						if (host.equals(nonProxyHosts[i])) {
+							return false;
+						}
+					}
+				}
+			} catch (MalformedURLException e) {
+				logger.warn("'" + location + "' is not a valid URL. "
+						+ "Cannot compare host with http.nonProxyHosts", e);
+			}
+		}
+		return true;
+	}
+
+	private static MartServiceException constructException(HttpMethod method,
+			String martServiceLocation, Exception cause) {
+		StringBuffer errorMessage = new StringBuffer();
+		errorMessage.append("Error posting to " + martServiceLocation
+				+ lineSeparator);
+		if (cause == null) {
+			errorMessage.append(" " + method.getStatusLine()
+					+ lineSeparator);
+		}
+		if (method instanceof PostMethod) {
+			PostMethod postMethod = (PostMethod) method;
+			NameValuePair[] data = postMethod.getParameters();
+			for (int i = 0; i < data.length; i++) {
+				errorMessage.append(" " + data[i].getName() + " = "
+						+ data[i].getValue()
+						+ lineSeparator);
+			}
+
+		} else {
+			errorMessage.append(method.getQueryString());
+		}
+		return new MartServiceException(errorMessage.toString(), cause);
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-bioinformatics/blob/a87b4151/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/a87b4151/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/a87b4151/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/a87b4151/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);
+	}
+
+}