package jalview.ws.dbsources; import jalview.datamodel.Alignment; import jalview.datamodel.DBRefSource; import jalview.datamodel.Sequence; import jalview.ws.HttpClientUtils; import jalview.ws.seqfetcher.DbSourceProxyImpl; import java.io.IOException; import java.util.Iterator; import java.util.StringTokenizer; import org.apache.http.client.ClientProtocolException; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import com.stevesoft.pat.Regex; public abstract class Intermine extends DbSourceProxyImpl { protected int seqStart = 1; protected int seqEnd = 500; protected String domain = "7227"; protected String name = "Intermine"; protected String baseUrl = ""; protected String testQuery = ""; @Override public String getDbSource() { return DBRefSource.INTERMINE; } @Override public String getDbName() { return "INTERMINE_" + this.name; } @Override public String getDbVersion() { return baseUrl; } @Override public String getAccessionSeparator() { return null; } @Override public Regex getAccessionValidator() { return null; } @Override public String getTestQuery() { return testQuery; } @Override public boolean isValidReference(String accession) { return false; } @SuppressWarnings("unchecked") public Alignment getAlignmentData(String baseUrl, String query, String domain, int seqStart, int seqEnd) { StringTokenizer queries = new StringTokenizer(query, ";"); int count = 0; Sequence[] retrievedSeq = new Sequence[queries.countTokens()]; try { while (queries.hasMoreTokens()) { String uniquequery = queries.nextToken(); String seqRef = uniquequery; // StringTokenizer queryParam = new StringTokenizer(uniquequery, ":"); String[] queryParam = uniquequery.split(":"); if (queryParam.length > 1) { seqRef = queryParam[0]; String[] positions = queryParam[1].split("-"); if (positions.length > 1) { seqStart = Integer.valueOf(positions[0]); seqEnd = Integer.valueOf(positions[1]); } } startQuery(); String rawSequenceData = fetchData(baseUrl, seqRef, domain, seqStart, seqEnd, true); String rawAnnotationData = fetchData(baseUrl, uniquequery, domain, seqStart, seqEnd, false); stopQuery(); String sequenceString = ""; // System.out.println("Sequence data: " + rawSequenceData); // System.out.println("Annotation data : " + rawAnnotationData); JSONParser jsonParser = new JSONParser(); JSONObject rawSeqJson = (JSONObject) jsonParser .parse(rawSequenceData); // JSONObject rawAnotJson = (JSONObject) // jsonParser.parse(rawAnnotationData); JSONArray rawSeqJsonArray = (JSONArray) rawSeqJson.get("features"); for (Iterator sequenceIter = rawSeqJsonArray.iterator(); sequenceIter .hasNext();) { // retrievedSeq = new Sequence[rawSeqJsonArray.size()]; JSONObject feature = sequenceIter.next(); sequenceString = feature.get("seq").toString(); int start = Integer.valueOf(feature.get("start").toString()); int end = Integer.valueOf(feature.get("end").toString()); retrievedSeq[count++] = new Sequence(uniquequery, sequenceString, start, end); } } } catch (Exception e) { e.printStackTrace(); } return new Alignment(retrievedSeq); } private static String fetchData(String baseUrl, String seqRef, String domain, int start, int end, Boolean fetchRef) throws ClientProtocolException, IOException { String resourceUrl = baseUrl + "/service/jbrowse/" + domain + "/features/" + seqRef + "?start=" + start + "&end=" + end + "&reference=" + fetchRef; return HttpClientUtils.doHttpUrlGet(resourceUrl); } @Override public int getTier() { return 0; } }