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