com.comcast.cats.jenkins.service.AbstractService.java Source code

Java tutorial

Introduction

Here is the source code for com.comcast.cats.jenkins.service.AbstractService.java

Source

/**
 * Copyright 2014 Comcast Cable Communications Management, LLC
 *
 * This file is part of CATS.
 *
 * CATS is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * CATS 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with CATS.  If not, see <http://www.gnu.org/licenses/>.
 */
package com.comcast.cats.jenkins.service;

import java.io.File;
import java.io.IOException;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpMethodBase;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.URI;
import org.apache.commons.httpclient.URIException;
import org.apache.commons.httpclient.UsernamePasswordCredentials;
import org.apache.commons.httpclient.auth.AuthScope;
import org.apache.commons.httpclient.methods.FileRequestEntity;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.RequestEntity;
import org.simpleframework.xml.Serializer;
import org.simpleframework.xml.core.Persister;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.comcast.cats.util.JenkinsClientProperties;

/**
 * An abstraction of common code to connect to the web service. All service
 * classes, which talks to the web service should extends this.
 * 
 * @author SSugun00c
 * 
 */
public abstract class AbstractService {
    protected final Logger LOGGER = LoggerFactory.getLogger(getClass());

    private static final String REQUEST_URL_SUFFIX = "/api/xml";
    private static final String CONTENT_TYPE = "Content-Type";
    private static final String APPLICATION_XML = "application/xml";

    private JenkinsClientProperties jenkinsClientProperties = new JenkinsClientProperties();

    /**
     * Typical web service client class to get a string representation of the
     * response.
     * 
     * @param requestUrl
     *            Relative request URL
     * @param mapperClass
     *            Class to which the response should cast to.
     * @return JAXB deserialized response
     */
    protected Object getForObject(final String requestUrl, Class<?> mapperClass, String parameters) {
        Object domainObject = null;
        HttpClient client = new HttpClient();

        try {
            PostMethod request = new PostMethod();
            request.setURI(new URI(getAbsoluteUrl(requestUrl + REQUEST_URL_SUFFIX + parameters), false));
            request.addRequestHeader(CONTENT_TYPE, APPLICATION_XML);
            String apiToken = jenkinsClientProperties.getJenkinsApiToken();
            if (!apiToken.isEmpty()) {
                request.setDoAuthentication(true);
            }
            domainObject = sendRequestToJenkins(mapperClass, domainObject, client, request, apiToken);

        } catch (Exception e) {
            LOGGER.error(e.getMessage());
        }

        return domainObject;
    }

    /**
     * Sends Http request to Jenkins server and read the respose.
     * 
     * @param mapperClass
     * @param domainObject
     * @param client
     * @param request
     * @return
     * @throws NumberFormatException
     * @throws IOException
     * @throws HttpException
     * @throws URIException
     */
    private Object sendRequestToJenkins(Class<?> mapperClass, Object domainObject, HttpClient client,
            HttpMethodBase request, String apiToken)
            throws NumberFormatException, IOException, HttpException, URIException {
        String passwdord = apiToken;
        if (apiToken.isEmpty()) {
            // Set jenkins password if no API token is present
            passwdord = jenkinsClientProperties.getJenkinsPassword();
        }
        client.getState().setCredentials(
                new AuthScope(jenkinsClientProperties.getJenkinsHost(),
                        new Integer(jenkinsClientProperties.getJenkinsPort()), AuthScope.ANY_REALM),
                new UsernamePasswordCredentials(jenkinsClientProperties.getJenkinsUsername(), passwdord));
        if (!apiToken.isEmpty()) {
            client.getParams().setAuthenticationPreemptive(true);
        }

        int responseCode = client.executeMethod(request);

        LOGGER.info("[REQUEST][" + request.getURI().toString() + "]");
        LOGGER.info("[STATUS][" + request.getStatusLine().toString() + "]");

        if (HttpStatus.SC_OK == responseCode) {
            try {
                Serializer serializer = new Persister();
                domainObject = serializer.read(mapperClass, request.getResponseBodyAsStream(), false);
            } catch (Exception e) {
                LOGGER.error(e.getMessage());
            }
        }
        return domainObject;
    }

    /**
     * Get fully qualified path for the request
     * 
     * @param requestUrl
     * @return
     */
    private String getAbsoluteUrl(String requestUrl) {
        String absoluteUrl = jenkinsClientProperties.getJenkinsServieBaseUrl();

        if (null != requestUrl) {
            absoluteUrl += requestUrl;
        }
        return absoluteUrl;
    }

    /**
     * Perform build Operations Via GET
     * 
     * @param requestUrl
     *            Relative request URL
     * @param mapperClass
     *            Class to which the response should cast to.
     * @return JAXB deserialized response
     */
    protected Object performBuildOperationsViaGet(final String requestUrl, Class<?> mapperClass) {
        Object domainObject = null;
        HttpClient client = new HttpClient();
        try {
            GetMethod request = new GetMethod();
            request.setURI(new URI(getAbsoluteUrl(requestUrl), false));
            request.addRequestHeader(CONTENT_TYPE, APPLICATION_XML);
            String apiToken = jenkinsClientProperties.getJenkinsApiToken();
            if (!apiToken.isEmpty()) {
                request.setDoAuthentication(true);
            }

            domainObject = sendRequestToJenkins(mapperClass, domainObject, client, request, apiToken);
        } catch (Exception e) {
            LOGGER.error(e.getMessage());
        }

        return domainObject;
    }

    // TODO: Not tested
    /**
     * Create Project Via GET
     * 
     * @param requestUrl
     *            Relative request URL
     * @param mapperClass
     *            Class to which the response should cast to.
     * @return JAXB deserialized response
     */
    protected Object createProject(final String requestUrl, Class<?> mapperClass, File config) {
        Object domainObject = null;
        HttpClient client = new HttpClient();
        try {
            PostMethod request = new PostMethod(getAbsoluteUrl(requestUrl));
            request.addRequestHeader(CONTENT_TYPE, APPLICATION_XML);
            RequestEntity entity = new FileRequestEntity(config, "text/xml; charset=UTF-8");
            request.setRequestEntity(entity);
            String apiToken = jenkinsClientProperties.getJenkinsApiToken();
            if (!apiToken.isEmpty()) {
                request.setDoAuthentication(true);
            }

            domainObject = sendRequestToJenkins(mapperClass, domainObject, client, request, apiToken);

        } catch (Exception e) {
            LOGGER.error(e.getMessage());
        }

        return domainObject;
    }

}