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.io.BufferedReader;
24 import java.io.IOException;
25 import java.io.InputStream;
26 import java.io.InputStreamReader;
27 import java.util.ArrayList;
28 import java.util.Collection;
29 import java.util.HashMap;
30 import java.util.Locale;
31 import java.util.Objects;
33 import jalview.fts.api.FTSDataColumnI;
34 import jalview.fts.api.FTSDataColumnI.FTSDataColumnGroupI;
35 import jalview.fts.api.FTSRestClientI;
36 import jalview.fts.core.FTSDataColumnPreferences.PreferenceSource;
39 * Base class providing implementation for common methods defined in
44 * @note implementations MUST be accessed as a singleton.
46 public abstract class FTSRestClient implements FTSRestClientI
48 protected Collection<FTSDataColumnI> dataColumns = new ArrayList<>();
50 protected Collection<FTSDataColumnGroupI> dataColumnGroups = new ArrayList<>();
52 protected Collection<FTSDataColumnI> searchableDataColumns = new ArrayList<>();
54 protected Collection<FTSDataColumnI> defaulDisplayedDataColumns = new ArrayList<>();
56 protected FTSDataColumnI primaryKeyColumn;
58 private String primaryKeyColumnCode = null;
60 private int defaultResponsePageSize = 100;
62 protected HashMap<String, String> mockQueries = null;
64 protected FTSRestClient()
69 public void parseDataColumnsConfigFile()
71 String fileName = getColumnDataConfigFileName();
73 InputStream in = getClass().getResourceAsStream(fileName);
75 try (BufferedReader br = new BufferedReader(new InputStreamReader(in)))
78 while ((line = br.readLine()) != null)
80 final String[] lineData = line.split(";");
83 if (lineData.length == 2)
85 if (lineData[0].equalsIgnoreCase("_data_column.primary_key"))
87 primaryKeyColumnCode = lineData[1];
89 if (lineData[0].equalsIgnoreCase(
90 "_data_column.default_response_page_size"))
92 defaultResponsePageSize = Integer.valueOf(lineData[1]);
95 else if (lineData.length == 3)
97 dataColumnGroups.add(new FTSDataColumnGroupI()
100 public String getID()
106 public String getName()
112 public int getSortOrder()
114 return Integer.valueOf(lineData[2]);
118 public String toString()
124 public int hashCode()
126 return Objects.hash(this.getID(), this.getName(),
127 this.getSortOrder());
131 public boolean equals(Object otherObject)
133 FTSDataColumnGroupI that = (FTSDataColumnGroupI) otherObject;
134 return this.getID().equals(that.getID())
135 && this.getName().equals(that.getName())
136 && this.getSortOrder() == that.getSortOrder();
140 else if (lineData.length > 6)
142 FTSDataColumnI dataCol = new FTSDataColumnI()
145 public String toString()
147 return "ALL".equals(getName()) ? getName()
148 : getName() + " [" + getAltCode() + "]";
152 public String getName()
158 public String getCode()
160 return lineData[1].split("\\|")[0];
164 public String getAltCode()
166 return lineData[1].split("\\|").length > 1
167 ? lineData[1].split("\\|")[1]
172 public DataTypeI getDataType()
174 final String[] dataTypeString = lineData[2].split("\\|");
175 final String classString = dataTypeString[0]
176 .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);
441 * {{working query, working response}, ...}
443 public static void createMockFTSRestClient(FTSRestClient instance,
446 instance.setMock(mocks);
450 public FTSDataColumnGroupI getDataColumnGroupById(String id)
453 if (dataColumns == null || dataColumns.isEmpty())
455 parseDataColumnsConfigFile();
457 for (FTSDataColumnGroupI columnGroup : dataColumnGroups)
459 if (columnGroup.getID().equalsIgnoreCase(id))
464 throw new Exception("Couldn't find data column group with id : " + id);
467 public static String getMessageByHTTPStatusCode(int code, String service)
473 message = "Bad request. There is a problem with your input.";
477 message = service + " rest services no longer available!";
481 message = "The requested resource could not be found";
490 message = "There seems to be an error from the " + service
494 message = "Service not available. The server is being updated, try again later.";
499 return String.valueOf(code) + " " + message;
502 public static void unMock(FTSRestClient instance)
504 instance.mockQueries = null;
507 protected String getResourceFile(String fileName)
512 result = getClass().getResource(fileName).getFile();
513 } catch (Exception e)
522 public int getDefaultResponsePageSize()
524 if (dataColumns == null || dataColumns.isEmpty())
526 parseDataColumnsConfigFile();
528 return defaultResponsePageSize;
531 protected void setMock(String[][] mocks)
538 mockQueries = new HashMap<String, String>();
539 for (String[] mock : mocks)
541 mockQueries.put(mock[0], mock[1]);
545 protected boolean isMocked()
547 return mockQueries != null;
551 public String[] getPreferencesColumnsFor(PreferenceSource source)
553 String[] columnNames = null;
557 columnNames = new String[] { "", "Display", "Group" };
560 // non structure sources don't return any other kind of preferences