/*
 * 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.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", stripWhiteSpace(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");
        }
    }

    /**
     * Strip all white spaces of the specified <code>str<code>
     *
     * @param str
     *            the string
     * @return string with out white spaces
     */
    private static String stripWhiteSpace(String str) {
        return str.replaceAll("\\s+", "");
    }
}

@@ -948,24 +948,68 @@
 se.Status;%0A%0A
+import org.apache.commons.lang.StringUtils;%0A
 import org.a
@@ -3659,28 +3659,57 @@
 fields%22,
- strip
+%0A                StringUtils.delete
 White
-S
+s
 pace(FIE
@@ -5065,288 +5065,6 @@
  %7D%0A%0A
-    /**%0A     * Strip all white spaces of the specified %3Ccode%3Estr%3Ccode%3E%0A     *%0A     * @param str%0A     *            the string%0A     * @return string with out white spaces%0A     */%0A    private static String stripWhiteSpace(String str) %7B%0A        return str.replaceAll(%22%5C%5Cs+%22, %22%22);%0A    %7D%0A
 %7D%0A

Change own implementation to strip whitespaces by StringUtils method