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:23 UTC

[15/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-activity/src/main/java/net/sf/taverna/t2/activities/biomart/BiomartActivity.java
----------------------------------------------------------------------
diff --git a/taverna-biomart-activity/src/main/java/net/sf/taverna/t2/activities/biomart/BiomartActivity.java b/taverna-biomart-activity/src/main/java/net/sf/taverna/t2/activities/biomart/BiomartActivity.java
new file mode 100644
index 0000000..7e87939
--- /dev/null
+++ b/taverna-biomart-activity/src/main/java/net/sf/taverna/t2/activities/biomart/BiomartActivity.java
@@ -0,0 +1,351 @@
+/*******************************************************************************
+ * Copyright (C) 2007 The University of Manchester
+ *
+ *  Modifications to the initial code base are copyright of their
+ *  respective authors, or their employers as appropriate.
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Lesser General Public License
+ *  as published by the Free Software Foundation; either version 2.1 of
+ *  the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful, but
+ *  WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Lesser General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ ******************************************************************************/
+package net.sf.taverna.t2.activities.biomart;
+
+import java.io.IOException;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import net.sf.taverna.t2.reference.ReferenceService;
+import net.sf.taverna.t2.reference.ReferenceServiceException;
+import net.sf.taverna.t2.reference.T2Reference;
+import net.sf.taverna.t2.workflowmodel.processor.activity.AbstractAsynchronousActivity;
+import net.sf.taverna.t2.workflowmodel.processor.activity.ActivityConfigurationException;
+import net.sf.taverna.t2.workflowmodel.processor.activity.ActivityOutputPort;
+import net.sf.taverna.t2.workflowmodel.processor.activity.AsynchronousActivityCallback;
+
+import org.apache.log4j.Logger;
+import org.biomart.martservice.MartQuery;
+import org.biomart.martservice.MartServiceException;
+import org.biomart.martservice.MartServiceXMLHandler;
+import org.biomart.martservice.ResultReceiver;
+import org.biomart.martservice.ResultReceiverException;
+import org.biomart.martservice.config.QueryConfigUtils;
+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.jdom.Document;
+import org.jdom.JDOMException;
+import org.jdom.input.SAXBuilder;
+
+import com.fasterxml.jackson.databind.JsonNode;
+
+/**
+ * An Activity providing Biomart functionality.
+ *
+ * @author David Withers
+ */
+public class BiomartActivity extends AbstractAsynchronousActivity<JsonNode> {
+
+	public static final String URI = "http://ns.taverna.org.uk/2010/activity/biomart";
+
+	static boolean STREAM_RESULTS = true;
+
+	private static Logger logger = Logger.getLogger(BiomartActivity.class);
+	
+	private JsonNode json;
+
+	private MartQuery biomartQuery;
+
+	@Override
+	public void configure(JsonNode json)
+			throws ActivityConfigurationException {
+		this.json = json;
+		String martQueryText = json.get("martQuery").asText();
+		SAXBuilder builder = new SAXBuilder();
+		try {
+			Document document = builder.build(new StringReader(martQueryText));
+			biomartQuery = MartServiceXMLHandler.elementToMartQuery(document.getRootElement(), null);
+		} catch (JDOMException | IOException e) {
+			throw new ActivityConfigurationException(e);
+		}
+	}
+
+	@Override
+	public JsonNode getConfiguration() {
+		return json;
+	}
+
+	@Override
+	public void executeAsynch(final Map<String, T2Reference> data,
+			final AsynchronousActivityCallback callback) {
+		callback.requestRun(new Runnable() {
+
+			public void run() {
+				final ReferenceService referenceService = callback.getContext().getReferenceService();
+
+				final Map<String, T2Reference> outputData = new HashMap<String, T2Reference>();
+
+				try {
+					// Get a query including data source etc, creating
+					// a copy so that any filter value settings are not
+					// overwritten by input values
+					biomartQuery.calculateLinks();
+					Query query = new Query(biomartQuery.getQuery());
+
+					// Configure any filters
+					List<Filter> filters = query.getFilters();
+					for (Filter filter : filters) {
+						String name = filter.getQualifiedName();
+						if (data.containsKey(name + "_filter")) {
+							Object filterValue = referenceService.renderIdentifier(data
+									.get(name + "_filter"), String.class, callback.getContext());
+							if (filterValue instanceof String) {
+								filter.setValue((String) filterValue);
+							} else if (filterValue instanceof List) {
+								List<?> idList = (List<?>) filterValue;
+								filter.setValue(QueryConfigUtils
+										.listToCsv(idList));
+							}
+						}
+					}
+
+					if (biomartQuery.getQuery().getFormatter() == null) {
+						if (STREAM_RESULTS) {
+							final List<Attribute> attributes = biomartQuery
+									.getAttributesInLinkOrder();
+							final Map<String, List<T2Reference>> outputLists = new HashMap<String, List<T2Reference>>();
+							for (Attribute attribute : attributes) {
+								outputLists.put(attribute.getQualifiedName(),
+										new ArrayList<T2Reference>());
+							}
+
+							biomartQuery.getMartService().executeQuery(query,
+									new ResultReceiver() {
+
+										public void receiveResult(
+												Object[] resultLine, long index) throws ResultReceiverException {
+											Map<String, T2Reference> partialOutputData = new HashMap<String, T2Reference>();
+											for (int i = 0; i < resultLine.length; i++) {
+												Attribute attribute = attributes
+														.get(i);
+												String outputName = attribute
+														.getQualifiedName();
+												Integer outputDepth = getOutputPortDepth(outputName);
+                                                if (outputDepth == null) {
+                                                    logger.warn("Skipping unknown output port " + outputName);
+                                                    continue;
+                                                }
+												try {
+													T2Reference data = referenceService
+															.register(resultLine[i], outputDepth - 1, true, callback.getContext());
+													partialOutputData.put(
+															outputName, data);
+													outputLists.get(outputName)
+															.add((int) index, data);
+												} catch (ReferenceServiceException e) {
+													throw new ResultReceiverException(e);
+//													callback.fail("Failure when calling the reference service", e);
+												}
+											}
+											callback.receiveResult(
+													partialOutputData,
+													new int[] { (int) index });
+										}
+
+										public void receiveError(String message,
+												long index) throws ResultReceiverException {
+											Map<String, T2Reference> partialOutputData = new HashMap<String, T2Reference>();
+											for (Attribute attribute : attributes) {
+												String outputName = attribute
+														.getQualifiedName();
+    				                                Integer outputDepth = getOutputPortDepth(outputName);
+    				                                if (outputDepth == null) {
+    				                                    logger.warn("Skipping unknown output port " + outputName);
+    				                                    continue;
+    				                                }
+    				                                try {
+													T2Reference error = referenceService.getErrorDocumentService()
+															.registerError(message, outputDepth - 1, callback.getContext()).getId();
+													partialOutputData.put(
+															outputName, error);
+													outputLists.get(outputName)
+															.add((int) index, error);
+												} catch (ReferenceServiceException e) {
+													throw new ResultReceiverException(e);
+//													callback.fail("Failure when calling the reference service", e);
+												}
+											}
+											callback.receiveResult(
+													partialOutputData,
+													new int[] { (int) index });
+										}
+
+									});
+
+							for (Attribute attribute : attributes) {
+								String outputName = attribute
+										.getQualifiedName();
+								Integer outputDepth = getOutputPortDepth(outputName);
+								if (outputDepth == null) {
+								    logger.warn("Skipping unknown output port " + outputName);
+								    continue;
+								}
+								outputData.put(outputName, referenceService.register(
+										outputLists.get(outputName),
+										outputDepth, true, callback.getContext()));
+							}
+
+						} else {
+							// shouldn't need to reorder attributes for MartJ
+							// 0.5
+							Object[] resultList = biomartQuery.getMartService()
+									.executeQuery(query);
+							List<Attribute> attributes = biomartQuery
+									.getAttributesInLinkOrder();
+							assert resultList.length == attributes.size();
+							for (int i = 0; i < resultList.length; i++) {
+								Attribute attribute = attributes.get(i);
+								String outputName = attribute
+										.getQualifiedName();
+                                Integer outputDepth = getOutputPortDepth(outputName);
+                                if (outputDepth == null) {
+                                    logger.warn("Skipping unknown output port " + outputName);
+                                } else {
+                                    outputData.put(outputName, referenceService.register(
+										resultList[i], outputDepth, true, callback.getContext()));
+                                }
+							}
+						}
+					} else {
+						Object[] resultList = biomartQuery.getMartService()
+								.executeQuery(query);
+						assert resultList.length == 1;
+						Dataset dataset = biomartQuery.getQuery().getDatasets()
+								.get(0);
+						String outputName = dataset.getName();
+                        Integer outputDepth = getOutputPortDepth(outputName);
+                        if (outputDepth == null) {
+                            logger.warn("Skipping unknown output port " + outputName);
+                        } else {
+                            outputData.put(outputName, referenceService.register(
+								resultList[0], outputDepth, true, callback.getContext()));
+                        }
+					}
+
+					callback.receiveResult(outputData, new int[0]);
+				} catch (MartServiceException e) {
+					callback.fail("Failure calling biomart", e);
+				} catch (ReferenceServiceException e) {
+					callback.fail("Failure when calling the reference service", e);
+				} catch (ResultReceiverException e) {
+					callback.fail("Failure when receiving a result from biomart", e);
+				}
+			}
+
+		});
+
+	}
+
+	private Integer getOutputPortDepth(String portName) {
+		for (ActivityOutputPort port : getOutputPorts()) {
+			if (port.getName().equals(portName)) {
+				return port.getDepth();
+			}
+		}
+		return null;
+	}
+
+//	private void buildInputPorts(List<Edit<?>> editList) {
+//		Map<String, ActivityInputPort> newInputMap = new HashMap<String, ActivityInputPort>();
+//		List<Filter> filters = biomartQuery.getQuery().getFilters();
+//		// Create new input ports corresponding to filters
+//		for (Filter filter : filters) {
+//			String name = filter.getQualifiedName() + "_filter";
+//			if (inputMap.containsKey(name)) {
+//				newInputMap.put(name, inputMap.remove(name));
+//			} else {
+//				ActivityInputPort inputPort = null;
+//				if (filter.isList()) {
+//					inputPort = edits.createActivityInputPort(name, 1, true,
+//							new ArrayList<Class<? extends ExternalReferenceSPI>>(),
+//							String.class);
+//				} else {
+//					inputPort = edits.createActivityInputPort(name, 0, true,
+//							new ArrayList<Class<? extends ExternalReferenceSPI>>(),
+//							String.class);
+//				}
+//				newInputMap.put(name, inputPort);
+//				editList.add(edits.getAddActivityInputPortEdit(this, inputPort));
+//				editList.add(createAddMimeTypeAnnotationEdit(inputPort, "text/plain"));
+//			}
+//		}
+//		//remove any ports still left in the map
+//		for (ActivityInputPort inputPort : inputMap.values()) {
+//			editList.add(edits.getRemoveActivityInputPortEdit(this, inputPort));
+//		}
+//		inputMap = newInputMap;
+//	}
+
+//	private void buildOutputPorts(List<Edit<?>> editList) {
+//		Map<String, ActivityOutputPort> newOutputMap = new HashMap<String, ActivityOutputPort>();
+//		Query query = biomartQuery.getQuery();
+//		List<Attribute> attributes = query.getAttributes();
+//		String formatter = query.getFormatter();
+//		if (formatter == null) {
+//			// Create new output ports corresponding to attributes
+//			for (Attribute attribute : attributes) {
+//				String name = attribute.getQualifiedName();
+//				if (outputMap.containsKey(name)) {
+//					newOutputMap.put(name, outputMap.remove(name));
+//				} else {
+//					ActivityOutputPort outputPort = null;
+//					if (attribute.getAttributes() != null) {
+//						outputPort = edits.createActivityOutputPort(name, 2, STREAM_RESULTS?1:2);
+//					} else {
+//						outputPort = edits.createActivityOutputPort(name, 1, STREAM_RESULTS?0:1);
+//					}
+//					newOutputMap.put(name, outputPort);
+//					editList.add(edits.getAddActivityOutputPortEdit(this, outputPort));
+//					editList.add(createAddMimeTypeAnnotationEdit(outputPort, "text/plain"));
+//				}
+//			}
+//		} else if (attributes.size() > 0) {
+//			// create one port using the dataset name
+//			Attribute attribute = attributes.get(0);
+//			String name = attribute.getContainingDataset().getName();
+//			if (outputMap.containsKey(name)) {
+//				newOutputMap.put(name, outputMap.remove(name));
+//			} else {
+//				ActivityOutputPort outputPort = edits.createActivityOutputPort(name, 0, 0);
+//				newOutputMap.put(name, outputPort);
+//				editList.add(edits.getAddActivityOutputPortEdit(this, outputPort));
+//				editList.add(createAddMimeTypeAnnotationEdit(outputPort, "text/plain"));
+//			}
+//		}
+//		//remove any ports still left in the map
+//		for (ActivityOutputPort outputPort : outputMap.values()) {
+//			editList.add(edits.getRemoveActivityOutputPortEdit(this, outputPort));
+//		}
+//		outputMap = newOutputMap;
+//	}
+
+//	private Edit<?> createAddMimeTypeAnnotationEdit(Annotated<?> annotated, String type) {
+//		MimeType mimeType = new MimeType();
+//		mimeType.setText(type);
+//		return edits.getAddAnnotationChainEdit(annotated, mimeType);
+//	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-bioinformatics/blob/a87b4151/taverna-biomart-activity/src/main/java/net/sf/taverna/t2/activities/biomart/BiomartActivityConfigurationBean.java
----------------------------------------------------------------------
diff --git a/taverna-biomart-activity/src/main/java/net/sf/taverna/t2/activities/biomart/BiomartActivityConfigurationBean.java b/taverna-biomart-activity/src/main/java/net/sf/taverna/t2/activities/biomart/BiomartActivityConfigurationBean.java
new file mode 100644
index 0000000..91cc323
--- /dev/null
+++ b/taverna-biomart-activity/src/main/java/net/sf/taverna/t2/activities/biomart/BiomartActivityConfigurationBean.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (C) 2011 The University of Manchester
+ *
+ *  Modifications to the initial code base are copyright of their
+ *  respective authors, or their employers as appropriate.
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Lesser General Public License
+ *  as published by the Free Software Foundation; either version 2.1 of
+ *  the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful, but
+ *  WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Lesser General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ ******************************************************************************/
+package net.sf.taverna.t2.activities.biomart;
+
+import net.sf.taverna.t2.workflowmodel.processor.config.ConfigurationBean;
+import net.sf.taverna.t2.workflowmodel.processor.config.ConfigurationProperty;
+
+import org.jdom.Element;
+
+/**
+ * Biomart configuration.
+ *
+ * @author David Withers
+ */
+@ConfigurationBean(uri = BiomartActivity.URI + "#Config")
+public class BiomartActivityConfigurationBean {
+
+	private Element martQuery;
+
+	public Element getMartQuery() {
+		return martQuery;
+	}
+
+	@ConfigurationProperty(name = "martQuery", label = "Mart Query", description = "Biomart query in XML")
+	public void setMartQuery(Element martQuery) {
+		this.martQuery = martQuery;
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-bioinformatics/blob/a87b4151/taverna-biomart-activity/src/main/java/net/sf/taverna/t2/activities/biomart/BiomartActivityFactory.java
----------------------------------------------------------------------
diff --git a/taverna-biomart-activity/src/main/java/net/sf/taverna/t2/activities/biomart/BiomartActivityFactory.java b/taverna-biomart-activity/src/main/java/net/sf/taverna/t2/activities/biomart/BiomartActivityFactory.java
new file mode 100644
index 0000000..4aaf043
--- /dev/null
+++ b/taverna-biomart-activity/src/main/java/net/sf/taverna/t2/activities/biomart/BiomartActivityFactory.java
@@ -0,0 +1,144 @@
+/*******************************************************************************
+ * Copyright (C) 2011 The University of Manchester
+ *
+ *  Modifications to the initial code base are copyright of their
+ *  respective authors, or their employers as appropriate.
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Lesser General Public License
+ *  as published by the Free Software Foundation; either version 2.1 of
+ *  the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful, but
+ *  WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Lesser General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ ******************************************************************************/
+package net.sf.taverna.t2.activities.biomart;
+
+import java.io.IOException;
+import java.io.StringReader;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import net.sf.taverna.t2.reference.ExternalReferenceSPI;
+import net.sf.taverna.t2.workflowmodel.Edit;
+import net.sf.taverna.t2.workflowmodel.Edits;
+import net.sf.taverna.t2.workflowmodel.processor.activity.ActivityFactory;
+import net.sf.taverna.t2.workflowmodel.processor.activity.ActivityInputPort;
+import net.sf.taverna.t2.workflowmodel.processor.activity.ActivityOutputPort;
+
+import org.apache.log4j.Logger;
+import org.biomart.martservice.MartQuery;
+import org.biomart.martservice.MartServiceXMLHandler;
+import org.biomart.martservice.query.Attribute;
+import org.biomart.martservice.query.Filter;
+import org.biomart.martservice.query.Query;
+import org.jdom.Document;
+import org.jdom.JDOMException;
+import org.jdom.input.SAXBuilder;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+/**
+ * An {@link ActivityFactory} for creating <code>BiomartActivity</code>.
+ *
+ * @author David Withers
+ */
+public class BiomartActivityFactory implements ActivityFactory {
+
+	private static Logger logger = Logger.getLogger(BiomartActivityFactory.class);
+
+	private Edits edits;
+	private SAXBuilder builder = new SAXBuilder();
+
+	@Override
+	public BiomartActivity createActivity() {
+		return new BiomartActivity();
+	}
+
+	@Override
+	public URI getActivityType() {
+		return URI.create(BiomartActivity.URI);
+	}
+
+	@Override
+	public JsonNode getActivityConfigurationSchema() {
+		ObjectMapper objectMapper = new ObjectMapper();
+		try {
+			return objectMapper.readTree(getClass().getResource("/schema.json"));
+		} catch (IOException e) {
+			return objectMapper.createObjectNode();
+		}
+	}
+
+	@Override
+	public Set<ActivityInputPort> getInputPorts(JsonNode configuration) {
+		Set<ActivityInputPort> inputPorts = new HashSet<>();
+		try {
+			Query query = getQuery(configuration);
+			for (Filter filter : query.getFilters()) {
+				String name = filter.getQualifiedName() + "_filter";
+				inputPorts.add(edits.createActivityInputPort(name, filter.isList() ? 1 : 0, true,
+						new ArrayList<Class<? extends ExternalReferenceSPI>>(), String.class));
+			}
+		} catch (JDOMException | IOException e) {
+			logger.warn("Error caluculating input ports from BioMart configuration", e);
+		}
+		return inputPorts;
+	}
+
+	@Override
+	public Set<ActivityOutputPort> getOutputPorts(JsonNode configuration) {
+		Set<ActivityOutputPort> outputPorts = new HashSet<>();
+		try {
+			Query query = getQuery(configuration);
+			List<Attribute> attributes = query.getAttributes();
+			if (query.getFormatter() == null) {
+				// Create new output ports corresponding to attributes
+				for (Attribute attribute : attributes) {
+					String name = attribute.getQualifiedName();
+					ActivityOutputPort outputPort = null;
+					if (attribute.getAttributes() != null) {
+						outputPorts.add(edits.createActivityOutputPort(name, 2,
+								BiomartActivity.STREAM_RESULTS ? 1 : 2));
+					} else {
+						outputPorts.add(edits.createActivityOutputPort(name, 1,
+								BiomartActivity.STREAM_RESULTS ? 0 : 1));
+					}
+				}
+			} else if (attributes.size() > 0) {
+				// create one port using the dataset name
+				Attribute attribute = attributes.get(0);
+				String name = attribute.getContainingDataset().getName();
+				outputPorts.add(edits.createActivityOutputPort(name, 0, 0));
+			}
+		} catch (JDOMException | IOException e) {
+			logger.warn("Error caluculating output ports from BioMart configuration", e);
+		}
+		return outputPorts;
+	}
+
+	public void setEdits(Edits edits) {
+		this.edits = edits;
+	}
+
+	private Query getQuery(JsonNode configuration) throws JDOMException, IOException {
+		String martQueryText = configuration.get("martQuery").asText();
+		Document document = builder.build(new StringReader(martQueryText));
+		MartQuery martQuery = MartServiceXMLHandler.elementToMartQuery(document.getRootElement(),
+				null);
+		return martQuery.getQuery();
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-bioinformatics/blob/a87b4151/taverna-biomart-activity/src/main/java/net/sf/taverna/t2/activities/biomart/BiomartActivityHealthChecker.java
----------------------------------------------------------------------
diff --git a/taverna-biomart-activity/src/main/java/net/sf/taverna/t2/activities/biomart/BiomartActivityHealthChecker.java b/taverna-biomart-activity/src/main/java/net/sf/taverna/t2/activities/biomart/BiomartActivityHealthChecker.java
new file mode 100644
index 0000000..8e48635
--- /dev/null
+++ b/taverna-biomart-activity/src/main/java/net/sf/taverna/t2/activities/biomart/BiomartActivityHealthChecker.java
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * Copyright (C) 2007 The University of Manchester
+ *
+ *  Modifications to the initial code base are copyright of their
+ *  respective authors, or their employers as appropriate.
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Lesser General Public License
+ *  as published by the Free Software Foundation; either version 2.1 of
+ *  the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful, but
+ *  WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Lesser General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ ******************************************************************************/
+package net.sf.taverna.t2.activities.biomart;
+
+import java.io.IOException;
+import java.io.StringReader;
+import java.util.List;
+
+import net.sf.taverna.t2.visit.VisitReport;
+
+import net.sf.taverna.t2.workflowmodel.health.RemoteHealthChecker;
+import net.sf.taverna.t2.workflowmodel.processor.activity.Activity;
+import net.sf.taverna.t2.workflowmodel.processor.activity.DisabledActivity;
+
+
+import org.biomart.martservice.MartQuery;
+import org.biomart.martservice.MartServiceXMLHandler;
+import org.jdom.Document;
+import org.jdom.Element;
+import org.jdom.JDOMException;
+import org.jdom.input.SAXBuilder;
+
+public class BiomartActivityHealthChecker extends RemoteHealthChecker {
+
+	public boolean canVisit(Object subject) {
+		if (subject == null) {
+			return false;
+		}
+		if (subject instanceof BiomartActivity) {
+			return true;
+		}
+		if (subject instanceof DisabledActivity) {
+			return (((DisabledActivity) subject).getActivity() instanceof BiomartActivity);
+		}
+		return false;
+	}
+
+	public VisitReport visit(Object o, List<Object> ancestors) {
+		Element biomartQueryElement = null;
+		Activity activity = (Activity) o;
+		if (activity instanceof BiomartActivity) {
+			String martQueryText = ((BiomartActivity)activity).getConfiguration().get("martQuery").asText();
+			SAXBuilder builder = new SAXBuilder();
+			try {
+				Document document = builder.build(new StringReader(martQueryText));
+				biomartQueryElement = document.getRootElement();
+			} catch (JDOMException | IOException e) {
+				e.printStackTrace();
+			}
+		} else if (activity instanceof DisabledActivity) {
+			biomartQueryElement = (Element) ((DisabledActivity) activity).getActivityConfiguration();
+		}
+		MartQuery biomartQuery = MartServiceXMLHandler.elementToMartQuery(biomartQueryElement, null);
+		return contactEndpoint(activity, biomartQuery.getMartService().getLocation());
+	}
+
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-bioinformatics/blob/a87b4151/taverna-biomart-activity/src/main/resources/META-INF/services/net.sf.taverna.t2.workflowmodel.health.HealthChecker
----------------------------------------------------------------------
diff --git a/taverna-biomart-activity/src/main/resources/META-INF/services/net.sf.taverna.t2.workflowmodel.health.HealthChecker b/taverna-biomart-activity/src/main/resources/META-INF/services/net.sf.taverna.t2.workflowmodel.health.HealthChecker
new file mode 100644
index 0000000..19aae39
--- /dev/null
+++ b/taverna-biomart-activity/src/main/resources/META-INF/services/net.sf.taverna.t2.workflowmodel.health.HealthChecker
@@ -0,0 +1 @@
+# net.sf.taverna.t2.activities.biomart.BiomartActivityHealthChecker
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-bioinformatics/blob/a87b4151/taverna-biomart-activity/src/main/resources/META-INF/spring/biomart-activity-context-osgi.xml
----------------------------------------------------------------------
diff --git a/taverna-biomart-activity/src/main/resources/META-INF/spring/biomart-activity-context-osgi.xml b/taverna-biomart-activity/src/main/resources/META-INF/spring/biomart-activity-context-osgi.xml
new file mode 100644
index 0000000..d8df086
--- /dev/null
+++ b/taverna-biomart-activity/src/main/resources/META-INF/spring/biomart-activity-context-osgi.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans:beans xmlns="http://www.springframework.org/schema/osgi" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xmlns:beans="http://www.springframework.org/schema/beans"
+	xsi:schemaLocation="http://www.springframework.org/schema/beans
+                                 http://www.springframework.org/schema/beans/spring-beans.xsd
+                                 http://www.springframework.org/schema/osgi
+                                 http://www.springframework.org/schema/osgi/spring-osgi.xsd">
+
+	<service ref="biomartActivityHealthChecker" interface="net.sf.taverna.t2.workflowmodel.health.HealthChecker" />
+
+	<service ref="biomartActivityFactory" interface="net.sf.taverna.t2.workflowmodel.processor.activity.ActivityFactory" />
+
+	<reference id="edits" interface="net.sf.taverna.t2.workflowmodel.Edits" />
+
+</beans:beans>

http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-bioinformatics/blob/a87b4151/taverna-biomart-activity/src/main/resources/META-INF/spring/biomart-activity-context.xml
----------------------------------------------------------------------
diff --git a/taverna-biomart-activity/src/main/resources/META-INF/spring/biomart-activity-context.xml b/taverna-biomart-activity/src/main/resources/META-INF/spring/biomart-activity-context.xml
new file mode 100644
index 0000000..dcc0538
--- /dev/null
+++ b/taverna-biomart-activity/src/main/resources/META-INF/spring/biomart-activity-context.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://www.springframework.org/schema/beans
+                           http://www.springframework.org/schema/beans/spring-beans.xsd">
+
+	<bean id="biomartActivityHealthChecker" class="net.sf.taverna.t2.activities.biomart.BiomartActivityHealthChecker" />
+
+	<bean id="biomartActivityFactory" class="net.sf.taverna.t2.activities.biomart.BiomartActivityFactory">
+		<property name="edits" ref="edits" />
+	</bean>
+
+
+</beans>

http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-bioinformatics/blob/a87b4151/taverna-biomart-activity/src/main/resources/schema.json
----------------------------------------------------------------------
diff --git a/taverna-biomart-activity/src/main/resources/schema.json b/taverna-biomart-activity/src/main/resources/schema.json
new file mode 100644
index 0000000..99eb9f2
--- /dev/null
+++ b/taverna-biomart-activity/src/main/resources/schema.json
@@ -0,0 +1,19 @@
+{
+    "$schema": "http://json-schema.org/draft-03/schema#",
+    "id": "http://ns.taverna.org.uk/2010/activity/biomart.schema.json",
+    "title": "Biomart activity configuration",
+    "type": "object",
+    "properties": {
+        "@context": {
+            "description": "JSON-LD context for interpreting the configuration as RDF",
+            "required": true,
+            "enum": ["http://ns.taverna.org.uk/2010/activity/biomart.context.json"]
+        },
+        "martQuery": {
+            "title": "Mart Query",
+            "description": "Biomart query in XML",
+            "type": "string",
+            "required": true,
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-bioinformatics/blob/a87b4151/taverna-biomart-activity/src/test/java/net/sf/taverna/t2/activities/biomart/BiomartActivityFactoryTest.java
----------------------------------------------------------------------
diff --git a/taverna-biomart-activity/src/test/java/net/sf/taverna/t2/activities/biomart/BiomartActivityFactoryTest.java b/taverna-biomart-activity/src/test/java/net/sf/taverna/t2/activities/biomart/BiomartActivityFactoryTest.java
new file mode 100644
index 0000000..78ed2f6
--- /dev/null
+++ b/taverna-biomart-activity/src/test/java/net/sf/taverna/t2/activities/biomart/BiomartActivityFactoryTest.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (C) 2011 The University of Manchester
+ *
+ *  Modifications to the initial code base are copyright of their
+ *  respective authors, or their employers as appropriate.
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Lesser General Public License
+ *  as published by the Free Software Foundation; either version 2.1 of
+ *  the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful, but
+ *  WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Lesser General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ ******************************************************************************/
+package net.sf.taverna.t2.activities.biomart;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.net.URI;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ *
+ * @author David Withers
+ */
+public class BiomartActivityFactoryTest {
+
+	private BiomartActivityFactory factory;
+
+	/**
+	 * @throws java.lang.Exception
+	 */
+	@Before
+	public void setUp() throws Exception {
+		factory = new BiomartActivityFactory();
+	}
+
+	/**
+	 * Test method for {@link net.sf.taverna.t2.activities.biomart.BiomartActivityFactory#createActivity()}.
+	 */
+	@Test
+	public void testCreateActivity() {
+		BiomartActivity createActivity = factory.createActivity();
+		assertNotNull(createActivity);
+	}
+
+	/**
+	 * Test method for {@link net.sf.taverna.t2.activities.biomart.BiomartActivityFactory#getActivityType()}.
+	 */
+	@Test
+	public void testGetActivityURI() {
+		assertEquals(URI.create(BiomartActivity.URI), factory.getActivityType());
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-bioinformatics/blob/a87b4151/taverna-biomart-activity/src/test/resources/biomart-query.xml
----------------------------------------------------------------------
diff --git a/taverna-biomart-activity/src/test/resources/biomart-query.xml b/taverna-biomart-activity/src/test/resources/biomart-query.xml
new file mode 100644
index 0000000..e0b43bd
--- /dev/null
+++ b/taverna-biomart-activity/src/test/resources/biomart-query.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<MartQuery xmlns:biomart="http://org.embl.ebi.escience/xscufl-biomart/0.1alpha">
+  <MartService location="http://www.biomart.org/biomart/martservice" />
+  <MartDataset displayName="Homo sapiens genes (NCBI36)" name="hsapiens_gene_ensembl" type="TableSet" initialBatchSize="100" maximumBatchSize="50000" visible="false">
+    <MartURLLocation default="1" displayName="ENSEMBL 41 (SANGER)" host="www.biomart.org" name="ensembl" port="80" serverVirtualSchema="default" virtualSchema="default" visible="1" />
+  </MartDataset>
+  <Query virtualSchemaName="default" count="0" softwareVersion="0.5">
+    <Dataset name="hsapiens_gene_ensembl">
+      <Attribute name="chromosome_name" />
+      <Attribute name="go_description" />
+      <Filter name="chromosome_name" value="1" />
+      <Filter name="band_end" value="p36.32" />
+      <Filter name="band_start" value="p36.33" />
+    </Dataset>
+  </Query>
+</MartQuery>
+

http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-bioinformatics/blob/a87b4151/taverna-biomart-martservice/pom.xml
----------------------------------------------------------------------
diff --git a/taverna-biomart-martservice/pom.xml b/taverna-biomart-martservice/pom.xml
new file mode 100644
index 0000000..582a601
--- /dev/null
+++ b/taverna-biomart-martservice/pom.xml
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>net.sf.taverna</groupId>
+		<artifactId>taverna-parent</artifactId>
+		<version>3.0.1-SNAPSHOT</version>
+	</parent>
+	<groupId>org.biomart</groupId>
+	<artifactId>martservice</artifactId>
+	<packaging>bundle</packaging>
+	<name>MartService</name>
+	<version>2.0.1-SNAPSHOT</version>
+	<description>Biomart webservice API</description>
+	
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.felix</groupId>
+				<artifactId>maven-bundle-plugin</artifactId>
+				<version>2.3.7</version>
+				<extensions>true</extensions>
+				<configuration>
+					<instructions>
+						<Private-Package>org.ensembl.mart.lib,org.ensembl.mart.lib.config,org.ensembl.mart.util</Private-Package>
+						<Import-Package>!org.ensembl.util,!org.ensembl.mart.editor,!oracle.sql,!gnu.getopt,!org.ewin.*,*</Import-Package>
+					</instructions>
+				</configuration>
+			</plugin>
+		</plugins>
+	</build>
+	
+	<dependencies>
+		<dependency>
+			<groupId>org.biomart</groupId>
+			<artifactId>martj</artifactId>
+			<version>0.6</version>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.jdom</groupId>
+			<artifactId>com.springsource.org.jdom</artifactId>
+			<version>1.1.0</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.commons</groupId>
+			<artifactId>com.springsource.org.apache.commons.httpclient</artifactId>
+			<version>3.1.0</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.commons</groupId>
+			<artifactId>com.springsource.org.apache.commons.io</artifactId>
+			<version>1.4.0</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.log4j</groupId>
+			<artifactId>com.springsource.org.apache.log4j</artifactId>
+			<version>${log4j.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<version>${junit.version}</version>
+			<scope>test</scope>
+		</dependency>
+	</dependencies>
+
+	<repositories>
+		<repository>
+			<releases />
+			<snapshots>
+				<enabled>false</enabled>
+			</snapshots>
+			<id>mygrid-repository</id>
+			<name>myGrid Repository</name>
+			<url>http://www.mygrid.org.uk/maven/repository</url>
+		</repository>
+		<repository>
+			<releases>
+				<enabled>false</enabled>
+			</releases>
+			<snapshots />
+			<id>mygrid-snapshot-repository</id>
+			<name>myGrid Snapshot Repository</name>
+			<url>http://www.mygrid.org.uk/maven/snapshot-repository</url>
+		</repository>
+		<repository>
+			<id>com.springsource.repository.bundles.release</id>
+			<name>SpringSource Enterprise Bundle Repository - SpringSource Bundle Releases</name>
+			<url>http://repository.springsource.com/maven/bundles/release</url>
+		</repository>
+		<repository>
+			<id>com.springsource.repository.bundles.external</id>
+			<name>SpringSource Enterprise Bundle Repository - External Bundle Releases</name>
+			<url>http://repository.springsource.com/maven/bundles/external</url>
+		</repository>
+	</repositories>
+	<scm>
+		<connection>scm:git:https://github.com/taverna/taverna-biomart-martservice.git</connection>
+		<developerConnection>scm:git:ssh://git@github.com:taverna/taverna-biomart-martservice.git</developerConnection>
+		<url>https://github.com/taverna/taverna-biomart-martservice/</url>
+		<tag>HEAD</tag>
+	</scm>
+</project>

http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-bioinformatics/blob/a87b4151/taverna-biomart-martservice/src/main/java/org/biomart/martservice/DatasetLink.java
----------------------------------------------------------------------
diff --git a/taverna-biomart-martservice/src/main/java/org/biomart/martservice/DatasetLink.java b/taverna-biomart-martservice/src/main/java/org/biomart/martservice/DatasetLink.java
new file mode 100644
index 0000000..e5dccd4
--- /dev/null
+++ b/taverna-biomart-martservice/src/main/java/org/biomart/martservice/DatasetLink.java
@@ -0,0 +1,220 @@
+/*
+ * 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: DatasetLink.java,v $
+ * Revision           $Revision: 1.2 $
+ * Release status     $State: Exp $
+ * Last modified on   $Date: 2007/12/13 11:38:55 $
+ *               by   $Author: davidwithers $
+ * Created on 12-Apr-2006
+ *****************************************************************/
+package org.biomart.martservice;
+
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * The link between two MartDatasets and the list of possible the link IDs that
+ * could join the source and target MartDataset.
+ * 
+ * @author David Withers
+ */
+public class DatasetLink {
+	private static final Comparator<DatasetLink> displayComparator = new DatasetLinkComparator();
+
+	private MartDataset sourceDataset;
+
+	private MartDataset targetDataset;
+
+	private Set<String> links = new HashSet<String>();
+
+	/**
+	 * Constructs an instance of an <code>DatasetLink</code> with the
+	 * specified source and target.
+	 * 
+	 * @param sourceDataset
+	 *            the link source
+	 * @param targetDataset
+	 *            the link target
+	 */
+	public DatasetLink(MartDataset sourceDataset, MartDataset targetDataset) {
+		this.sourceDataset = sourceDataset;
+		this.targetDataset = targetDataset;
+	}
+
+	/**
+	 * Returns the source Dataset.
+	 * 
+	 * @return the source Dataset
+	 */
+	public MartDataset getSourceDataset() {
+		return sourceDataset;
+	}
+
+	/**
+	 * Sets the source Dataset.
+	 * 
+	 * @param sourceDataset
+	 *            the sourceDataset to set
+	 */
+	public void setSourceDataset(MartDataset sourceDataset) {
+		this.sourceDataset = sourceDataset;
+	}
+
+	/**
+	 * Returns the target Dataset.
+	 * 
+	 * @return the target Dataset
+	 */
+	public MartDataset getTargetDataset() {
+		return targetDataset;
+	}
+
+	/**
+	 * Sets the target Dataset.
+	 * 
+	 * @param targetDataset
+	 *            the target Dataset to set
+	 */
+	public void setTargetDataset(MartDataset targetDataset) {
+		this.targetDataset = targetDataset;
+	}
+
+	/**
+	 * Returns the link IDs that could join the source and target MartDatasets.
+	 * 
+	 * @return the link IDs that could join the source and target MartDatasets
+	 */
+	public String[] getLinks() {
+		return links.toArray(new String[links.size()]);
+	}
+
+	/**
+	 * Adds a link ID.
+	 * 
+	 * @param link
+	 *            the link ID to add.
+	 */
+	public void addLink(String link) {
+		links.add(link);
+	}
+
+	/**
+	 * Returns true if this DatasetLink has link IDs.
+	 * 
+	 * @return true if this DatasetLink has link IDs
+	 */
+	public boolean hasLinks() {
+		return !links.isEmpty();
+	}
+
+	public String toString() {
+		return "[" + sourceDataset.getMartURLLocation().getDisplayName() + "] "
+				+ sourceDataset.getDisplayName();
+	}
+
+	/* (non-Javadoc)
+	 * @see java.lang.Object#hashCode()
+	 */
+	public int hashCode() {
+		final int PRIME = 31;
+		int result = 1;
+		result = PRIME * result + ((sourceDataset == null) ? 0 : sourceDataset.hashCode());
+		result = PRIME * result + ((targetDataset == null) ? 0 : targetDataset.hashCode());
+		return result;
+	}
+
+	/* (non-Javadoc)
+	 * @see java.lang.Object#equals(java.lang.Object)
+	 */
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if (obj == null)
+			return false;
+		if (getClass() != obj.getClass())
+			return false;
+		final DatasetLink other = (DatasetLink) obj;
+		if (sourceDataset == null) {
+			if (other.sourceDataset != null)
+				return false;
+		} else if (!sourceDataset.equals(other.sourceDataset))
+			return false;
+		if (targetDataset == null) {
+			if (other.targetDataset != null)
+				return false;
+		} else if (!targetDataset.equals(other.targetDataset))
+			return false;
+		return true;
+	}
+
+	/**
+	 * Returns a Comparator that compares DatasetLinks based on the display name
+	 * of the source dataset and the display name of the MartURLLocation
+	 * containing the source dataset.
+	 * 
+	 * @return the display comparator
+	 */
+	public static Comparator<DatasetLink> getDisplayComparator() {
+		return displayComparator;
+	}
+
+}
+
+/**
+ * Comparator that compares DatasetLinks based on the display name of the source
+ * MartDataset and the display name of the MartURLLocation containing the source
+ * MartDataset.
+ * 
+ * @author David Withers
+ */
+class DatasetLinkComparator implements Comparator<DatasetLink> {
+
+	/**
+	 * Compares two DatasetLinks based on the display name of the source dataset
+	 * and the display name of the MartURLLocation containing the source
+	 * dataset.
+	 * 
+	 * @param o1
+	 *            the first DatasetLink to be compared
+	 * @param o2
+	 *            the second DatasetLink to be compared
+	 * @return a negative integer, zero, or a positive integer as the first
+	 *         argument is less than, equal to, or greater than the second
+	 */
+	public int compare(DatasetLink o1, DatasetLink o2) {
+		MartDataset ds1 = o1.getSourceDataset();
+		MartDataset ds2 = o2.getSourceDataset();
+		int result = ds1.getDisplayName().compareTo(ds2.getDisplayName());
+		if (result == 0) {
+			result = ds1.getMartURLLocation().getDisplayName().compareTo(
+					ds2.getMartURLLocation().getDisplayName());
+		}
+		return result;
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-bioinformatics/blob/a87b4151/taverna-biomart-martservice/src/main/java/org/biomart/martservice/MartDataset.java
----------------------------------------------------------------------
diff --git a/taverna-biomart-martservice/src/main/java/org/biomart/martservice/MartDataset.java b/taverna-biomart-martservice/src/main/java/org/biomart/martservice/MartDataset.java
new file mode 100644
index 0000000..8c0f584
--- /dev/null
+++ b/taverna-biomart-martservice/src/main/java/org/biomart/martservice/MartDataset.java
@@ -0,0 +1,342 @@
+/*
+ * 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: MartDataset.java,v $
+ * Revision           $Revision: 1.2 $
+ * Release status     $State: Exp $
+ * Last modified on   $Date: 2007/10/04 14:17:19 $
+ *               by   $Author: davidwithers $
+ * Created on 17-Mar-2006
+ *****************************************************************/
+package org.biomart.martservice;
+
+import java.util.Comparator;
+
+/**
+ * The dataset returned by a BioMart web service.
+ * 
+ * @author David Withers
+ */
+public class MartDataset {
+	private static final Comparator<MartDataset> displayComparator = new MartDatasetComparator();
+
+	private String type;
+
+	private String name;
+
+	private String displayName;
+
+	private boolean visible;
+
+	private long initialBatchSize;
+
+	private long maximumBatchSize;
+
+	private String interfaceValue;
+
+	private String modified;
+
+	private MartURLLocation martURLLocation;
+
+	/**
+	 * 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 initialBatchSize.
+	 * 
+	 * @return the initialBatchSize.
+	 */
+	public long getInitialBatchSize() {
+		return initialBatchSize;
+	}
+
+	/**
+	 * Sets the initialBatchSize.
+	 * 
+	 * @param initialBatchSize
+	 *            the initialBatchSize to set.
+	 */
+	public void setInitialBatchSize(long initialBatchSize) {
+		this.initialBatchSize = initialBatchSize;
+	}
+
+	/**
+	 * Returns the maximumBatchSize.
+	 * 
+	 * @return the maximumBatchSize.
+	 */
+	public long getMaximumBatchSize() {
+		return maximumBatchSize;
+	}
+
+	/**
+	 * Sets the maximumBatchSize.
+	 * 
+	 * @param maximumBatchSize
+	 *            the maximumBatchSize to set.
+	 */
+	public void setMaximumBatchSize(long maximumBatchSize) {
+		this.maximumBatchSize = maximumBatchSize;
+	}
+
+	/**
+	 * 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 type.
+	 * 
+	 * @return the type.
+	 */
+	public String getType() {
+		return type;
+	}
+
+	/**
+	 * Sets the type.
+	 * 
+	 * @param type
+	 *            the type to set.
+	 */
+	public void setType(String type) {
+		this.type = type;
+	}
+
+	/**
+	 * Returns the visible flag.
+	 * 
+	 * @return the visible flag
+	 */
+	public boolean isVisible() {
+		return visible;
+	}
+
+	/**
+	 * Sets the visible flag.
+	 * 
+	 * @param visible
+	 *            the visible flag
+	 */
+	public void setVisible(boolean visible) {
+		this.visible = visible;
+	}
+
+	/**
+	 * Returns the modified date.
+	 *
+	 * @return the modified date
+	 */
+	public String getModified() {
+		return modified;
+	}
+
+	/**
+	 * Sets the modified date.
+	 *
+	 * @param modified the new modified date
+	 */
+	public void setModified(String modified) {
+		this.modified = modified;
+	}
+
+	/**
+	 * Returns the interface.
+	 *
+	 * @return the interface
+	 */
+	public String getInterface() {
+		return interfaceValue;
+	}
+
+	/**
+	 * Sets the interface.
+	 *
+	 * @param interfaceValue the new interface
+	 */
+	public void setInterface(String interfaceValue) {
+		this.interfaceValue = interfaceValue;
+	}
+
+	/**
+	 * Returns the martURLLocation.
+	 * 
+	 * @return the martURLLocation
+	 */
+	public MartURLLocation getMartURLLocation() {
+		return martURLLocation;
+	}
+
+	/**
+	 * Sets the martURLLocation.
+	 * 
+	 * @param martURLLocation
+	 *            the martURLLocation to set.
+	 */
+	public void setMartURLLocation(MartURLLocation martURLLocation) {
+		this.martURLLocation = martURLLocation;
+	}
+
+	/**
+	 * Returns the virtualSchema of the martURLLocation. If the martURLLocation
+	 * is null, null is returned.
+	 * 
+	 * @return the virtualSchema of the martURLLocation
+	 */
+	public String getVirtualSchema() {
+		MartURLLocation martURLLocation = getMartURLLocation();
+		if (martURLLocation != null) {
+			return martURLLocation.getVirtualSchema();
+		} else {
+			return null;
+		}
+	}
+
+	/**
+	 * Returns the qualified name of this dataset in the format
+	 * 'virtualSchemaName.datasetName'. If there is no virtualSchema the
+	 * datasetName is returned.
+	 * 
+	 * @return the qualified name of this dataset
+	 */
+	public String getQualifiedName() {
+		String schema = getVirtualSchema();
+		if (schema != null) {
+			return schema + "." + getName();
+		} else {
+			return getName();
+		}
+	}
+
+	/**
+	 * Returns the display name.
+	 * 
+	 * @return the display name
+	 */
+	public String toString() {
+		return getDisplayName();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see java.lang.Object#hashCode()
+	 */
+	public int hashCode() {
+		final int PRIME = 31;
+		int result = 1;
+		result = PRIME
+				* result
+				+ ((getQualifiedName() == null) ? 0 : getQualifiedName()
+						.hashCode());
+		return result;
+	}
+
+	/**
+	 * Tests equality based on the qualified name.
+	 * 
+	 * @return true if the objects are equal based on the qualified name
+	 */
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if (obj == null)
+			return false;
+		if (getClass() != obj.getClass())
+			return false;
+		final MartDataset other = (MartDataset) obj;
+		if (getQualifiedName() == null) {
+			if (other.getQualifiedName() != null)
+				return false;
+		} else if (!getQualifiedName().equals(other.getQualifiedName()))
+			return false;
+		return true;
+	}
+
+	/**
+	 * Returns a Comparator that compares MartDatasets based on their display
+	 * names.
+	 * 
+	 * @return the display comparator
+	 */
+	public static Comparator<MartDataset> getDisplayComparator() {
+		return displayComparator;
+	}
+
+}
+
+/**
+ * Comparator that compares MartDatasets based on their display names.
+ * 
+ * @author David Withers
+ */
+class MartDatasetComparator implements Comparator<MartDataset> {
+
+	/**
+	 * Compares two MartDatasets based on their display names.
+	 * 
+	 * @param martDataset1
+	 *            the first MartDataset to be compared
+	 * @param martDataset2
+	 *            the second MartDataset to be compared
+	 * @return a negative integer, zero, or a positive integer as the first
+	 *         argument is less than, equal to, or greater than the second
+	 */
+	public int compare(MartDataset martDataset1, MartDataset martDataset2) {
+		return martDataset1.getDisplayName().compareTo(martDataset2.getDisplayName());
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-bioinformatics/blob/a87b4151/taverna-biomart-martservice/src/main/java/org/biomart/martservice/MartQuery.java
----------------------------------------------------------------------
diff --git a/taverna-biomart-martservice/src/main/java/org/biomart/martservice/MartQuery.java b/taverna-biomart-martservice/src/main/java/org/biomart/martservice/MartQuery.java
new file mode 100644
index 0000000..9f75566
--- /dev/null
+++ b/taverna-biomart-martservice/src/main/java/org/biomart/martservice/MartQuery.java
@@ -0,0 +1,436 @@
+/*
+ * 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: MartQuery.java,v $
+ * Revision           $Revision: 1.2 $
+ * Release status     $State: Exp $
+ * Last modified on   $Date: 2007/12/13 11:38:55 $
+ *               by   $Author: davidwithers $
+ * Created on 08-May-2006
+ *****************************************************************/
+package org.biomart.martservice;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.biomart.martservice.query.Attribute;
+import org.biomart.martservice.query.Dataset;
+import org.biomart.martservice.query.Filter;
+import org.biomart.martservice.query.Link;
+import org.biomart.martservice.query.Query;
+import org.ensembl.mart.lib.config.AttributeDescription;
+import org.ensembl.mart.lib.config.DatasetConfig;
+
+/**
+ * Class for creating queries to send to a BioMart web service.
+ * 
+ * @author David Withers
+ */
+public class MartQuery {
+	private MartService martService;
+
+	private MartDataset martDataset;
+
+	private Query query;
+
+	private Map<String, String> linkedDatasets = new HashMap<String, String>();
+
+	private String softwareVersion;
+
+	public MartQuery() {
+
+	}
+
+	public MartQuery(MartService martService, MartDataset martDataset, String requestId) {
+		String version = null;
+		try {
+			version = martService.getVersion(martDataset.getMartURLLocation());
+		} catch (MartServiceException e) {
+			//assume it's a pre 0.5 mart service
+		}
+		setMartService(martService);
+		setMartDataset(martDataset);
+		if (version == null || version.equals("0.4")) {
+			setQuery(new Query(martDataset.getVirtualSchema(), null, requestId));
+		} else {
+			setQuery(new Query(martDataset.getVirtualSchema(), version, requestId));
+		}
+	}
+
+	/**
+	 * @param martService
+	 * @param martDataset
+	 * @param query
+	 */
+	public MartQuery(MartService martService, MartDataset martDataset,
+			Query query) {
+		setMartService(martService);
+		setMartDataset(martDataset);
+		setQuery(query);
+	}
+
+	/**
+	 * Returns the martDataset.
+	 * 
+	 * @return the martDataset.
+	 */
+	public MartDataset getMartDataset() {
+		return martDataset;
+	}
+
+	/**
+	 * Sets the martDataset.
+	 * 
+	 * @param martDataset
+	 *            the martDataset to set.
+	 */
+	public void setMartDataset(MartDataset martDataset) {
+		this.martDataset = martDataset;
+	}
+
+	/**
+	 * Returns the martService.
+	 * 
+	 * @return the martService.
+	 */
+	public MartService getMartService() {
+		return martService;
+	}
+
+	/**
+	 * Sets the martService.
+	 * 
+	 * @param martService
+	 *            the martService to set.
+	 */
+	public void setMartService(MartService martService) {
+		this.martService = martService;
+	}
+
+	/**
+	 * Returns the query.
+	 * 
+	 * @return the query.
+	 */
+	public Query getQuery() {
+		return query;
+	}
+
+	/**
+	 * Sets the query.
+	 * 
+	 * @param query
+	 *            the query to set.
+	 */
+	public void setQuery(Query query) {
+		this.query = query;
+		softwareVersion = query.getSoftwareVersion();
+	}
+
+	/**
+	 * Adds the ID that links the specified dataset to the initial dataset.
+	 * 
+	 * @param datasetName
+	 *            the dataset
+	 * @param linkId
+	 *            the link ID
+	 */
+	public void addLinkedDataset(String datasetName, String linkId) {
+		linkedDatasets.put(datasetName, linkId);
+	}
+
+	/**
+	 * Removes a dataset and any datasets linked to it.
+	 * 
+	 * @param datasetName
+	 *            the dataset to remove
+	 */
+	public void removeLinkedDataset(String datasetName) {
+		linkedDatasets.remove(datasetName);
+		if (query.containsDataset(datasetName)) {
+			Dataset dataset = query.getDataset(datasetName);
+			dataset.removeAllAttributes();
+			dataset.removeAllFilters();
+			query.removeDataset(dataset);
+			for (Link link : query.getLinks(datasetName)) {
+				removeLinkedDataset(link.getTarget());
+			}
+
+		}
+		if (query.containsLink(datasetName)) {
+			query.removeLink(query.getLink(datasetName));
+		}
+	}
+
+	/**
+	 * Changes the ID that links a dataset. This method performs no function,
+	 * nor does it throw an exception, if the specified dataset does not exist.
+	 * 
+	 * @param datasetName
+	 *            the dataset
+	 * @param linkId
+	 *            the link ID
+	 */
+	public void changeLinkedDataset(String datasetName, String linkId) {
+		if (linkedDatasets.containsKey(datasetName)) {
+			linkedDatasets.put(datasetName, linkId);
+			if (query.containsLink(datasetName)) {
+				query.getLink(datasetName).setDefaultLink(linkId);
+			}
+		}
+	}
+
+	public Set<String> getLinkedDatasets() {
+		return linkedDatasets.keySet();
+	}
+
+	public String getLink(String datasetName) {
+		return (String) linkedDatasets.get(datasetName);
+	}
+
+	/**
+	 * Returns the Datasets that this Query contains in the order specified by
+	 * the links.
+	 * 
+	 * @return the Datasets that this Query contains in the order specified by
+	 *         the links
+	 */
+	public List<Dataset> getDatasetsInLinkOrder() {
+		if (query.getLinks().size() > 0) {
+			List<Dataset> datasets = new ArrayList<Dataset>();
+			datasets.addAll(getLinkedDatasets(martDataset.getName()));
+			// add other datasets
+			for (Dataset dataset : query.getDatasets()) {
+				if (!datasets.contains(dataset)) {
+					datasets.add(dataset);
+				}
+			}
+			return datasets;
+		} else {
+			return query.getDatasets();
+		}
+	}
+
+	/**
+	 * @param dataset
+	 * @return
+	 */
+	private List<Dataset> getLinkedDatasets(String dataset) {
+		List<Dataset> datasets = new ArrayList<Dataset>();
+		datasets.add(query.getDataset(dataset));
+		if (query.containsLink(dataset)) {
+			Link link = query.getLink(dataset);
+			if (!link.getTarget().equals(martDataset.getName())) {
+				datasets.addAll(getLinkedDatasets(link.getTarget()));
+			}
+		}
+		return datasets;
+	}
+
+	/**
+	 * Returns all the Attributes from all the Datasets in this Query in the
+	 * order specified by the links.
+	 * 
+	 * @return all the Attributes from all the Datasets in this Query in the
+	 *         order specified by the links
+	 */
+	public List<Attribute> getAttributesInLinkOrder() {
+		List<Attribute> attributes = new ArrayList<Attribute>();
+		List<Dataset> datasets;
+		if (softwareVersion == null) {
+			datasets = getDatasetsInLinkOrder();
+		} else {
+			datasets = query.getDatasets();
+		}
+		for (Dataset dataset : datasets) {
+			attributes.addAll(dataset.getAttributes());
+		}
+		return attributes;
+	}
+
+	/**
+	 * Adds an Attribute to the Dataset with the given datasetName. If the Query
+	 * has no Dataset with the given datasetName then a new Dataset is created.
+	 * 
+	 * @param datasetName
+	 *            the name of the Dataset to add the Attribute to
+	 * @param attribute
+	 *            the Attribute to add
+	 * @throws MartServiceException
+	 */
+	public void addAttribute(String datasetName, Attribute attribute) {
+		if (!query.containsDataset(datasetName)) {
+			Dataset dataset = new Dataset(datasetName);
+			if (datasetName.equals(martDataset.getName())) {
+				query.addDataset(0, dataset);
+			} else {
+				query.addDataset(dataset);
+			}
+		}
+		Dataset dataset = query.getDataset(datasetName);
+		dataset.addAttribute(attribute);
+	}
+
+	/**
+	 * Removes an Attribute from its containing Dataset.
+	 * 
+	 * @param attribute
+	 */
+	public void removeAttribute(Attribute attribute) {
+		Dataset dataset = attribute.getContainingDataset();
+		if (dataset != null) {
+			if (dataset.removeAttribute(attribute)) {
+				if (!dataset.hasAttributes() && !dataset.hasFilters()) {
+					Query query = dataset.getContainingQuery();
+					if (query != null) {
+						query.removeDataset(dataset);
+					}
+				}
+			}
+		}
+	}
+
+	/**
+	 * Adds a Filter to the Dataset with the given datasetName. If the Query has
+	 * no Dataset with the given datasetName then a new Dataset is created.
+	 * 
+	 * @param datasetName
+	 *            the name of the Dataset to add the Filter to
+	 * @param filter
+	 *            the Filter to add
+	 * @throws MartServiceException
+	 */
+	public void addFilter(String datasetName, Filter filter) {
+		if (!query.containsDataset(datasetName)) {
+			Dataset dataset = new Dataset(datasetName);
+			if (datasetName.equals(martDataset.getName())) {
+				query.addDataset(0, dataset);
+			} else {
+				query.addDataset(dataset);
+			}
+		}
+		Dataset dataset = query.getDataset(datasetName);
+		dataset.addFilter(filter);
+	}
+
+	/**
+	 * Removes a Filter from its containing Dataset.
+	 * 
+	 * @param filter
+	 */
+	public void removeFilter(Filter filter) {
+		Dataset dataset = filter.getContainingDataset();
+		if (dataset != null) {
+			if (dataset.removeFilter(filter)) {
+				if (!dataset.hasAttributes() && !dataset.hasFilters()) {
+					Query query = dataset.getContainingQuery();
+					if (query != null) {
+						query.removeDataset(dataset);
+					}
+				}
+			}
+		}
+	}
+
+	/**
+	 * @throws MartServiceException
+	 */
+	public void calculateLinks() throws MartServiceException {
+		if (softwareVersion == null) {
+			if (!martService.linksCalculated()) {
+				martService.calculateLinks();
+			}
+			for (Link link : query.getLinks()) {
+				query.removeLink(link);
+			}
+			for (Dataset dataset : query.getDatasets()) {
+				if (!martDataset.getName().equals(dataset.getName())) {
+					addLinks(dataset.getName());
+				}
+			}
+		}
+	}
+
+	/**
+	 * @param source
+	 * @throws MartServiceException
+	 */
+	public void addLinks(String source) throws MartServiceException {
+		MartDataset sourceDataset = martService.getDataset(martDataset
+				.getVirtualSchema(), source);
+		MartDataset targetDataset = martDataset;
+		List<MartDataset> path = martService.getPath(sourceDataset, targetDataset);
+		if (path == null) {
+			path = martService.getPath(targetDataset, sourceDataset);
+		}
+		if (path == null) {
+			throw new MartServiceException("No link between " + source
+					+ " and " + targetDataset.getName());
+		}
+		Iterator<MartDataset> iter = path.iterator();
+		if (iter.hasNext()) {
+			MartDataset lastDataset = (MartDataset) iter.next();
+			while (iter.hasNext()) {
+				MartDataset dataset = (MartDataset) iter.next();
+				DatasetLink link = martService.getLinkBetween(lastDataset,
+						dataset);
+				String linkId = link.getLinks()[0];
+				if (link.getLinks().length > 1) {
+					if (getLink(source) != null) {
+						linkId = getLink(source);
+					} else {
+						List<Attribute> attributes = query.getDataset(source)
+								.getAttributes();
+						if (attributes.size() > 0) {
+							Attribute attribute = (Attribute) attributes.get(0);
+							DatasetConfig config = martService
+									.getDatasetConfig(sourceDataset);
+							if (config.containsAttributeDescription(attribute
+									.getName())) {
+								AttributeDescription description = config
+										.getAttributeDescriptionByInternalName(attribute
+												.getName());
+								String datasetLink = description
+										.getDatasetLink();
+								if (datasetLink != null) {
+									linkId = datasetLink;
+								}
+							}
+						}
+					}
+				}
+				query.addLink(new Link(lastDataset.getName(),
+						dataset.getName(), linkId));
+				lastDataset = dataset;
+			}
+		}
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-bioinformatics/blob/a87b4151/taverna-biomart-martservice/src/main/java/org/biomart/martservice/MartRegistry.java
----------------------------------------------------------------------
diff --git a/taverna-biomart-martservice/src/main/java/org/biomart/martservice/MartRegistry.java b/taverna-biomart-martservice/src/main/java/org/biomart/martservice/MartRegistry.java
new file mode 100644
index 0000000..93bf04d
--- /dev/null
+++ b/taverna-biomart-martservice/src/main/java/org/biomart/martservice/MartRegistry.java
@@ -0,0 +1,96 @@
+/*
+ * 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: MartRegistry.java,v $
+ * Revision           $Revision: 1.2 $
+ * Release status     $State: Exp $
+ * Last modified on   $Date: 2007/12/13 11:38:55 $
+ *               by   $Author: davidwithers $
+ * Created on 17-Mar-2006
+ *****************************************************************/
+package org.biomart.martservice;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * The MartRegistry returned by a BioMart web service.
+ * 
+ * @author David Withers
+ */
+public class MartRegistry {
+	private List<MartURLLocation> martURLLocations = new ArrayList<MartURLLocation>();
+
+	/**
+	 * Returns the martURLLocations.
+	 * 
+	 * @return the martURLLocations.
+	 */
+	public MartURLLocation[] getMartURLLocations() {
+		return martURLLocations
+				.toArray(new MartURLLocation[martURLLocations.size()]);
+	}
+
+	/**
+	 * Adds a martURLLocation to the registry.
+	 * 
+	 * @param martURLLocations
+	 *            the martURLLocations to add.
+	 */
+	public void addMartURLLocation(MartURLLocation martURLLocation) {
+		martURLLocations.add(martURLLocation);
+	}
+
+	/* (non-Javadoc)
+	 * @see java.lang.Object#hashCode()
+	 */
+	public int hashCode() {
+		final int PRIME = 31;
+		int result = 1;
+		result = PRIME * result + ((martURLLocations == null) ? 0 : martURLLocations.hashCode());
+		return result;
+	}
+
+	/* (non-Javadoc)
+	 * @see java.lang.Object#equals(java.lang.Object)
+	 */
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if (obj == null)
+			return false;
+		if (getClass() != obj.getClass())
+			return false;
+		final MartRegistry other = (MartRegistry) obj;
+		if (martURLLocations == null) {
+			if (other.martURLLocations != null)
+				return false;
+		} else if (!martURLLocations.equals(other.martURLLocations))
+			return false;
+		return true;
+	}
+
+}