package jalview.ext.ensembl;
import jalview.datamodel.AlignmentI;
import jalview.datamodel.DBRefSource;
import java.io.BufferedReader;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.json.simple.JSONArray;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
public class EnsemblInfo extends EnsemblRestClient
{
/*
* cached results of REST /info/divisions service, currently
*
* {
* { "ENSEMBLFUNGI", "http://rest.ensemblgenomes.org"},
* "ENSEMBLBACTERIA", "http://rest.ensemblgenomes.org"},
* "ENSEMBLPROTISTS", "http://rest.ensemblgenomes.org"},
* "ENSEMBLMETAZOA", "http://rest.ensemblgenomes.org"},
* "ENSEMBLPLANTS", "http://rest.ensemblgenomes.org"},
* "ENSEMBL", "http://rest.ensembl.org" }
* }
*
* The values for EnsemblGenomes are retrieved by a REST call, that for
* Ensembl is added programmatically for convenience of lookup
*/
private static Map divisions;
@Override
public String getDbName()
{
return "ENSEMBL";
}
@Override
public AlignmentI getSequenceRecords(String queries) throws Exception
{
return null;
}
@Override
protected URL getUrl(List ids) throws MalformedURLException
{
return null;
}
@Override
protected boolean useGetRequest()
{
return true;
}
@Override
protected String getRequestMimeType(boolean multipleIds)
{
return "application/json";
}
@Override
protected String getResponseMimeType()
{
return "application/json";
}
/**
* Answers the domain (http://rest.ensembl.org or
* http://rest.ensemblgenomes.org) for the given division, or null if not
* recognised by Ensembl.
*
* @param division
* @return
*/
public String getDomain(String division)
{
if (divisions == null)
{
fetchDivisions();
}
return divisions.get(division.toUpperCase());
}
/**
* On first request only, populate the lookup map by fetching the list of
* divisions known to EnsemblGenomes.
*/
void fetchDivisions()
{
divisions = new HashMap<>();
/*
* for convenience, pre-fill ensembl.org as the domain for "ENSEMBL"
*/
divisions.put(DBRefSource.ENSEMBL.toUpperCase(), ensemblDomain);
BufferedReader br = null;
try
{
URL url = getDivisionsUrl(ensemblGenomesDomain);
if (url != null)
{
br = getHttpResponse(url, null);
}
parseResponse(br, ensemblGenomesDomain);
} catch (IOException e)
{
// ignore
} finally
{
if (br != null)
{
try
{
br.close();
} catch (IOException e)
{
// ignore
}
}
}
}
/**
* Parses the JSON response to /info/divisions, and add each to the lookup map
*
* @param br
* @param domain
*/
void parseResponse(BufferedReader br, String domain)
{
JSONParser jp = new JSONParser();
try
{
JSONArray parsed = (JSONArray) jp.parse(br);
Iterator rvals = parsed.iterator();
while (rvals.hasNext())
{
String division = rvals.next().toString();
divisions.put(division.toUpperCase(), domain);
}
} catch (IOException | ParseException | NumberFormatException e)
{
// ignore
}
}
/**
* Constructs the URL for the EnsemblGenomes /info/divisions REST service
* @param domain TODO
*
* @return
* @throws MalformedURLException
*/
URL getDivisionsUrl(String domain) throws MalformedURLException
{
return new URL(domain
+ "/info/divisions?content-type=application/json");
}
/**
* Returns the set of 'divisions' recognised by Ensembl or EnsemblGenomes
*
* @return
*/
public Set getDivisions() {
if (divisions == null)
{
fetchDivisions();
}
return divisions.keySet();
}
}