package com.niklim.clicktrace.service.export.jira;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.net.UrlEscapers;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.niklim.clicktrace.dialog.jira.JiraExportDialog;
import com.niklim.clicktrace.jira.client.ExportParams;
import com.niklim.clicktrace.jira.client.ExportResult;
import com.niklim.clicktrace.jira.client.ExportStatus;
import com.niklim.clicktrace.jira.client.JiraRestClicktraceClient;
import com.niklim.clicktrace.model.Session;
import com.niklim.clicktrace.props.UserProperties;
import com.niklim.clicktrace.service.SessionCompressor;
import com.niklim.clicktrace.service.exception.JiraExportException;
/**
* Exports Clicktrace session to JIRA. Compresses the session in separate thread
* (starts when the user enters {@link JiraExportDialog}).
*/
@Singleton
public class JiraExporter {
private static final Logger log = LoggerFactory.getLogger(JiraExporter.class);
@Inject
private SessionCompressor sessionCompressor;
@Inject
private UserProperties props;
@Inject
private JiraRestClicktraceClient client;
private ExecutorService executor;
private Future<String> compressedSession;
public JiraExporter() {
executor = Executors.newFixedThreadPool(1);
}
public void initExport(final Session session) {
compressedSession = compressFuture(session, props.getExportImageWidth());
}
private Future<String> compressFuture(final Session session, final Integer imageWidth) {
return executor.submit(new Callable<String>() {
@Override
public String call() throws Exception {
InitImageWidthPropertyExportHandler.handle(props.getSessionsDirPath(), session, imageWidth);
return sessionCompressor.compress(session);
}
});
}
public void exportSession(String username, String password, String issueKey, String sessionName,
String jiraInstanceUrl) throws JiraExportException {
sessionName = UrlEscapers.urlFragmentEscaper().escape(sessionName);
try {
String stream = compressedSession.get();
// client
ExportResult res = client.exportSession(new ExportParams(username, password, jiraInstanceUrl, issueKey,
sessionName), stream);
if (res.status == ExportStatus.ERROR) {
throw new JiraExportException(res.msg);
}
} catch (Exception e) {
log.error("", e);
throw new JiraExportException(e.getLocalizedMessage());
}
}
public void cleanup() {
compressedSession = null;
}
}