You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@taverna.apache.org by st...@apache.org on 2015/02/23 11:38:22 UTC
[14/17] incubator-taverna-plugin-bioinformatics git commit: Revert
"temporarily empty repository"
http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-bioinformatics/blob/a87b4151/taverna-biomart-martservice/src/main/java/org/biomart/martservice/MartService.java
----------------------------------------------------------------------
diff --git a/taverna-biomart-martservice/src/main/java/org/biomart/martservice/MartService.java b/taverna-biomart-martservice/src/main/java/org/biomart/martservice/MartService.java
new file mode 100644
index 0000000..c02bbb5
--- /dev/null
+++ b/taverna-biomart-martservice/src/main/java/org/biomart/martservice/MartService.java
@@ -0,0 +1,709 @@
+/*
+ * Copyright (C) 2003 The University of Manchester
+ *
+ * Modifications to the initial code base are copyright of their
+ * respective authors, or their employers as appropriate. Authorship
+ * of the modifications may be determined from the ChangeLog placed at
+ * the end of this file.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA.
+ *
+ ****************************************************************
+ * Source code information
+ * -----------------------
+ * Filename $RCSfile: MartService.java,v $errors/failure.html
+ * Revision $Revision: 1.7 $
+ * Release status $State: Exp $
+ * Last modified on $Date: 2008/08/11 12:48:29 $
+ * by $Author: davidwithers $
+ * Created on 17-Mar-2006
+ *****************************************************************/
+package org.biomart.martservice;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.lang.ref.SoftReference;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.zip.GZIPInputStream;
+import java.util.zip.GZIPOutputStream;
+
+import org.apache.log4j.Logger;
+import org.biomart.martservice.query.Query;
+import org.ensembl.mart.lib.config.ConfigurationException;
+import org.ensembl.mart.lib.config.DatasetConfig;
+import org.ensembl.mart.lib.config.DatasetConfigXMLUtils;
+import org.ensembl.mart.lib.config.Exportable;
+import org.ensembl.mart.lib.config.Importable;
+import org.jdom.Document;
+import org.jdom.JDOMException;
+import org.jdom.input.SAXBuilder;
+import org.xml.sax.InputSource;
+
+/**
+ * A class for interacting with a BioMart web service.
+ *
+ * @author David Withers
+ */
+public class MartService {
+ private static Logger logger = Logger.getLogger(MartServiceUtils.class);
+
+ private String location;
+
+ private String requestId;
+
+ private File cacheDirectory;
+
+ private MartRegistry registry;
+
+ private Map<MartURLLocation, String> versionMap = new HashMap<MartURLLocation, String>();
+
+ private Map<String, MartDataset[]> datasetsMap = new HashMap<String, MartDataset[]>();
+
+ private Map<String, SoftReference<DatasetConfig>> datasetConfigMap = new HashMap<String, SoftReference<DatasetConfig>>();
+
+ private Map<String, Importable[]> importablesMap = new HashMap<String, Importable[]>();
+
+ private Map<String, Exportable[]> exportablesMap = new HashMap<String, Exportable[]>();
+
+ private Map<MartDataset, List<DatasetLink>> linkableDatasetsMap = new HashMap<MartDataset, List<DatasetLink>>();
+
+ private Map<MartDataset, Set<DatasetLink>> datasetToLinkSetMap = new HashMap<MartDataset, Set<DatasetLink>>();
+
+ private Map<MartDataset, Map<MartDataset, MartDataset>> datasetsToPathMap = new HashMap<MartDataset, Map<MartDataset, MartDataset>>();
+
+ private static final Map<String, MartService> martServiceMap = new HashMap<String, MartService>();
+
+ private static final String fs = System.getProperty("file.separator");
+
+ private boolean linksCalculated = false;
+
+ /**
+ * Constructs an instance of a <code>MartService</code> with the specified
+ * location.
+ *
+ * The location must be the URL of a valid BioMart MartService, e.g.
+ * http://www.biomart.org/biomart/martservice
+ *
+ * @param location
+ * the URL of the MartService
+ */
+ private MartService(String location) {
+ this.location = location;
+ }
+
+ /**
+ * Returns a <code>MartService</code> for the specified location. If a
+ * <code>MartService</code> does not exist for the location a new one is
+ * constructed.
+ *
+ * The location must be the URL of a valid BioMart MartService, e.g.
+ * http://www.biomart.org/biomart/martservice
+ *
+ * @param location
+ * the URL of the MartService
+ */
+ public static MartService getMartService(String location) {
+ if (!martServiceMap.containsKey(location)) {
+ martServiceMap.put(location, new MartService(location));
+ }
+ return martServiceMap.get(location);
+ }
+
+ /**
+ * Returns the requestId.
+ *
+ * @return the requestId
+ */
+ public String getRequestId() {
+ return requestId;
+ }
+
+ /**
+ * Sets the requestId.
+ *
+ * @param requestId
+ * the new requestId
+ */
+ public void setRequestId(String requestId) {
+ this.requestId = requestId;
+ }
+
+ /**
+ * Returns the cacheDirectory.
+ *
+ * @return the cacheDirectory
+ */
+ public File getCacheDirectory() {
+ return cacheDirectory;
+ }
+
+ /**
+ * Sets the cacheDirectory.
+ *
+ * @param cacheDirectory
+ * the new cacheDirectory
+ */
+ public void setCacheDirectory(File cacheDirectory) {
+ this.cacheDirectory = cacheDirectory;
+ }
+
+ /**
+ * Returns the URL of the MartService.
+ *
+ * @return the URL of the MartService
+ */
+ public String getLocation() {
+ return location;
+ }
+
+ /**
+ * Removes any cached items.
+ */
+ public void clearCache() {
+ registry = null;
+ datasetsMap.clear();
+ datasetConfigMap.clear();
+ importablesMap.clear();
+ exportablesMap.clear();
+ }
+
+ /**
+ * Returns the MartRegistry for this MartService.
+ *
+ * @return the MartRegistry for this MartService
+ * @throws MartServiceException
+ * if the MartService returns an error or is unavailable
+ */
+ public MartRegistry getRegistry() throws MartServiceException {
+ if (registry == null) {
+ registry = MartServiceUtils.getRegistry(location, requestId);
+ }
+ return registry;
+ }
+
+ public String getVersion(MartURLLocation martURLLocation)
+ throws MartServiceException {
+ if (!versionMap.containsKey(martURLLocation)) {
+ versionMap.put(martURLLocation, MartServiceUtils.getVersion(
+ location, requestId, martURLLocation));
+ }
+ return versionMap.get(martURLLocation);
+ }
+
+ /**
+ * Returns all the datasets available from this MartService.
+ *
+ * @return all the datasets available from this MartService.
+ * @throws MartServiceException
+ * if the MartService returns an error or is unavailable
+ */
+ public MartDataset[] getDatasets() throws MartServiceException {
+ List<MartDataset> datasets = new ArrayList<MartDataset>();
+ MartURLLocation[] locations = getRegistry().getMartURLLocations();
+ for (int i = 0; i < locations.length; i++) {
+ datasets.addAll(Arrays.asList(getDatasets(locations[i])));
+ }
+ return datasets.toArray(new MartDataset[datasets.size()]);
+ }
+
+ /**
+ * Returns the datasets belonging to the virtualSchema.
+ *
+ * @param virtualSchema
+ * the virtual schema to include datasets from.
+ * @return the datasets belonging to the virtualSchema.
+ * @throws MartServiceException
+ * if the MartService returns an error or is unavailable
+ */
+ public MartDataset[] getDatasets(String virtualSchema)
+ throws MartServiceException {
+ List<MartDataset> datasets = new ArrayList<MartDataset>();
+ MartURLLocation[] locations = getRegistry().getMartURLLocations();
+ for (int i = 0; i < locations.length; i++) {
+ if (virtualSchema == null
+ || virtualSchema.equals(locations[i].getVirtualSchema())) {
+ datasets.addAll(Arrays.asList(getDatasets(locations[i])));
+ }
+ }
+ return datasets.toArray(new MartDataset[datasets.size()]);
+ }
+
+ /**
+ * Returns the datasets specified by martURLLocation.
+ *
+ * @param martURLLocation
+ * where to find the datasets.
+ * @return the datasets specified by martURLLocation.
+ * @throws MartServiceException
+ * if the MartService returns an error or is unavailable
+ */
+ public MartDataset[] getDatasets(MartURLLocation martURLLocation)
+ throws MartServiceException {
+ String name = martURLLocation.getName();
+ if (!datasetsMap.containsKey(name)) {
+ datasetsMap.put(name, MartServiceUtils.getDatasets(location,
+ requestId, martURLLocation));
+ }
+ return datasetsMap.get(name);
+ }
+
+ /**
+ * Returns the dataset specified by a virtualSchema and a dataset name.
+ *
+ * @param virtualSchema
+ * the virtualSchema containing the dataset
+ * @param datasetName
+ * the name of the dataset to return
+ * @return a dataset
+ * @throws MartServiceException
+ * if the MartService returns an error or is unavailable
+ */
+ public MartDataset getDataset(String virtualSchema, String datasetName)
+ throws MartServiceException {
+ MartDataset result = null;
+ MartDataset[] datasets = getDatasets(virtualSchema);
+ for (int i = 0; i < datasets.length; i++) {
+ if (datasetName.equals(datasets[i].getName())) {
+ result = datasets[i];
+ break;
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Returns the configuration for a dataset.
+ *
+ * @param dataset
+ * the dataset to get the configuration for
+ * @return the configuration for a dataset
+ * @throws MartServiceException
+ * if the MartService returns an error or is unavailable
+ */
+ public DatasetConfig getDatasetConfig(MartDataset dataset)
+ throws MartServiceException {
+ String qualifiedName = dataset.getQualifiedName();
+ DatasetConfig datasetConfig;
+ if (!datasetConfigMap.containsKey(qualifiedName)) {
+ if (dataset.getModified() != null && cacheDirectory != null) {
+ datasetConfig = getDatasetConfigFromCache(dataset);
+ } else {
+ datasetConfig = MartServiceUtils.getDatasetConfig(location,
+ requestId, dataset);
+ }
+ datasetConfigMap.put(qualifiedName,
+ new SoftReference<DatasetConfig>(datasetConfig));
+ } else {
+ datasetConfig = datasetConfigMap.get(qualifiedName).get();
+ if (datasetConfig == null) {
+ if (dataset.getModified() != null && cacheDirectory != null) {
+ datasetConfig = getDatasetConfigFromCache(dataset);
+ } else {
+ datasetConfig = MartServiceUtils.getDatasetConfig(location,
+ requestId, dataset);
+ }
+ datasetConfigMap.put(qualifiedName,
+ new SoftReference<DatasetConfig>(datasetConfig));
+ }
+
+ }
+ return datasetConfig;
+ }
+
+ private DatasetConfig getDatasetConfigFromCache(MartDataset dataset)
+ throws MartServiceException {
+ DatasetConfig datasetConfig = null;
+ MartURLLocation mart = dataset.getMartURLLocation();
+ String path = mart.getHost() + fs + mart.getName() + fs
+ + mart.getVirtualSchema();
+ File martCacheDir = new File(cacheDirectory, path);
+ martCacheDir.mkdirs();
+ File cache = new File(martCacheDir, dataset.getName() + ".cfg");
+ DatasetConfigXMLUtils datasetConfigXMLUtils = new DatasetConfigXMLUtils(
+ true);
+ if (cache.exists()) {
+ try {
+ SAXBuilder builder = new SAXBuilder();
+ Document doc = builder.build(new InputSource(
+ new GZIPInputStream(new FileInputStream(cache))));
+
+ // Document doc =
+ // datasetConfigXMLUtils.getDocumentForXMLStream(new
+ // FileInputStream(cache));
+
+ datasetConfig = datasetConfigXMLUtils
+ .getDatasetConfigForDocument(doc);
+ datasetConfigXMLUtils.loadDatasetConfigWithDocument(
+ datasetConfig, doc);
+ if (!datasetConfig.getModified().trim().equals(
+ dataset.getModified().trim())) {
+ logger.info(" " + datasetConfig.getModified().trim()
+ + " != " + dataset.getModified().trim());
+ logger.info(" Database: "
+ + dataset.getMartURLLocation().getDatabase()
+ + ", Dataset: " + dataset.getName());
+ datasetConfig = null;
+ }
+ } catch (IOException e) {
+ logger.debug("error reading cache from " + cache.getPath(), e);
+ datasetConfig = null;
+ } catch (ConfigurationException e) {
+ logger.debug("error parsing from " + cache.getPath(), e);
+ datasetConfig = null;
+ } catch (JDOMException e) {
+ logger.debug("error parsing from " + cache.getPath(), e);
+ datasetConfig = null;
+ }
+ }
+ if (datasetConfig == null) {
+ datasetConfig = MartServiceUtils.getDatasetConfig(location,
+ requestId, dataset);
+ try {
+ GZIPOutputStream zipOutputStream = new GZIPOutputStream(
+ new FileOutputStream(cache));
+ datasetConfigXMLUtils.writeDatasetConfigToOutputStream(
+ datasetConfig, zipOutputStream);
+ zipOutputStream.flush();
+ zipOutputStream.close();
+ } catch (IOException e) {
+ logger.debug("error writing cache to " + cache.getPath(), e);
+ } catch (ConfigurationException e) {
+ logger.debug("error writing cache to " + cache.getPath(), e);
+ }
+ }
+ return datasetConfig;
+ }
+
+ /**
+ * Returns the importables for a dataset.
+ *
+ * @param dataset
+ * @return the importables for a dataset
+ * @throws MartServiceException
+ * if the MartService returns an error or is unavailable
+ */
+ public Importable[] getImportables(MartDataset dataset)
+ throws MartServiceException {
+ String qualifiedName = dataset.getQualifiedName();
+ if (!importablesMap.containsKey(qualifiedName)) {
+ try {
+ importablesMap.put(qualifiedName, getDatasetConfig(dataset)
+ .getImportables());
+ } catch (MartServiceException e) {
+ return new Importable[0];
+ }
+ }
+ return importablesMap.get(qualifiedName);
+ }
+
+ /**
+ * Returns the exportables for a dataset.
+ *
+ * @param dataset
+ * @return the exportables for a dataset
+ * @throws MartServiceException
+ * if the MartService returns an error or is unavailable
+ */
+ public Exportable[] getExportables(MartDataset dataset)
+ throws MartServiceException {
+ String qualifiedName = dataset.getQualifiedName();
+ if (!exportablesMap.containsKey(qualifiedName)) {
+ try {
+ exportablesMap.put(qualifiedName, getDatasetConfig(dataset)
+ .getExportables());
+ } catch (MartServiceException e) {
+ return new Exportable[0];
+ }
+ }
+ return exportablesMap.get(qualifiedName);
+ }
+
+ /**
+ * Sends a <code>Query</code> to the MartService and returns the results
+ * of executing the query.
+ *
+ * The results are returned as an array of lists; one list for each
+ * attribute specified in the query.
+ *
+ * @param query
+ * the query to execute
+ * @return the results of executing the query
+ * @throws MartServiceException
+ * if the MartService returns an error or is unavailable
+ */
+ public Object[] executeQuery(Query query) throws MartServiceException {
+ // logger.info(MartServiceUtils.queryToXML(query));
+ return MartServiceUtils.getResults(location, requestId, query);
+ }
+
+ /**
+ * Sends a <code>Query</code> to the MartService and writes the results to
+ * the <code>ResultReceiver</code> as each line of the result stream is
+ * read.
+ *
+ * @param query
+ * @param resultReceiver
+ * @throws MartServiceException
+ * if the MartService returns an error or is unavailable
+ * @throws ResultReceiverException
+ * if the ResultReceiver cannot receive the result
+ * @see ResultReceiver
+ */
+ public void executeQuery(Query query, ResultReceiver resultReceiver)
+ throws MartServiceException, ResultReceiverException {
+ MartServiceUtils.putResults(location, requestId, query, resultReceiver);
+ }
+
+ /**
+ * Returns a list of datasets that can be linked to the specified dataset.
+ *
+ * @param martDataset
+ * @return datasets that can be linked to the specified dataset
+ * @throws MartServiceException
+ */
+ public List<DatasetLink> getLinkableDatasets(MartDataset martDataset)
+ throws MartServiceException {
+ if (!linkableDatasetsMap.containsKey(martDataset)) {
+ List<DatasetLink> linkableDatasets = new ArrayList<DatasetLink>();
+
+ Set<String> importableSet = new HashSet<String>();
+ Importable[] importables = getImportables(martDataset);
+ for (int i = 0; i < importables.length; i++) {
+ importableSet.add(importables[i].getLinkName());
+ }
+
+ MartDataset[] datasets = getDatasets(martDataset.getVirtualSchema());
+ for (int j = 0; j < datasets.length; j++) {
+ if (datasets[j].isVisible()
+ && !datasets[j].getName().equals(martDataset.getName())) {
+ DatasetLink datasetLink = new DatasetLink(datasets[j],
+ martDataset);
+ Exportable[] exportables = getExportables(datasets[j]);
+ for (int k = 0; k < exportables.length; k++) {
+ String link = exportables[k].getLinkName();
+ if (importableSet.contains(link)) {
+ datasetLink.addLink(link);
+ }
+ }
+ if (datasetLink.hasLinks()) {
+ linkableDatasets.add(datasetLink);
+ }
+ }
+ }
+ linkableDatasetsMap.put(martDataset, linkableDatasets);
+ }
+
+ return linkableDatasetsMap.get(martDataset);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ public boolean equals(Object obj) {
+ boolean result = false;
+ if (obj != null) {
+ MartService other = (MartService) obj;
+ if (location == null) {
+ result = other.location == null;
+ } else {
+ result = location.equals(other.location);
+ }
+ }
+ return result;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Object#hashCode()
+ */
+ public int hashCode() {
+ return location.hashCode();
+ }
+
+ public boolean linksCalculated() {
+ return linksCalculated;
+ }
+
+ // java implementation of the perl stuff that calculates links.
+ // all this should go for the next version of biomart.
+
+ public void calculateLinks() throws MartServiceException {
+ synchronized (location) {
+ if (!linksCalculated) {
+ datasetToLinkSetMap.clear();
+ datasetsToPathMap.clear();
+
+ MartDataset[] allDatasets = getDatasets();
+ for (int i = 0; i < allDatasets.length; i++) {
+ MartDataset[] datasets = getDatasets(allDatasets[i]
+ .getVirtualSchema());
+ for (int j = 0; j < datasets.length; j++) {
+ if (!allDatasets[i].getName().equals(
+ datasets[j].getName())) {
+ linkDatasets(allDatasets[i], datasets[j]);
+ }
+ }
+ }
+ for (int i = 0; i < allDatasets.length; i++) {
+ datasetsToPathMap.put(allDatasets[i],
+ dijkstra(allDatasets[i]));
+ }
+ linksCalculated = true;
+ }
+ }
+ }
+
+ public List<MartDataset> getPath(MartDataset source, MartDataset target) {
+ List<MartDataset> path = new ArrayList<MartDataset>();
+
+ Map<MartDataset, MartDataset> pathMap = datasetsToPathMap.get(source);
+
+ MartDataset currentDataset = target;
+
+ while (currentDataset != null) {
+ path.add(0, currentDataset);
+ currentDataset = (MartDataset) pathMap.get(currentDataset);
+ }
+
+ if (path.size() < 2 || !path.get(0).equals(source)
+ || !path.get(path.size() - 1).equals(target)) {
+ return null;
+ }
+
+ return path;
+ }
+
+ public DatasetLink getLinkBetween(MartDataset exportingDataset,
+ MartDataset importingDataset) {
+ Set<DatasetLink> links = datasetToLinkSetMap.get(exportingDataset);
+ for (DatasetLink link : links) {
+ MartDataset targetDataset = link.getTargetDataset();
+ if (importingDataset.equals(targetDataset)) {
+ return link;
+ }
+ }
+
+ return null;
+ }
+
+ public List<DatasetLink> getLinksFrom(MartDataset dataset) {
+ List<DatasetLink> linksFrom = new ArrayList<DatasetLink>();
+ Set<DatasetLink> links = datasetToLinkSetMap.get(dataset);
+ if (links != null) {
+ for (DatasetLink link : links) {
+ if (link.getSourceDataset().equals(dataset)) {
+ linksFrom.add(link);
+ }
+ }
+ }
+ return linksFrom;
+ }
+
+ public void linkDatasets(MartDataset source, MartDataset target)
+ throws MartServiceException {
+ DatasetLink datasetLink = new DatasetLink(source, target);
+ Importable[] importables = getImportables(target);
+ for (int i = 0; i < importables.length; i++) {
+ Exportable[] exportables = getExportables(source);
+ for (int j = 0; j < exportables.length; j++) {
+ if (importables[i].getLinkName().equals(
+ exportables[j].getLinkName())) {
+ String importVersion = importables[i].getLinkVersion();
+ String exportVersion = exportables[j].getLinkVersion();
+ if (importVersion != null && exportVersion != null) {
+ if (importVersion.equals(exportVersion)) {
+ datasetLink.addLink(importables[i].getLinkName());
+ }
+ } else {
+ datasetLink.addLink(importables[i].getLinkName());
+ }
+ }
+ }
+ }
+ if (datasetLink.hasLinks()) {
+ if (!datasetToLinkSetMap.containsKey(source)) {
+ datasetToLinkSetMap.put(source, new HashSet<DatasetLink>());
+ }
+ if (!datasetToLinkSetMap.containsKey(target)) {
+ datasetToLinkSetMap.put(target, new HashSet<DatasetLink>());
+ }
+ datasetToLinkSetMap.get(source).add(datasetLink);
+ datasetToLinkSetMap.get(target).add(datasetLink);
+ }
+ }
+
+ public Map<MartDataset, MartDataset> dijkstra(MartDataset dataset)
+ throws MartServiceException {
+ Map<MartDataset, MartDataset> path = new HashMap<MartDataset, MartDataset>();
+ LinkedList<MartDataset> vertices = new LinkedList<MartDataset>(Arrays
+ .asList(getDatasets(dataset.getVirtualSchema())));
+ Map<MartDataset, Integer> dist = new HashMap<MartDataset, Integer>();
+ for (MartDataset vertex : vertices) {
+ dist.put(vertex, new Integer(10000));
+ }
+
+ dist.put(dataset, new Integer(0));
+
+ while (vertices.size() > 0) {
+ int min_vert_idx = 0;
+ MartDataset min_vert = (MartDataset) vertices.get(min_vert_idx);
+ int min_dist = ((Integer) dist.get(min_vert)).intValue();
+
+ for (int vertex_idx = 0; vertex_idx < vertices.size(); vertex_idx++) {
+ MartDataset vertex = (MartDataset) vertices.get(vertex_idx);
+ if (((Integer) dist.get(vertex)).intValue() < min_dist) {
+ min_vert_idx = vertex_idx;
+ min_vert = vertex;
+ min_dist = ((Integer) dist.get(vertex)).intValue();
+ }
+ }
+
+ if (min_dist == 10000) {
+ // Exhausted a disjoint set of datasets.
+ break;
+ }
+
+ vertices.remove(min_vert_idx);
+
+ List<DatasetLink> edges = getLinksFrom(min_vert);
+ for (DatasetLink edge : edges) {
+ MartDataset vertex = edge.getTargetDataset();
+
+ if (((Integer) dist.get(vertex)).intValue() > ((Integer) dist
+ .get(min_vert)).intValue() + 1) {
+ dist.put(vertex, new Integer(((Integer) dist.get(min_vert))
+ .intValue() + 1));
+ path.put(vertex, min_vert);
+ }
+ }
+ }
+
+ return path;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-bioinformatics/blob/a87b4151/taverna-biomart-martservice/src/main/java/org/biomart/martservice/MartServiceException.java
----------------------------------------------------------------------
diff --git a/taverna-biomart-martservice/src/main/java/org/biomart/martservice/MartServiceException.java b/taverna-biomart-martservice/src/main/java/org/biomart/martservice/MartServiceException.java
new file mode 100644
index 0000000..f1f0639
--- /dev/null
+++ b/taverna-biomart-martservice/src/main/java/org/biomart/martservice/MartServiceException.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2003 The University of Manchester
+ *
+ * Modifications to the initial code base are copyright of their
+ * respective authors, or their employers as appropriate. Authorship
+ * of the modifications may be determined from the ChangeLog placed at
+ * the end of this file.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA.
+ *
+ ****************************************************************
+ * Source code information
+ * -----------------------
+ * Filename $RCSfile: MartServiceException.java,v $
+ * Revision $Revision: 1.1 $
+ * Release status $State: Exp $
+ * Last modified on $Date: 2007/01/31 14:12:05 $
+ * by $Author: davidwithers $
+ * Created on 05-May-2006
+ *****************************************************************/
+package org.biomart.martservice;
+
+/**
+ * Thrown when a MartService is inaccessable or returns an error.
+ *
+ * @author David Withers
+ */
+public class MartServiceException extends Exception {
+ private static final long serialVersionUID = 5535008907746588537L;
+
+ /**
+ * Constructs a new exception with no detail message.
+ *
+ */
+ public MartServiceException() {
+ super();
+ }
+
+ /**
+ * Constructs a new exception with the specified detail message.
+ *
+ * @param message
+ * the detail message
+ * @param cause
+ * the cause (a null value is permitted, and indicates that the
+ * cause is nonexistent or unknown)
+ */
+ public MartServiceException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ /**
+ * Constructs a new exception with the specified detail message and cause.
+ *
+ * @param message
+ * the detail message
+ */
+ public MartServiceException(String message) {
+ super(message);
+ }
+
+ /**
+ * Constructs a new exception with the specified cause.
+ *
+ * @param cause
+ * the cause (a null value is permitted, and indicates that the
+ * cause is nonexistent or unknown)
+ */
+ public MartServiceException(Throwable cause) {
+ super(cause);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-bioinformatics/blob/a87b4151/taverna-biomart-martservice/src/main/java/org/biomart/martservice/MartServiceUtils.java
----------------------------------------------------------------------
diff --git a/taverna-biomart-martservice/src/main/java/org/biomart/martservice/MartServiceUtils.java b/taverna-biomart-martservice/src/main/java/org/biomart/martservice/MartServiceUtils.java
new file mode 100644
index 0000000..cdcb400
--- /dev/null
+++ b/taverna-biomart-martservice/src/main/java/org/biomart/martservice/MartServiceUtils.java
@@ -0,0 +1,725 @@
+/*
+ * Copyright (C) 2003 The University of Manchester
+ *
+ * Modifications to the initial code base are copyright of their
+ * respective authors, or their employers as appropriate. Authorship
+ * of the modifications may be determined from the ChangeLog placed at
+ * the end of this file.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA.
+ *
+ ****************************************************************
+ * Source code information
+ * -----------------------
+ * Filename $RCSfile: MartServiceUtils.java,v $
+ * Revision $Revision: 1.12 $
+ * Release status $State: Exp $
+ * Last modified on $Date: 2008/07/31 15:06:49 $
+ * by $Author: davidwithers $
+ * Created on 17-Mar-2006
+ *****************************************************************/
+package org.biomart.martservice;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler;
+import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.HttpMethod;
+import org.apache.commons.httpclient.HttpStatus;
+import org.apache.commons.httpclient.NameValuePair;
+import org.apache.commons.httpclient.UsernamePasswordCredentials;
+import org.apache.commons.httpclient.auth.AuthScope;
+import org.apache.commons.httpclient.methods.GetMethod;
+import org.apache.commons.httpclient.methods.PostMethod;
+import org.apache.commons.httpclient.params.HttpMethodParams;
+import org.apache.commons.io.IOUtils;
+import org.apache.log4j.Logger;
+import org.biomart.martservice.query.Attribute;
+import org.biomart.martservice.query.Dataset;
+import org.biomart.martservice.query.Query;
+import org.biomart.martservice.query.QueryXMLHandler;
+import org.ensembl.mart.lib.config.ConfigurationException;
+import org.ensembl.mart.lib.config.DatasetConfig;
+import org.ensembl.mart.lib.config.DatasetConfigXMLUtils;
+import org.jdom.DocType;
+import org.jdom.Document;
+import org.jdom.Element;
+import org.jdom.JDOMException;
+import org.jdom.Namespace;
+import org.jdom.input.SAXBuilder;
+import org.jdom.output.XMLOutputter;
+import org.xml.sax.InputSource;
+
+/**
+ * Utility class for interacting with a BioMart web service.
+ *
+ * @author David Withers
+ */
+public class MartServiceUtils {
+ private static Logger logger = Logger.getLogger(MartServiceUtils.class);
+
+ private static String lineSeparator = System.getProperty("line.separator");
+
+ public static final String QUERY_ATTRIBUTE = "query";
+
+ public static final String DATASET_ATTRIBUTE = "dataset";
+
+ public static final String MART_ATTRIBUTE = "mart";
+
+ public static final String SCHEMA_ATTRIBUTE = "virtualschema";
+
+ public static final String TYPE_ATTRIBUTE = "type";
+
+ public static final String MART_USER_ATTRIBUTE = "martuser";
+
+ public static final String INTERFACE_ATTRIBUTE = "interface";
+
+ public static final String REQUEST_ID_ATTRIBUTE = "requestid";
+
+ public static final String REGISTRY_VALUE = "registry";
+
+ public static final String VERSION_VALUE = "version";
+
+ public static final String DATASETS_VALUE = "datasets";
+
+ public static final String DATASET_VALUE = "dataset";
+
+ public static final String CONFIGURATION_VALUE = "configuration";
+
+ /**
+ * Sends a registry request to the Biomart webservice and constructs a
+ * MartRegistry from the XML returned by the webservice.
+ *
+ * @param martServiceLocation
+ * the URL of the Biomart webservice
+ * @return a MartRegistry
+ * @throws MartServiceException
+ * if the Biomart webservice returns an error or is unavailable
+ */
+ public static MartRegistry getRegistry(String martServiceLocation,
+ String requestId) throws MartServiceException {
+ List<NameValuePair> data = new ArrayList<NameValuePair>();
+ data.add(new NameValuePair(TYPE_ATTRIBUTE, REGISTRY_VALUE));
+ if (requestId != null) {
+ data.add(new NameValuePair(REQUEST_ID_ATTRIBUTE, requestId));
+ }
+ HttpMethod method = new GetMethod(martServiceLocation);
+ method.setQueryString(data
+ .toArray(new NameValuePair[data.size()]));
+ try {
+ InputStream in = executeMethod(method, martServiceLocation);
+ Document document = new SAXBuilder().build(in);
+ Element root = document.getRootElement();
+ return MartServiceXMLHandler.elementToRegistry(root,
+ Namespace.NO_NAMESPACE);
+ } catch (IOException e) {
+ String errorMessage = "Error getting registry from "
+ + martServiceLocation;
+ throw new MartServiceException(errorMessage, e);
+ } catch (JDOMException e) {
+ String errorMessage = "Error getting registry from "
+ + martServiceLocation;
+ throw new MartServiceException(errorMessage, e);
+ } finally {
+ method.releaseConnection();
+ }
+
+ }
+
+ public static String getVersion(String martServiceLocation,
+ String requestId, MartURLLocation mart) throws MartServiceException {
+ String errorMessage = "Error getting version from " + martServiceLocation;
+
+ List<NameValuePair> data = new ArrayList<NameValuePair>();
+ data.add(new NameValuePair(TYPE_ATTRIBUTE, VERSION_VALUE));
+ if (mart.getVirtualSchema() != null) {
+ data.add(new NameValuePair(SCHEMA_ATTRIBUTE, mart
+ .getVirtualSchema()));
+ }
+ data.add(new NameValuePair(MART_ATTRIBUTE, mart.getName()));
+ if (requestId != null) {
+ data.add(new NameValuePair(REQUEST_ID_ATTRIBUTE, requestId));
+ }
+ if (requestId != null) {
+ data.add(new NameValuePair(REQUEST_ID_ATTRIBUTE, requestId));
+ }
+ HttpMethod method = new GetMethod(martServiceLocation);
+ method.setQueryString(data
+ .toArray(new NameValuePair[data.size()]));
+ try {
+ InputStream in = executeMethod(method, martServiceLocation);
+ BufferedReader bufferedReader = new BufferedReader(
+ new InputStreamReader(in));
+ String version = bufferedReader.readLine();
+ if (version == null) {
+ throw new MartServiceException(errorMessage + ": No version returned");
+ }
+ version = version.trim();
+ // fix for biomart's 'let's add a blank line' thing
+ if ("".equals(version)) {
+ version = bufferedReader.readLine();
+ if (version == null) {
+ throw new MartServiceException(errorMessage + ": No version returned");
+ }
+ version = version.trim();
+ }
+ bufferedReader.close();
+ return version;
+ } catch (IOException e) {
+ throw new MartServiceException(errorMessage, e);
+ } finally {
+ method.releaseConnection();
+ }
+ }
+
+ /**
+ * Sends a datasets request to the Biomart webservice and constructs an
+ * array of MartDataset from the tab separated rows of data returned by the
+ * webservice.
+ *
+ * @param martServiceLocation
+ * the URL of the Biomart webservice
+ * @param mart
+ * the mart to get datasets from
+ * @return an array of MartDataset
+ * @throws MartServiceException
+ * if the Biomart webservice returns an error or is unavailable
+ */
+ public static MartDataset[] getDatasets(String martServiceLocation,
+ String requestId, MartURLLocation mart) throws MartServiceException {
+ List<NameValuePair> data = new ArrayList<NameValuePair>();
+ data.add(new NameValuePair(TYPE_ATTRIBUTE, DATASETS_VALUE));
+ if (mart.getVirtualSchema() != null) {
+ data.add(new NameValuePair(SCHEMA_ATTRIBUTE, mart
+ .getVirtualSchema()));
+ }
+ data.add(new NameValuePair(MART_ATTRIBUTE, mart.getName()));
+ if (mart.getMartUser() != null) {
+ data
+ .add(new NameValuePair(MART_USER_ATTRIBUTE, mart
+ .getMartUser()));
+ }
+ if (requestId != null) {
+ data.add(new NameValuePair(REQUEST_ID_ATTRIBUTE, requestId));
+ }
+ HttpMethod method = new GetMethod(martServiceLocation);
+ method.setQueryString(data
+ .toArray(new NameValuePair[data.size()]));
+ try {
+ InputStream in = executeMethod(method, martServiceLocation);
+
+ MartDataset[] datasets = tabSeparatedReaderToDatasets(
+ new InputStreamReader(in), mart);
+ in.close();
+ return datasets;
+ } catch (IOException e) {
+ String errorMessage = "Error getting datasets from "
+ + martServiceLocation;
+ throw new MartServiceException(errorMessage, e);
+ } finally {
+ method.releaseConnection();
+ }
+ }
+
+ /**
+ * Sends a configuration request to the Biomart webservice and constructs a
+ * DatasetConfig from the XML returned by the webservice.
+ *
+ * @param martServiceLocation
+ * the URL of the Biomart webservice
+ * @param dataset
+ * the dataset to get the configuration for
+ * @return a DatasetConfig
+ * @throws MartServiceException
+ * if the Biomart webservice returns an error or is unavailable
+ */
+ public static DatasetConfig getDatasetConfig(String martServiceLocation,
+ String requestId, MartDataset dataset) throws MartServiceException {
+ List<NameValuePair> data = new ArrayList<NameValuePair>();
+ data.add(new NameValuePair(TYPE_ATTRIBUTE, CONFIGURATION_VALUE));
+ MartURLLocation mart = dataset.getMartURLLocation();
+ // if the dataset has a location specify the virtual schema to uniquely
+ // identify the dataset
+ if (mart != null && mart.getVirtualSchema() != null) {
+ data.add(new NameValuePair(SCHEMA_ATTRIBUTE, mart
+ .getVirtualSchema()));
+ }
+ data.add(new NameValuePair(DATASET_VALUE, dataset.getName()));
+// if (dataset.getInterface() != null) {
+// data.add(new NameValuePair(INTERFACE_ATTRIBUTE, dataset
+// .getInterface()));
+// }
+ if (mart != null && mart.getMartUser() != null) {
+ data
+ .add(new NameValuePair(MART_USER_ATTRIBUTE, mart
+ .getMartUser()));
+ }
+ if (requestId != null) {
+ data.add(new NameValuePair(REQUEST_ID_ATTRIBUTE, requestId));
+ }
+ HttpMethod method = new GetMethod(martServiceLocation);
+ method.setQueryString(data
+ .toArray(new NameValuePair[data.size()]));
+
+ try {
+ InputStream in = executeMethod(method, martServiceLocation);
+
+ DatasetConfigXMLUtils datasetConfigXMLUtils = new DatasetConfigXMLUtils(
+ true);
+ SAXBuilder builder = new SAXBuilder();
+ Document doc = builder.build(new InputSource(in));
+ // Document doc = datasetConfigXMLUtils.getDocumentForXMLStream(in);
+
+ DatasetConfig datasetConfig = datasetConfigXMLUtils
+ .getDatasetConfigForDocument(doc);
+ datasetConfigXMLUtils.loadDatasetConfigWithDocument(datasetConfig,
+ doc);
+ return datasetConfig;
+ } catch (ConfigurationException e) {
+ String errorMessage = "Error parsing configuration from "
+ + martServiceLocation;
+ logger.debug(errorMessage, e);
+ throw new MartServiceException(errorMessage, e);
+ } catch (JDOMException e) {
+ String errorMessage = "Error parsing configuration from "
+ + martServiceLocation;
+ logger.debug(errorMessage, e);
+ throw new MartServiceException(errorMessage, e);
+ } catch (IOException e) {
+ String errorMessage = "Error getting configuration from "
+ + martServiceLocation;
+ logger.debug(errorMessage, e);
+ throw new MartServiceException(errorMessage, e);
+ } finally {
+ method.releaseConnection();
+ }
+ }
+
+ /**
+ * Sends a query to the Biomart webservice and constructs an array of List
+ * of String results from the tab separated rows of data returned by the
+ * webservice.
+ *
+ * @param martServiceLocation
+ * the URL of the Biomart webservice
+ * @param query
+ * the query to send to the webservice
+ * @return an array of List of String
+ * @throws MartServiceException
+ * if the Biomart webservice returns an error or is unavailable
+ */
+ public static Object[] getResults(String martServiceLocation,
+ String requestId, Query query) throws MartServiceException {
+ Object[] results = new Object[0];
+ // int attributes = query.getAttributes().size();
+ int attributes = getAttributeCount(query.getAttributes());
+ boolean count = query.getCount() == 1;
+ // if there are no attributes and we're not doing a count there's no
+ // point in doing the query
+ if (attributes > 0 || count) {
+ // The 'new' 0.5 server now resolves the attribute lists so there's
+ // no need to do the split here any more
+ // String queryXml = queryToXML(splitAttributeLists(query));
+ String queryXml = queryToXML(query);
+ logger.info(queryXml);
+ NameValuePair[] data = { new NameValuePair(QUERY_ATTRIBUTE,
+ queryXml) };
+ PostMethod method = new PostMethod(martServiceLocation);
+ method.setRequestBody(data);
+
+ try {
+ InputStream in = executeMethod(method, martServiceLocation);
+ if (query.getFormatter() == null) {
+ results = tabSeparatedReaderToResults(
+ new InputStreamReader(in), count ? 1 : attributes);
+ if (!count) {
+ results = reassembleAttributeLists(results, query);
+ }
+ } else {
+ results = readResult(in, query.getFormatter());
+ }
+ in.close();
+ } catch (IOException e) {
+ String errorMessage = "Error reading data from "
+ + martServiceLocation;
+ throw new MartServiceException(errorMessage, e);
+ } finally {
+ method.releaseConnection();
+ }
+
+ }
+
+ return results;
+ }
+
+ public static void putResults(String martServiceLocation, String requestId,
+ Query query, ResultReceiver resultReceiver) throws MartServiceException, ResultReceiverException {
+ int attributeCount = getAttributeCount(query.getAttributes());
+ boolean count = query.getCount() == 1;
+ // if there are no attributes and we're not doing a count there's no
+ // point in doing the query
+ if (attributeCount > 0 || count) {
+ String queryXml = queryToXML(query);
+ logger.info(queryXml);
+ NameValuePair[] data = { new NameValuePair(QUERY_ATTRIBUTE,
+ queryXml) };
+ PostMethod method = new PostMethod(martServiceLocation);
+ method.setRequestBody(data);
+
+ try {
+ InputStream in = executeMethod(method, martServiceLocation);
+ if (query.getFormatter() == null) {
+ if (count) {
+ resultReceiver.receiveResult(tabSeparatedReaderToResults(new InputStreamReader(in), 1), 0);
+ } else {
+ List<Attribute> attributes = query.getAttributes();
+ Object[] result = new Object[attributes.size()];
+ BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in));
+ String line = bufferedReader.readLine();
+ for (long i = 0; line != null; line = bufferedReader.readLine(), i++) {
+ String[] tokens = line.split("\t", -1);
+ if (attributeCount == tokens.length) {
+ for (int ri = 0, ti = 0; ri < result.length && ti < tokens.length; ri++) {
+ Attribute attribute = attributes.get(ri);
+ if (attribute.getAttributes() == null) {
+ result[ri] = tokens[ti];
+ ti++;
+ } else {
+ int nestedAttributeCount = attribute.getAttributesCount();
+ List<Object> list = new ArrayList<Object>();
+ for (int j = 0; j < nestedAttributeCount; j++) {
+ list.add(tokens[ti]);
+ ti++;
+ }
+ result[ri] = list;
+ }
+ }
+ resultReceiver.receiveResult(result, i);
+ } else {
+ resultReceiver.receiveError(line, i);
+ }
+ }
+ }
+ } else {
+ resultReceiver.receiveResult(readResult(in, query.getFormatter()), 0);
+ }
+ in.close();
+ } catch (IOException e) {
+ String errorMessage = "Error reading data from "
+ + martServiceLocation;
+ throw new MartServiceException(errorMessage, e);
+ } finally {
+ method.releaseConnection();
+ }
+
+ }
+ }
+
+// private static String getLocation(MartURLLocation martUrlLocation) {
+// StringBuffer location = new StringBuffer("http://");
+// location.append(martUrlLocation.getHost());
+// location.append(":" + martUrlLocation.getPort());
+// location.append(martUrlLocation.getPath());
+// return location.toString();
+// }
+
+ private static int getAttributeCount(List<Attribute> attributeList) {
+ int result = 0;
+ for (Attribute attribute : attributeList) {
+ if (attribute.getAttributes() == null) {
+ result++;
+ } else {
+ result += attribute.getAttributesCount();
+ }
+ }
+ return result;
+ }
+
+ private static Object[] reassembleAttributeLists(Object[] lists, Query query) {
+ int index = 0;
+ List<Object> result = new ArrayList<Object>();
+ for (Attribute attribute : query.getAttributes()) {
+ if (attribute.getAttributes() == null) {
+ result.add(lists[index]);
+ index++;
+ } else {
+ int attributesCount = attribute.getAttributesCount();
+ List<Object> list = new ArrayList<Object>();
+ for (int i = 0; i < attributesCount; i++) {
+ list.add(lists[index]);
+ index++;
+ }
+ result.add(list);
+ }
+ }
+ return result.toArray();
+ }
+
+ public static Query splitAttributeLists(Query query) {
+ Query result = new Query(query);
+ for (Dataset dataset : result.getDatasets()) {
+ List<Attribute> attributeList = dataset.getAttributes();
+ dataset.removeAllAttributes();
+ for (Attribute attribute : attributeList) {
+ if (attribute.getAttributes() == null) {
+ dataset.addAttribute(attribute);
+ } else {
+ String[] attributes = attribute.getAttributes().split(",");
+ for (int i = 0; i < attributes.length; i++) {
+ dataset.addAttribute(new Attribute(attributes[i]));
+ }
+ }
+ }
+ }
+ return result;
+ }
+
+ public static String getMimeTypeForFormatter(String formatter) {
+ String mimeType = "'text/plain'";
+ if ("ADF".equals(formatter)) {
+ mimeType = "'text/plain'";
+ } else if ("AXT".equals(formatter)) {
+ mimeType = "'text/plain'";
+ } else if ("AXTPLUS".equals(formatter)) {
+ mimeType = "'text/plain'";
+ } else if ("CSV".equals(formatter)) {
+ mimeType = "'text/plain'";
+ } else if ("FASTA".equals(formatter)) {
+ mimeType = "'text/plain'";
+ } else if ("FASTACDNA".equals(formatter)) {
+ mimeType = "'text/plain'";
+ } else if ("GFF".equals(formatter)) {
+ mimeType = "'text/plain'";
+ } else if ("HTML".equals(formatter)) {
+ mimeType = "'text/html'";
+ } else if ("MAF".equals(formatter)) {
+ mimeType = "'text/plain'";
+ } else if ("MFA".equals(formatter)) {
+ mimeType = "'text/plain'";
+ } else if ("MFASTA".equals(formatter)) {
+ mimeType = "'text/plain'";
+ } else if ("TSV".equals(formatter)) {
+ mimeType = "'text/tab-separeted-values'";
+ } else if ("TXT".equals(formatter)) {
+ mimeType = "'text/plain'";
+ } else if ("XLS".equals(formatter)) {
+ mimeType = "'application/excel'";
+ }
+
+ return mimeType;
+ }
+
+ private static List<String>[] tabSeparatedReaderToResults(Reader reader,
+ int resultsCount) throws IOException {
+ List<String>[] results = new List[resultsCount];
+ for (int i = 0; i < results.length; i++) {
+ results[i] = new ArrayList<String>();
+ }
+ BufferedReader bufferedReader = new BufferedReader(reader);
+ String line = bufferedReader.readLine();
+ while (line != null) {
+ String[] tokens = line.split("\t", -1);
+ for (int i = 0; i < results.length && i < tokens.length; i++) {
+ results[i].add(tokens[i]);
+ }
+ line = bufferedReader.readLine();
+ }
+ return results;
+ }
+
+ private static Object[] readResult(InputStream inputStream, String formatter) throws IOException {
+ Object[] result = new Object[1];
+
+ if (getMimeTypeForFormatter(formatter).contains("application/")) {
+ result[0] = IOUtils.toByteArray(inputStream);
+ } else {
+ result[0] = IOUtils.toString(inputStream);
+ }
+ return result;
+ }
+
+ private static MartDataset[] tabSeparatedReaderToDatasets(Reader reader,
+ MartURLLocation martURLLocation) throws IOException {
+ List<MartDataset> datasetList = new ArrayList<MartDataset>();
+ BufferedReader bufferedReader = new BufferedReader(reader);
+ String line = bufferedReader.readLine();
+ while (line != null) {
+ String[] tokens = line.split("\t");
+
+ if (tokens.length >= 7) {
+ MartDataset dataset = new MartDataset();
+
+ dataset.setType(tokens[0]);
+ dataset.setName(tokens[1]);
+ dataset.setDisplayName(tokens[2]);
+ if (tokens[3].equals("1")) {
+ dataset.setVisible(true);
+ } else {
+ dataset.setVisible(false);
+ }
+ // value at position 4 is not documented so it's skipped
+ try {
+ dataset.setInitialBatchSize(Long.parseLong(tokens[5]));
+ } catch (NumberFormatException e) {
+ dataset.setInitialBatchSize(0);
+ }
+ try {
+ dataset.setMaximumBatchSize(Long.parseLong(tokens[6]));
+ } catch (NumberFormatException e) {
+ dataset.setMaximumBatchSize(0);
+ }
+
+ if (tokens.length > 7) {
+ dataset.setInterface(tokens[7]);
+ dataset.setModified(tokens[8]);
+ }
+
+ dataset.setMartURLLocation(martURLLocation);
+
+ datasetList.add(dataset);
+ }
+ line = bufferedReader.readLine();
+ }
+ return datasetList.toArray(new MartDataset[datasetList.size()]);
+ }
+
+ /**
+ * Creates an XML string from a query
+ *
+ * @param query
+ * @return an XML string
+ */
+ public static String queryToXML(Query query) {
+ Document document = new Document(QueryXMLHandler.queryToElement(query,
+ Namespace.NO_NAMESPACE), new DocType("Query"));
+ return new XMLOutputter().outputString(document);
+ }
+
+ /**
+ * @param martServiceLocation
+ * @param data
+ * @return
+ * @throws MartServiceException
+ */
+ private static InputStream executeMethod(HttpMethod method,
+ String martServiceLocation) throws MartServiceException {
+ HttpClient client = new HttpClient();
+ if (isProxyHost(martServiceLocation)) {
+ setProxy(client);
+ }
+
+ method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
+ new DefaultHttpMethodRetryHandler(3, false));
+// method.getParams().setSoTimeout(60000);
+ try {
+ int statusCode = client.executeMethod(method);
+ if (statusCode != HttpStatus.SC_OK) {
+ throw constructException(method, martServiceLocation, null);
+ }
+ return method.getResponseBodyAsStream();
+ } catch (IOException e) {
+ throw constructException(method, martServiceLocation, e);
+ }
+ }
+
+ /**
+ *
+ * @param client
+ */
+ public static void setProxy(HttpClient client) {
+ String host = System.getProperty("http.proxyHost");
+ String port = System.getProperty("http.proxyPort");
+ String user = System.getProperty("http.proxyUser");
+ String password = System.getProperty("http.proxyPassword");
+
+ if (host != null && port != null) {
+ try {
+ int portInteger = Integer.parseInt(port);
+ client.getHostConfiguration().setProxy(host, portInteger);
+ if (user != null && password != null) {
+ client.getState().setProxyCredentials(
+ new AuthScope(host, portInteger),
+ new UsernamePasswordCredentials(user, password));
+ }
+ } catch (NumberFormatException e) {
+ logger.error("Proxy port not an integer", e);
+ }
+ }
+ }
+
+ public static boolean isProxyHost(String location) {
+ String httpNonProxyHosts = System.getProperty("http.nonProxyHosts");
+ if (httpNonProxyHosts != null) {
+ try {
+ String host = new URL(location).getHost();
+ String[] nonProxyHosts = httpNonProxyHosts.split("\\|");
+ for (int i = 0; i < nonProxyHosts.length; i++) {
+ if (nonProxyHosts[i].startsWith("*")) {
+ if (host.endsWith(nonProxyHosts[i].substring(1))) {
+ return false;
+ }
+ } else if (nonProxyHosts[i].endsWith("*")) {
+ if (host.startsWith(nonProxyHosts[i].substring(0,
+ nonProxyHosts[i].length() - 1))) {
+ return false;
+ }
+ } else {
+ if (host.equals(nonProxyHosts[i])) {
+ return false;
+ }
+ }
+ }
+ } catch (MalformedURLException e) {
+ logger.warn("'" + location + "' is not a valid URL. "
+ + "Cannot compare host with http.nonProxyHosts", e);
+ }
+ }
+ return true;
+ }
+
+ private static MartServiceException constructException(HttpMethod method,
+ String martServiceLocation, Exception cause) {
+ StringBuffer errorMessage = new StringBuffer();
+ errorMessage.append("Error posting to " + martServiceLocation
+ + lineSeparator);
+ if (cause == null) {
+ errorMessage.append(" " + method.getStatusLine()
+ + lineSeparator);
+ }
+ if (method instanceof PostMethod) {
+ PostMethod postMethod = (PostMethod) method;
+ NameValuePair[] data = postMethod.getParameters();
+ for (int i = 0; i < data.length; i++) {
+ errorMessage.append(" " + data[i].getName() + " = "
+ + data[i].getValue()
+ + lineSeparator);
+ }
+
+ } else {
+ errorMessage.append(method.getQueryString());
+ }
+ return new MartServiceException(errorMessage.toString(), cause);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-bioinformatics/blob/a87b4151/taverna-biomart-martservice/src/main/java/org/biomart/martservice/MartServiceXMLHandler.java
----------------------------------------------------------------------
diff --git a/taverna-biomart-martservice/src/main/java/org/biomart/martservice/MartServiceXMLHandler.java b/taverna-biomart-martservice/src/main/java/org/biomart/martservice/MartServiceXMLHandler.java
new file mode 100644
index 0000000..e8a5189
--- /dev/null
+++ b/taverna-biomart-martservice/src/main/java/org/biomart/martservice/MartServiceXMLHandler.java
@@ -0,0 +1,390 @@
+/*
+ * Copyright (C) 2003 The University of Manchester
+ *
+ * Modifications to the initial code base are copyright of their
+ * respective authors, or their employers as appropriate. Authorship
+ * of the modifications may be determined from the ChangeLog placed at
+ * the end of this file.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA.
+ *
+ ****************************************************************
+ * Source code information
+ * -----------------------
+ * Filename $RCSfile: MartServiceXMLHandler.java,v $
+ * Revision $Revision: 1.4 $
+ * Release status $State: Exp $
+ * Last modified on $Date: 2007/12/13 11:38:55 $
+ * by $Author: davidwithers $
+ * Created on 28-Apr-2006
+ *****************************************************************/
+package org.biomart.martservice;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import org.biomart.martservice.query.QueryXMLHandler;
+import org.jdom.Element;
+import org.jdom.Namespace;
+
+/**
+ * Utility class for serializing mart service classes to XML.
+ *
+ * @author David Withers
+ */
+public class MartServiceXMLHandler {
+ public static final String MART_SERVICE_ELEMENT = "MartService";
+
+ public static final String MART_URL_LOCATION_ELEMENT = "MartURLLocation";
+
+ public static final String MART_DATASET_ELEMENT = "MartDataset";
+
+ public static final String MART_QUERY_ELEMENT = "MartQuery";
+
+ public static final String LINKED_DATASETS_ELEMENT = "LinkedDatasets";
+
+ public static final String LINKED_DATASET_ELEMENT = "LinkedDataset";
+
+ public static final String VIRTUAL_SCHEMA_ELEMENT = "virtualSchema";
+
+ public static final String LOCATION_ATTRIBUTE = "location";
+
+ public static final String DATABASE_ATTRIBUTE = "database";
+
+ public static final String DEFAULT_ATTRIBUTE = "default";
+
+ public static final String DEFAULT_VALUE_ATTRIBUTE = "defaultValue";
+
+ public static final String DISPLAY_NAME_ATTRIBUTE = "displayName";
+
+ public static final String HOST_ATTRIBUTE = "host";
+
+ public static final String INCLUDE_DATASETS_ATTRIBUTE = "includeDatasets";
+
+ public static final String LINK_ATTRIBUTE = "LINK";
+
+ public static final String MART_USER_ATTRIBUTE = "martUser";
+
+ public static final String NAME_ATTRIBUTE = "name";
+
+ public static final String PATH_ATTRIBUTE = "path";
+
+ public static final String PORT_ATTRIBUTE = "port";
+
+ public static final String TYPE_ATTRIBUTE = "type";
+
+ public static final String INITIAL_BATCH_SIZE_ATTRIBUTE = "initialBatchSize";
+
+ public static final String MAXIMUM_BATCH_SIZE_ATTRIBUTE = "maximumBatchSize";
+
+ public static final String VIRTUAL_SCHEMA_ATTRIBUTE = "virtualSchema";
+
+ public static final String SERVER_VIRTUAL_SCHEMA_ATTRIBUTE = "serverVirtualSchema";
+
+ public static final String VISIBLE_ATTRIBUTE = "visible";
+
+ public static final String REDIRECT_ATTRIBUTE = "redirect";
+
+ public static final String INTERFACE_ATTRIBUTE = "interface";
+
+ public static final String MODIFIED_ATTRIBUTE = "modified";
+
+ /**
+ * Converts a <code>MartService</code> to an XML element.
+ *
+ * @param martService
+ * the <code>MartService</code> to serialize
+ * @param namespace
+ * the <code>Namespace</code> to use when constructing the
+ * <code>Element</code>
+ * @return an XML serialization of the <code>MartService</code>
+ */
+ public static Element martServiceToElement(MartService martService,
+ Namespace namespace) {
+ Element element = new Element(MART_SERVICE_ELEMENT, namespace);
+ element.setAttribute(LOCATION_ATTRIBUTE, martService.getLocation());
+ return element;
+ }
+
+ /**
+ * Creates a <code>MartService</code> from an XML element.
+ *
+ * @param element
+ * the <code>Element</code> to deserialize
+ * @return a deserialized <code>MartService</code>
+ */
+ public static MartService elementToMartService(Element element) {
+ return MartService.getMartService(element
+ .getAttributeValue(LOCATION_ATTRIBUTE));
+ }
+
+ /**
+ * Converts a <code>MartDataset</code> to an XML element.
+ *
+ * @param dataset
+ * the <code>MartDataset</code> to serialize
+ * @param namespace
+ * the <code>Namespace</code> to use when constructing the
+ * <code>Element</code>
+ * @return an XML serialization of the <code>MartDataset</code>
+ */
+ public static Element datasetToElement(MartDataset dataset,
+ Namespace namespace) {
+ Element element = new Element(MART_DATASET_ELEMENT, namespace);
+ element.setAttribute(DISPLAY_NAME_ATTRIBUTE, dataset.getDisplayName());
+ element.setAttribute(NAME_ATTRIBUTE, dataset.getName());
+ element.setAttribute(TYPE_ATTRIBUTE, dataset.getType());
+ element.setAttribute(INITIAL_BATCH_SIZE_ATTRIBUTE, String
+ .valueOf(dataset.getInitialBatchSize()));
+ element.setAttribute(MAXIMUM_BATCH_SIZE_ATTRIBUTE, String
+ .valueOf(dataset.getMaximumBatchSize()));
+ element.setAttribute(VISIBLE_ATTRIBUTE, String.valueOf(dataset
+ .isVisible()));
+ if (dataset.getInterface() != null) {
+ element.setAttribute(INTERFACE_ATTRIBUTE, dataset.getInterface());
+ }
+ if (dataset.getModified() != null) {
+ element.setAttribute(MODIFIED_ATTRIBUTE, dataset.getModified());
+ }
+ element.addContent(locationToElement(dataset.getMartURLLocation(),
+ namespace));
+ return element;
+ }
+
+ /**
+ * Creates a <code>MartDataset</code> from an XML element.
+ *
+ * @param element
+ * the <code>Element</code> to deserialize
+ * @param namespace
+ * the <code>Namespace</code> containing the
+ * <code>Element</code>
+ * @return a deserialized <code>MartDataset</code>
+ */
+ public static MartDataset elementToDataset(Element element,
+ Namespace namespace) {
+ MartDataset dataset = new MartDataset();
+ dataset.setDisplayName(element
+ .getAttributeValue(DISPLAY_NAME_ATTRIBUTE));
+ dataset.setName(element.getAttributeValue(NAME_ATTRIBUTE));
+ dataset.setType(element.getAttributeValue(TYPE_ATTRIBUTE));
+ dataset.setInitialBatchSize(Long.parseLong(element
+ .getAttributeValue(INITIAL_BATCH_SIZE_ATTRIBUTE)));
+ dataset.setMaximumBatchSize(Long.parseLong(element
+ .getAttributeValue(MAXIMUM_BATCH_SIZE_ATTRIBUTE)));
+ dataset.setVisible(Boolean.getBoolean(element
+ .getAttributeValue(VISIBLE_ATTRIBUTE)));
+ dataset.setInterface(element.getAttributeValue(INTERFACE_ATTRIBUTE));
+ dataset.setModified(element.getAttributeValue(MODIFIED_ATTRIBUTE));
+ dataset.setMartURLLocation(elementToLocation(element.getChild(
+ MART_URL_LOCATION_ELEMENT, namespace)));
+ return dataset;
+ }
+
+ /**
+ * Creates a <code>MartRegistry</code> from an XML element.
+ *
+ * @param element
+ * the <code>Element</code> to deserialize
+ * @param namespace
+ * the <code>Namespace</code> containing the
+ * <code>Element</code>
+ * @return a deserialized <code>MartRegistry</code>
+ */
+ public static MartRegistry elementToRegistry(Element root,
+ Namespace namespace) {
+ MartRegistry registry = new MartRegistry();
+ List<Element> children = root.getChildren();
+ for (Element childElement : children) {
+ if (childElement.getNamespace().equals(namespace)) {
+ if (childElement.getName().equals(MART_URL_LOCATION_ELEMENT)) {
+ MartURLLocation martURLLocation = MartServiceXMLHandler
+ .elementToLocation(childElement);
+ martURLLocation.setVirtualSchema("default");
+ registry.addMartURLLocation(martURLLocation);
+ } else if (childElement.getName()
+ .equals(VIRTUAL_SCHEMA_ELEMENT)) {
+ String virtualSchema = childElement
+ .getAttributeValue(NAME_ATTRIBUTE);
+ List<Element> locations = childElement.getChildren(
+ MART_URL_LOCATION_ELEMENT, namespace);
+ for (Element location : locations) {
+ MartURLLocation martURLLocation = MartServiceXMLHandler
+ .elementToLocation(location);
+ martURLLocation.setVirtualSchema(virtualSchema);
+ registry.addMartURLLocation(martURLLocation);
+ }
+ }
+ }
+ }
+ return registry;
+ }
+
+ /**
+ * Converts a <code>MartURLLocation</code> to an XML element.
+ *
+ * @param location
+ * the <code>MartURLLocation</code> to serialize
+ * @param namespace
+ * the <code>Namespace</code> to use when constructing the
+ * <code>Element</code>
+ * @return an XML serialization of the <code>MartURLLocation</code>
+ */
+ public static Element locationToElement(MartURLLocation location,
+ Namespace namespace) {
+ Element element = new Element(MART_URL_LOCATION_ELEMENT, namespace);
+ if (location.getDatabase() != null) {
+ element.setAttribute(DATABASE_ATTRIBUTE, location.getDatabase());
+ }
+ element.setAttribute(DEFAULT_ATTRIBUTE, location.isDefault() ? "1"
+ : "0");
+ element.setAttribute(DISPLAY_NAME_ATTRIBUTE, location.getDisplayName());
+ element.setAttribute(HOST_ATTRIBUTE, location.getHost());
+ if (location.getIncludeDatasets() != null) {
+ element.setAttribute(INCLUDE_DATASETS_ATTRIBUTE, location
+ .getIncludeDatasets());
+ }
+ if (location.getMartUser() != null) {
+ element.setAttribute(MART_USER_ATTRIBUTE, location.getMartUser());
+ }
+ element.setAttribute(NAME_ATTRIBUTE, location.getName());
+ if (location.getPath() != null) {
+ element.setAttribute(PATH_ATTRIBUTE, location.getPath());
+ }
+ element
+ .setAttribute(PORT_ATTRIBUTE, String
+ .valueOf(location.getPort()));
+ element.setAttribute(SERVER_VIRTUAL_SCHEMA_ATTRIBUTE, location
+ .getServerVirtualSchema());
+ if (location.getVirtualSchema() != null) {
+ element.setAttribute(VIRTUAL_SCHEMA_ATTRIBUTE, location
+ .getVirtualSchema());
+ }
+ element.setAttribute(VISIBLE_ATTRIBUTE, location.isVisible() ? "1"
+ : "0");
+ element.setAttribute(REDIRECT_ATTRIBUTE, location.isRedirect() ? "1"
+ : "0");
+ return element;
+ }
+
+ /**
+ * Creates a <code>MartURLLocation</code> from an XML element.
+ *
+ * @param element
+ * the <code>Element</code> to deserialize
+ * @return a deserialized <code>MartURLLocation</code>
+ */
+ public static MartURLLocation elementToLocation(Element element) {
+ MartURLLocation location = new MartURLLocation();
+ location.setDatabase(element.getAttributeValue(DATABASE_ATTRIBUTE));
+ location.setDefault("1".equals(element
+ .getAttributeValue(DEFAULT_ATTRIBUTE)));
+ location.setDisplayName(element
+ .getAttributeValue(DISPLAY_NAME_ATTRIBUTE));
+ location.setHost(element.getAttributeValue(HOST_ATTRIBUTE));
+ location.setIncludeDatasets(element
+ .getAttributeValue(INCLUDE_DATASETS_ATTRIBUTE));
+ location.setMartUser(element.getAttributeValue(MART_USER_ATTRIBUTE));
+ location.setName(element.getAttributeValue(NAME_ATTRIBUTE));
+ location.setPath(element.getAttributeValue(PATH_ATTRIBUTE));
+ try {
+ location.setPort(Integer.parseInt(element
+ .getAttributeValue(PORT_ATTRIBUTE)));
+ } catch (NumberFormatException e) {
+ location.setPort(80);
+ }
+ location.setServerVirtualSchema(element
+ .getAttributeValue(SERVER_VIRTUAL_SCHEMA_ATTRIBUTE));
+ location.setVirtualSchema(element
+ .getAttributeValue(VIRTUAL_SCHEMA_ATTRIBUTE));
+ location.setVisible("1".equals(element
+ .getAttributeValue(VISIBLE_ATTRIBUTE)));
+ location.setRedirect("1".equals(element
+ .getAttributeValue(REDIRECT_ATTRIBUTE)));
+ return location;
+ }
+
+ /**
+ * Creates a <code>MartQuery</code> from an XML element.
+ *
+ * @param element
+ * the <code>Element</code> to deserialize
+ * @param namespace
+ * the <code>Namespace</code> containing the
+ * <code>Element</code>
+ * @return a deserialized <code>MartQuery</code>
+ */
+ public static MartQuery elementToMartQuery(Element element,
+ Namespace namespace) {
+ MartQuery martQuery = new MartQuery();
+ martQuery.setMartService(MartServiceXMLHandler
+ .elementToMartService(element.getChild(MART_SERVICE_ELEMENT,
+ namespace)));
+ martQuery.setMartDataset(elementToDataset(element.getChild(
+ MART_DATASET_ELEMENT, namespace), namespace));
+ martQuery.setQuery(QueryXMLHandler.elementToQuery(element.getChild(
+ QueryXMLHandler.QUERY_ELEMENT, namespace), namespace));
+ Element linksElement = element.getChild(LINKED_DATASETS_ELEMENT, namespace);
+ if (linksElement != null) {
+ List linkedDatasets = linksElement.getChildren(LINKED_DATASETS_ELEMENT,
+ namespace);
+ for (Iterator iter = linkedDatasets.iterator(); iter.hasNext();) {
+ Element datasetElement = (Element) iter.next();
+ String datasetName = datasetElement.getAttributeValue(NAME_ATTRIBUTE);
+ String linkId = datasetElement.getAttributeValue(LINK_ATTRIBUTE);
+ martQuery.addLinkedDataset(datasetName, linkId);
+ }
+ }
+ return martQuery;
+ }
+
+ /**
+ * Converts a <code>MartQuery</code> to an XML element.
+ *
+ * @param martQuery
+ * the <code>MartQuery</code> to serialize
+ * @param namespace
+ * the <code>Namespace</code> to use when constructing the
+ * <code>Element</code>
+ * @return an XML serialization of the <code>MartQuery</code>
+ */
+ public static Element martQueryToElement(MartQuery martQuery,
+ Namespace namespace) {
+ Element element = new Element(MART_QUERY_ELEMENT, namespace);
+ element.addContent(martServiceToElement(martQuery.getMartService(),
+ namespace));
+ element.addContent(datasetToElement(martQuery.getMartDataset(),
+ namespace));
+ element.addContent(QueryXMLHandler.queryToElement(martQuery.getQuery(),
+ namespace));
+ Set linkedDatasets = martQuery.getLinkedDatasets();
+ if (linkedDatasets.size() > 0) {
+ Element linksElement = new Element(LINKED_DATASETS_ELEMENT, namespace);
+ for (Iterator iter = linkedDatasets.iterator(); iter.hasNext();) {
+ String datasetName = (String) iter.next();
+ Element datasetElement = new Element(LINKED_DATASETS_ELEMENT, namespace);
+ datasetElement.setAttribute(NAME_ATTRIBUTE, datasetName);
+ datasetElement.setAttribute(LINK_ATTRIBUTE, martQuery
+ .getLink(datasetName));
+ linksElement.addContent(datasetElement);
+ }
+ element.addContent(linksElement);
+ }
+ return element;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-bioinformatics/blob/a87b4151/taverna-biomart-martservice/src/main/java/org/biomart/martservice/MartURLLocation.java
----------------------------------------------------------------------
diff --git a/taverna-biomart-martservice/src/main/java/org/biomart/martservice/MartURLLocation.java b/taverna-biomart-martservice/src/main/java/org/biomart/martservice/MartURLLocation.java
new file mode 100644
index 0000000..476956d
--- /dev/null
+++ b/taverna-biomart-martservice/src/main/java/org/biomart/martservice/MartURLLocation.java
@@ -0,0 +1,422 @@
+/*
+ * Copyright (C) 2003 The University of Manchester
+ *
+ * Modifications to the initial code base are copyright of their
+ * respective authors, or their employers as appropriate. Authorship
+ * of the modifications may be determined from the ChangeLog placed at
+ * the end of this file.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA.
+ *
+ ****************************************************************
+ * Source code information
+ * -----------------------
+ * Filename $RCSfile: MartURLLocation.java,v $
+ * Revision $Revision: 1.2 $
+ * Release status $State: Exp $
+ * Last modified on $Date: 2007/10/04 14:15:59 $
+ * by $Author: davidwithers $
+ * Created on 17-Mar-2006
+ *****************************************************************/
+package org.biomart.martservice;
+
+import org.ensembl.mart.lib.config.MartLocation;
+
+/**
+ * The MartURLLocation contained by the MartRegistry returned by a BioMart web
+ * service.
+ *
+ * @author David Withers
+ */
+public class MartURLLocation implements MartLocation {
+ private static final String URL_TYPE = "URL";
+
+ private String database;
+
+ private boolean defaultValue;
+
+ private String displayName;
+
+ private String host;
+
+ private String includeDatasets;
+
+ private String martUser;
+
+ private String name;
+
+ private String path;
+
+ private int port;
+
+ private String serverVirtualSchema;
+
+ private String virtualSchema;
+
+ private boolean visible;
+
+ private boolean redirect;
+
+ /**
+ * Returns the database.
+ *
+ * @return the database
+ */
+ public String getDatabase() {
+ return database;
+ }
+
+ /**
+ * Sets the database.
+ *
+ * @param database the new database
+ */
+ public void setDatabase(String database) {
+ this.database = database;
+ }
+
+ /**
+ * Returns true if the default flag is set.
+ *
+ * @return true if the default flag is set
+ */
+ public boolean isDefault() {
+ return defaultValue;
+ }
+
+ /**
+ * Sets the default flag.
+ *
+ * @param defaultValue
+ * the value of the default flag
+ */
+ public void setDefault(boolean defaultValue) {
+ this.defaultValue = defaultValue;
+ }
+
+ /**
+ * Returns the displayName.
+ *
+ * @return the displayName.
+ */
+ public String getDisplayName() {
+ return displayName;
+ }
+
+ /**
+ * Sets the displayName.
+ *
+ * @param displayName
+ * the displayName to set.
+ */
+ public void setDisplayName(String displayName) {
+ this.displayName = displayName;
+ }
+
+ /**
+ * Returns the host.
+ *
+ * @return the host.
+ */
+ public String getHost() {
+ return host;
+ }
+
+ /**
+ * Sets the host.
+ *
+ * @param host
+ * the host to set.
+ */
+ public void setHost(String host) {
+ this.host = host;
+ }
+
+ /**
+ * Returns the includeDatasets.
+ *
+ * @return the includeDatasets
+ */
+ public String getIncludeDatasets() {
+ return includeDatasets;
+ }
+
+ /**
+ * Sets the includeDatasets.
+ *
+ * @param includeDatasets the new includeDatasets
+ */
+ public void setIncludeDatasets(String includeDatasets) {
+ this.includeDatasets = includeDatasets;
+ }
+
+ /**
+ * Returns the martUser.
+ *
+ * @return the martUser
+ */
+ public String getMartUser() {
+ return martUser;
+ }
+
+ /**
+ * Sets the martUser.
+ *
+ * @param martUser the new martUser
+ */
+ public void setMartUser(String martUser) {
+ this.martUser = martUser;
+ }
+
+ /**
+ * Returns the name
+ *
+ * @return the name.
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * Sets the name.
+ *
+ * @param name
+ * the name to set.
+ */
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ /**
+ * Returns the path.
+ *
+ * @return the path
+ */
+ public String getPath() {
+ return path;
+ }
+
+ /**
+ * Sets the path.
+ *
+ * @param path the new path
+ */
+ public void setPath(String path) {
+ this.path = path;
+ }
+
+ /**
+ * Returns the port.
+ *
+ * @return the port.
+ */
+ public int getPort() {
+ return port;
+ }
+
+ /**
+ * Sets the port.
+ *
+ * @param port
+ * the port to set.
+ */
+ public void setPort(int port) {
+ this.port = port;
+ }
+
+ /**
+ * Returns the serverVirtualSchema.
+ *
+ * @return the serverVirtualSchema.
+ */
+ public String getServerVirtualSchema() {
+ return serverVirtualSchema;
+ }
+
+ /**
+ * Sets the serverVirtualSchema.
+ *
+ * @param serverVirtualSchema
+ * the serverVirtualSchema to set.
+ */
+ public void setServerVirtualSchema(String serverVirtualSchema) {
+ this.serverVirtualSchema = serverVirtualSchema;
+ }
+
+ /**
+ * Returns the virtualSchema.
+ *
+ * @return the virtualSchema.
+ */
+ public String getVirtualSchema() {
+ return virtualSchema;
+ }
+
+ /**
+ * Sets the virtualSchema.
+ *
+ * @param virtualSchema
+ * the virtualSchema to set.
+ */
+ public void setVirtualSchema(String virtualSchema) {
+ this.virtualSchema = virtualSchema;
+ }
+
+ /**
+ * Returns true if the location is visible.
+ *
+ * @return Returns the visible.
+ */
+ public boolean isVisible() {
+ return visible;
+ }
+
+ /**
+ * @param visible
+ * The visible to set.
+ */
+ public void setVisible(boolean visible) {
+ this.visible = visible;
+ }
+
+ /**
+ * Returns true if this location is redirected.
+ *
+ * @return the redirect
+ */
+ public boolean isRedirect() {
+ return redirect;
+ }
+
+ /**
+ * @param redirect the redirect to set
+ */
+ public void setRedirect(boolean redirect) {
+ this.redirect = redirect;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.ensembl.mart.lib.config.MartLocation#getType()
+ */
+ public String getType() {
+ return URL_TYPE;
+ }
+
+ /**
+ * Returns the display name.
+ *
+ * @return the display name
+ */
+ public String toString() {
+ return getDisplayName();
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result
+ + ((database == null) ? 0 : database.hashCode());
+ result = prime * result + (defaultValue ? 1231 : 1237);
+ result = prime * result
+ + ((displayName == null) ? 0 : displayName.hashCode());
+ result = prime * result + ((host == null) ? 0 : host.hashCode());
+ result = prime * result
+ + ((includeDatasets == null) ? 0 : includeDatasets.hashCode());
+ result = prime * result
+ + ((martUser == null) ? 0 : martUser.hashCode());
+ result = prime * result + ((name == null) ? 0 : name.hashCode());
+ result = prime * result + ((path == null) ? 0 : path.hashCode());
+ result = prime * result + port;
+ result = prime * result + (redirect ? 1231 : 1237);
+ result = prime
+ * result
+ + ((serverVirtualSchema == null) ? 0 : serverVirtualSchema
+ .hashCode());
+ result = prime * result
+ + ((virtualSchema == null) ? 0 : virtualSchema.hashCode());
+ result = prime * result + (visible ? 1231 : 1237);
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ final MartURLLocation other = (MartURLLocation) obj;
+ if (database == null) {
+ if (other.database != null)
+ return false;
+ } else if (!database.equals(other.database))
+ return false;
+ if (defaultValue != other.defaultValue)
+ return false;
+ if (displayName == null) {
+ if (other.displayName != null)
+ return false;
+ } else if (!displayName.equals(other.displayName))
+ return false;
+ if (host == null) {
+ if (other.host != null)
+ return false;
+ } else if (!host.equals(other.host))
+ return false;
+ if (includeDatasets == null) {
+ if (other.includeDatasets != null)
+ return false;
+ } else if (!includeDatasets.equals(other.includeDatasets))
+ return false;
+ if (martUser == null) {
+ if (other.martUser != null)
+ return false;
+ } else if (!martUser.equals(other.martUser))
+ return false;
+ if (name == null) {
+ if (other.name != null)
+ return false;
+ } else if (!name.equals(other.name))
+ return false;
+ if (path == null) {
+ if (other.path != null)
+ return false;
+ } else if (!path.equals(other.path))
+ return false;
+ if (port != other.port)
+ return false;
+ if (redirect != other.redirect)
+ return false;
+ if (serverVirtualSchema == null) {
+ if (other.serverVirtualSchema != null)
+ return false;
+ } else if (!serverVirtualSchema.equals(other.serverVirtualSchema))
+ return false;
+ if (virtualSchema == null) {
+ if (other.virtualSchema != null)
+ return false;
+ } else if (!virtualSchema.equals(other.virtualSchema))
+ return false;
+ if (visible != other.visible)
+ return false;
+ return true;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-bioinformatics/blob/a87b4151/taverna-biomart-martservice/src/main/java/org/biomart/martservice/ResultReceiver.java
----------------------------------------------------------------------
diff --git a/taverna-biomart-martservice/src/main/java/org/biomart/martservice/ResultReceiver.java b/taverna-biomart-martservice/src/main/java/org/biomart/martservice/ResultReceiver.java
new file mode 100644
index 0000000..cc1d062
--- /dev/null
+++ b/taverna-biomart-martservice/src/main/java/org/biomart/martservice/ResultReceiver.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2003 The University of Manchester
+ *
+ * Modifications to the initial code base are copyright of their
+ * respective authors, or their employers as appropriate. Authorship
+ * of the modifications may be determined from the ChangeLog placed at
+ * the end of this file.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA.
+ *
+ ****************************************************************
+ * Source code information
+ * -----------------------
+ * Filename $RCSfile: ResultReceiver.java,v $
+ * Revision $Revision: 1.2 $
+ * Release status $State: Exp $
+ * Last modified on $Date: 2008/07/31 15:06:49 $
+ * by $Author: davidwithers $
+ * Created on Jan 18, 2008
+ *****************************************************************/
+package org.biomart.martservice;
+
+/**
+ * An interface for receiving results of a Query.
+ *
+ * @author David Withers
+ */
+public interface ResultReceiver {
+
+ /**
+ * Receives a single row from the results of executing a Query.
+ *
+ * This method will be called frequently and should not block.
+ *
+ * @param resultRow
+ */
+ public void receiveResult(Object[] resultRow, long index) throws ResultReceiverException;
+
+ /**
+ * Receives an error for a single row from the results of executing a Query.
+ *
+ * This method will be called frequently and should not block.
+ *
+ * @param resultRow
+ */
+ public void receiveError(String errorMessage, long index) throws ResultReceiverException;
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-bioinformatics/blob/a87b4151/taverna-biomart-martservice/src/main/java/org/biomart/martservice/ResultReceiverException.java
----------------------------------------------------------------------
diff --git a/taverna-biomart-martservice/src/main/java/org/biomart/martservice/ResultReceiverException.java b/taverna-biomart-martservice/src/main/java/org/biomart/martservice/ResultReceiverException.java
new file mode 100644
index 0000000..c3498e6
--- /dev/null
+++ b/taverna-biomart-martservice/src/main/java/org/biomart/martservice/ResultReceiverException.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2003 The University of Manchester
+ *
+ * Modifications to the initial code base are copyright of their
+ * respective authors, or their employers as appropriate. Authorship
+ * of the modifications may be determined from the ChangeLog placed at
+ * the end of this file.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA.
+ *
+ ****************************************************************
+ * Source code information
+ * -----------------------
+ * Filename $RCSfile: ResultReceiverException.java,v $
+ * Revision $Revision: 1.1 $
+ * Release status $State: Exp $
+ * Last modified on $Date: 2008/03/04 16:47:57 $
+ * by $Author: davidwithers $
+ * Created on 05-May-2006
+ *****************************************************************/
+package org.biomart.martservice;
+
+/**
+ *
+ * @author David Withers
+ */
+public class ResultReceiverException extends Exception {
+ private static final long serialVersionUID = 7151337259555845771L;
+
+ /**
+ * Constructs a new exception with no detail message.
+ *
+ */
+ public ResultReceiverException() {
+ super();
+ }
+
+ /**
+ * Constructs a new exception with the specified detail message.
+ *
+ * @param message
+ * the detail message
+ * @param cause
+ * the cause (a null value is permitted, and indicates that the
+ * cause is nonexistent or unknown)
+ */
+ public ResultReceiverException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ /**
+ * Constructs a new exception with the specified detail message and cause.
+ *
+ * @param message
+ * the detail message
+ */
+ public ResultReceiverException(String message) {
+ super(message);
+ }
+
+ /**
+ * Constructs a new exception with the specified cause.
+ *
+ * @param cause
+ * the cause (a null value is permitted, and indicates that the
+ * cause is nonexistent or unknown)
+ */
+ public ResultReceiverException(Throwable cause) {
+ super(cause);
+ }
+
+}