package com.niklim.clicktrace.service.export.jira; import java.net.URISyntaxException; import java.text.MessageFormat; import java.util.concurrent.ExecutionException; import org.apache.commons.lang.StringEscapeUtils; import org.apache.commons.lang.StringUtils; import org.codehaus.jettison.json.JSONException; import org.codehaus.jettison.json.JSONObject; import com.atlassian.httpclient.api.HttpClient; import com.atlassian.httpclient.api.Request; import com.atlassian.httpclient.api.Response; import com.google.common.net.UrlEscapers; import com.google.inject.Inject; import com.google.inject.Singleton; 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.JiraClientFactory; import com.niklim.clicktrace.jira.client.JiraRestClicktraceClient; import com.niklim.clicktrace.props.JiraConfig; import com.niklim.clicktrace.service.exception.JiraExportException; /** * Creates Issue in JIRA and checks if Clicktrace session already is in JIRA. */ @Singleton public class JiraService { @Inject private JiraRestClicktraceClient client; private static final String CREATE_SUCCESS = "Created"; public String createIssue(JiraConfig jiraConfig, String project, String issueType, String priority, String summary, String description) throws URISyntaxException, IllegalStateException, IllegalArgumentException, InterruptedException, ExecutionException, JiraExportException, JSONException { String jiraInstanceUrl = jiraConfig.getInstanceUrl(); String username = jiraConfig.getUsername(); String password = jiraConfig.getPassword().get(); HttpClient httpClient = JiraClientFactory.createHttpClient(username, password, jiraInstanceUrl); String jsonObj = createRequestEntity(project, issueType, priority, summary, description); Request r = createRequest(jiraInstanceUrl, httpClient, jsonObj); Response response = r.post().get(); if (!StringUtils.equals(CREATE_SUCCESS, response.getStatusText())) { throw new JiraExportException(MessageFormat.format( "Unable to create the Issue: {0}.\nProbably not all required fields were set.", response.getStatusText())); } JSONObject jsonObject = new JSONObject(response.getEntity()); return jsonObject.getString("key"); } private Request createRequest(String jiraInstanceUrl, HttpClient httpClient, String jsonObj) { Request request = httpClient.newRequest(jiraInstanceUrl + "/rest/api/2/issue"); request.setContentType("application/json"); request.setEntity(jsonObj); return request; } private String createRequestEntity(String project, String issueType, String priority, String summary, String description) { //@formatter:off String jsonObj = "{" + "\"fields\": {" + "\"project\":" + "{" + "\"key\": \""+project+"\"" + "}," + "\"summary\": \""+summary+"\"," + "\"description\": \""+StringEscapeUtils.escapeJava(description)+"\"," + "\"issuetype\": {" + "\"name\": \""+issueType+"\"" + "}," + "\"priority\": {" + "\"name\": \""+priority+"\"" + "}" + "}" + "}"; //@formatter:on return jsonObj; } public boolean checkSessionExist(String username, String password, String issueKey, String sessionName, String jiraInstanceUrl) throws JiraExportException { sessionName = UrlEscapers.urlFragmentEscaper().escape(sessionName); ExportResult res = client.checkSession(new ExportParams(username, password, jiraInstanceUrl, issueKey, sessionName)); return handleCheckSessionExistsResult(res); } private boolean handleCheckSessionExistsResult(ExportResult res) throws JiraExportException { if (res.status == ExportStatus.NO_SESSION) { return false; } else if (res.status == ExportStatus.SESSION_EXISTS) { return true; } else { throw new JiraExportException(res.msg); } } }