9861b1a5f3abfa7f5f4d37cd49aa1de019749f27
[jalview.git] / src / jalview / gui / structurechooser / StructureChooserQuerySource.java
1 package jalview.gui.structurechooser;
2
3 import java.util.Collection;
4 import java.util.HashSet;
5 import java.util.LinkedHashSet;
6 import java.util.List;
7 import java.util.Objects;
8 import java.util.Set;
9 import java.util.Vector;
10
11 import javax.swing.JTable;
12 import javax.swing.table.TableModel;
13
14 import jalview.datamodel.DBRefEntry;
15 import jalview.datamodel.DBRefSource;
16 import jalview.datamodel.PDBEntry;
17 import jalview.datamodel.SequenceI;
18 import jalview.fts.api.FTSData;
19 import jalview.fts.api.FTSDataColumnI;
20 import jalview.fts.api.FTSRestClientI;
21 import jalview.fts.core.FTSDataColumnPreferences;
22 import jalview.fts.core.FTSDataColumnPreferences.PreferenceSource;
23 import jalview.fts.core.FTSRestRequest;
24 import jalview.fts.core.FTSRestResponse;
25 import jalview.fts.service.pdb.PDBFTSRestClient;
26 import jalview.jbgui.GStructureChooser.FilterOption;
27
28 /**
29  * logic for querying sources of structural data for structures of sequences
30  * 
31  * @author jprocter
32  *
33  * @param <T>
34  */
35 public abstract class StructureChooserQuerySource
36 {
37   protected FTSRestRequest lastPdbRequest;
38
39   protected FTSRestClientI pdbRestClient;
40
41   protected FTSDataColumnPreferences docFieldPrefs;
42
43   /**
44    * max length of a GET URL (probably :( )
45    */
46   protected static int MAX_QLENGTH = 7820;
47
48   public StructureChooserQuerySource()
49   {
50   }
51
52   public static StructureChooserQuerySource getPDBfts()
53   {
54           return new PDBStructureChooserQuerySource();
55   }
56
57   public static StructureChooserQuerySource getTDBfts()
58   {
59     return new ThreeDBStructureChooserQuerySource();
60   }
61
62   public FTSDataColumnPreferences getDocFieldPrefs()
63   {
64     return docFieldPrefs;
65   }
66
67   public void setDocFieldPrefs(FTSDataColumnPreferences docFieldPrefs)
68   {
69     this.docFieldPrefs = docFieldPrefs;
70   }
71
72   public FTSDataColumnPreferences getInitialFieldPreferences()
73   {
74     return docFieldPrefs;
75   }
76
77
78   /**
79    * Builds a query string for a given sequences using its DBRef entries
80    * 
81    * @param seq
82    *          the sequences to build a query for
83    * @return the built query string
84    */
85
86   public abstract String buildQuery(SequenceI seq);
87   
88
89   /**
90    * Remove the following special characters from input string +, -, &, !, (, ),
91    * {, }, [, ], ^, ", ~, *, ?, :, \
92    * 
93    * @param seqName
94    * @return
95    */
96   public static String sanitizeSeqName(String seqName)
97   {
98     Objects.requireNonNull(seqName);
99     return seqName.replaceAll("\\[\\d*\\]", "")
100             .replaceAll("[^\\dA-Za-z|_]", "").replaceAll("\\s+", "+");
101   }
102
103   /**
104    * Ensures sequence ref names are not less than 3 characters and does not
105    * contain a database name
106    * 
107    * @param seqName
108    * @return
109    */
110   static boolean isValidSeqName(String seqName)
111   {
112     // System.out.println("seqName : " + seqName);
113     String ignoreList = "pdb,uniprot,swiss-prot";
114     if (seqName.length() < 3)
115     {
116       return false;
117     }
118     if (seqName.contains(":"))
119     {
120       return false;
121     }
122     seqName = seqName.toLowerCase();
123     for (String ignoredEntry : ignoreList.split(","))
124     {
125       if (seqName.contains(ignoredEntry))
126       {
127         return false;
128       }
129     }
130     return true;
131   }
132
133   static String getDBRefId(DBRefEntry dbRef)
134   {
135     String ref = dbRef.getAccessionId().replaceAll("GO:", "");
136     return ref;
137   }
138
139   static PDBEntry getFindEntry(String id, Vector<PDBEntry> pdbEntries)
140   {
141     Objects.requireNonNull(id);
142     Objects.requireNonNull(pdbEntries);
143     PDBEntry foundEntry = null;
144     for (PDBEntry entry : pdbEntries)
145     {
146       if (entry.getId().equalsIgnoreCase(id))
147       {
148         return entry;
149       }
150     }
151     return foundEntry;
152   }
153
154   /**
155    * FTSRestClient specific query builder to recover associated structure data
156    * records for a sequence
157    * 
158    * @param seq
159    *          - seq to generate a query for
160    * @param wantedFields
161    *          - fields to retrieve
162    * @param selectedFilterOpt
163    *          - criterion for ranking results (e.g. resolution)
164    * @param b
165    *          - sort ascending or descending
166    * @return
167    * @throws Exception
168    */
169   public abstract FTSRestResponse fetchStructuresMetaData(SequenceI seq,
170           Collection<FTSDataColumnI> wantedFields,
171           FilterOption selectedFilterOpt, boolean b) throws Exception;
172
173   /**
174    * FTSRestClient specific query builder to pick top ranked entry from a
175    * fetchStructuresMetaData query
176    * 
177    * @param seq
178    *          - seq to generate a query for
179    * @param wantedFields
180    *          - fields to retrieve
181    * @param selectedFilterOpt
182    *          - criterion for ranking results (e.g. resolution)
183    * @param b
184    *          - sort ascending or descending
185    * @return
186    * @throws Exception
187    */
188   public abstract FTSRestResponse selectFirstRankedQuery(SequenceI seq,
189           Collection<FTSDataColumnI> wantedFields, String fieldToFilterBy,
190           boolean b) throws Exception;
191
192   /**
193    * 
194    * @param discoveredStructuresSet
195    * @return the table model for the given result set for this engine
196    */
197   public TableModel getTableModel(
198           Collection<FTSData> discoveredStructuresSet)
199   {
200     return FTSRestResponse.getTableModel(lastPdbRequest,
201             discoveredStructuresSet);
202   }
203
204   public abstract PDBEntry[] collectSelectedRows(JTable restable,
205           int[] selectedRows, List<SequenceI> selectedSeqsToView);
206
207 }