+package compbio.ws.execstat;\r
+\r
+import java.io.File;\r
+import java.io.FileFilter;\r
+import java.io.FileWriter;\r
+import java.io.IOException;\r
+import java.text.SimpleDateFormat;\r
+import java.util.ArrayList;\r
+import java.util.HashMap;\r
+import java.util.List;\r
+import java.util.Map;\r
+\r
+import org.apache.log4j.Logger;\r
+\r
+import compbio.engine.client.ConfExecutable;\r
+import compbio.engine.conf.PropertyHelperManager;\r
+import compbio.metadata.JobStatus;\r
+import compbio.util.FileUtil;\r
+import compbio.util.PropertyHelper;\r
+import compbio.ws.client.Services;\r
+\r
+/**\r
+ * Number of runs of each WS = number of folders with name\r
+ * \r
+ * Number of successful runs = all runs with no result file\r
+ * \r
+ * Per period of time = limit per file creating time Runtime (avg/max) =\r
+ * \r
+ * started time - finished time\r
+ * \r
+ * Task & result size = result.size\r
+ * \r
+ * Abandoned runs - not collected runs\r
+ * \r
+ * Cancelled runs - cancelled\r
+ * \r
+ * Cluster vs local runs\r
+ * \r
+ * Reasons for failure = look in the err out?\r
+ * \r
+ * \r
+ * Metadata required:\r
+ * \r
+ * work directory for local and cluster tasks = from Helper or cmd parameter. WS\r
+ * names - enumeration. Status file names and content.\r
+ * \r
+ * @author pvtroshin\r
+ * \r
+ */\r
+public class ExecutionStatCollector {\r
+\r
+ static final int UNDEFINED = -1;\r
+\r
+ private static final Logger log = Logger\r
+ .getLogger(ExecutionStatCollector.class);\r
+\r
+ static SimpleDateFormat DF = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss");\r
+\r
+ static PropertyHelper ph = PropertyHelperManager.getPropertyHelper();\r
+\r
+ static String getClusterJobDir() {\r
+ String clusterdir = ph.getProperty("cluster.tmp.directory");\r
+ if (clusterdir != null) {\r
+ clusterdir.trim();\r
+ }\r
+ return clusterdir;\r
+ }\r
+\r
+ static void updateTime(File statFile) throws IOException {\r
+ long lastMod = statFile.lastModified();\r
+ FileWriter fw = new FileWriter(statFile);\r
+ fw.write(new Long(lastMod).toString());\r
+ fw.close();\r
+ }\r
+\r
+ static String getLocalJobDir() {\r
+ String locdir = ph.getProperty("local.tmp.directory");\r
+ if (locdir != null) {\r
+ locdir.trim();\r
+ }\r
+ return locdir;\r
+ }\r
+\r
+ /**\r
+ * \r
+ * @param args\r
+ * @throws IOException\r
+ */\r
+ public static void main(String[] args) throws IOException {\r
+\r
+ // updateTime(new File(\r
+ // "D:\\workspace\\JABA2\\jobsout\\AACon#170462904473672\\STARTED"));\r
+\r
+ String workDir = PropertyHelperManager.getLocalPath()\r
+ + getLocalJobDir().trim();\r
+ System.out.println(workDir);\r
+ File[] files = FileUtil.getFiles("H:/www-jws2/job_dir/jobsout",\r
+ directories);\r
+ List<StatProcessor.JobStat> stats = new ArrayList<StatProcessor.JobStat>();\r
+ for (File file : files) {\r
+ JobDirectory jd = new JobDirectory(file);\r
+ stats.add(jd.getJobStat());\r
+ // System.out.println(jd.getJobStat().getJobReportTabulated());\r
+ }\r
+ StatProcessor sp = new StatProcessor(stats);\r
+ System.out.println(sp.reportStat());\r
+ System.out.println();\r
+ System.out.println("!!!!!!!!!!!!!!!!!!");\r
+ System.out.println();\r
+ System.out.println(sp.getSingleWSStat(Services.TcoffeeWS).reportStat());\r
+ }\r
+\r
+ static FileFilter directories = new FileFilter() {\r
+ @Override\r
+ public boolean accept(File pathname) {\r
+ return pathname.isDirectory();\r
+ }\r
+ };\r
+\r
+ static class JobDirectory {\r
+\r
+ File jobdir;\r
+ Map<String, File> files = new HashMap<String, File>();\r
+\r
+ public JobDirectory(File directory) {\r
+ this.jobdir = directory;\r
+ for (File f : jobdir.listFiles()) {\r
+ files.put(f.getName(), f);\r
+ }\r
+ }\r
+\r
+ public boolean hasStatus(JobStatus status) {\r
+ return files.containsKey(status.toString());\r
+ }\r
+\r
+ boolean isCollected() {\r
+ return hasStatus(JobStatus.COLLECTED);\r
+ }\r
+\r
+ boolean isCancelled() {\r
+ return hasStatus(JobStatus.CANCELLED);\r
+ }\r
+\r
+ long getStartTime() {\r
+ long starttime = UNDEFINED;\r
+ File startfile = files.get(JobStatus.STARTED.toString());\r
+ if (startfile == null) {\r
+ startfile = files.get(JobStatus.SUBMITTED.toString());\r
+ }\r
+ if (startfile != null) {\r
+ starttime = startfile.lastModified();\r
+ /*\r
+ * String start = FileUtil.readFileToString(startfile);\r
+ * starttime = Long.parseLong(start.trim());\r
+ */\r
+ }\r
+ return starttime;\r
+ }\r
+\r
+ long getFinishedTime() {\r
+ long ftime = UNDEFINED;\r
+ File finished = files.get(JobStatus.FINISHED.toString());\r
+ if (finished != null) {\r
+ ftime = finished.lastModified();\r
+ /*\r
+ * String start = FileUtil.readFileToString(finished); ftime =\r
+ * Long.parseLong(start.trim());\r
+ */\r
+ // System.out.println("f " + ftime);\r
+ }\r
+ /*\r
+ * } catch (IOException e) { log.log(Level.WARN,\r
+ * "Cannot parse finished time: " + e.getMessage(), e); } catch\r
+ * (NumberFormatException e) { log.log(Level.WARN,\r
+ * "Cannot parse finished time: " + e.getMessage(), e); }\r
+ */\r
+ return ftime;\r
+ }\r
+\r
+ String getWSName() {\r
+ String name = jobdir.getName().split("#")[0];\r
+ if (name.startsWith(ConfExecutable.CLUSTER_TASK_ID_PREFIX)) {\r
+ assert ConfExecutable.CLUSTER_TASK_ID_PREFIX.length() == 1;\r
+ name = name.substring(1);\r
+ }\r
+ if (name.startsWith("ClustalW")) {\r
+ name = name.trim().substring(name.length() - 1);\r
+ }\r
+ return name;\r
+ }\r
+\r
+ Services getService() {\r
+ return Services.getService(getWSName() + "WS");\r
+ }\r
+ // Mafft, Muscle, Tcoffee, Clustal task:fasta.in result:fasta.out\r
+ // Probcons task:fasta.in result:alignment.out\r
+ /*\r
+ * TODO replace with Universal names for WS!\r
+ */\r
+ long getResultSize() {\r
+ String name = getWSName();\r
+ File f = null;\r
+ if (name.equalsIgnoreCase("Probcons")) {\r
+ f = files.get("alignment.out");\r
+ }\r
+ f = files.get("fasta.out");\r
+ if (f != null) {\r
+ return f.length();\r
+ }\r
+ return UNDEFINED;\r
+ }\r
+\r
+ long getInputSize() {\r
+ File input = files.get("fasta.in");\r
+ if (input != null) {\r
+ return input.length();\r
+ }\r
+ return UNDEFINED;\r
+ }\r
+\r
+ StatProcessor.JobStat getJobStat() {\r
+ return new StatProcessor.JobStat(getService(), jobdir.getName(),\r
+ getStartTime(), getFinishedTime(), getInputSize(),\r
+ getResultSize(), isCollected(), isCancelled());\r
+ }\r
+\r
+ @Override\r
+ public int hashCode() {\r
+ final int prime = 31;\r
+ int result = 1;\r
+ result = prime * result\r
+ + ((jobdir == null) ? 0 : jobdir.hashCode());\r
+ return result;\r
+ }\r
+\r
+ @Override\r
+ public boolean equals(Object obj) {\r
+ if (this == obj)\r
+ return true;\r
+ if (obj == null)\r
+ return false;\r
+ if (getClass() != obj.getClass())\r
+ return false;\r
+ JobDirectory other = (JobDirectory) obj;\r
+ if (jobdir == null) {\r
+ if (other.jobdir != null)\r
+ return false;\r
+ } else if (!jobdir.equals(other.jobdir))\r
+ return false;\r
+ return true;\r
+ }\r
+\r
+ }\r
+}\r