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(),
264 public boolean equals(Object otherObject)
266 FTSDataColumnI that = (FTSDataColumnI) otherObject;
267 return this.getCode().equals(that.getCode())
268 && this.getName().equals(that.getName())
269 && this.getGroup().equals(that.getGroup());
274 dataColumns.add(dataCol);
276 if (dataCol.isSearchable())
278 searchableDataColumns.add(dataCol);
281 if (dataCol.isVisibleByDefault())
283 defaulDisplayedDataColumns.add(dataCol);
291 } catch (Exception e)
298 this.primaryKeyColumn = getDataColumnByNameOrCode(primaryKeyColumnCode);
299 } catch (Exception e)
303 } catch (IOException e)
310 public int getPrimaryKeyColumIndex(
311 Collection<FTSDataColumnI> wantedFields, boolean hasRefSeq)
315 // If a reference sequence is attached then start counting from 1 else
317 int pdbFieldIndexCounter = hasRefSeq ? 1 : 0;
319 for (FTSDataColumnI field : wantedFields)
321 if (field.isPrimaryKeyColumn())
323 break; // Once PDB Id index is determined exit iteration
325 ++pdbFieldIndexCounter;
327 return pdbFieldIndexCounter;
331 public String getDataColumnsFieldsAsCommaDelimitedString(
332 Collection<FTSDataColumnI> dataColumnFields)
335 if (dataColumnFields != null && !dataColumnFields.isEmpty())
337 StringBuilder returnedFields = new StringBuilder();
338 for (FTSDataColumnI field : dataColumnFields)
340 returnedFields.append(",").append(field.getCode());
342 returnedFields.deleteCharAt(0);
343 result = returnedFields.toString();
350 public Collection<FTSDataColumnI> getAllFTSDataColumns()
352 if (dataColumns == null || dataColumns.isEmpty())
354 parseDataColumnsConfigFile();
360 public Collection<FTSDataColumnI> getSearchableDataColumns()
362 if (searchableDataColumns == null || searchableDataColumns.isEmpty())
364 parseDataColumnsConfigFile();
366 return searchableDataColumns;
370 public Collection<FTSDataColumnI> getAllDefaulDisplayedDataColumns()
372 if (defaulDisplayedDataColumns == null
373 || defaulDisplayedDataColumns.isEmpty())
375 parseDataColumnsConfigFile();
377 return defaulDisplayedDataColumns;
381 public FTSDataColumnI getPrimaryKeyColumn()
383 if (defaulDisplayedDataColumns == null
384 || defaulDisplayedDataColumns.isEmpty())
386 parseDataColumnsConfigFile();
388 return primaryKeyColumn;
392 public FTSDataColumnI getDataColumnByNameOrCode(String nameOrCode)
395 if (dataColumns == null || dataColumns.isEmpty())
397 parseDataColumnsConfigFile();
399 for (FTSDataColumnI column : dataColumns)
401 if (column.getName().equalsIgnoreCase(nameOrCode)
402 || column.getCode().equalsIgnoreCase(nameOrCode))
407 throw new Exception("Couldn't find data column with name : "
412 public FTSDataColumnGroupI getDataColumnGroupById(String id)
415 if (dataColumns == null || dataColumns.isEmpty())
417 parseDataColumnsConfigFile();
419 for (FTSDataColumnGroupI columnGroup : dataColumnGroups)
421 if (columnGroup.getID().equalsIgnoreCase(id))
426 throw new Exception("Couldn't find data column group with id : " + id);
429 public String getMessageByHTTPStatusCode(int code, String service)
435 message = MessageManager
436 .getString("exception.bad_request");
440 message = MessageManager.formatMessage(
441 "exception.fts_rest_service_no_longer_available", service);
445 message = MessageManager.getString("exception.resource_not_be_found");
454 message = MessageManager.getString("exception.fts_server_error");
457 message = MessageManager.getString("exception.service_not_available");
465 protected String getResourceFile(String fileName)
470 result = getClass().getResource(fileName).getFile();
471 } catch (Exception e)
480 public int getDefaultResponsePageSize()
482 if (dataColumns == null || dataColumns.isEmpty())
484 parseDataColumnsConfigFile();
486 return defaultResponsePageSize;