JAL-1705 DbSourceProxy properties converted to methods, tidy/format code
[jalview.git] / src / jalview / ext / ensembl / EnsemblSeqProxy.java
1 package jalview.ext.ensembl;
2
3 import jalview.datamodel.Alignment;
4 import jalview.datamodel.AlignmentI;
5 import jalview.datamodel.SequenceI;
6 import jalview.exceptions.JalviewException;
7 import jalview.ext.ensembl.SeqFetcher.EnsemblSeqType;
8 import jalview.io.FastaFile;
9 import jalview.io.FileParse;
10 import jalview.util.DBRefUtils;
11 import jalview.ws.seqfetcher.DbSourceProxyImpl;
12
13 import java.util.ArrayList;
14 import java.util.Arrays;
15 import java.util.List;
16
17 import com.stevesoft.pat.Regex;
18
19 public abstract class EnsemblSeqProxy extends DbSourceProxyImpl
20 {
21   SeqFetcher sf;
22
23   public EnsemblSeqProxy()
24   {
25     sf = new SeqFetcher();
26   }
27
28   @Override
29   public String getDbSource()
30   {
31     return "ENSEMBL";
32   }
33
34
35   @Override
36   public String getDbVersion()
37   {
38     return "0"; // sf.getVersion();
39   }
40
41   @Override
42   public String getAccessionSeparator()
43   {
44     return " ";
45   }
46
47   @Override
48   public Regex getAccessionValidator()
49   {
50     return new Regex("((ENSP|ENST|ENSG|CCDS)[0-9.]{3,})");
51   }
52
53   /**
54    * Default test query is a transcript
55    */
56   @Override
57   public String getTestQuery()
58   {
59     return "ENST00000288602";
60   }
61
62   @Override
63   public boolean isValidReference(String accession)
64   {
65     return getAccessionValidator().search(accession);
66   }
67
68   private volatile boolean inProgress = false;
69
70   @Override
71   public AlignmentI getSequenceRecords(String queries) throws Exception
72   {
73     inProgress = true;
74     List<String> tids, ids = new ArrayList<String>();
75     tids = Arrays.asList(queries.split(" +"));
76     AlignmentI rtn = null;
77
78     /*
79      * execute queries, if necessary in batches of the
80      * maximum allowed number of ids
81      */
82     int maxQueryCount = getMaximumQueryCount();
83     for (int v = 0, vSize = tids.size(); v < vSize; v += maxQueryCount)
84     {
85       int p = Math.min(vSize, v + maxQueryCount);
86       ids = tids.subList(v, p);
87       try
88       {
89         if (!sf.isEnsemblAvailable())
90         {
91           inProgress = false;
92           throw new JalviewException("ENSEMBL Rest API not available.");
93         }
94         FileParse fp = new FileParse(sf.getSequenceReader(
95                 getSourceEnsemblType(), ids));
96         FastaFile fr = new FastaFile(fp);
97         if (fr.hasWarningMessage())
98         {
99           System.out
100                   .println("Warning when retrieving " + ids.size() + " ids"
101                           + ids.toString() + "\n" + fr.getWarningMessage());
102         }
103         else if (fr.getSeqs().size() != ids.size())
104         {
105           System.out.println("Only retrieved " + fr.getSeqs().size()
106                   + " sequences for " + ids.size() + " query strings.");
107         }
108         if (fr.getSeqs().size() > 0)
109         {
110           AlignmentI seqal = new Alignment(
111                   fr.getSeqsAsArray());
112           for (SequenceI sq:seqal.getSequences())
113           {
114             if (ids.contains((sq.getName())))
115             {
116               DBRefUtils.parseToDbRef(sq, "ENSEMBL", "0", sq.getName());
117             }
118           }
119           if (rtn == null)
120           {
121             rtn = seqal;
122           }
123           else
124           {
125             rtn.append(seqal);
126           }
127         }
128       } catch (Throwable r)
129       {
130         inProgress = false;
131         if (rtn != null)
132         {
133           System.err.println("Aborting ID retrieval after " + v
134                   + " chunks.");
135           r.printStackTrace();
136         }
137         else
138         {
139
140           throw new JalviewException("Aborting ID retrieval after " + v
141                   + " chunks. Unexpected problem ("
142                   + r.getLocalizedMessage() + ")", r);
143         }
144
145       }
146     }
147     inProgress = false;
148     return rtn;
149   }
150
151   /**
152    * 
153    * @return the configured sequence return type for this source
154    */
155   protected abstract EnsemblSeqType getSourceEnsemblType();
156
157   @Override
158   public boolean queryInProgress()
159   {
160     return inProgress;
161   }
162
163   @Override
164   public StringBuffer getRawRecords()
165   {
166     return null;
167   }
168
169   @Override
170   public int getTier()
171   {
172     return 0;
173   }
174
175   /**
176    * A sequence/id POST request currently allows up to 50 queries
177    * 
178    * @see http://rest.ensembl.org/documentation/info/sequence_id_post
179    */
180   @Override
181   public int getMaximumQueryCount()
182   {
183     return 50;
184   }
185
186   @Override
187   public boolean isDnaCoding()
188   {
189     return true;
190   }
191 }