package glug.gui;
import static com.madgag.interval.SimpleInterval.union;
import static glug.model.time.LogInterval.toJodaInterval;
import static java.lang.System.currentTimeMillis;
import com.madgag.interval.Interval;
import glug.model.time.LogInstant;
import glug.model.time.LogInterval;
import glug.parser.LogLoader;
import glug.parser.LogLoader.LoadReport;
import java.util.List;
import javax.swing.SwingWorker;
import org.joda.time.format.PeriodFormat;
public class LogLoadingTask extends SwingWorker<Void, LoadReport> {
private final LogLoader logLoader;
private final DataLoadedUIUpdater uiUpdater;
private final int numLinesLoadedBetweenUIUpdates;
public LogLoadingTask(LogLoader logLoader, DataLoadedUIUpdater uiUpdater, int numLinesLoadedBetweenUIUpdates) {
this.logLoader = logLoader;
this.uiUpdater = uiUpdater;
this.numLinesLoadedBetweenUIUpdates = numLinesLoadedBetweenUIUpdates;
}
@Override
public Void doInBackground() {
long startLoadTime=currentTimeMillis();
LoadReport loadReport;Interval<LogInstant> loadedLogInterval=null;
try {
do {
loadReport=logLoader.loadLines(numLinesLoadedBetweenUIUpdates);
publish(loadReport);
loadedLogInterval=union(loadedLogInterval,loadReport.getUpdatedInterval());
//System.out.print(".");
} while (!isCancelled() && !loadReport.endOfStreamReached());
} catch (Throwable e) {
e.printStackTrace();
throw new RuntimeException(e);
}
long durationLoadTime=currentTimeMillis()-startLoadTime;
System.out.println("Finished loading "+loadedLogInterval+" ("+format(loadedLogInterval)+") in "+durationLoadTime+" ms");
return null;
}
private String format(Interval<LogInstant> loadedLogInterval) {
return toJodaInterval(loadedLogInterval).toPeriod().toString(PeriodFormat.getDefault());
}
@Override
protected void process(List<LoadReport> loadReports) {
Interval<LogInstant> totalLogIntervalCoveredByLoadReports = totalLogIntervalCoveredBy(loadReports);
System.out.println("Just loaded "+ totalLogIntervalCoveredByLoadReports);
uiUpdater.updateUI(totalLogIntervalCoveredByLoadReports);
}
private Interval<LogInstant> totalLogIntervalCoveredBy(Iterable<LoadReport> loadReports) {
Interval<LogInstant> interval = null;
for (LoadReport loadReport : loadReports) {
interval = union(interval,loadReport.getUpdatedInterval());
}
return interval;
}
}