Fixes to test cases
[jabaws.git] / datamodel / compbio / data / sequence / ScoreManager.java
1 package compbio.data.sequence;\r
2 \r
3 import java.io.BufferedWriter;\r
4 import java.io.IOException;\r
5 import java.io.OutputStream;\r
6 import java.io.OutputStreamWriter;\r
7 import java.util.ArrayList;\r
8 import java.util.HashMap;\r
9 import java.util.HashSet;\r
10 import java.util.List;\r
11 import java.util.Map;\r
12 import java.util.Set;\r
13 \r
14 import javax.xml.bind.annotation.XmlAccessType;\r
15 import javax.xml.bind.annotation.XmlAccessorType;\r
16 \r
17 @XmlAccessorType(XmlAccessType.FIELD)\r
18 public class ScoreManager {\r
19 \r
20         public static final String SINGLE_ENTRY_KEY = "Alignment";\r
21 \r
22         private List<ScoreHolder> seqScores;\r
23 \r
24         private ScoreManager() {\r
25                 // Default JAXB constructor\r
26         }\r
27 \r
28         private ScoreManager(String id, Set<Score> data) {\r
29                 seqScores = new ArrayList<ScoreManager.ScoreHolder>();\r
30                 seqScores.add(new ScoreHolder(id, data));\r
31         }\r
32 \r
33         private ScoreManager(Map<String, Set<Score>> data) {\r
34                 List<ScoreHolder> seqScores = new ArrayList<ScoreHolder>();\r
35                 for (Map.Entry<String, Set<Score>> singleSeqScores : data.entrySet()) {\r
36                         seqScores.add(new ScoreHolder(singleSeqScores.getKey(),\r
37                                         singleSeqScores.getValue()));\r
38                 }\r
39                 this.seqScores = seqScores;\r
40         }\r
41 \r
42         public static ScoreManager newInstance(Map<String, Set<Score>> data) {\r
43                 return new ScoreManager(data);\r
44         }\r
45 \r
46         public static ScoreManager newInstanceSingleScore(\r
47                         Map<String, Score> seqScoresMap) {\r
48                 Map<String, Set<Score>> multipleScoresMap = new HashMap<String, Set<Score>>();\r
49                 for (Map.Entry<String, Score> seqScore : seqScoresMap.entrySet()) {\r
50                         Set<Score> scores = new HashSet<Score>();\r
51                         scores.add(seqScore.getValue());\r
52                         multipleScoresMap.put(seqScore.getKey(), scores);\r
53                 }\r
54                 return new ScoreManager(multipleScoresMap);\r
55         }\r
56 \r
57         public static ScoreManager newInstanceSingleSequence(Set<Score> data) {\r
58                 return new ScoreManager(ScoreManager.SINGLE_ENTRY_KEY, data);\r
59         }\r
60 \r
61         public Map<String, Set<Score>> asMap() {\r
62                 Map<String, Set<Score>> seqScoresMap = new HashMap<String, Set<Score>>();\r
63                 for (ScoreHolder sch : this.seqScores) {\r
64                         Set<Score> oldValue = seqScoresMap.put(sch.id, sch.scores);\r
65                         if (oldValue != null) {\r
66                                 throw new IllegalStateException(\r
67                                                 "Cannot represent this ScoreManager instance "\r
68                                                                 + "as a Map as it contains duplicated keys: "\r
69                                                                 + sch.id);\r
70                         }\r
71                 }\r
72                 return seqScoresMap;\r
73         }\r
74 \r
75         public Set<Score> asSet() {\r
76                 if (seqScores.size() == 0 || seqScores.size() > 1) {\r
77                         throw new IllegalStateException(\r
78                                         "This ScoreManager has no or multiple sequence entries and thus "\r
79                                                         + "cannot be represented as a Set. Number of entries are: "\r
80                                                         + seqScores.size());\r
81                 }\r
82                 ScoreHolder sch = seqScores.get(0);\r
83                 return sch.scores;\r
84         }\r
85 \r
86         public int getNumberOfSeq() {\r
87                 return seqScores.size();\r
88         }\r
89 \r
90         public ScoreHolder getAnnotationForSequence(String seqId) {\r
91                 for (ScoreHolder sch : seqScores) {\r
92                         if (sch.id.equals(seqId)) {\r
93                                 return sch;\r
94                         }\r
95                 }\r
96                 return null;\r
97         }\r
98 \r
99         public void writeOut(OutputStream outStream) throws IOException {\r
100                 BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(\r
101                                 outStream));\r
102                 for (ScoreHolder oneSeqScores : seqScores) {\r
103                         oneSeqScores.writeOut(outStream);\r
104                 }\r
105                 writer.flush();\r
106         }\r
107         \r
108 \r
109         @Override\r
110         public int hashCode() {\r
111                 final int prime = 31;\r
112                 int result = 1;\r
113                 result = prime * result\r
114                                 + ((seqScores == null) ? 0 : seqScores.hashCode());\r
115                 return result;\r
116         }\r
117 \r
118         @Override\r
119         public boolean equals(Object obj) {\r
120                 if (this == obj)\r
121                         return true;\r
122                 if (obj == null)\r
123                         return false;\r
124                 if (getClass() != obj.getClass())\r
125                         return false;\r
126                 ScoreManager other = (ScoreManager) obj;\r
127                 if (seqScores == null) {\r
128                         if (other.seqScores != null)\r
129                                 return false;\r
130                 } else if (!seqScores.equals(other.seqScores))\r
131                         return false;\r
132                 return true;\r
133         }\r
134 \r
135 \r
136 \r
137         @XmlAccessorType(XmlAccessType.FIELD)\r
138         public static class ScoreHolder {\r
139 \r
140                 public String id;\r
141                 public Set<Score> scores;\r
142 \r
143                 private ScoreHolder() {\r
144                         // JAXB Default constructor should not be used otherwise\r
145                 }\r
146 \r
147                 ScoreHolder(String id, Set<Score> scores) {\r
148                         this.id = id;\r
149                         this.scores = scores;\r
150                 }\r
151 \r
152                 public void writeOut(OutputStream outStream) throws IOException {\r
153                         BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(\r
154                                         outStream));\r
155                         writer.write(">" + id + "\n");\r
156                         Score.write(scores, outStream);\r
157                 }\r
158 \r
159                 public Score getScoreByMethod(Enum<?> method) {\r
160                         for (Score sc : scores) {\r
161                                 if (method == sc.getMethod()) {\r
162                                         return sc;\r
163                                 }\r
164                         }\r
165                         return null;\r
166                 }\r
167 \r
168                 public int getNumberOfScores() {\r
169                         return scores.size();\r
170                 }\r
171 \r
172                 @Override\r
173                 public int hashCode() {\r
174                         final int prime = 17;\r
175                         int result = 1;\r
176                         result = prime * result + ((id == null) ? 0 : id.hashCode());\r
177                         result = prime * result\r
178                                         + ((scores == null) ? 0 : scores.hashCode());\r
179                         return result;\r
180                 }\r
181 \r
182                 @Override\r
183                 public boolean equals(Object obj) {\r
184                         if (this == obj)\r
185                                 return true;\r
186                         if (obj == null)\r
187                                 return false;\r
188                         if (getClass() != obj.getClass())\r
189                                 return false;\r
190                         ScoreHolder other = (ScoreHolder) obj;\r
191                         if (id == null) {\r
192                                 if (other.id != null)\r
193                                         return false;\r
194                         } else if (!id.equals(other.id))\r
195                                 return false;\r
196                         if (scores == null) {\r
197                                 if (other.scores != null)\r
198                                         return false;\r
199                         } else if (!scores.equals(other.scores))\r
200                                 return false;\r
201                         return true;\r
202                 }\r
203                 \r
204                 \r
205         }\r
206 }\r