package com.niklim.clicktrace.dialog.jira;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.UnsupportedEncodingException;
import java.net.URISyntaxException;
import java.text.MessageFormat;
import java.util.concurrent.ExecutionException;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JOptionPane;
import org.apache.commons.lang.StringUtils;
import org.codehaus.jettison.json.JSONException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.Optional;
import com.google.common.base.Strings;
import com.google.inject.Inject;
import com.niklim.clicktrace.controller.ActiveSession;
import com.niklim.clicktrace.dialog.AbstractDialog;
import com.niklim.clicktrace.msg.InfoMsgs;
import com.niklim.clicktrace.props.JiraConfig;
import com.niklim.clicktrace.props.JiraConfig.JiraUserMetadata;
import com.niklim.clicktrace.service.exception.JiraExportException;
import com.niklim.clicktrace.service.export.jira.JiraExporter;
import com.niklim.clicktrace.service.export.jira.JiraFieldDto;
import com.niklim.clicktrace.service.export.jira.JiraService;
public class JiraExportDialog extends AbstractDialog<JiraExportView> {
private static final Logger log = LoggerFactory.getLogger(JiraExportDialog.class);
@Inject
private JiraService jiraExportService;
@Inject
private ActiveSession activeSession;
@Inject
private JiraExporter jiraExporter;
private JiraConfig jiraConfig;
public void open(JiraConfig jiraConfig) {
this.jiraConfig = jiraConfig;
initModel();
jiraExporter.initExport(activeSession.getSession());
center();
view.dialog().setVisible(true);
}
private void initModel() {
JiraUserMetadata userMetadata = jiraConfig.getUserMetadata().get();
JiraFieldDto[] issueTypes = userMetadata.issueTypes.toArray(new JiraFieldDto[] {});
view.issueType.setModel(new DefaultComboBoxModel(issueTypes));
view.priority.setModel(new DefaultComboBoxModel(userMetadata.priorities.toArray()));
view.project.setModel(new DefaultComboBoxModel(userMetadata.projects.toArray()));
selectBugIssueType(issueTypes);
}
private void selectBugIssueType(JiraFieldDto[] issueTypes) {
for (JiraFieldDto field : issueTypes) {
if ("Bug".equals(field.label)) {
view.issueType.getModel().setSelectedItem(field);
break;
}
}
}
@Override
public void close() {
jiraExporter.cleanup();
view.dialog().setVisible(false);
}
@Inject
public void init() {
createListeners();
postInit();
}
private void createListeners() {
view.createIssueCheckBox.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
if (view.createIssueCheckBox.isSelected()) {
view.issueKeyLabel.setEnabled(false);
view.issueKeyTextField.setEnabled(false);
view.enableCreateControls(true);
} else {
view.issueKeyLabel.setEnabled(true);
view.issueKeyTextField.setEnabled(true);
view.enableCreateControls(false);
}
}
});
}
@Override
public void okAction() {
if (view.createIssueCheckBox.isSelected()) {
createIssueAndExport();
} else {
exportToExistingIssue();
}
}
private void createIssueAndExport() {
Optional<String> validationErrorOpt = validateIssueCreate();
if (validationErrorOpt.isPresent()) {
JOptionPane.showMessageDialog(view.dialog(), validationErrorOpt.get());
return;
}
try {
String issueKey = createIssue();
exportSession(issueKey, true);
} catch (Exception e) {
log.error("Issue create error", e);
JOptionPane.showMessageDialog(view.dialog(), e.getLocalizedMessage());
}
}
private void exportToExistingIssue() {
if (StringUtils.isEmpty(view.issueKeyTextField.getText())) {
JOptionPane.showMessageDialog(view.dialog(), InfoMsgs.JIRA_EXPORT_ISSUE_KEY_EMPTY);
view.issueKeyTextField.requestFocus();
return;
}
String issueKey = view.issueKeyTextField.getText();
if (confirmSessionExport(issueKey)) {
exportSession(issueKey, false);
}
}
private Optional<String> validateIssueCreate() {
if (StringUtils.isEmpty(view.issueSummary.getText().trim())) {
view.issueSummary.requestFocus();
return Optional.of(InfoMsgs.JIRA_EXPORT_NO_SUMMARY);
}
return Optional.<String> absent();
}
private String createIssue() throws URISyntaxException, InterruptedException, ExecutionException,
UnsupportedEncodingException, IllegalStateException, IllegalArgumentException, JiraExportException,
JSONException {
String project = ((JiraFieldDto) view.project.getSelectedItem()).value;
String issueType = ((JiraFieldDto) view.issueType.getSelectedItem()).value;
String priority = ((JiraFieldDto) view.priority.getSelectedItem()).value;
String issueSummary = view.issueSummary.getText();
String description;
if (view.useDescription.isSelected()) {
description = Strings.nullToEmpty(activeSession.getSession().getDescription());
} else {
description = "";
}
return jiraExportService.createIssue(jiraConfig, project, issueType, priority, issueSummary, description);
}
private boolean confirmSessionExport(String issueKey) {
try {
boolean sessionExist = jiraExportService.checkSessionExist(jiraConfig.getUsername(), jiraConfig
.getPassword().get(), issueKey, activeSession.getSession().getName(), jiraConfig.getInstanceUrl());
if (sessionExist) {
return askUserForExportConfirmation();
} else {
return true;
}
} catch (JiraExportException e) {
JOptionPane.showMessageDialog(view.dialog(), e.getMessage());
return false;
}
}
private boolean askUserForExportConfirmation() {
int res = JOptionPane.showConfirmDialog(view.dialog(), "Session exists. Overwrite?", "Overwrite?",
JOptionPane.OK_CANCEL_OPTION);
return res == JOptionPane.OK_OPTION;
}
private void exportSession(String issueKey, boolean issueCreated) {
try {
showWaitingCursor();
jiraExporter.exportSession(jiraConfig.getUsername(), jiraConfig.getPassword().get(), issueKey,
activeSession.getSession().getName(), jiraConfig.getInstanceUrl());
hideWaitingCursor();
JOptionPane.showMessageDialog(view.dialog(), MessageFormat.format(InfoMsgs.JIRA_EXPORT_SUCCESS, issueKey));
close();
} catch (JiraExportException e) {
hideWaitingCursor();
JOptionPane.showMessageDialog(view.dialog(), e.getMessage(), "Error", JOptionPane.WARNING_MESSAGE);
if (issueCreated) {
JOptionPane.showMessageDialog(view.dialog(),
MessageFormat.format(InfoMsgs.JIRA_ISSUE_CREATED, issueKey));
}
} catch (Throwable e) {
hideWaitingCursor();
log.error("unpredicted", e);
JOptionPane.showMessageDialog(view.dialog(), e.getMessage(), "Error", JOptionPane.WARNING_MESSAGE);
if (issueCreated) {
JOptionPane.showMessageDialog(view.dialog(),
MessageFormat.format(InfoMsgs.JIRA_ISSUE_CREATED, issueKey));
}
}
}
@Override
protected JiraExportView createView() {
return new JiraExportView();
}
}