Change header template for a new version
[jabaws.git] / webservices / compbio / stat / collector / StatProcessor.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.stat.collector;\r
19 \r
20 import java.util.ArrayList;\r
21 import java.util.Collections;\r
22 import java.util.List;\r
23 \r
24 import compbio.ws.client.Services;\r
25 \r
26 public class StatProcessor {\r
27 \r
28         List<JobStat> stats;\r
29 \r
30         public StatProcessor(List<JobStat> stats) {\r
31                 this.stats = stats;\r
32         }\r
33 \r
34         public List<JobStat> getClusterJobs() {\r
35                 return getJobSubset(true);\r
36         }\r
37 \r
38         public List<JobStat> getLocalJobs() {\r
39                 return getJobSubset(false);\r
40         }\r
41 \r
42         private List<JobStat> getJobSubset(boolean cluster) {\r
43                 List<JobStat> clusterjobs = new ArrayList<JobStat>();\r
44                 for (JobStat js : stats) {\r
45                         if (cluster) {\r
46                                 if (js.isClusterJob()) {\r
47                                         clusterjobs.add(js);\r
48                                 }\r
49                         } else {\r
50                                 if (!js.isClusterJob()) {\r
51                                         clusterjobs.add(js);\r
52                                 }\r
53                         }\r
54                 }\r
55                 return clusterjobs;\r
56 \r
57         }\r
58 \r
59         /*\r
60          * TODO List<JobStat> getNewStat() throws SQLException { Set<String> jobids\r
61          * = new HashSet<String>(); for(JobStat js: stats) { jobids.add(js.jobname);\r
62          * } StatDB.removeRecordedJobs(jobids); List<String> newjobs = new\r
63          * HashSet<String>(); for(String jobid: jobids) { if(newjobs.co)\r
64          * jobids.add(js.jobname); } }\r
65          */\r
66 \r
67         /**\r
68          * Not collected. Excludes all cancelled jobs, and jobs with no results as\r
69          * these are reported separately.\r
70          */\r
71         public List<JobStat> getAbandonedJobs() {\r
72                 List<JobStat> abJobs = new ArrayList<JobStat>();\r
73                 for (JobStat js : stats) {\r
74                         if (!js.isCollected && !js.isCancelled && js.hasResult()) {\r
75                                 abJobs.add(js);\r
76                         }\r
77                 }\r
78                 return abJobs;\r
79         }\r
80 \r
81         /**\r
82          * Started & finished but did not produce result\r
83          * \r
84          * @return\r
85          */\r
86         public List<JobStat> getFailedJobs() {\r
87                 List<JobStat> failedJobs = new ArrayList<JobStat>();\r
88                 for (JobStat js : stats) {\r
89                         if (js.hasStarted() && js.getIsFinished() && !js.hasResult()) {\r
90                                 failedJobs.add(js);\r
91                         }\r
92                 }\r
93                 return failedJobs;\r
94         }\r
95 \r
96         public List<JobStat> getCancelledJobs() {\r
97                 List<JobStat> abJobs = new ArrayList<JobStat>();\r
98                 for (JobStat js : stats) {\r
99                         if (js.isCancelled) {\r
100                                 abJobs.add(js);\r
101                         }\r
102                 }\r
103                 return abJobs;\r
104         }\r
105 \r
106         public List<JobStat> sortByRuntime() {\r
107                 List<JobStat> abJobs = new ArrayList<JobStat>(stats);\r
108                 Collections.sort(abJobs, JobStat.RUNTIME);\r
109                 return abJobs;\r
110         }\r
111 \r
112         public List<JobStat> sortByStartTime() {\r
113                 List<JobStat> abJobs = new ArrayList<JobStat>(stats);\r
114                 Collections.sort(abJobs, JobStat.STARTTIME);\r
115                 return abJobs;\r
116         }\r
117 \r
118         public List<JobStat> sortByResultSize() {\r
119                 List<JobStat> abJobs = new ArrayList<JobStat>(stats);\r
120                 Collections.sort(abJobs, JobStat.RESULTSIZE);\r
121                 return abJobs;\r
122         }\r
123 \r
124         public int getJobNumber() {\r
125                 return stats.size();\r
126         }\r
127 \r
128         public List<JobStat> getJobs() {\r
129                 return stats;\r
130         }\r
131 \r
132         public StatProcessor getSingleWSStat(Services webService) {\r
133                 List<JobStat> wsStat = new ArrayList<JobStat>();\r
134                 for (JobStat js : stats) {\r
135                         if (js.webService == webService) {\r
136                                 wsStat.add(js);\r
137                         }\r
138                 }\r
139                 return new StatProcessor(wsStat);\r
140         }\r
141 \r
142         public long getTotalRuntime() {\r
143                 long counter = 0;\r
144                 for (JobStat js : stats) {\r
145                         int jobtime = js.getRuntime();\r
146                         if (jobtime != ExecutionStatCollector.UNDEFINED) {\r
147                                 counter += jobtime;\r
148                         }\r
149                 }\r
150                 return counter;\r
151         }\r
152 \r
153         public List<JobStat> getIncompleteJobs() {\r
154                 List<JobStat> aJobs = new ArrayList<JobStat>();\r
155                 for (JobStat js : stats) {\r
156                         if (!js.hasResult() && !js.getIsCancelled()) {\r
157                                 aJobs.add(js);\r
158                         }\r
159                 }\r
160                 return aJobs;\r
161         }\r
162 \r
163         public String reportStat() {\r
164                 String report = "Total Jobs: " + getJobNumber() + "\n";\r
165                 report += "Abandoned Jobs: " + getAbandonedJobs().size() + "\n";\r
166                 report += "Cancelled Jobs: " + getCancelledJobs().size() + "\n";\r
167                 report += "Total Runtime (s): " + getTotalRuntime() + "\n";\r
168                 report += "Unsuccessful Jobs: " + getIncompleteJobs().size() + "\n";\r
169                 if (sortByRuntime().size() > 10) {\r
170                         report += "10 longest jobs: \n\n" + sortByRuntime().subList(0, 9)\r
171                                         + "\n";\r
172                 } else {\r
173                         report += "longest jobs: \n\n" + sortByRuntime() + "\n";\r
174                 }\r
175                 if (sortByResultSize().size() > 10)\r
176                         report += "10 biggest jobs: \n\n"\r
177                                         + sortByResultSize().subList(0, 9) + "\n";\r
178                 else {\r
179                         report += "biggest jobs: \n\n" + sortByResultSize() + "\n";\r
180                 }\r
181                 return report;\r
182         }\r
183 \r
184         @Override\r
185         public String toString() {\r
186                 return this.reportStat();\r
187         }\r
188 \r
189 }\r