1 package compbio.ws.execstat;
\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
9 import compbio.engine.client.ConfExecutable;
\r
10 import compbio.ws.client.Services;
\r
12 public class StatProcessor {
\r
14 List<JobStat> stats;
\r
16 StatProcessor(List<JobStat> stats) {
\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
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
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
48 List<JobStat> sortByRuntime() {
\r
49 List<JobStat> abJobs = new ArrayList<StatProcessor.JobStat>(stats);
\r
50 Collections.sort(abJobs, JobStat.RUNTIME);
\r
54 List<JobStat> sortByStartTime() {
\r
55 List<JobStat> abJobs = new ArrayList<StatProcessor.JobStat>(stats);
\r
56 Collections.sort(abJobs, JobStat.STARTTIME);
\r
60 List<JobStat> sortByResultSize() {
\r
61 List<JobStat> abJobs = new ArrayList<StatProcessor.JobStat>(stats);
\r
62 Collections.sort(abJobs, JobStat.RESULTSIZE);
\r
66 int getJobNumber() {
\r
67 return stats.size();
\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
77 return new StatProcessor(wsStat);
\r
80 long getTotalRuntime() {
\r
82 for (JobStat js : stats) {
\r
83 int jobtime = js.getRuntime();
\r
84 if (jobtime != ExecutionStatCollector.UNDEFINED) {
\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
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
112 report += "longest jobs: \n\n" + sortByRuntime() + "\n";
\r
114 if (sortByResultSize().size() > 10)
\r
115 report += "10 biggest jobs: \n\n"
\r
116 + sortByResultSize().subList(0, 9) + "\n";
\r
118 report += "biggest jobs: \n\n" + sortByResultSize() + "\n";
\r
123 static class JobStat {
\r
125 static final Comparator<JobStat> RUNTIME = new Comparator<JobStat>() {
\r
127 public int compare(JobStat o1, JobStat o2) {
\r
128 return new Integer(o2.getRuntime()).compareTo(o1.getRuntime());
\r
132 static final Comparator<JobStat> STARTTIME = new Comparator<JobStat>() {
\r
134 public int compare(JobStat o1, JobStat o2) {
\r
135 return new Long(o1.start).compareTo(o2.start);
\r
139 static final Comparator<JobStat> RESULTSIZE = new Comparator<JobStat>() {
\r
141 public int compare(JobStat o1, JobStat o2) {
\r
142 return new Long(o2.resultSize).compareTo(o1.resultSize);
\r
146 Services webService;
\r
147 String clusterJobId;
\r
153 boolean isCollected;
\r
154 boolean isCancelled;
\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
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
171 public boolean isClusterJob() {
\r
172 return jobname.startsWith(ConfExecutable.CLUSTER_TASK_ID_PREFIX);
\r
176 public int hashCode() {
\r
177 final int prime = 31;
\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
191 public boolean equals(Object obj) {
\r
196 if (getClass() != obj.getClass())
\r
198 JobStat other = (JobStat) obj;
\r
199 if (finish != other.finish)
\r
201 if (inputSize != other.inputSize)
\r
203 if (isCancelled != other.isCancelled)
\r
205 if (isCollected != other.isCollected)
\r
207 if (jobname == null) {
\r
208 if (other.jobname != null)
\r
210 } else if (!jobname.equals(other.jobname))
\r
212 if (resultSize != other.resultSize)
\r
214 if (start != other.start)
\r
219 public int getRuntime() {
\r
220 if (start != ExecutionStatCollector.UNDEFINED
\r
221 && finish != ExecutionStatCollector.UNDEFINED) {
\r
222 return (int) (finish - start) / 1000;
\r
224 return ExecutionStatCollector.UNDEFINED;
\r
228 public String toString() {
\r
229 return getJobReport();
\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
238 if (finish != ExecutionStatCollector.UNDEFINED) {
\r
239 report += "Finished " + new Date(finish) + "\n";
\r
241 if (start != ExecutionStatCollector.UNDEFINED
\r
242 && finish != ExecutionStatCollector.UNDEFINED) {
\r
243 report += "Runtime " + getRuntime() + "\n";
\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
254 * Header Job Started Finished Runtime Input Result
\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
263 report += ExecutionStatCollector.UNDEFINED + "\t";
\r
265 if (finish != ExecutionStatCollector.UNDEFINED) {
\r
266 report += ExecutionStatCollector.DF.format(new Date(finish))
\r
269 report += ExecutionStatCollector.UNDEFINED + "\t";
\r
271 if (start != ExecutionStatCollector.UNDEFINED
\r
272 && finish != ExecutionStatCollector.UNDEFINED) {
\r
273 report += getRuntime() + "\t";
\r
275 report += ExecutionStatCollector.UNDEFINED + "\t";
\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