All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.awired.clients.cruisecontrol.CruiseControl Maven / Gradle / Ivy

The newest version!
package net.awired.clients.cruisecontrol;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.security.Permission;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.management.AttributeNotFoundException;
import javax.management.InstanceNotFoundException;
import javax.management.MBeanException;
import javax.management.MBeanServerConnection;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.management.ReflectionException;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import javax.naming.Context;

public class CruiseControl {

    public String ccHost;
    public int ccRmiPort;
    public int ccHttpPort;
    private String buildResults = "cruisecontrol/buildresults";

    private static final class BuildStatus {
        public static final String IN_QUEUE = "in build queue";
        public static final String WAITING = "waiting for next time to build";
        public static final String BOOTSTRAPPING = "bootstrapping";
        public static final String CHECKING_FOR_MODS = "checking for modifications";
        public static final String NOW_BUILDING = "now building";
        public static final String MERGING_LOGS = "merging accumulated log files";
        public static final String PUBLISHING = "publishing build results";
    }

    private static CruiseControl instance = null;

    public static CruiseControl get() {
        if (instance == null) {
            instance = new CruiseControl();
        }
        return instance;
    }

    private CruiseControl() {
    }

    public String getStatus(String project) {
        JMXConnector connector = createConnector();
        MBeanServerConnection mbsc;
        String projectStatus = null;
        try {
            mbsc = connector.getMBeanServerConnection();
            ObjectName cruiseObjectName = ObjectName.getInstance("CruiseControl Project:name=" + project);
            projectStatus = (String) mbsc.getAttribute(cruiseObjectName, "Status");
            connector.close();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (MalformedObjectNameException e) {
            e.printStackTrace();
        } catch (NullPointerException e) {
            e.printStackTrace();
        } catch (AttributeNotFoundException e) {
            e.printStackTrace();
        } catch (InstanceNotFoundException e) {
            e.printStackTrace();
        } catch (MBeanException e) {
            e.printStackTrace();
        } catch (ReflectionException e) {
            e.printStackTrace();
        }

        return projectStatus;
    }

    public String getLastSuccessfulBuildLabel(String project) {
        String lastbuildTime = (String) getAttribute("CruiseControl Project:name=" + project, "LastSuccessfulBuild");
        // http://softbuild01.emea.apc.com:8082/cruisecontrol/buildresults/CPM_60_ComponentTestXP?log=log20090521205615L38214
        URL url;
        try {

            url = new URL("http://" + ccHost + ":" + ccHttpPort + "/" + buildResults + "/" + project + "?log="
                    + lastbuildTime);

            URLConnection urlConnection = url.openConnection();
            BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
            String inputLine;

            while ((inputLine = in.readLine()) != null) {
                if (inputLine.contains(lastbuildTime)) {
                    String buildLabel = inputLine.substring(inputLine.indexOf(lastbuildTime) + lastbuildTime.length()
                            + 1);
                    return buildLabel.substring(0, buildLabel.indexOf("\""));
                }
            }
            in.close();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    public String getLabel(String project) {
        return (String) getAttribute("CruiseControl Project:name=" + project, "Label");
    }

    @SuppressWarnings("unchecked")
    public List getAllProjects() {
        return (List) getAttribute("CruiseControl Manager:id=unique", "Projects");
    }

    @SuppressWarnings("unchecked")
    public Map getAllProjectStatus() {
        return (Map) getAttribute("CruiseControl Manager:id=unique", "AllProjectsStatus");
    }

    public void runBuild(String project) throws IOException, MalformedObjectNameException, NullPointerException,
            InstanceNotFoundException, MBeanException, ReflectionException {
        JMXConnector connector = createConnector();
        MBeanServerConnection mbsc = connector.getMBeanServerConnection();
        ObjectName cruiseObjectName = ObjectName.getInstance("CruiseControl Project:name=" + project);
        mbsc.invoke(cruiseObjectName, "build", null, null);
        connector.close();
    }

    public void forceBuild(String project) {
        MBeanServerConnection connection = null;
        try {
            connection = createConnector().getMBeanServerConnection();
        } catch (IOException e1) {
            e1.printStackTrace();
        }

        ObjectName mbeanObj;
        try {
            mbeanObj = ObjectName.getInstance("CruiseControl Project:name=" + project);
        } catch (MalformedObjectNameException e) {
            throw new RuntimeException(e);
        }

        String status;

        try {
            status = (String) connection.getAttribute(mbeanObj, "Status");
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

        if (!BuildStatus.WAITING.equals(status) && !BuildStatus.IN_QUEUE.equals(status)) {
            System.out.println("Not forcing build because current status is '" + status + "'");
            return;
        }
        System.out.println("Forcing build...");
        try {
            connection.invoke(mbeanObj, "build", new Object[0], new String[0]);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        System.out.println("sent 'build' msg successfully");
    }

    private Object getAttribute(String mbeanObject, String attribute) {
        ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
        Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
        SecurityManager securityManager = System.getSecurityManager();

        System.setSecurityManager(new MyRMISecurityManager());
        JMXConnector connector = createConnector();
        MBeanServerConnection mbsc;
        try {
            mbsc = connector.getMBeanServerConnection();
            return mbsc.getAttribute(ObjectName.getInstance(mbeanObject), attribute);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (AttributeNotFoundException e) {
            e.printStackTrace();
        } catch (InstanceNotFoundException e) {
            e.printStackTrace();
        } catch (MBeanException e) {
            e.printStackTrace();
        } catch (ReflectionException e) {
            e.printStackTrace();
        } catch (MalformedObjectNameException e1) {
            e1.printStackTrace();
        } catch (NullPointerException e1) {
            e1.printStackTrace();
        } finally {
            try {
                connector.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            Thread.currentThread().setContextClassLoader(contextClassLoader);
            System.setSecurityManager(securityManager);
        }
        return null;
    }

    private JMXConnector createConnector() {
        JMXServiceURL address = null;
        try {
            address = new JMXServiceURL("rmi", getCcHost(), getCcRmiPort(), "/jndi/jrmp");
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        HashMap environment = new HashMap();
        environment.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory");
        environment.put(Context.PROVIDER_URL, "rmi://" + getCcHost() + ":" + getCcRmiPort());
        try {
            return JMXConnectorFactory.connect(address, environment);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
        }
        return null;
    }

    private String getCcHost() {
        return ccHost;
    }

    private int getCcRmiPort() {
        return ccRmiPort;
    }

    private int getCcHttpPort() {
        return ccHttpPort;
    }

    public void setCcHost(String ccHost) {
        this.ccHost = ccHost;
    }

    public void setCcRmiPort(int ccRmiPort) {
        this.ccRmiPort = ccRmiPort;
    }

    public void setCcHttpPort(int ccHttpPort) {
        this.ccHttpPort = ccHttpPort;
    }

    private class MyRMISecurityManager extends SecurityManager {
        public void checkPermission() {
        }

        public void checkPermission(Permission perm) {
        }

        public void checkPermission(Permission perm, Object context) {
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy