/*
* This file is part of LibrePlan
*
* Copyright (C) 2013 St. Antoniusziekenhuis
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.libreplan.importers;
import java.util.Collections;
import java.util.List;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import org.apache.commons.lang.StringUtils;
import org.apache.cxf.jaxrs.client.WebClient;
import org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider;
import org.codehaus.jackson.map.DeserializationConfig.Feature;
import org.libreplan.importers.jira.IssueDTO;
import org.libreplan.importers.jira.SearchResultDTO;
import org.libreplan.ws.cert.NaiveTrustProvider;
import org.libreplan.ws.common.impl.Util;
/**
* Client to interact with Jira RESTful web service.
*
* @author Miciele Ghiorghis <m.ghiorghis@antoniusziekenhuis.nl>
*/
public class JiraRESTClient {
/**
* Path for search operation in JIRA REST API
*/
public static final String PATH_SEARCH = "rest/api/latest/search";
/**
* Path for authenticate session in JIRA REST API
*/
public static final String PATH_AUTH_SESSION = "rest/auth/latest/session";
/**
* Path for issue operations in JIRA REST API
*/
public static final String PATH_ISSUE = "/rest/api/latest/issue/";
/**
* Fields to include in the response of rest/api/latest/search.
*/
private static final String FIELDS_TO_INCLUDE_IN_RESPONSE = "summary,status,timetracking,worklog";
/**
* Max number of issues to return(default is 50)
*/
private static final long MAX_RESULTS = 1000;
private static final MediaType[] mediaTypes = new MediaType[] {
MediaType.valueOf(MediaType.APPLICATION_JSON),
MediaType.valueOf(MediaType.APPLICATION_XML) };
/**
* Queries Jira for all labels
*
* @param url
* the url from where to fetch data
* @return String with the list of labels sepparated by comma
*/
public static String getAllLables(String url) {
WebClient client = WebClient.create(url).accept(mediaTypes);
return client.get(String.class);
}
/**
* Query Jira for all issues with the specified query parameter
*
* @param url
* the url(end point)
* @param username
* the user name
* @param password
* the password
* @param path
* the path segment
* @param query
* the query
* @return list of jira issues
*/
public static List<IssueDTO> getIssues(String url, String username,
String password, String path, String query) {
WebClient client = createClient(url);
checkAutherization(client, username, password);
client.back(true);// Go to baseURI
client.path(path);
if (!query.isEmpty()) {
client.query("jql", query);
}
client.query("maxResults", MAX_RESULTS);
client.query("fields",
StringUtils.deleteWhitespace(FIELDS_TO_INCLUDE_IN_RESPONSE));
SearchResultDTO searchResult = client.get(SearchResultDTO.class);
return searchResult.getIssues();
}
/**
* Creates WebClient
*
* @param url
* the url
* @return the created WebClient
*/
private static WebClient createClient(String url) {
JacksonJaxbJsonProvider jacksonJaxbJsonProvider = new JacksonJaxbJsonProvider();
jacksonJaxbJsonProvider.configure(Feature.FAIL_ON_UNKNOWN_PROPERTIES,
false);
return WebClient.create(url,
Collections.singletonList(jacksonJaxbJsonProvider)).accept(
mediaTypes);
}
/**
* Request jira for authorization check
*
* @param client
* jira client
* @param login
* login name
* @param password
* login password
*/
private static void checkAutherization(WebClient client, String login,
String password) {
NaiveTrustProvider.setAlwaysTrust(true);
client.path(PATH_AUTH_SESSION);
Util.addAuthorizationHeader(client, login, password);
Response response = client.get();
if (response.getStatus() != Status.OK.getStatusCode()) {
throw new RuntimeException("Authorization failed");
}
}
}