JAL-653 updating 'align as' tests to match latest tweaks to algorithm
[jalview.git] / src / jalview / ext / ensembl / EnsemblSeqProxy.java
1 package jalview.ext.ensembl;
2
3 import jalview.datamodel.AlignmentI;
4 import jalview.datamodel.DBRefSource;
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.DbSourceProxy;
12 import jalview.ws.seqfetcher.DbSourceProxyImpl;
13
14 import java.util.ArrayList;
15 import java.util.Arrays;
16 import java.util.List;
17
18 import com.stevesoft.pat.Regex;
19
20 public abstract class EnsemblSeqProxy extends DbSourceProxyImpl implements
21         DbSourceProxy
22 {
23   SeqFetcher sf;
24
25   public EnsemblSeqProxy() throws Exception
26   {
27     sf = new SeqFetcher();
28     addDbSourceProperty(DBRefSource.MULTIACC);
29     addDbSourceProperty(DBRefSource.SEQDB);
30     // decide whether these need to be filtered according to return type
31     addDbSourceProperty(DBRefSource.PROTSEQDB);
32     addDbSourceProperty(DBRefSource.DNACODINGSEQDB);
33     addDbSourceProperty(DBRefSource.DNASEQDB);
34   }
35
36   @Override
37   public String getDbSource()
38   {
39     return "ENSEMBL";
40   }
41
42
43   @Override
44   public String getDbVersion()
45   {
46     return "0"; // sf.getVersion();
47   }
48
49   @Override
50   public String getAccessionSeparator()
51   {
52     return " ";
53   }
54
55   @Override
56   public Regex getAccessionValidator()
57   {
58     return new Regex("((ENSP|ENST|ENSG|CCDS)[0-9.]{3,})");
59   }
60
61   @Override
62   public String getTestQuery()
63   {
64     return "ENSP00000288602";
65   }
66
67   @Override
68   public boolean isValidReference(String accession)
69   {
70     return getAccessionValidator().search(accession);
71   }
72
73   private volatile boolean inProgress = false;
74
75   @Override
76   public AlignmentI getSequenceRecords(String queries) throws Exception
77   {
78     inProgress = true;
79     List<String> tids, ids = new ArrayList<String>();
80     tids = Arrays.asList(queries.split(" +"));
81     AlignmentI rtn = null;
82     for (int v = 0, vSize = tids.size(); v < vSize; v += 50)
83     {
84       int p = v + 50;
85       if (p > vSize)
86       {
87         p = vSize;
88       }
89       ;
90       ids = tids.subList(v, p);
91       try
92       {
93         if (!sf.isEnsemblAvailable())
94         {
95           inProgress = false;
96           throw new JalviewException("ENSEMBL Rest API not available.");
97         }
98         FileParse fp = new FileParse(sf.getSequenceReader(
99                 getSourceEnsemblType(), ids));
100         FastaFile fr = new FastaFile(fp);
101         if (fr.hasWarningMessage())
102         {
103           System.out
104                   .println("Warning when retrieving " + ids.size() + " ids"
105                           + ids.toString() + "\n" + fr.getWarningMessage());
106         }
107         else if (fr.getSeqs().size() != ids.size())
108         {
109           System.out.println("Only retrieved " + fr.getSeqs().size()
110                   + " sequences for " + ids.size() + " query strings.");
111         }
112         if (fr.getSeqs().size() > 0)
113         {
114           AlignmentI seqal = new jalview.datamodel.Alignment(
115                   fr.getSeqsAsArray());
116           for (SequenceI sq:seqal.getSequences())
117           {
118             if (ids.contains((sq.getName())))
119             {
120               DBRefUtils.parseToDbRef(sq, "ENSEMBL", "0", sq.getName());
121             }
122           }
123           if (rtn == null)
124           {
125             rtn = seqal;
126           }
127           else
128           {
129             rtn.append(seqal);
130           }
131         }
132       } catch (Throwable r)
133       {
134         inProgress = false;
135         if (rtn != null)
136         {
137           System.err.println("Aborting ID retrieval after " + v
138                   + " chunks.");
139           r.printStackTrace();
140         }
141         else
142         {
143
144           throw new JalviewException("Aborting ID retrieval after " + v
145                   + " chunks. Unexpected problem ("
146                   + r.getLocalizedMessage() + ")", r);
147         }
148
149       }
150     }
151     inProgress = false;
152     return rtn;
153   }
154
155   /**
156    * 
157    * @return the configured sequence return type for this source
158    */
159   protected abstract EnsemblSeqType getSourceEnsemblType();
160
161   @Override
162   public boolean queryInProgress()
163   {
164     return inProgress;
165   }
166
167   @Override
168   public StringBuffer getRawRecords()
169   {
170     return null;
171   }
172
173   @Override
174   public int getTier()
175   {
176     return 0;
177   }
178 }