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