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()
151 public String getName()
157 public String getCode()
159 return lineData[1].split("\\|")[0];
163 public String getAltCode()
165 return lineData[1].split("\\|").length > 1
166 ? lineData[1].split("\\|")[1]
171 public DataTypeI getDataType()
173 final String[] dataTypeString = lineData[2].split("\\|");
174 final String classString = dataTypeString[0]
175 .toUpperCase(Locale.ROOT);
177 return new DataTypeI()
181 public boolean isFormtted()
183 if (dataTypeString.length > 1
184 && dataTypeString[1] != null)
186 switch (dataTypeString[1].toUpperCase(Locale.ROOT))
201 public int getSignificantFigures()
203 if (dataTypeString.length > 2
204 && dataTypeString[2] != null)
206 return Integer.valueOf(dataTypeString[2]);
212 public Class getDataTypeClass()
218 return Integer.class;
231 public FTSDataColumnGroupI getGroup()
233 FTSDataColumnGroupI group = null;
236 group = getDataColumnGroupById(lineData[3]);
237 } catch (Exception e)
245 public int getMinWidth()
247 return Integer.valueOf(lineData[4]);
251 public int getMaxWidth()
253 return Integer.valueOf(lineData[5]);
257 public int getPreferredWidth()
259 return Integer.valueOf(lineData[6]);
263 public boolean isPrimaryKeyColumn()
265 return getName().equalsIgnoreCase(primaryKeyColumnCode)
266 || getCode().equalsIgnoreCase(primaryKeyColumnCode);
270 public boolean isVisibleByDefault()
272 return Boolean.valueOf(lineData[7]);
276 public boolean isSearchable()
278 return Boolean.valueOf(lineData[8]);
282 public int hashCode()
284 return Objects.hash(this.getName(), this.getCode(),
289 public boolean equals(Object otherObject)
291 FTSDataColumnI that = (FTSDataColumnI) otherObject;
292 return otherObject == null ? false
293 : this.getCode().equals(that.getCode())
294 && this.getName().equals(that.getName())
295 && this.getGroup().equals(that.getGroup());
299 dataColumns.add(dataCol);
301 if (dataCol.isSearchable())
303 searchableDataColumns.add(dataCol);
306 if (dataCol.isVisibleByDefault())
308 defaulDisplayedDataColumns.add(dataCol);
316 } catch (Exception e)
323 this.primaryKeyColumn = getDataColumnByNameOrCode(
324 primaryKeyColumnCode);
325 } catch (Exception e)
329 } catch (IOException e)
336 public int getPrimaryKeyColumIndex(
337 Collection<FTSDataColumnI> wantedFields, boolean hasRefSeq)
341 // If a reference sequence is attached then start counting from 1 else
343 int pdbFieldIndexCounter = hasRefSeq ? 1 : 0;
345 for (FTSDataColumnI field : wantedFields)
347 if (field.isPrimaryKeyColumn())
349 break; // Once PDB Id index is determined exit iteration
351 ++pdbFieldIndexCounter;
353 return pdbFieldIndexCounter;
357 public String getDataColumnsFieldsAsCommaDelimitedString(
358 Collection<FTSDataColumnI> dataColumnFields)
361 if (dataColumnFields != null && !dataColumnFields.isEmpty())
363 StringBuilder returnedFields = new StringBuilder();
364 for (FTSDataColumnI field : dataColumnFields)
366 returnedFields.append(",").append(field.getCode());
368 returnedFields.deleteCharAt(0);
369 result = returnedFields.toString();
375 public Collection<FTSDataColumnI> getAllFTSDataColumns()
377 if (dataColumns == null || dataColumns.isEmpty())
379 parseDataColumnsConfigFile();
385 public Collection<FTSDataColumnI> getSearchableDataColumns()
387 if (searchableDataColumns == null || searchableDataColumns.isEmpty())
389 parseDataColumnsConfigFile();
391 return searchableDataColumns;
395 public Collection<FTSDataColumnI> getAllDefaultDisplayedFTSDataColumns()
397 if (defaulDisplayedDataColumns == null
398 || defaulDisplayedDataColumns.isEmpty())
400 parseDataColumnsConfigFile();
402 return defaulDisplayedDataColumns;
406 public FTSDataColumnI getPrimaryKeyColumn()
408 if (defaulDisplayedDataColumns == null
409 || defaulDisplayedDataColumns.isEmpty())
411 parseDataColumnsConfigFile();
413 return primaryKeyColumn;
417 public FTSDataColumnI getDataColumnByNameOrCode(String nameOrCode)
420 if (dataColumns == null || dataColumns.isEmpty())
422 parseDataColumnsConfigFile();
424 for (FTSDataColumnI column : dataColumns)
426 if (column.getName().equalsIgnoreCase(nameOrCode)
427 || column.getCode().equalsIgnoreCase(nameOrCode))
433 "Couldn't find data column with name : " + nameOrCode);
440 * {{working query, working response}, ...}
442 public static void createMockFTSRestClient(FTSRestClient instance,
445 instance.setMock(mocks);
449 public FTSDataColumnGroupI getDataColumnGroupById(String id)
452 if (dataColumns == null || dataColumns.isEmpty())
454 parseDataColumnsConfigFile();
456 for (FTSDataColumnGroupI columnGroup : dataColumnGroups)
458 if (columnGroup.getID().equalsIgnoreCase(id))
463 throw new Exception("Couldn't find data column group with id : " + id);
466 public static String getMessageByHTTPStatusCode(int code, String service)
472 message = "Bad request. There is a problem with your input.";
476 message = service + " rest services no longer available!";
480 message = "The requested resource could not be found";
489 message = "There seems to be an error from the " + service
493 message = "Service not available. The server is being updated, try again later.";
498 return String.valueOf(code) + " " + message;
501 public static void unMock(FTSRestClient instance)
503 instance.mockQueries = null;
506 protected String getResourceFile(String fileName)
511 result = getClass().getResource(fileName).getFile();
512 } catch (Exception e)
521 public int getDefaultResponsePageSize()
523 if (dataColumns == null || dataColumns.isEmpty())
525 parseDataColumnsConfigFile();
527 return defaultResponsePageSize;
530 protected void setMock(String[][] mocks)
537 mockQueries = new HashMap<String, String>();
538 for (String[] mock : mocks)
540 mockQueries.put(mock[0], mock[1]);
544 protected boolean isMocked()
546 return mockQueries != null;
550 public String[] getPreferencesColumnsFor(PreferenceSource source)
552 String[] columnNames = null;
556 columnNames = new String[] { "", "Display", "Group" };
559 // non structure sources don't return any other kind of preferences