Added support for different intermine database variants
[jalview.git] / src / jalview / ws / dbsources / Intermine.java
1 package jalview.ws.dbsources;
2
3 import jalview.datamodel.Alignment;
4 import jalview.datamodel.DBRefSource;
5 import jalview.datamodel.Sequence;
6 import jalview.ws.HttpClientUtils;
7 import jalview.ws.seqfetcher.DbSourceProxyImpl;
8
9 import java.io.IOException;
10 import java.util.Iterator;
11 import java.util.StringTokenizer;
12
13 import org.apache.http.client.ClientProtocolException;
14 import org.json.simple.JSONArray;
15 import org.json.simple.JSONObject;
16 import org.json.simple.parser.JSONParser;
17
18 import com.stevesoft.pat.Regex;
19
20 public abstract class Intermine extends DbSourceProxyImpl
21 {
22   protected int seqStart = 1;
23
24   protected int seqEnd = 500;
25
26   protected String domain = "7227";
27
28   protected String name = "Intermine";
29
30   protected String baseUrl = "";
31
32   protected String testQuery = "";
33
34   @Override
35   public String getDbSource()
36   {
37     return DBRefSource.INTERMINE;
38   }
39
40   @Override
41   public String getDbName()
42   {
43     return "INTERMINE_" + this.name;
44   }
45
46   @Override
47   public String getDbVersion()
48   {
49     return baseUrl;
50   }
51
52
53   @Override
54   public String getAccessionSeparator()
55   {
56     return null;
57   }
58
59   @Override
60   public Regex getAccessionValidator()
61   {
62     return null;
63   }
64
65   @Override
66   public String getTestQuery()
67   {
68     return testQuery;
69   }
70
71   @Override
72   public boolean isValidReference(String accession)
73   {
74     return false;
75   }
76
77   @SuppressWarnings("unchecked")
78   public Alignment getAlignmentData(String baseUrl, String query,
79           String domain, int seqStart, int seqEnd)
80   {
81
82     StringTokenizer queries = new StringTokenizer(query, ";");
83
84     int count = 0;
85     Sequence[] retrievedSeq = new Sequence[queries.countTokens()];
86     try
87     {
88       while (queries.hasMoreTokens())
89       {
90         String uniquequery = queries.nextToken();
91         String seqRef = uniquequery;
92         // StringTokenizer queryParam = new StringTokenizer(uniquequery, ":");
93         String[] queryParam = uniquequery.split(":");
94         if (queryParam.length > 1)
95         {
96           seqRef = queryParam[0];
97           String[] positions = queryParam[1].split("-");
98           if (positions.length > 1)
99           {
100             seqStart = Integer.valueOf(positions[0]);
101             seqEnd = Integer.valueOf(positions[1]);
102           }
103         }
104
105         startQuery();
106         String rawSequenceData = fetchData(baseUrl,
107                 seqRef, domain,
108                 seqStart, seqEnd, true);
109         String rawAnnotationData = fetchData(baseUrl,
110                 uniquequery, domain, seqStart, seqEnd, false);
111         stopQuery();
112
113         String sequenceString = "";
114
115         // System.out.println("Sequence data: " + rawSequenceData);
116         // System.out.println("Annotation data : " + rawAnnotationData);
117         JSONParser jsonParser = new JSONParser();
118         JSONObject rawSeqJson = (JSONObject) jsonParser
119                 .parse(rawSequenceData);
120         // JSONObject rawAnotJson = (JSONObject)
121         // jsonParser.parse(rawAnnotationData);
122         JSONArray rawSeqJsonArray = (JSONArray) rawSeqJson.get("features");
123         for (Iterator<JSONObject> sequenceIter = rawSeqJsonArray.iterator(); sequenceIter
124                 .hasNext();)
125         {
126           // retrievedSeq = new Sequence[rawSeqJsonArray.size()];
127           JSONObject feature = sequenceIter.next();
128           sequenceString = feature.get("seq").toString();
129           int start = Integer.valueOf(feature.get("start").toString());
130           int end = Integer.valueOf(feature.get("end").toString());
131
132           retrievedSeq[count++] = new Sequence(uniquequery, sequenceString,
133                   start,
134                   end);
135         }
136       }
137     } catch (Exception e)
138     {
139       e.printStackTrace();
140     }
141     return new Alignment(retrievedSeq);
142   }
143
144
145   private static String fetchData(String baseUrl, String seqRef,
146           String domain, int start, int end, Boolean fetchRef)
147                   throws ClientProtocolException, IOException
148   {
149     String resourceUrl = baseUrl + "/service/jbrowse/" + domain
150             + "/features/" + seqRef + "?start=" + start + "&end=" + end
151             + "&reference=" + fetchRef;
152     return HttpClientUtils.doHttpUrlGet(resourceUrl);
153   }
154
155   @Override
156   public int getTier()
157   {
158     return 0;
159   }
160
161 }