7b172dedd1126806cb0c6a0d47af69bb25d8f07b
[jalview.git] / src / jalview / ws / uimodel / PDBSearchResponse.java
1 package jalview.ws.uimodel;
2
3 import jalview.ws.dbsources.PDBRestClient.PDBDocField;
4
5 import java.util.Collection;
6 import java.util.List;
7 import java.util.Objects;
8
9 import javax.swing.DefaultListModel;
10 import javax.swing.table.DefaultTableModel;
11
12 import org.json.simple.JSONObject;
13
14 public class PDBSearchResponse
15 {
16   private int itemsFound;
17
18   private String responseTime;
19
20   private Collection<PDBResponseSummary> searchSummary;
21
22   public int getItemsFound()
23   {
24     return itemsFound;
25   }
26
27   public void setItemsFound(int itemFound)
28   {
29     this.itemsFound = itemFound;
30   }
31
32   public String getResponseTime()
33   {
34     return responseTime;
35   }
36
37   public void setResponseTime(String responseTime)
38   {
39     this.responseTime = responseTime;
40   }
41
42   public Collection<PDBResponseSummary> getSearchSummary()
43   {
44     return searchSummary;
45   }
46
47   public void setSearchSummary(Collection<PDBResponseSummary> searchSummary)
48   {
49     this.searchSummary = searchSummary;
50   }
51
52   public static DefaultListModel<PDBResponseSummary> getListModel(
53           Collection<PDBResponseSummary> summariesList)
54   {
55     DefaultListModel<PDBResponseSummary> defaultListModel = new DefaultListModel<PDBResponseSummary>();
56     for (PDBResponseSummary summaryList : summariesList)
57     {
58       defaultListModel.addElement(summaryList);
59     }
60     return defaultListModel;
61   }
62
63   public static DefaultTableModel getTableModel(PDBSearchRequest request,
64           Collection<PDBResponseSummary> summariesList)
65   {
66     DefaultTableModel model = new DefaultTableModel();
67
68     if (request.getAssociatedSequence() != null)
69     {
70       model.addColumn("Sequence");
71     }
72     for (PDBDocField field : request.getWantedFields())
73     {
74       model.addColumn(field.getName());
75     }
76
77     for (PDBResponseSummary res : summariesList)
78     {
79       model.addRow(res.getSummaryColums());
80     }
81     return model;
82   }
83
84
85   
86   public class PDBResponseSummary
87   {
88     private String pdbId;
89
90     private String summaryRow;
91
92     private String[] summaryColums;
93
94     private String associatedSequence;
95
96     private int width = 480;
97
98     public PDBResponseSummary(JSONObject doc,
99             List<PDBDocField> diplayFields, String associatedSeq)
100     {
101       StringBuilder summaryBuilder = new StringBuilder();
102
103       int colCounter = 0;
104       summaryColums = new String[(associatedSeq != null) ? diplayFields
105               .size() + 1 : diplayFields.size()];
106       if (associatedSeq != null)
107       {
108         this.associatedSequence = (associatedSeq.length() > 18) ? associatedSeq
109                 .substring(0, 18) : associatedSeq;
110         summaryColums[0] = associatedSequence;
111         colCounter = 1;
112       }
113
114       for (PDBDocField field : diplayFields)
115       {
116         if (field.equals(PDBDocField.MOLECULE_TYPE)
117                 && doc.get(PDBDocField.MOLECULE_TYPE.getCode()) != null)
118         {
119           String moleculeType = doc
120                   .get(PDBDocField.MOLECULE_TYPE.getCode()).toString();
121           if (moleculeType.equalsIgnoreCase("protein"))
122           {
123             summaryBuilder.append("<img src=\""
124                     + getClass().getResource("/images/protein.png")
125                             .toString() + "\">");
126           }
127           if (moleculeType.equalsIgnoreCase("dna"))
128           {
129             summaryBuilder.append("<img src=\""
130                     + getClass().getResource("/images/dna.png").toString()
131                     + "\">");
132           }
133           if (moleculeType.equalsIgnoreCase("rna"))
134           {
135             summaryBuilder.append("<img src=\""
136                     + getClass().getResource("/images/dna.png").toString()
137                     + "\">");
138           }
139           if (moleculeType.equalsIgnoreCase("sugar"))
140           {
141             summaryBuilder.append("<img src=\""
142                     + getClass().getResource("/images/sugar.png")
143                             .toString() + "\">");
144           }
145           summaryColums[colCounter++] = moleculeType;
146         }
147         else if (field.equals(PDBDocField.PDB_ID)
148                 && doc.get(PDBDocField.PDB_ID.getCode()) != null)
149         {
150           this.pdbId = doc.get(PDBDocField.PDB_ID.getCode()).toString();
151           summaryBuilder.append(this.pdbId).append(" | ");
152           summaryColums[colCounter++] = this.pdbId;
153         }
154         else if (doc.get(field.getCode()) != null)
155         {
156           summaryBuilder.append(field.getName()).append(": ")
157                   .append(doc.get(field.getCode())).append(" | ");
158           summaryColums[colCounter++] = doc.get(field.getCode()).toString();
159         }
160       }
161       int endIndex = summaryBuilder.lastIndexOf(" | ");
162       String fSummary = summaryBuilder.toString().substring(0, endIndex);
163       this.summaryRow = fSummary.trim();
164       summaryBuilder = null;
165     }
166
167     public String getPdbId()
168     {
169       return pdbId;
170     }
171
172     public void setPdbId(String pdbId)
173     {
174       this.pdbId = pdbId;
175     }
176
177     public String getSummaryRow()
178     {
179       return summaryRow;
180     }
181
182     public void setSummaryRow(String summary)
183     {
184       this.summaryRow = summary;
185     }
186
187     public String[] getSummaryColums()
188     {
189       return summaryColums;
190     }
191
192     public void setSummaryColums(String[] summaryColums)
193     {
194       this.summaryColums = summaryColums;
195     }
196
197     public String toString()
198     {
199       StringBuilder html = new StringBuilder();
200       html.append("<html><div style=\"width:" + width
201               + "; word-wrap: break-word; border-bottom-style: dotted;\"> ");
202       html.append(summaryRow);
203       html.append("</div></html>");
204       return html.toString();
205     }
206
207     @Override
208     public int hashCode()
209     {
210       return Objects.hash(this.pdbId, this.summaryRow);
211     }
212
213     @Override
214     public boolean equals(Object other)
215     {
216       if (!(other instanceof PDBResponseSummary))
217       {
218         return false;
219       }
220
221       PDBResponseSummary that = (PDBResponseSummary) other;
222
223       // Custom equality check here.
224       return this.pdbId.equals(that.pdbId)
225               && this.summaryRow.equals(that.summaryRow);
226     }
227
228   }
229
230 }
231