package com.youdevise.hudson.slavestatus; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import hudson.model.Computer; import hudson.model.TaskListener; import hudson.slaves.ComputerListener; public class SlaveListenerInitiator extends ComputerListener { private static final String STARTUP_LOG_MESSAGE = "Initialising slave-status plugin"; private static final String SLAVE_STARTUP_LOG_MESSAGE = "Starting slave-status listener on %s"; private transient Logger logger = null; private int port; private List<StatusReporter> reporters = new ArrayList<StatusReporter>(); public SlaveListenerInitiator(int port) { init(port); } public SlaveListenerInitiator(int port, Logger logger) { this.logger = logger; init(port); } private void init(int port) { getLogger().info(STARTUP_LOG_MESSAGE); setPort(port); register(new IsRunningReporter()); register(new MemoryReporter()); } @Override public void onOnline(Computer slave, TaskListener taskListener) { getLogger().info(String.format(SLAVE_STARTUP_LOG_MESSAGE, slave.getName())); try { SlaveListener listener = new SlaveListener(port, reporters.toArray(new StatusReporter[0])); slave.getChannel().callAsync(listener); } catch (IOException e) { getLogger().log(Level.SEVERE, "Could not call slave", e); } } public void register(StatusReporter reporter) { reporters.add(reporter); } public void setPort(int port) { this.port = port; } private Logger getLogger() { if (null == logger) { logger = Logger.getLogger(SlaveListenerInitiator.class.getName()); } return logger; } }