1 package jalview.fts.core;
3 import jalview.fts.api.FTSDataColumnI;
4 import jalview.fts.api.FTSDataColumnI.FTSDataColumnGroupI;
5 import jalview.fts.api.FTSRestClientI;
6 import jalview.util.MessageManager;
8 import java.io.BufferedReader;
9 import java.io.IOException;
10 import java.io.InputStream;
11 import java.io.InputStreamReader;
12 import java.util.ArrayList;
13 import java.util.Collection;
14 import java.util.Objects;
17 * Base class providing implementation for common methods defined in
22 * @note implementations MUST be accessed as a singleton.
24 public abstract class FTSRestClient implements FTSRestClientI
26 protected Collection<FTSDataColumnI> dataColumns = new ArrayList<FTSDataColumnI>();
28 protected Collection<FTSDataColumnGroupI> dataColumnGroups = new ArrayList<FTSDataColumnGroupI>();
30 protected Collection<FTSDataColumnI> searchableDataColumns = new ArrayList<FTSDataColumnI>();
32 protected Collection<FTSDataColumnI> defaulDisplayedDataColumns = new ArrayList<FTSDataColumnI>();
34 protected FTSDataColumnI primaryKeyColumn;
36 private String primaryKeyColumnCode = null;
38 private int defaultResponsePageSize = 100;
40 protected FTSRestClient()
45 public void parseDataColumnsConfigFile()
47 String fileName = getColumnDataConfigFileName();
49 InputStream in = getClass().getResourceAsStream(fileName);
51 try (BufferedReader br = new BufferedReader(new InputStreamReader(in)))
54 while ((line = br.readLine()) != null)
56 final String[] lineData = line.split(";");
59 if (lineData.length == 2)
61 if (lineData[0].equalsIgnoreCase("_data_column.primary_key"))
63 primaryKeyColumnCode = lineData[1];
66 .equalsIgnoreCase("_data_column.default_response_page_size"))
68 defaultResponsePageSize = Integer.valueOf(lineData[1]);
71 else if (lineData.length == 3)
73 dataColumnGroups.add(new FTSDataColumnGroupI()
82 public String getName()
88 public int getSortOrder()
90 return Integer.valueOf(lineData[2]);
94 public String toString()
100 public int hashCode()
102 return Objects.hash(this.getID(), this.getName(),
103 this.getSortOrder());
107 public boolean equals(Object otherObject)
109 FTSDataColumnGroupI that = (FTSDataColumnGroupI) otherObject;
110 return this.getID().equals(that.getID())
111 && this.getName().equals(that.getName())
112 && this.getSortOrder() == that.getSortOrder();
116 else if (lineData.length > 6)
118 FTSDataColumnI dataCol = new FTSDataColumnI()
121 public String toString()
127 public String getName()
133 public String getCode()
135 return lineData[1].split("\\|")[0];
139 public String getAltCode()
141 return lineData[1].split("\\|").length > 1 ? lineData[1]
142 .split("\\|")[1] : getCode();
146 public DataTypeI getDataType()
148 final String[] dataTypeString = lineData[2].split("\\|");
149 final String classString = dataTypeString[0].toUpperCase();
151 return new DataTypeI()
155 public boolean isFormtted()
157 if (dataTypeString.length > 1
158 && dataTypeString[1] != null)
160 switch (dataTypeString[1].toUpperCase())
175 public int getSignificantFigures()
177 if (dataTypeString.length > 2
178 && dataTypeString[2] != null)
180 return Integer.valueOf(dataTypeString[2]);
186 public Class getDataTypeClass()
192 return Integer.class;
205 public FTSDataColumnGroupI getGroup()
207 FTSDataColumnGroupI group = null;
210 group = getDataColumnGroupById(lineData[3]);
211 } catch (Exception e)
219 public int getMinWidth()
221 return Integer.valueOf(lineData[4]);
225 public int getMaxWidth()
227 return Integer.valueOf(lineData[5]);
231 public int getPreferredWidth()
233 return Integer.valueOf(lineData[6]);
237 public boolean isPrimaryKeyColumn()
239 return getName().equalsIgnoreCase(primaryKeyColumnCode)
240 || getCode().equalsIgnoreCase(primaryKeyColumnCode);
244 public boolean isVisibleByDefault()
246 return Boolean.valueOf(lineData[7]);
250 public boolean isSearchable()
252 return Boolean.valueOf(lineData[8]);
256 public int hashCode()
258 return Objects.hash(this.getName(), this.getCode(),
263 public boolean equals(Object otherObject)
265 FTSDataColumnI that = (FTSDataColumnI) otherObject;
266 return this.getCode().equals(that.getCode())
267 && this.getName().equals(that.getName())
268 && this.getGroup().equals(that.getGroup());
272 dataColumns.add(dataCol);
274 if (dataCol.isSearchable())
276 searchableDataColumns.add(dataCol);
279 if (dataCol.isVisibleByDefault())
281 defaulDisplayedDataColumns.add(dataCol);
289 } catch (Exception e)
296 this.primaryKeyColumn = getDataColumnByNameOrCode(primaryKeyColumnCode);
297 } catch (Exception e)
301 } catch (IOException e)
308 public int getPrimaryKeyColumIndex(
309 Collection<FTSDataColumnI> wantedFields, boolean hasRefSeq)
313 // If a reference sequence is attached then start counting from 1 else
315 int pdbFieldIndexCounter = hasRefSeq ? 1 : 0;
317 for (FTSDataColumnI field : wantedFields)
319 if (field.isPrimaryKeyColumn())
321 break; // Once PDB Id index is determined exit iteration
323 ++pdbFieldIndexCounter;
325 return pdbFieldIndexCounter;
329 public String getDataColumnsFieldsAsCommaDelimitedString(
330 Collection<FTSDataColumnI> dataColumnFields)
333 if (dataColumnFields != null && !dataColumnFields.isEmpty())
335 StringBuilder returnedFields = new StringBuilder();
336 for (FTSDataColumnI field : dataColumnFields)
338 returnedFields.append(",").append(field.getCode());
340 returnedFields.deleteCharAt(0);
341 result = returnedFields.toString();
347 public Collection<FTSDataColumnI> getAllFTSDataColumns()
349 if (dataColumns == null || dataColumns.isEmpty())
351 parseDataColumnsConfigFile();
357 public Collection<FTSDataColumnI> getSearchableDataColumns()
359 if (searchableDataColumns == null || searchableDataColumns.isEmpty())
361 parseDataColumnsConfigFile();
363 return searchableDataColumns;
367 public Collection<FTSDataColumnI> getAllDefaultDisplayedFTSDataColumns()
369 if (defaulDisplayedDataColumns == null
370 || defaulDisplayedDataColumns.isEmpty())
372 parseDataColumnsConfigFile();
374 return defaulDisplayedDataColumns;
378 public FTSDataColumnI getPrimaryKeyColumn()
380 if (defaulDisplayedDataColumns == null
381 || defaulDisplayedDataColumns.isEmpty())
383 parseDataColumnsConfigFile();
385 return primaryKeyColumn;
389 public FTSDataColumnI getDataColumnByNameOrCode(String nameOrCode)
392 if (dataColumns == null || dataColumns.isEmpty())
394 parseDataColumnsConfigFile();
396 for (FTSDataColumnI column : dataColumns)
398 if (column.getName().equalsIgnoreCase(nameOrCode)
399 || column.getCode().equalsIgnoreCase(nameOrCode))
404 throw new Exception("Couldn't find data column with name : "
409 public FTSDataColumnGroupI getDataColumnGroupById(String id)
412 if (dataColumns == null || dataColumns.isEmpty())
414 parseDataColumnsConfigFile();
416 for (FTSDataColumnGroupI columnGroup : dataColumnGroups)
418 if (columnGroup.getID().equalsIgnoreCase(id))
423 throw new Exception("Couldn't find data column group with id : " + id);
426 public String getMessageByHTTPStatusCode(int code, String service)
432 message = MessageManager.getString("exception.bad_request");
436 message = MessageManager.formatMessage(
437 "exception.fts_rest_service_no_longer_available", service);
441 message = MessageManager.getString("exception.resource_not_be_found");
450 message = MessageManager.formatMessage("exception.fts_server_error",
454 message = MessageManager.getString("exception.service_not_available");
462 protected String getResourceFile(String fileName)
467 result = getClass().getResource(fileName).getFile();
468 } catch (Exception e)
477 public int getDefaultResponsePageSize()
479 if (dataColumns == null || dataColumns.isEmpty())
481 parseDataColumnsConfigFile();
483 return defaultResponsePageSize;