magicware.scm.redmine.tools.RedmineClient.java Source code

Java tutorial

Introduction

Here is the source code for magicware.scm.redmine.tools.RedmineClient.java

Source

/*
 * Copyright 2011 Zouhin Ro
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package magicware.scm.redmine.tools;

import java.io.IOException;
import java.util.UUID;
import java.util.regex.MatchResult;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang.StringUtils;
import org.apache.http.Header;
import org.apache.http.HttpHost;
import org.apache.http.HttpRequest;
import org.apache.http.HttpResponse;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.AuthCache;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.protocol.ClientContext;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.auth.BasicScheme;
import org.apache.http.impl.client.BasicAuthCache;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class RedmineClient {

    protected static Logger log = LoggerFactory.getLogger(RedmineClient.class);

    private HttpHost targetHost;
    private DefaultHttpClient httpclient;
    private String context = null;

    public RedmineClient(String host, int port, String context) {
        super();
        this.httpclient = new DefaultHttpClient();
        this.targetHost = new HttpHost(host, port, Constants.NORMAL_PROTOCOL);
        this.context = context;
    }

    public void fillBasicAuth(String userName, String base64Pwd) {

        // Basic?
        httpclient.getCredentialsProvider().setCredentials(
                new AuthScope(targetHost.getHostName(), targetHost.getPort()),
                new UsernamePasswordCredentials(userName,
                        StringUtils.isEmpty(base64Pwd) ? UUID.randomUUID().toString()
                                : new String(Base64.decodeBase64(base64Pwd))));
        AuthCache authCache = new BasicAuthCache();
        BasicScheme basicAuth = new BasicScheme();
        authCache.put(targetHost, basicAuth);
        BasicHttpContext localcontext = new BasicHttpContext();
        localcontext.setAttribute(ClientContext.AUTH_CACHE, authCache);
    }

    public int queryIssue(String projectId, String fieldId, String keyNo)
            throws ClientProtocolException, IOException {

        HttpGet httpGet = null;
        try {

            int count = 0;
            StringBuilder uri = new StringBuilder();

            uri.append(this.context).append("/issues.json?").append("project_id=").append(projectId)
                    .append("&status_id=*&").append(fieldId).append("=").append(keyNo);

            httpGet = new HttpGet(uri.toString());
            log.debug("executing get request " + httpGet.getURI());

            // ???
            RdeminResponse rdeminResponse = getRdeminResponse(httpGet);

            if (rdeminResponse.isResponseOK()) {
                Matcher m = Pattern.compile(Constants.ISSUE_COUNT_VALUE_EXP).matcher(rdeminResponse.getContent());
                while (m.find()) {
                    MatchResult mr = m.toMatchResult();
                    count = Integer.valueOf(mr.group(1).trim());
                }
                log.debug("count of issue[" + keyNo + "] -> " + count);
            } else {
                throw new RuntimeException(
                        "??????????" + rdeminResponse.getContent());
            }

            return count;

        } finally {
            if (httpGet != null)
                httpGet.abort();
        }
    }

    public String createNewIssue(String newIssue) throws ClientProtocolException, IOException {
        HttpPost httpPost = null;
        String newIssueId = null;
        try {
            log.trace(newIssue);
            httpPost = new HttpPost(this.context + "/issues.json");
            httpPost.setEntity(new StringEntity(newIssue, "application/json", HTTP.UTF_8));
            log.debug("executing post request " + httpPost.getURI());

            // ???
            RdeminResponse rdeminResponse = getRdeminResponse(httpPost);

            if (rdeminResponse.isResponseOK()) {
                Matcher m = Pattern.compile(Constants.ISSUE_ID_VALUE_EXP).matcher(rdeminResponse.getContent());
                while (m.find()) {
                    MatchResult mr = m.toMatchResult();
                    newIssueId = mr.group(1).trim();
                }
            }
            return newIssueId;

        } finally {
            if (httpPost != null)
                httpPost.abort();
        }
    }

    public boolean deleteIssue(String issueId) throws ClientProtocolException, IOException {
        HttpDelete httpDelete = null;
        try {
            httpDelete = new HttpDelete(this.context + "/issues/" + issueId + ".json");
            log.debug("executing request delete " + httpDelete.getURI());
            RdeminResponse rdeminResponse = getRdeminResponse(httpDelete);
            return rdeminResponse.isResponseOK();
        } finally {
            if (httpDelete != null)
                httpDelete.abort();
        }
    }

    public int request(String uri) throws ClientProtocolException, IOException {
        HttpGet httpGet = null;
        try {
            httpGet = new HttpGet(this.context + uri);
            log.debug("executing request " + httpGet.getURI());
            return getRdeminResponse(httpGet).getStatus();
        } finally {
            if (httpGet != null)
                httpGet.abort();
        }
    }

    private RdeminResponse getRdeminResponse(HttpRequest request) throws IOException, ClientProtocolException {

        RdeminResponse rdeminResponse = new RdeminResponse();

        log.debug("-------------------------------------");

        HttpResponse response = httpclient.execute(targetHost, request);

        int statusCode = response.getStatusLine().getStatusCode();
        log.debug("responseStatus:" + statusCode);
        log.trace("Response Header >>>");
        Header[] headers = response.getAllHeaders();
        for (Header header : headers) {
            log.trace(header.getName() + ": " + header.getValue());
        }

        log.trace("Response Body >>>");

        String responseString = EntityUtils.toString(response.getEntity());
        log.trace(responseString);

        rdeminResponse.setStatus(statusCode);
        rdeminResponse.setContent(responseString);
        if (!rdeminResponse.isResponseOK()) {
            log.error(responseString);
        }

        return rdeminResponse;
    }

    public void shutdown() {
        if (httpclient != null)
            httpclient.getConnectionManager().shutdown();
    }

    class RdeminResponse {

        private int status;

        private String content;

        public int getStatus() {
            return status;
        }

        public void setStatus(int status) {
            this.status = status;
        }

        public String getContent() {
            return content;
        }

        public void setContent(String content) {
            this.content = content;
        }

        public boolean isResponseOK() {
            return (status >= 200 && status < 300);
        }
    }

}