16b32346c9c3edee7ae9fd183a8449fd1a6b8755
[jabaws.git] / webservices / compbio / ws / execstat / StatProcessor.java
1 package compbio.ws.execstat;\r
2 \r
3 import java.util.ArrayList;\r
4 import java.util.Collections;\r
5 import java.util.Comparator;\r
6 import java.util.Date;\r
7 import java.util.List;\r
8 \r
9 import compbio.engine.client.ConfExecutable;\r
10 import compbio.ws.client.Services;\r
11 \r
12 public class StatProcessor {\r
13 \r
14         List<JobStat> stats;\r
15 \r
16         StatProcessor(List<JobStat> stats) {\r
17                 this.stats = stats;\r
18         }\r
19 \r
20         /*\r
21          * TODO List<JobStat> getNewStat() throws SQLException { Set<String> jobids\r
22          * = new HashSet<String>(); for(JobStat js: stats) { jobids.add(js.jobname);\r
23          * } StatDB.removeRecordedJobs(jobids); List<String> newjobs = new\r
24          * HashSet<String>(); for(String jobid: jobids) { if(newjobs.co)\r
25          * jobids.add(js.jobname); } }\r
26          */\r
27 \r
28         List<JobStat> getAbandonedJobs() {\r
29                 List<JobStat> abJobs = new ArrayList<StatProcessor.JobStat>();\r
30                 for (JobStat js : stats) {\r
31                         if (!js.isCollected) {\r
32                                 abJobs.add(js);\r
33                         }\r
34                 }\r
35                 return abJobs;\r
36         }\r
37 \r
38         List<JobStat> getCancelledJobs() {\r
39                 List<JobStat> abJobs = new ArrayList<StatProcessor.JobStat>();\r
40                 for (JobStat js : stats) {\r
41                         if (js.isCancelled) {\r
42                                 abJobs.add(js);\r
43                         }\r
44                 }\r
45                 return abJobs;\r
46         }\r
47 \r
48         List<JobStat> sortByRuntime() {\r
49                 List<JobStat> abJobs = new ArrayList<StatProcessor.JobStat>(stats);\r
50                 Collections.sort(abJobs, JobStat.RUNTIME);\r
51                 return abJobs;\r
52         }\r
53 \r
54         List<JobStat> sortByStartTime() {\r
55                 List<JobStat> abJobs = new ArrayList<StatProcessor.JobStat>(stats);\r
56                 Collections.sort(abJobs, JobStat.STARTTIME);\r
57                 return abJobs;\r
58         }\r
59 \r
60         List<JobStat> sortByResultSize() {\r
61                 List<JobStat> abJobs = new ArrayList<StatProcessor.JobStat>(stats);\r
62                 Collections.sort(abJobs, JobStat.RESULTSIZE);\r
63                 return abJobs;\r
64         }\r
65 \r
66         int getJobNumber() {\r
67                 return stats.size();\r
68         }\r
69 \r
70         public StatProcessor getSingleWSStat(Services webService) {\r
71                 List<JobStat> wsStat = new ArrayList<StatProcessor.JobStat>();\r
72                 for (JobStat js : stats) {\r
73                         if (js.webService == webService) {\r
74                                 wsStat.add(js);\r
75                         }\r
76                 }\r
77                 return new StatProcessor(wsStat);\r
78         }\r
79 \r
80         long getTotalRuntime() {\r
81                 long counter = 0;\r
82                 for (JobStat js : stats) {\r
83                         int jobtime = js.getRuntime();\r
84                         if (jobtime != ExecutionStatCollector.UNDEFINED) {\r
85                                 counter += jobtime;\r
86                         }\r
87                 }\r
88                 return counter;\r
89         }\r
90 \r
91         List<JobStat> getUnsuccessfulJobs() {\r
92                 List<JobStat> aJobs = new ArrayList<StatProcessor.JobStat>();\r
93                 for (JobStat js : stats) {\r
94                         int jobtime = js.getRuntime();\r
95                         if (js.resultSize == ExecutionStatCollector.UNDEFINED) {\r
96                                 aJobs.add(js);\r
97                         }\r
98                 }\r
99                 return aJobs;\r
100         }\r
101 \r
102         public String reportStat() {\r
103                 String report = "Total Jobs: " + getJobNumber() + "\n";\r
104                 report += "Abandoned Jobs: " + getAbandonedJobs().size() + "\n";\r
105                 report += "Cancelled Jobs: " + getCancelledJobs().size() + "\n";\r
106                 report += "Total Runtime (s): " + getTotalRuntime() + "\n";\r
107                 report += "Unsuccessful Jobs: " + getUnsuccessfulJobs().size() + "\n";\r
108                 if (sortByRuntime().size() > 10) {\r
109                         report += "10 longest jobs: \n\n" + sortByRuntime().subList(0, 9)\r
110                                         + "\n";\r
111                 } else {\r
112                         report += "longest jobs: \n\n" + sortByRuntime() + "\n";\r
113                 }\r
114                 if (sortByResultSize().size() > 10)\r
115                         report += "10 biggest jobs: \n\n"\r
116                                         + sortByResultSize().subList(0, 9) + "\n";\r
117                 else {\r
118                         report += "biggest jobs: \n\n" + sortByResultSize() + "\n";\r
119                 }\r
120                 return report;\r
121         }\r
122 \r
123         static class JobStat {\r
124 \r
125                 static final Comparator<JobStat> RUNTIME = new Comparator<JobStat>() {\r
126                         @Override\r
127                         public int compare(JobStat o1, JobStat o2) {\r
128                                 return new Integer(o2.getRuntime()).compareTo(o1.getRuntime());\r
129                         }\r
130                 };\r
131 \r
132                 static final Comparator<JobStat> STARTTIME = new Comparator<JobStat>() {\r
133                         @Override\r
134                         public int compare(JobStat o1, JobStat o2) {\r
135                                 return new Long(o1.start).compareTo(o2.start);\r
136                         }\r
137                 };\r
138 \r
139                 static final Comparator<JobStat> RESULTSIZE = new Comparator<JobStat>() {\r
140                         @Override\r
141                         public int compare(JobStat o1, JobStat o2) {\r
142                                 return new Long(o2.resultSize).compareTo(o1.resultSize);\r
143                         }\r
144                 };\r
145 \r
146                 Services webService;\r
147                 String clusterJobId;\r
148                 String jobname;\r
149                 long start;\r
150                 long finish;\r
151                 long inputSize;\r
152                 long resultSize;\r
153                 boolean isCollected;\r
154                 boolean isCancelled;\r
155 \r
156                 JobStat(Services webService, String clusterJobId, String jobname,\r
157                                 long start, long finish, long inputSize, long resultSize,\r
158                                 boolean isCollected, boolean isCancelled) {\r
159                         super();\r
160                         this.webService = webService;\r
161                         this.clusterJobId = clusterJobId;\r
162                         this.jobname = jobname;\r
163                         this.start = start;\r
164                         this.finish = finish;\r
165                         this.inputSize = inputSize;\r
166                         this.resultSize = resultSize;\r
167                         this.isCollected = isCollected;\r
168                         this.isCancelled = isCancelled;\r
169                 }\r
170 \r
171                 public boolean isClusterJob() {\r
172                         return jobname.startsWith(ConfExecutable.CLUSTER_TASK_ID_PREFIX);\r
173                 }\r
174 \r
175                 @Override\r
176                 public int hashCode() {\r
177                         final int prime = 31;\r
178                         int result = 1;\r
179                         result = prime * result + (int) (finish ^ (finish >>> 32));\r
180                         result = prime * result + (int) (inputSize ^ (inputSize >>> 32));\r
181                         result = prime * result + (isCancelled ? 1231 : 1237);\r
182                         result = prime * result + (isCollected ? 1231 : 1237);\r
183                         result = prime * result\r
184                                         + ((jobname == null) ? 0 : jobname.hashCode());\r
185                         result = prime * result + (int) (resultSize ^ (resultSize >>> 32));\r
186                         result = prime * result + (int) (start ^ (start >>> 32));\r
187                         return result;\r
188                 }\r
189 \r
190                 @Override\r
191                 public boolean equals(Object obj) {\r
192                         if (this == obj)\r
193                                 return true;\r
194                         if (obj == null)\r
195                                 return false;\r
196                         if (getClass() != obj.getClass())\r
197                                 return false;\r
198                         JobStat other = (JobStat) obj;\r
199                         if (finish != other.finish)\r
200                                 return false;\r
201                         if (inputSize != other.inputSize)\r
202                                 return false;\r
203                         if (isCancelled != other.isCancelled)\r
204                                 return false;\r
205                         if (isCollected != other.isCollected)\r
206                                 return false;\r
207                         if (jobname == null) {\r
208                                 if (other.jobname != null)\r
209                                         return false;\r
210                         } else if (!jobname.equals(other.jobname))\r
211                                 return false;\r
212                         if (resultSize != other.resultSize)\r
213                                 return false;\r
214                         if (start != other.start)\r
215                                 return false;\r
216                         return true;\r
217                 }\r
218 \r
219                 public int getRuntime() {\r
220                         if (start != ExecutionStatCollector.UNDEFINED\r
221                                         && finish != ExecutionStatCollector.UNDEFINED) {\r
222                                 return (int) (finish - start) / 1000;\r
223                         }\r
224                         return ExecutionStatCollector.UNDEFINED;\r
225                 }\r
226 \r
227                 @Override\r
228                 public String toString() {\r
229                         return getJobReport();\r
230                 }\r
231 \r
232                 String getJobReport() {\r
233                         String report = "WS: " + webService + "\n";\r
234                         report += "JOB: " + jobname + "\n";\r
235                         if (start != ExecutionStatCollector.UNDEFINED) {\r
236                                 report += "Started " + new Date(start) + "\n";\r
237                         }\r
238                         if (finish != ExecutionStatCollector.UNDEFINED) {\r
239                                 report += "Finished " + new Date(finish) + "\n";\r
240                         }\r
241                         if (start != ExecutionStatCollector.UNDEFINED\r
242                                         && finish != ExecutionStatCollector.UNDEFINED) {\r
243                                 report += "Runtime " + getRuntime() + "\n";\r
244                         }\r
245                         report += "Input size " + inputSize + "\n";\r
246                         report += "Result size " + resultSize + "\n";\r
247                         report += "ClusterJobID " + clusterJobId + "\n";\r
248                         report += "Collected? " + isCollected + "\n";\r
249                         report += "Cancelled? " + isCancelled + "\n";\r
250                         return report;\r
251                 }\r
252 \r
253                 /**\r
254                  * Header Job Started Finished Runtime Input Result\r
255                  */\r
256                 String getJobReportTabulated() {\r
257                         String report = webService + "\t";\r
258                         report += jobname + "\t";\r
259                         if (start != ExecutionStatCollector.UNDEFINED) {\r
260                                 report += ExecutionStatCollector.DF.format(new Date(start))\r
261                                                 + "\t";\r
262                         } else {\r
263                                 report += ExecutionStatCollector.UNDEFINED + "\t";\r
264                         }\r
265                         if (finish != ExecutionStatCollector.UNDEFINED) {\r
266                                 report += ExecutionStatCollector.DF.format(new Date(finish))\r
267                                                 + "\t";\r
268                         } else {\r
269                                 report += ExecutionStatCollector.UNDEFINED + "\t";\r
270                         }\r
271                         if (start != ExecutionStatCollector.UNDEFINED\r
272                                         && finish != ExecutionStatCollector.UNDEFINED) {\r
273                                 report += getRuntime() + "\t";\r
274                         } else {\r
275                                 report += ExecutionStatCollector.UNDEFINED + "\t";\r
276                         }\r
277                         report += inputSize + "\t";\r
278                         report += resultSize + "\t";\r
279                         report += clusterJobId + "\t";\r
280                         report += isCollected + "\t";\r
281                         report += isCancelled + "\t";\r
282                         return report;\r
283                 }\r
284 \r
285         }\r
286 \r
287 }\r