package de.pbauerochse.worklogviewer.fx.tasks;
import de.pbauerochse.worklogviewer.util.ExceptionUtil;
import de.pbauerochse.worklogviewer.util.FormattingUtil;
import de.pbauerochse.worklogviewer.util.SettingsUtil;
import de.pbauerochse.worklogviewer.youtrack.connector.YouTrackConnector;
import de.pbauerochse.worklogviewer.youtrack.connector.YouTrackConnectorFactory;
import de.pbauerochse.worklogviewer.youtrack.createreport.request.CreateReportRequestEntity;
import de.pbauerochse.worklogviewer.youtrack.createreport.response.ReportDetailsResponse;
import de.pbauerochse.worklogviewer.youtrack.csv.YouTrackCsvReportProcessor;
import de.pbauerochse.worklogviewer.youtrack.domain.WorklogReport;
import javafx.concurrent.Task;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.ByteArrayInputStream;
/**
* @author Patrick Bauerochse
* @since 07.07.15
*/
public class FetchTimereportTask extends Task<WorklogReport> {
private static final Logger LOGGER = LoggerFactory.getLogger(FetchTimereportTask.class);
private static final int MAX_REPORT_STATUS_POLLS = 5;
private final FetchTimereportContext context;
public FetchTimereportTask(FetchTimereportContext context) {
updateTitle("FetchTimereport-Task");
this.context = context;
}
@Override
protected WorklogReport call() throws Exception {
SettingsUtil.Settings settings = SettingsUtil.loadSettings();
YouTrackConnector connector = YouTrackConnectorFactory.getInstance();
updateProgress(0, 100);
updateMessage(FormattingUtil.getFormatted("worker.progress.login", settings.getYoutrackUsername()));
// create report
CreateReportRequestEntity reportRequestEntity = new CreateReportRequestEntity(context);
updateMessage(FormattingUtil.getFormatted("worker.progress.creatingreport", FormattingUtil.getFormatted(context.getTimerangeProvider().getReportTimerange().getLabelKey())));
ReportDetailsResponse reportDetailsResponse = connector.createReport(reportRequestEntity);
updateProgress(50, 100);
// report generation succeeded and is in progress right now
// giant try block to finally delete the report again even
// in error cases to prevent polluted user report view
WorklogReport result = new WorklogReport();
context.setResult(result);
try {
updateMessage(FormattingUtil.getFormatted("worker.progress.waitingforrecalculation"));
// poll report status every second
// until report generation is finished or MAX_REPORT_STATUS_POLLS reached
int currentRetry = 0;
while (!StringUtils.equals(ReportDetailsResponse.READY_STATE, reportDetailsResponse.getState()) && currentRetry++ < MAX_REPORT_STATUS_POLLS) {
Thread.sleep(1000);
reportDetailsResponse = connector.getReportDetails(reportDetailsResponse.getId());
}
if (!StringUtils.equals(ReportDetailsResponse.READY_STATE, reportDetailsResponse.getState())) {
throw ExceptionUtil.getIllegalStateException("exceptions.main.worker.recalculation", MAX_REPORT_STATUS_POLLS);
}
// download the generated report
updateMessage(FormattingUtil.getFormatted("worker.progress.downloadingreport", reportDetailsResponse.getId()));
ByteArrayInputStream reportData = connector.downloadReport(reportDetailsResponse.getId());
updateProgress(80, 100);
updateMessage(FormattingUtil.getFormatted("worker.progress.processingreport"));
YouTrackCsvReportProcessor.processResponse(reportData, result);
// fetch issue details
connector.fetchTaskDetails(result);
} finally {
// delete the report again
updateProgress(90, 100);
updateMessage(FormattingUtil.getFormatted("worker.progress.deletingreport"));
connector.deleteReport(reportDetailsResponse.getId());
updateMessage(FormattingUtil.getFormatted("worker.progress.done"));
updateProgress(100, 100);
}
return result;
}
}