com.cibuddy.jenkins.JenkinsServer.java Source code

Java tutorial

Introduction

Here is the source code for com.cibuddy.jenkins.JenkinsServer.java

Source

/*
 * Copyright (C) 2012 Mirko Jahn <mirkojahn@gmail.com>
 *
 * 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 com.cibuddy.jenkins;

import com.cibuddy.core.build.MissingProjectException;
import com.cibuddy.core.build.ProjectSetupException;
import com.cibuddy.core.build.server.DefaultProjectImpl;
import com.cibuddy.core.build.server.IProject;
import com.cibuddy.core.build.server.IProjectState;
import com.cibuddy.core.build.server.IServer;
import com.cibuddy.core.security.AuthenticationToken;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.logging.Level;
import org.apache.http.HeaderIterator;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpHead;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BufferedHeader;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 *
 * @author Mirko Jahn <mirkojahn@gmail.com>
 * @version 1.0
 * @since 1.0
 */
public class JenkinsServer implements IServer {

    private static final Logger LOG = LoggerFactory.getLogger(JenkinsServer.class);
    public static final String JENKINS_HEADER = "X-Jenkins";
    public static final String JENKINS_SERVER_JOB = "/api/xml?tree=name,url,color,lastBuild[result,id,building,number,actions[causes[userName]]]";
    public static final String JENKINS_SERVER_JOB_JSON = "/api/json?tree=name,url,color,lastBuild[result,id,building,number]";
    public static final String JENKINS_SERVER_JOBS = "/api/xml?tree=jobs[" + JENKINS_SERVER_JOB + "]";
    public static final String JENKINS_PROJECT_COLOR = "/api/xml?xpath=/*/color/text()";

    private URI serverUri;
    private String name;
    private String source;
    private String jenkins_version = null;

    public JenkinsServer(String source, String serverName, URI serverUri, AuthenticationToken token) {
        try {
            this.serverUri = serverUri;
            this.name = serverName;
            this.source = source;
            LOG.debug("New Jenkins Server to include under" + serverUri);

            // check if Jenkins is reachable and in fact a jenkins server

            HttpClient httpclient = new DefaultHttpClient();
            HttpHead head = new HttpHead(serverUri);
            HttpResponse response = httpclient.execute(head);
            HeaderIterator it = response.headerIterator(JENKINS_HEADER);
            while (it.hasNext()) {
                jenkins_version = ((BufferedHeader) it.next()).getValue();
                LOG.debug("Jenkins Version identified: " + jenkins_version);
            }
        } catch (Exception ex) {
            // do nothing
            LOG.warn("Problem occured while adding Jenkins Server to configuration", ex);
        }
    }

    private static void checkResult(int i) throws IOException {
        if (i / 100 != 2) {
            throw new IOException(
                    "Server didn't respond with a status indicating success. Aborting now due to status: " + i);
        }
    }

    @Override
    public URI getBuildServerURI() {
        return serverUri;
    }

    @Override
    public String getBuildServerType() {
        return IServer.TYPE_JENKINS_SERVER;
    }

    @Override
    public String getBuildServerVersion() {
        return jenkins_version;
    }

    @Override
    public IProjectState getProjectState(String projectName) throws ProjectSetupException {
        try {
            String requestURI = getURLStringforProjectName(projectName, this) + JENKINS_SERVER_JOB_JSON;
            // get the project
            try {
                HttpClient httpclient = new DefaultHttpClient();

                HttpGet httpget = new HttpGet(new URI(requestURI));
                HttpResponse response = httpclient.execute(httpget);

                HttpEntity entity = response.getEntity();
                checkResult(response.getStatusLine().getStatusCode());
                if (entity != null) {
                    String json = EntityUtils.toString(entity, "utf-8");
                    return JenkinsProjectState.builder(json);
                }
            } catch (URISyntaxException ex) {
                java.util.logging.Logger.getLogger(JenkinsServer.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IOException e) {
                LOG.warn("Problem occured while checking Jenkins Server:" + requestURI);
                throw new MissingProjectException(projectName, e);
            }

        } catch (UnsupportedEncodingException ex) {
            LOG.warn("Couldn't encode project URL for Jenkins CI build server project called: " + projectName, ex);
        } catch (MalformedURLException ex) {
            LOG.warn("Malformed project URL for Jenkins CI build server project called: " + projectName, ex);
        }
        return null;
    }

    @Override
    public String getBuildServerAlias() {
        return name;
    }

    @Override
    public String getBuildServerSource() {
        return source;
    }

    static String getURLStringforProjectName(String projectName, IServer server)
            throws UnsupportedEncodingException, MalformedURLException, ProjectSetupException {
        String serverURIstring = server.getBuildServerURI().toURL().toExternalForm();
        if (!serverURIstring.endsWith("/")) {
            serverURIstring = serverURIstring + "/";
        }
        // url encode name
        String projectNameEncoded = URLEncoder.encode(projectName, "UTF-8").replace("+", "%20");
        String projectString = new URL(serverURIstring + "job/" + projectNameEncoded).toString();
        return projectString;
    }

    @Override
    public IProject getProject(String projectId) {
        return new DefaultProjectImpl(projectId, this);
    }

}