Clover icon

Coverage Report

  1. Project Clover database Thu Aug 13 2020 12:04:21 BST
  2. Package jalview.urls

File IdentifiersUrlProvider.java

 

Coverage histogram

../../img/srcFileCovDistChart9.png
12% of files have more coverage

Code metrics

30
66
13
1
270
185
29
0.44
5.08
13
2.23

Classes

Class Line # Actions
IdentifiersUrlProvider 50 66 29
0.85321185.3%
 

Contributing tests

This file is covered by 25 tests. .

Source view

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   
22    package jalview.urls;
23   
24    import static jalview.util.UrlConstants.DB_ACCESSION;
25    import static jalview.util.UrlConstants.DELIM;
26    import static jalview.util.UrlConstants.SEP;
27   
28    import jalview.util.JSONUtils;
29    import jalview.util.UrlLink;
30   
31    import java.io.FileReader;
32    import java.io.IOException;
33    import java.util.ArrayList;
34    import java.util.HashMap;
35    import java.util.Iterator;
36    import java.util.List;
37    import java.util.Map;
38    import java.util.StringTokenizer;
39   
40    import org.json.simple.parser.ParseException;
41   
42    /**
43    *
44    * Implements the UrlProviderI interface for a UrlProvider object which serves
45    * URLs from identifiers.org
46    *
47    * @author $author$
48    * @version $Revision$
49    */
 
50    public class IdentifiersUrlProvider extends UrlProviderImpl
51    {
52   
53    private static final String LOCAL_KEY = "Local";
54   
55    private static final String ID_ORG_KEY = "identifiers.org";
56   
57    // map of string ids to urls
58    private HashMap<String, UrlLink> urls;
59   
60    // list of selected urls
61    private ArrayList<String> selectedUrls;
62   
 
63  33 toggle public IdentifiersUrlProvider(String cachedUrlList)
64    {
65  33 urls = readIdentifiers(IdOrgSettings.getDownloadLocation());
66  33 selectedUrls = new ArrayList<>();
67  33 checkSelectionMatchesUrls(cachedUrlList);
68    }
69   
70    /**
71    * Read data from an identifiers.org download file
72    *
73    * @param idFileName
74    * name of identifiers.org download file
75    * @return hashmap of identifiers.org data, keyed by MIRIAM id
76    */
 
77  33 toggle @SuppressWarnings("unchecked")
78    private HashMap<String, UrlLink> readIdentifiers(String idFileName)
79    {
80    // identifiers.org data
81  33 HashMap<String, UrlLink> idData = new HashMap<>();
82   
83  33 String errorMessage = null;
84  33 try
85    {
86    // NOTE: THIS WILL FAIL IN SWINGJS BECAUSE IT INVOLVES A FILE READER
87   
88  33 FileReader reader = new FileReader(idFileName);
89  33 String key = "";
90  33 Map<String, Object> obj = (Map<String, Object>) JSONUtils.parse(reader);
91  33 if (obj.containsKey(ID_ORG_KEY))
92    {
93  0 key = ID_ORG_KEY;
94    }
95  33 else if (obj.containsKey(LOCAL_KEY))
96    {
97  33 key = LOCAL_KEY;
98    }
99    else
100    {
101  0 System.out.println(
102    "Unexpected key returned from identifiers jalview service");
103  0 return idData;
104    }
105   
106  33 List<Object> jsonarray = (List<Object>) obj.get(key);
107   
108    // loop over each entry in JSON array and build HashMap entry
109  10885 for (int i = 0; i < jsonarray.size(); i++)
110    {
111  10852 Map<String, Object> item = (Map<String, Object>) jsonarray.get(i);
112   
113  10852 String url = (String) item.get("url") + "/" + DELIM + DB_ACCESSION
114    + DELIM;
115  10852 UrlLink link = new UrlLink((String) item.get("name"), url,
116    (String) item.get("prefix"));
117  10852 idData.put((String) item.get("id"), link);
118    }
119    } catch (IOException | ParseException e)
120    {
121    // unnecessary e.printStackTrace();
122    // Note how in JavaScript we can grab the first bytes from any file reader.
123    // Typical report here is "NetworkError" because the file does not exist.
124    // "https://." is coming from System.getProperty("user.home"), but this could
125    // be set by the page developer to anything, of course.
126  0 errorMessage = e.toString();
127  0 idData.clear();
128    }
129    // BH 2018 -- added more valuable report
130  33 if (errorMessage != null)
131    {
132  0 System.err.println("IdentifiersUrlProvider: cannot read " + idFileName + ": " + errorMessage);
133    }
134  33 return idData;
135    }
136   
 
137  33 toggle private void checkSelectionMatchesUrls(String cachedUrlList)
138    {
139  33 StringTokenizer st = new StringTokenizer(cachedUrlList, SEP);
140  283 while (st.hasMoreElements())
141    {
142  250 String id = st.nextToken();
143   
144  250 if (isMiriamId(id))
145    {
146    // this is an identifiers.org MIRIAM id
147  44 if (urls.containsKey(id))
148    {
149  44 selectedUrls.add(id);
150    }
151    }
152    }
153   
154    // reset defaultUrl in case it is no longer selected
155  33 setPrimaryUrl(primaryUrl);
156    }
157   
 
158  63 toggle @Override
159    public boolean setPrimaryUrl(String id)
160    {
161  63 if (urls.containsKey(id))
162    {
163  2 primaryUrl = id;
164    }
165    else
166    {
167  61 primaryUrl = null;
168    }
169   
170  63 return urls.containsKey(id);
171    }
172   
 
173  5 toggle @Override
174    public String writeUrlsAsString(boolean selected)
175    {
176  5 if (!selected)
177    {
178  2 return ""; // we don't cache unselected identifiers.org urls
179    }
180   
181  3 StringBuffer links = new StringBuffer();
182  3 if (!selectedUrls.isEmpty())
183    {
184  3 for (String k : selectedUrls)
185    {
186  9 links.append(k);
187  9 links.append(SEP);
188    }
189    // remove last SEP
190  3 links.setLength(links.length() - 1);
191    }
192  3 return links.toString();
193    }
194   
 
195  36 toggle @Override
196    public List<String> getLinksForMenu()
197    {
198  36 List<String> links = new ArrayList<>();
199  36 for (String key : selectedUrls)
200    {
201  15 links.add(urls.get(key).toStringWithTarget());
202    }
203  36 return links;
204    }
205   
 
206  13 toggle @Override
207    public List<UrlLinkDisplay> getLinksForTable()
208    {
209  13 return super.getLinksForTable(urls, selectedUrls, false);
210    }
211   
 
212  9 toggle @Override
213    public void setUrlData(List<UrlLinkDisplay> links)
214    {
215  9 selectedUrls = new ArrayList<>();
216   
217  9 Iterator<UrlLinkDisplay> it = links.iterator();
218  99 while (it.hasNext())
219    {
220  90 UrlLinkDisplay link = it.next();
221   
222    // Handle links with MIRIAM ids only
223  90 if (isMiriamId(link.getId()))
224    {
225    // select/deselect links accordingly and set default url
226  35 if (urls.containsKey(link.getId()))
227    {
228  35 if (link.getIsSelected())
229    {
230  26 selectedUrls.add(link.getId());
231    }
232  35 if (link.getIsPrimary())
233    {
234  0 setPrimaryUrl(link.getId());
235    }
236    }
237    }
238    }
239    }
240   
 
241  7 toggle @Override
242    public String getPrimaryUrl(String seqid)
243    {
244  7 return super.getPrimaryUrl(seqid, urls);
245    }
246   
 
247  5 toggle @Override
248    public String getPrimaryUrlId()
249    {
250  5 return primaryUrl;
251    }
252   
 
253  0 toggle @Override
254    public String getPrimaryTarget(String seqid)
255    {
256  0 return null;
257    }
258   
 
259  1 toggle @Override
260    public String choosePrimaryUrl()
261    {
262  1 return null;
263    }
264   
 
265  29 toggle @Override
266    public boolean contains(String id)
267    {
268  29 return (urls.containsKey(id));
269    }
270    }