package org.rhq.plugins.irc; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.rhq.core.domain.configuration.Configuration; import org.rhq.core.domain.event.Event; import org.rhq.core.domain.event.EventSeverity; import org.rhq.core.domain.measurement.AvailabilityType; import org.rhq.core.domain.measurement.MeasurementDataNumeric; import org.rhq.core.domain.measurement.MeasurementReport; import org.rhq.core.domain.measurement.MeasurementScheduleRequest; import org.rhq.core.pluginapi.event.EventContext; import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException; import org.rhq.core.pluginapi.inventory.ResourceComponent; import org.rhq.core.pluginapi.inventory.ResourceContext; import org.rhq.core.pluginapi.measurement.MeasurementFacet; import org.rhq.core.pluginapi.operation.OperationContext; import org.rhq.core.pluginapi.operation.OperationFacet; import org.rhq.core.pluginapi.operation.OperationResult; import java.util.Set; import java.util.concurrent.atomic.AtomicLong; /** * @author Greg Hinkle */ public class IRCChannelComponent implements ResourceComponent<IRCServerComponent>, MeasurementFacet, OperationFacet { private final Log log = LogFactory.getLog(this.getClass()); private ResourceContext<IRCServerComponent> context; private EventContext eventContext; private String channel; private AtomicLong messageCount = new AtomicLong(); /** * Return availability of this resource * * @see org.rhq.core.pluginapi.inventory.ResourceComponent#getAvailability() */ public AvailabilityType getAvailability() { if (!context.getParentResourceComponent().isInChannel(channel)) { context.getParentResourceComponent().registerChannel(this); } // TODO supply real implementation return AvailabilityType.UP; } /** * Start the resource connection * * @see org.rhq.core.pluginapi.inventory.ResourceComponent#start(org.rhq.core.pluginapi.inventory.ResourceContext) */ public void start(ResourceContext<IRCServerComponent> context) throws InvalidPluginConfigurationException, Exception { this.context = context; Configuration conf = context.getPluginConfiguration(); // TODO add code to start the resource / connection to it channel = conf.getSimple(IRCChannelDiscoveryComponent.CONFIG_CHANNEL).getStringValue(); eventContext = context.getEventContext(); context.getParentResourceComponent().registerChannel(this); } /** * Tear down the rescource connection * * @see org.rhq.core.pluginapi.inventory.ResourceComponent#stop() */ public void stop() { context.getParentResourceComponent().unregisterChannel(this); } /** * Gather measurement data * * @see org.rhq.core.pluginapi.measurement.MeasurementFacet#getValues(org.rhq.core.domain.measurement.MeasurementReport, java.util.Set) */ public void getValues(MeasurementReport report, Set<MeasurementScheduleRequest> metrics) throws Exception { for (MeasurementScheduleRequest req : metrics) { if (req.getName().equals("users")) { double count = this.context.getParentResourceComponent().getUserCount(this.getChannel()); MeasurementDataNumeric res = new MeasurementDataNumeric(req, count); report.addData(res); } else if (req.getName().equals("messages")) { report.addData( new MeasurementDataNumeric(req, Double.valueOf(messageCount.get()))); } } } /** * Invokes the passed operation on the managed resource * * @param name Name of the operation * @param params The method parameters * @return An operation result * @see org.rhq.core.pluginapi.operation.OperationFacet */ public OperationResult invokeOperation(String name, Configuration params) throws Exception { OperationResult res = new OperationResult(); if ("sendMessage".equals(name)) { String message = params.getSimple("message").getStringValue(); context.getParentResourceComponent().sendMessage(channel, message); } return res; } public String getChannel() { return channel; } public void acceptMessage(String sender, String login, String hostname, String message) { Event event = new Event("message", sender, System.currentTimeMillis(), EventSeverity.INFO, message); this.eventContext.publishEvent(event); this.messageCount.incrementAndGet(); } }