package com.vmware.springsource.hyperic.plugin.gemfire.detectors; import com.vmware.springsource.hyperic.plugin.gemfire.GemFireUtils; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.management.MBeanServerConnection; import org.apache.commons.logging.Log; import org.hyperic.hq.product.AutoServerDetector; import org.hyperic.hq.product.PluginException; import org.hyperic.hq.product.ServerDetector; import org.hyperic.hq.product.ServerResource; import org.hyperic.hq.product.ServiceResource; import org.hyperic.hq.product.jmx.MxUtil; import org.hyperic.util.config.ConfigResponse; public abstract class MemberDetector extends ServerDetector implements AutoServerDetector { Log log = getLog(); public List getServerResources(ConfigResponse pc) throws PluginException { log.debug("[getServerResources] pc=" + pc); List servers = new ArrayList(); Map<String, String> names = new HashMap(); try { MBeanServerConnection mServer = MxUtil.getMBeanServer(pc.toProperties()); List<String> members=GemFireUtils.getMembers(mServer); log.debug("[getServerResources] members=" + Arrays.asList(members)); for (String memberID : members) { Map memberDetails = GemFireUtils.getMemberDetails(memberID, mServer); if (log.isDebugEnabled()) { log.debug("[getServerResources] memberDetails=" + memberDetails); } if (isValidMember(memberDetails)) { String name = (String) memberDetails.get("gemfire.member.name.string"); if (names.get(name) != null) { log.error("[getServerResources] There is 2 of more '" + getTypeInfo().getName() + "' with the same name '" + name + "'"); } names.put(name, name); ServerResource server = createServerResource(""); server.setName(getTypeInfo().getName() + " " + name); server.setIdentifier("GFDS server.name " + name); ConfigResponse c = new ConfigResponse(); c.setValue("member.name", name); setMeasurementConfig(server, c); setProductConfig(server, new ConfigResponse()); setCustomProperties(server, getAtributtes(memberDetails)); servers.add(server); } } } catch (Exception ex) { throw new PluginException(ex.getMessage(), ex); } return servers; } @Override protected List discoverServices(ConfigResponse config) throws PluginException { log.debug("[discoverServices] config=" + config); List services = new ArrayList(); try { MBeanServerConnection mServer = MxUtil.getMBeanServer(config.toProperties()); String memberID = GemFireUtils.memberNameToMemberID(config.getValue("member.name"), mServer); Map memberDetails = GemFireUtils.getMemberDetails(memberID, mServer); Map<String, Map> regions = (Map) memberDetails.get("gemfire.member.regions.map"); if (regions != null) { for (Map region : regions.values()) { String name = (String) region.get("gemfire.region.name.string"); ServiceResource service = createServiceResource("Region"); service.setName(memberDetails.get("gemfire.member.name.string") + " Region " + name); ConfigResponse c = new ConfigResponse(); c.setValue("regionID", name); log.debug("[discoverServices] region -> c=" + c); ConfigResponse attr = new ConfigResponse(); attr.setValue("name", (String) region.get("gemfire.region.name.string")); attr.setValue("path", (String) region.get("gemfire.region.path.string")); attr.setValue("scope", (String) region.get("gemfire.region.scope.string")); attr.setValue("datapolicy", (String) region.get("gemfire.region.datapolicy.string")); attr.setValue("interestpolicy", (String) region.get("gemfire.region.interestpolicy.string")); attr.setValue("diskattrs", (String) region.get("gemfire.region.diskattrs.string")); setMeasurementConfig(service, c); service.setCustomProperties(attr); services.add(service); } } List<Map> gateways = (List) memberDetails.get("gemfire.member.gatewayhub.gateways.collection"); if (gateways != null) { for (Map gateway : gateways) { String id = (String) gateway.get("gemfire.member.gateway.id.string"); ServiceResource service = createServiceResource("Gateway"); service.setName(memberDetails.get("gemfire.member.name.string") + " Gateway " + id); ConfigResponse c = new ConfigResponse(); c.setValue("gatewayID", id); log.debug("[discoverServices] gateway -> c=" + c); setProductConfig(service, new ConfigResponse()); setMeasurementConfig(service, c); services.add(service); } } } catch (Exception ex) { throw new PluginException(ex.getMessage(), ex); } return services; } abstract boolean isValidMember(Map memberDetails); abstract ConfigResponse getAtributtes(Map memberDetails); }