/** * Created on Dec 20, 2006 8:42:13 AM * * Copyright FullSIX */ package hudson.plugins.jmx; import hudson.Extension; import hudson.model.Hudson; import hudson.model.Item; import hudson.model.Job; import hudson.model.listeners.ItemListener; import java.util.List; import javax.management.Attribute; import javax.management.AttributeList; import javax.management.AttributeNotFoundException; import javax.management.DynamicMBean; import javax.management.InstanceAlreadyExistsException; import javax.management.InstanceNotFoundException; import javax.management.InvalidAttributeValueException; import javax.management.MBeanAttributeInfo; import javax.management.MBeanException; import javax.management.MBeanInfo; import javax.management.MBeanRegistrationException; import javax.management.MBeanServer; import javax.management.MalformedObjectNameException; import javax.management.NotCompliantMBeanException; import javax.management.ObjectName; import javax.management.ReflectionException; /** * @author bruyeron * @version $Id$ */ @Extension public class JmxJobListener extends ItemListener { public final static String JMX_NAME_PREFIX = "hudson:type=Job,name="; protected MBeanServer server; private boolean loaded; /** * @param server */ public JmxJobListener() { this.server = PluginImpl.SERVER; } /** * @see hudson.model.listeners.JobListener#onCreated(hudson.model.Job) */ @Override public void onCreated(Item i) { if (!(i instanceof Job)) return; Job j = (Job)i; try { ObjectName n = new ObjectName(JMX_NAME_PREFIX + j.getName()); JobMBean mbean = new JobMBean(j); server.registerMBean(mbean, n); } catch (MalformedObjectNameException e) { e.printStackTrace(); } catch (InstanceAlreadyExistsException e) { e.printStackTrace(); } catch (MBeanRegistrationException e) { e.printStackTrace(); } catch (NotCompliantMBeanException e) { e.printStackTrace(); } } /** * @see hudson.model.listeners.JobListener#onDeleted(hudson.model.Job) */ @Override public void onDeleted(Item i) { if (!(i instanceof Job)) return; Job j = (Job)i; try { ObjectName n = new ObjectName(JMX_NAME_PREFIX + j.getName()); server.unregisterMBean(n); } catch (MalformedObjectNameException e) { e.printStackTrace(); } catch (InstanceNotFoundException e) { e.printStackTrace(); } catch (MBeanRegistrationException e) { e.printStackTrace(); } catch (NullPointerException e) { e.printStackTrace(); } } /** * @see hudson.model.listeners.JobListener#onLoaded() */ @Override public void onLoaded() { List<Job> jobs = Hudson.getInstance().getAllItems(Job.class); for(Job j : jobs){ onCreated(j); } loaded = true; } public void unregister(){ ItemListener.all().remove(this); if(!loaded) return; // early termination List<Job> jobs = Hudson.getInstance().getAllItems(Job.class); for(Job j : jobs){ onDeleted(j); } } static class JobMBean implements DynamicMBean { private static final String STATUS = "status"; static final String START = "start"; static final String STOP = "stop"; private Job job = null; private MBeanAttributeInfo[] attributeInfos = new MBeanAttributeInfo[1]; private MBeanInfo dMBeanInfo = null; /** * @param job */ private JobMBean(Job job) { super(); this.job = job; attributeInfos[0] = new MBeanAttributeInfo(STATUS, "java.lang.String", "Status of the Job", true, false, false); dMBeanInfo = new MBeanInfo(this.getClass().getName(), "Hudson Job", attributeInfos, null, null, null); } /** * @see javax.management.DynamicMBean#getAttribute(java.lang.String) */ public Object getAttribute(String attribute) throws AttributeNotFoundException, MBeanException, ReflectionException { if(STATUS.equals(attribute)){ return getStatus(); } return null; } private String getStatus(){ return job.getLastBuild() != null ? job.getLastBuild().getResult().toString():null; } /** * @see javax.management.DynamicMBean#getAttributes(java.lang.String[]) */ public AttributeList getAttributes(String[] attributes) { AttributeList result = null; for(String name : attributes){ if(STATUS.equals(name)){ result = new AttributeList(); result.add(new Attribute(name, getStatus())); } } return result; } /** * @see javax.management.DynamicMBean#getMBeanInfo() */ public MBeanInfo getMBeanInfo() { return dMBeanInfo; } /** * @see javax.management.DynamicMBean#invoke(java.lang.String, java.lang.Object[], java.lang.String[]) */ public Object invoke(String actionName, Object[] params, String[] signature) throws MBeanException, ReflectionException { return null; } /** * @see javax.management.DynamicMBean#setAttribute(javax.management.Attribute) */ public void setAttribute(Attribute attribute) throws AttributeNotFoundException, InvalidAttributeValueException, MBeanException, ReflectionException { } /** * @see javax.management.DynamicMBean#setAttributes(javax.management.AttributeList) */ public AttributeList setAttributes(AttributeList attributes) { return null; } } }