import java.io.IOException;
import java.net.MalformedURLException;
import java.util.HashMap;
import javax.management.MBeanServerConnection;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import javax.naming.Context;
import com.sun.jndi.rmi.registry.RegistryContextFactory;
/**
*
*/
public final class BuildTriggerer {
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";
}
public static void main(String[] args) {
forceBuild("localhost", "commons-math");
}
public static void forceBuild(String jmxRmiHost, String projectName) {
MBeanServerConnection connection = getConnection(jmxRmiHost);
ObjectName mbeanObj;
try {
mbeanObj = ObjectName.getInstance("CruiseControl Project:name=" + projectName);
} 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");
}
public static void forceBuildWithTarget(String jmxRmiHost, String projectName, String remoteTarget) {
MBeanServerConnection connection = getConnection(jmxRmiHost);
ObjectName mbeanObj;
try {
mbeanObj = ObjectName.getInstance("CruiseControl Project:name=" + projectName);
} 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 with target " + remoteTarget + "...");
try {
connection.invoke(mbeanObj, "buildWithTarget", new Object[] {remoteTarget}, new String[] {String.class.getName()});
} catch (Exception e) {
throw new RuntimeException(e);
}
System.out.println("sent 'build' msg successfully");
}
private static MBeanServerConnection getConnection(String jmxRmiHost) {
final int rmiPort = 1099;
JMXServiceURL url;
try {
url = new JMXServiceURL("service:jmx:rmi: + jmxRmiHost + ":" + rmiPort + "/jndi/jrmp");
} catch (MalformedURLException e) {
throw new RuntimeException(e);
}
System.setProperty(Context.INITIAL_CONTEXT_FACTORY, RegistryContextFactory.class.getName());
HashMap theEnvironment = new HashMap();
try {
return JMXConnectorFactory.connect(url, theEnvironment).getMBeanServerConnection();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}