JAL-3855 update EBI Alphafold barcoded URL generation to v2.cif/json URLs
[jalview.git] / src / jalview / fts / service / alphafold / AlphafoldRestClient.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3  * Copyright (C) $$Year-Rel$$ The Jalview Authors
4  * 
5  * This file is part of Jalview.
6  * 
7  * Jalview is free software: you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License 
9  * as published by the Free Software Foundation, either version 3
10  * of the License, or (at your option) any later version.
11  *  
12  * Jalview is distributed in the hope that it will be useful, but 
13  * WITHOUT ANY WARRANTY; without even the implied warranty 
14  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
15  * PURPOSE.  See the GNU General Public License for more details.
16  * 
17  * You should have received a copy of the GNU General Public License
18  * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
19  * The Jalview Authors are detailed in the 'AUTHORS' file.
20  */
21 package jalview.fts.service.alphafold;
22
23 import java.net.URL;
24 import java.util.ArrayList;
25 import java.util.Collection;
26 import java.util.List;
27 import java.util.Objects;
28
29 import jalview.bin.Console;
30 import jalview.datamodel.DBRefEntry;
31 import jalview.datamodel.DBRefSource;
32 import jalview.datamodel.SequenceI;
33 import jalview.fts.api.FTSData;
34 import jalview.fts.api.FTSDataColumnI;
35 import jalview.fts.core.FTSRestRequest;
36 import jalview.util.DBRefUtils;
37 import jalview.util.HttpUtils;
38 import jalview.ws.dbsources.EBIAlfaFold;
39
40 public class AlphafoldRestClient
41 {
42
43   /**
44    * turns a uniprot ID into a fake alphafold entry for the structure chooser -
45    * fakes PDB fields in response
46    * 
47    * @param UniprotID
48    * @return null or an FTS Record (if alphafold thinks it has a structure)
49    */
50   public static List<FTSData> getFTSData(// Map<String, Object> pdbJsonDoc,
51           FTSRestRequest request)
52   {
53     List<FTSData> records = new ArrayList<FTSData>();
54     String primaryKey = null;
55
56     Object[] summaryRowData;
57
58     SequenceI associatedSequence;
59
60     Collection<FTSDataColumnI> diplayFields = request.getWantedFields();
61     SequenceI associatedSeq = request.getAssociatedSequence();
62
63     for (DBRefEntry upref : DBRefUtils
64             .selectRefs(associatedSeq.getPrimaryDBRefs(), new String[]
65             { DBRefSource.UNIPROT }))
66     {
67       String alphaFoldId = "AF-" + upref.getAccessionId() + "-F1";
68       try
69       {
70         String urls = EBIAlfaFold.getAlphaFoldCifDownloadUrl(alphaFoldId,
71                 null);
72         URL url = new URL(urls);
73         if (!HttpUtils.checkUrlAvailable(url, 50))
74         {
75           continue;
76         }
77       } catch (Exception mfe)
78       {
79         Console.debug("Exception accessing urls", mfe);
80         continue;
81       }
82       int colCounter = 0;
83       summaryRowData = new Object[(associatedSeq != null)
84               ? diplayFields.size() + 1
85               : diplayFields.size()];
86       if (associatedSeq != null)
87       {
88         associatedSequence = associatedSeq;
89         summaryRowData[0] = associatedSequence;
90         colCounter = 1;
91       }
92
93       for (FTSDataColumnI field : diplayFields)
94       {
95         String fieldData = "alphafold";// (pdbJsonDoc.get(field.getCode()) ==
96                                        // null) ? ""
97         // : pdbJsonDoc.get(field.getCode()).toString();
98         if (field.isPrimaryKeyColumn())
99         {
100           primaryKey = alphaFoldId;
101           summaryRowData[colCounter++] = alphaFoldId;
102         }
103         else if (fieldData == null || fieldData.isEmpty())
104         {
105           summaryRowData[colCounter++] = null;
106         }
107         else
108         {
109           try
110           {
111             summaryRowData[colCounter++] = (field.getDataType()
112                     .getDataTypeClass() == Integer.class)
113                             ? 1
114                             : (field.getDataType()
115                                     .getDataTypeClass() == Double.class)
116                                             ? 1.3131313
117                                             : "AlphaFold clarity";
118           } catch (Exception e)
119           {
120             e.printStackTrace();
121             System.out.println("offending value:" + fieldData);
122           }
123         }
124       }
125
126       final String primaryKey1 = primaryKey;
127
128       final Object[] summaryRowData1 = summaryRowData;
129       records.add(new FTSData()
130       {
131         @Override
132         public Object[] getSummaryData()
133         {
134           return summaryRowData1;
135         }
136
137         @Override
138         public Object getPrimaryKey()
139         {
140           return primaryKey1;
141         }
142
143         /**
144          * Returns a string representation of this object;
145          */
146         @Override
147         public String toString()
148         {
149           StringBuilder summaryFieldValues = new StringBuilder();
150           for (Object summaryField : summaryRowData1)
151           {
152             summaryFieldValues.append(
153                     summaryField == null ? " " : summaryField.toString())
154                     .append("\t");
155           }
156           return summaryFieldValues.toString();
157         }
158
159         /**
160          * Returns hash code value for this object
161          */
162         @Override
163         public int hashCode()
164         {
165           return Objects.hash(primaryKey1, this.toString());
166         }
167
168         @Override
169         public boolean equals(Object that)
170         {
171           return this.toString().equals(that.toString());
172         }
173       });
174     }
175     return records;
176   }
177 }