Fix for potential NullPointer exception if the results are an empty file
[jabaws.git] / datamodel / compbio / data / sequence / ScoreManager.java
1 /* Copyright (c) 2011 Peter Troshin\r
2  *  \r
3  *  JAva Bioinformatics Analysis Web Services (JABAWS) @version: 2.0     \r
4  * \r
5  *  This library is free software; you can redistribute it and/or modify it under the terms of the\r
6  *  Apache License version 2 as published by the Apache Software Foundation\r
7  * \r
8  *  This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without\r
9  *  even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Apache \r
10  *  License for more details.\r
11  * \r
12  *  A copy of the license is in apache_license.txt. It is also available here:\r
13  * @see: http://www.apache.org/licenses/LICENSE-2.0.txt\r
14  * \r
15  * Any republication or derived work distributed in source code form\r
16  * must include this copyright and license notice.\r
17  */\r
18 package compbio.data.sequence;\r
19 \r
20 import java.io.IOException;\r
21 import java.io.Writer;\r
22 import java.util.ArrayList;\r
23 import java.util.List;\r
24 import java.util.Map;\r
25 import java.util.Set;\r
26 import java.util.TreeMap;\r
27 import java.util.TreeSet;\r
28 \r
29 import javax.xml.bind.annotation.XmlAccessType;\r
30 import javax.xml.bind.annotation.XmlAccessorType;\r
31 import javax.xml.bind.annotation.XmlTransient;\r
32 \r
33 @XmlAccessorType(XmlAccessType.FIELD)\r
34 public class ScoreManager {\r
35 \r
36         @XmlTransient\r
37         public static final String SINGLE_ENTRY_KEY = "Alignment";\r
38 \r
39         private List<ScoreHolder> seqScores;\r
40 \r
41         private ScoreManager() {\r
42                 // Default JAXB constructor\r
43         }\r
44 \r
45         private ScoreManager(String id, Set<Score> data) {\r
46                 seqScores = new ArrayList<ScoreManager.ScoreHolder>();\r
47                 seqScores.add(new ScoreHolder(id, data));\r
48         }\r
49 \r
50         private ScoreManager(Map<String, Set<Score>> data) {\r
51                 List<ScoreHolder> seqScores = new ArrayList<ScoreHolder>();\r
52                 for (Map.Entry<String, Set<Score>> singleSeqScores : data.entrySet()) {\r
53                         seqScores.add(new ScoreHolder(singleSeqScores.getKey(),\r
54                                         singleSeqScores.getValue()));\r
55                 }\r
56                 this.seqScores = seqScores;\r
57         }\r
58 \r
59         public static ScoreManager newInstance(Map<String, Set<Score>> data) {\r
60                 return new ScoreManager(data);\r
61         }\r
62 \r
63         public static ScoreManager newInstanceSingleScore(\r
64                         Map<String, Score> seqScoresMap) {\r
65                 Map<String, Set<Score>> multipleScoresMap = new TreeMap<String, Set<Score>>();\r
66                 for (Map.Entry<String, Score> seqScore : seqScoresMap.entrySet()) {\r
67                         Set<Score> scores = new TreeSet<Score>();\r
68                         scores.add(seqScore.getValue());\r
69                         multipleScoresMap.put(seqScore.getKey(), scores);\r
70                 }\r
71                 return new ScoreManager(multipleScoresMap);\r
72         }\r
73 \r
74         public static ScoreManager newInstanceSingleSequence(Set<Score> data) {\r
75                 return new ScoreManager(ScoreManager.SINGLE_ENTRY_KEY,\r
76                                 new TreeSet(data));\r
77         }\r
78 \r
79         public Map<String, TreeSet<Score>> asMap() {\r
80                 Map<String, TreeSet<Score>> seqScoresMap = new TreeMap<String, TreeSet<Score>>();\r
81                 for (ScoreHolder sch : this.seqScores) {\r
82                         TreeSet<Score> oldValue = seqScoresMap.put(sch.id, new TreeSet(\r
83                                         sch.scores));\r
84                         if (oldValue != null) {\r
85                                 throw new IllegalStateException(\r
86                                                 "Cannot represent this ScoreManager instance "\r
87                                                                 + "as a Map as it contains duplicated keys: "\r
88                                                                 + sch.id);\r
89                         }\r
90                 }\r
91                 return seqScoresMap;\r
92         }\r
93 \r
94         public Set<Score> asSet() {\r
95                 if (seqScores.size() == 0 || seqScores.size() > 1) {\r
96                         throw new IllegalStateException(\r
97                                         "This ScoreManager has no or multiple sequence entries and thus "\r
98                                                         + "cannot be represented as a Set. Number of entries are: "\r
99                                                         + seqScores.size());\r
100                 }\r
101                 ScoreHolder sch = seqScores.get(0);\r
102                 return sch.scores;\r
103         }\r
104 \r
105         public int getNumberOfSeq() {\r
106                 return seqScores.size();\r
107         }\r
108 \r
109         public ScoreHolder getAnnotationForSequence(String seqId) {\r
110                 for (ScoreHolder sch : seqScores) {\r
111                         if (sch.id.equals(seqId)) {\r
112                                 return sch;\r
113                         }\r
114                 }\r
115                 return null;\r
116         }\r
117 \r
118         public void writeOut(Writer outStream) throws IOException {\r
119                 assert outStream != null : "Output steam is not defined!";\r
120                 if (seqScores == null) {\r
121                         return;\r
122                 }\r
123                 for (ScoreHolder oneSeqScores : seqScores) {\r
124                         if (oneSeqScores == null)\r
125                                 continue;\r
126                         oneSeqScores.writeOut(outStream);\r
127                 }\r
128         }\r
129 \r
130         @Override\r
131         public int hashCode() {\r
132                 final int prime = 31;\r
133                 int result = 1;\r
134                 result = prime * result\r
135                                 + ((seqScores == null) ? 0 : seqScores.hashCode());\r
136                 return result;\r
137         }\r
138 \r
139         @Override\r
140         public boolean equals(Object obj) {\r
141                 if (this == obj)\r
142                         return true;\r
143                 if (obj == null)\r
144                         return false;\r
145                 if (getClass() != obj.getClass())\r
146                         return false;\r
147                 ScoreManager other = (ScoreManager) obj;\r
148                 if (seqScores == null) {\r
149                         if (other.seqScores != null)\r
150                                 return false;\r
151                 } else if (!seqScores.equals(other.seqScores))\r
152                         return false;\r
153                 return true;\r
154         }\r
155 \r
156         @XmlAccessorType(XmlAccessType.FIELD)\r
157         public static class ScoreHolder {\r
158 \r
159                 public String id;\r
160                 public TreeSet<Score> scores;\r
161 \r
162                 private ScoreHolder() {\r
163                         // JAXB Default constructor should not be used otherwise\r
164                 }\r
165 \r
166                 ScoreHolder(String id, Set<Score> scores) {\r
167                         this.id = id;\r
168                         this.scores = new TreeSet<Score>(scores);\r
169                 }\r
170 \r
171                 public void writeOut(Writer writer) throws IOException {\r
172                         writer.write(">" + id + "\n");\r
173                         Score.write(scores, writer);\r
174                 }\r
175 \r
176                 public Score getScoreByMethod(Enum<?> method) {\r
177                         for (Score sc : scores) {\r
178                                 if (method.toString().equals(sc.getMethod())) {\r
179                                         return sc;\r
180                                 }\r
181                         }\r
182                         return null;\r
183                 }\r
184                 public Score getScoreByMethod(String method) {\r
185                         for (Score sc : scores) {\r
186                                 if (method.toString().equals(sc.getMethod())) {\r
187                                         return sc;\r
188                                 }\r
189                         }\r
190                         return null;\r
191                 }\r
192                 public int getNumberOfScores() {\r
193                         return scores.size();\r
194                 }\r
195 \r
196                 @Override\r
197                 public int hashCode() {\r
198                         final int prime = 17;\r
199                         int result = 1;\r
200                         result = prime * result + ((id == null) ? 0 : id.hashCode());\r
201                         result = prime * result\r
202                                         + ((scores == null) ? 0 : scores.hashCode());\r
203                         return result;\r
204                 }\r
205 \r
206                 @Override\r
207                 public boolean equals(Object obj) {\r
208                         if (this == obj)\r
209                                 return true;\r
210                         if (obj == null)\r
211                                 return false;\r
212                         if (getClass() != obj.getClass())\r
213                                 return false;\r
214                         ScoreHolder other = (ScoreHolder) obj;\r
215                         if (id == null) {\r
216                                 if (other.id != null)\r
217                                         return false;\r
218                         } else if (!id.equals(other.id))\r
219                                 return false;\r
220                         if (scores == null) {\r
221                                 if (other.scores != null)\r
222                                         return false;\r
223                         } else if (!scores.equals(other.scores))\r
224                                 return false;\r
225                         return true;\r
226                 }\r
227 \r
228         }\r
229 \r
230 }\r