package edu.ucsf.mousedatabase.dataimport; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.concurrent.atomic.AtomicInteger; import edu.ucsf.mousedatabase.Log; public class ImportStatusTracker { public static final String CommandKey = "command"; public static final String TaskIdKey = "taskid"; public static final String SummaryCommand = "summary"; public static final String HistoryCommand = "history"; public static final int CompletedTaskExpirationThreshold = 1000 * 60 *2; public enum ImportStatus { PENDING, PROCESSING, COMPLETED, ERROR } private static AtomicInteger jobCounter = new AtomicInteger(); private static HashMap<Integer,ImportTask> CurrentImports = new HashMap<Integer,ImportTask>(); public static int RegisterTask(String header) { ImportTask task = new ImportTask(header); task.History = ""; int taskId = jobCounter.incrementAndGet(); CurrentImports.put(taskId, task); return taskId; } public static void Update(int taskId,String header,ImportStatus status) { UpdateHeader(taskId,header); UpdateStatus(taskId,status); } public static void UpdateHeader(int taskId,String header) { if (!CurrentImports.containsKey(taskId)) { return; } ImportTask task = CurrentImports.get(taskId); task.Header = header; Log.Info("Task " + taskId + " Header changed to " + header); } public static void UpdateTitle(int taskId,String title) { if (!CurrentImports.containsKey(taskId)) { return; } ImportTask task = CurrentImports.get(taskId); task.Title = title; Log.Info("Task " + taskId + " Title changed to " + title); } public static void UpdateStatus(int taskId, ImportStatus status) { if (!CurrentImports.containsKey(taskId)) { return; } ImportTask task = CurrentImports.get(taskId); task.Status = status; Log.Info("Task " + taskId + " status changed to: " + status); if (status == ImportStatus.COMPLETED || status == ImportStatus.ERROR) { task.EndDate = new Date(System.currentTimeMillis()); } } public static void SetProgress(int taskId, double percentComplete) { if (!CurrentImports.containsKey(taskId)) { return; } ImportTask task = CurrentImports.get(taskId); task.PercentComplete = percentComplete; //Log.Info("Task " + taskId + ": " + percentComplete + " percent complete"); } public static void AppendMessage(int taskId, String message) { if (!CurrentImports.containsKey(taskId)) { return; } ImportTask task = CurrentImports.get(taskId); DateFormat dateFormat = new SimpleDateFormat("hh:mm:ss:SSS"); Calendar cal = Calendar.getInstance(); task.History += "<span class='historyTimestamp'>" + dateFormat.format(cal.getTime()) + "</span>"; task.History += "<span class='historyMessage'>"+ message + "</span><br>"; Log.Info("Task " + taskId + ": " + message); } public static ArrayList<Integer> ImportsInProgress() { ArrayList<Integer> imports = new ArrayList<Integer>(); for (int importId = jobCounter.get();importId >= 1;importId--) { if (!CurrentImports.containsKey(importId)) continue; ImportTask task = CurrentImports.get(importId); if (task.EndDate != null) { long timeSinceCompleted = System.currentTimeMillis() - task.EndDate.getTime(); if (timeSinceCompleted >= CompletedTaskExpirationThreshold) { continue; } } imports.add(importId); } return imports; } public static ImportTask GetTask(int taskId) { if (!CurrentImports.containsKey(taskId)) return null; return CurrentImports.get(taskId); } }