2 * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3 * Copyright (C) $$Year-Rel$$ The Jalview Authors
5 * This file is part of Jalview.
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.
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.
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.
21 package jalview.fts.core;
23 import java.util.Locale;
25 import java.io.BufferedReader;
26 import java.io.IOException;
27 import java.io.InputStream;
28 import java.io.InputStreamReader;
29 import java.util.ArrayList;
30 import java.util.Collection;
31 import java.util.HashMap;
32 import java.util.Objects;
34 import jalview.fts.api.FTSDataColumnI;
35 import jalview.fts.api.FTSDataColumnI.FTSDataColumnGroupI;
36 import jalview.fts.core.FTSDataColumnPreferences.PreferenceSource;
37 import jalview.fts.service.threedbeacons.TDBeaconsFTSRestClient;
38 import jalview.fts.api.FTSRestClientI;
41 * Base class providing implementation for common methods defined in
46 * @note implementations MUST be accessed as a singleton.
48 public abstract class FTSRestClient implements FTSRestClientI
50 protected Collection<FTSDataColumnI> dataColumns = new ArrayList<>();
52 protected Collection<FTSDataColumnGroupI> dataColumnGroups = new ArrayList<>();
54 protected Collection<FTSDataColumnI> searchableDataColumns = new ArrayList<>();
56 protected Collection<FTSDataColumnI> defaulDisplayedDataColumns = new ArrayList<>();
58 protected FTSDataColumnI primaryKeyColumn;
60 private String primaryKeyColumnCode = null;
62 private int defaultResponsePageSize = 100;
64 protected HashMap<String,String> mockQueries = null;
66 protected FTSRestClient()
71 public void parseDataColumnsConfigFile()
73 String fileName = getColumnDataConfigFileName();
75 InputStream in = getClass().getResourceAsStream(fileName);
77 try (BufferedReader br = new BufferedReader(new InputStreamReader(in)))
80 while ((line = br.readLine()) != null)
82 final String[] lineData = line.split(";");
85 if (lineData.length == 2)
87 if (lineData[0].equalsIgnoreCase("_data_column.primary_key"))
89 primaryKeyColumnCode = lineData[1];
91 if (lineData[0].equalsIgnoreCase(
92 "_data_column.default_response_page_size"))
94 defaultResponsePageSize = Integer.valueOf(lineData[1]);
97 else if (lineData.length == 3)
99 dataColumnGroups.add(new FTSDataColumnGroupI()
102 public String getID()
108 public String getName()
114 public int getSortOrder()
116 return Integer.valueOf(lineData[2]);
120 public String toString()
126 public int hashCode()
128 return Objects.hash(this.getID(), this.getName(),
129 this.getSortOrder());
133 public boolean equals(Object otherObject)
135 FTSDataColumnGroupI that = (FTSDataColumnGroupI) otherObject;
136 return this.getID().equals(that.getID())
137 && this.getName().equals(that.getName())
138 && this.getSortOrder() == that.getSortOrder();
142 else if (lineData.length > 6)
144 FTSDataColumnI dataCol = new FTSDataColumnI()
147 public String toString()
153 public String getName()
159 public String getCode()
161 return lineData[1].split("\\|")[0];
165 public String getAltCode()
167 return lineData[1].split("\\|").length > 1
168 ? lineData[1].split("\\|")[1]
173 public DataTypeI getDataType()
175 final String[] dataTypeString = lineData[2].split("\\|");
176 final String classString = dataTypeString[0].toUpperCase(Locale.ROOT);
178 return new DataTypeI()
182 public boolean isFormtted()
184 if (dataTypeString.length > 1
185 && dataTypeString[1] != null)
187 switch (dataTypeString[1].toUpperCase(Locale.ROOT))
202 public int getSignificantFigures()
204 if (dataTypeString.length > 2
205 && dataTypeString[2] != null)
207 return Integer.valueOf(dataTypeString[2]);
213 public Class getDataTypeClass()
219 return Integer.class;
232 public FTSDataColumnGroupI getGroup()
234 FTSDataColumnGroupI group = null;
237 group = getDataColumnGroupById(lineData[3]);
238 } catch (Exception e)
246 public int getMinWidth()
248 return Integer.valueOf(lineData[4]);
252 public int getMaxWidth()
254 return Integer.valueOf(lineData[5]);
258 public int getPreferredWidth()
260 return Integer.valueOf(lineData[6]);
264 public boolean isPrimaryKeyColumn()
266 return getName().equalsIgnoreCase(primaryKeyColumnCode)
267 || getCode().equalsIgnoreCase(primaryKeyColumnCode);
271 public boolean isVisibleByDefault()
273 return Boolean.valueOf(lineData[7]);
277 public boolean isSearchable()
279 return Boolean.valueOf(lineData[8]);
283 public int hashCode()
285 return Objects.hash(this.getName(), this.getCode(),
290 public boolean equals(Object otherObject)
292 FTSDataColumnI that = (FTSDataColumnI) otherObject;
293 return otherObject == null ? false
294 : this.getCode().equals(that.getCode())
295 && this.getName().equals(that.getName())
296 && this.getGroup().equals(that.getGroup());
300 dataColumns.add(dataCol);
302 if (dataCol.isSearchable())
304 searchableDataColumns.add(dataCol);
307 if (dataCol.isVisibleByDefault())
309 defaulDisplayedDataColumns.add(dataCol);
317 } catch (Exception e)
324 this.primaryKeyColumn = getDataColumnByNameOrCode(
325 primaryKeyColumnCode);
326 } catch (Exception e)
330 } catch (IOException e)
337 public int getPrimaryKeyColumIndex(
338 Collection<FTSDataColumnI> wantedFields, boolean hasRefSeq)
342 // If a reference sequence is attached then start counting from 1 else
344 int pdbFieldIndexCounter = hasRefSeq ? 1 : 0;
346 for (FTSDataColumnI field : wantedFields)
348 if (field.isPrimaryKeyColumn())
350 break; // Once PDB Id index is determined exit iteration
352 ++pdbFieldIndexCounter;
354 return pdbFieldIndexCounter;
358 public String getDataColumnsFieldsAsCommaDelimitedString(
359 Collection<FTSDataColumnI> dataColumnFields)
362 if (dataColumnFields != null && !dataColumnFields.isEmpty())
364 StringBuilder returnedFields = new StringBuilder();
365 for (FTSDataColumnI field : dataColumnFields)
367 returnedFields.append(",").append(field.getCode());
369 returnedFields.deleteCharAt(0);
370 result = returnedFields.toString();
376 public Collection<FTSDataColumnI> getAllFTSDataColumns()
378 if (dataColumns == null || dataColumns.isEmpty())
380 parseDataColumnsConfigFile();
386 public Collection<FTSDataColumnI> getSearchableDataColumns()
388 if (searchableDataColumns == null || searchableDataColumns.isEmpty())
390 parseDataColumnsConfigFile();
392 return searchableDataColumns;
396 public Collection<FTSDataColumnI> getAllDefaultDisplayedFTSDataColumns()
398 if (defaulDisplayedDataColumns == null
399 || defaulDisplayedDataColumns.isEmpty())
401 parseDataColumnsConfigFile();
403 return defaulDisplayedDataColumns;
407 public FTSDataColumnI getPrimaryKeyColumn()
409 if (defaulDisplayedDataColumns == null
410 || defaulDisplayedDataColumns.isEmpty())
412 parseDataColumnsConfigFile();
414 return primaryKeyColumn;
418 public FTSDataColumnI getDataColumnByNameOrCode(String nameOrCode)
421 if (dataColumns == null || dataColumns.isEmpty())
423 parseDataColumnsConfigFile();
425 for (FTSDataColumnI column : dataColumns)
427 if (column.getName().equalsIgnoreCase(nameOrCode)
428 || column.getCode().equalsIgnoreCase(nameOrCode))
434 "Couldn't find data column with name : " + nameOrCode);
440 * @param mocks {{working query, working response}, ...}
442 public static void createMockFTSRestClient(FTSRestClient instance,String[][] mocks)
444 instance.setMock(mocks);
448 public FTSDataColumnGroupI getDataColumnGroupById(String id)
451 if (dataColumns == null || dataColumns.isEmpty())
453 parseDataColumnsConfigFile();
455 for (FTSDataColumnGroupI columnGroup : dataColumnGroups)
457 if (columnGroup.getID().equalsIgnoreCase(id))
462 throw new Exception("Couldn't find data column group with id : " + id);
465 public static String getMessageByHTTPStatusCode(int code, String service)
471 message = "Bad request. There is a problem with your input.";
475 message = service + " rest services no longer available!";
479 message = "The requested resource could not be found";
488 message = "There seems to be an error from the " + service
492 message = "Service not available. The server is being updated, try again later.";
497 return String.valueOf(code) + " " + message;
500 public static void unMock(FTSRestClient instance)
502 instance.mockQueries=null;
505 protected String getResourceFile(String fileName)
510 result = getClass().getResource(fileName).getFile();
511 } catch (Exception e)
520 public int getDefaultResponsePageSize()
522 if (dataColumns == null || dataColumns.isEmpty())
524 parseDataColumnsConfigFile();
526 return defaultResponsePageSize;
529 protected void setMock(String[][] mocks)
535 mockQueries=new HashMap<String,String>();
536 for (String[] mock:mocks)
538 mockQueries.put(mock[0],mock[1]);
542 protected boolean isMocked()
544 return mockQueries!=null;
548 public String[] getPreferencesColumnsFor(PreferenceSource source)
550 String[] columnNames = null;
554 columnNames = new String[] { "", "Display", "Group" };
557 // non structure sources don't return any other kind of preferences columns