package com.niklim.clicktrace.dialog.jira; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.net.ConnectException; import java.net.UnknownHostException; import java.text.MessageFormat; import java.util.concurrent.ExecutionException; import javax.swing.JOptionPane; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.atlassian.jira.rest.client.RestClientException; import com.google.inject.Inject; import com.google.inject.Singleton; 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.props.UserProperties; import com.niklim.clicktrace.service.export.jira.JiraMetadataService; @Singleton public class JiraLoginDialog extends AbstractDialog<JiraLoginView> { private static final Logger log = LoggerFactory.getLogger(JiraLoginDialog.class); private static final int HTTP_UNAUTHORIZED = 401; private static final int HTTP_FORBIDDEN = 403; private static final int HTTP_NOT_FOUND = 404; @Inject private JiraExportDialog exportDialog; @Inject private UserProperties props; @Inject private JiraMetadataService metadataService; private KeyAdapter loginAction = new KeyAdapter() { public void keyTyped(KeyEvent e) { if (e.getKeyChar() == '\n') { okAction(); } } }; @Inject public void init() { createListeners(); postInit(); } private void createListeners() { view.jiraInstanceUrl.addKeyListener(loginAction); view.username.addKeyListener(loginAction); view.password.addKeyListener(loginAction); } public void open() { initModel(); center(); view.dialog().setVisible(true); } private void initModel() { JiraConfig jiraConfig = props.getJiraConfig(); view.jiraInstanceUrl.setText(jiraConfig.getInstanceUrl()); view.username.setText(jiraConfig.getUsername()); } @Override protected void okAction() { showWaitingCursor(); JiraConfig jiraConfig = new JiraConfig(view.jiraInstanceUrl.getText(), view.username.getText()); jiraConfig.setPassword(view.password.getText()); try { JiraUserMetadata userMetadata = metadataService.loadUserMetadata(jiraConfig); jiraConfig.setUserMetadata(userMetadata); close(); exportDialog.open(jiraConfig); } catch (ExecutionException e) { handleKnownException(e); } catch (Exception e) { JOptionPane.showMessageDialog(view.dialog(), InfoMsgs.JIRA_UNKNOWN_LOGIN_FAILURE); } catch (Throwable e) { e.printStackTrace(); } hideWaitingCursor(); } private void handleKnownException(ExecutionException e) { RestClientException restException = getCause(e, RestClientException.class); if (restException != null) { handleRestException(restException); return; } if (getCause(e, ConnectException.class) != null) { JOptionPane.showMessageDialog(view.dialog(), InfoMsgs.JIRA_UNAVAILABLE); } else if (getCause(e, UnknownHostException.class) != null) { JOptionPane.showMessageDialog(view.dialog(), InfoMsgs.JIRA_EXPORT_WRONG_URL); } else { log.error("Unhandled ExecutionException cause", e.getCause()); JOptionPane.showMessageDialog(view.dialog(), InfoMsgs.JIRA_UNKNOWN_LOGIN_FAILURE); } } @SuppressWarnings("unchecked") private <T> T getCause(Throwable t, Class<T> exceptionClass) { if (t.getClass() == exceptionClass) { return (T) t; } if (t.getCause() == null) { return null; } else { return getCause(t.getCause(), exceptionClass); } } private void handleRestException(RestClientException re) { if (re.getStatusCode().isPresent()) { int statusCode = re.getStatusCode().get(); if (statusCode == HTTP_UNAUTHORIZED) { JOptionPane.showMessageDialog(view.dialog(), InfoMsgs.JIRA_EXPORT_AUTHENTICATION_FAILURE); return; } else if (statusCode == HTTP_FORBIDDEN) { JOptionPane.showMessageDialog(view.dialog(), InfoMsgs.JIRA_EXPORT_CAPTCHA_NEEDED); return; } else if (statusCode == HTTP_NOT_FOUND) { JOptionPane.showMessageDialog(view.dialog(), InfoMsgs.JIRA_EXPORT_WRONG_URL); return; } else { log.error(MessageFormat.format("Unhandled HTTP Code {0}", statusCode)); } } else { log.error("HTTP Code not present."); } } @Override protected JiraLoginView createView() { return new JiraLoginView(); } }