package com.vmware.springsource.hyperic.plugin.gemfire;
import com.vmware.springsource.hyperic.plugin.gemfire.collectors.MemberCollector;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.management.MBeanServerConnection;
import javax.management.ObjectName;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hyperic.hq.product.LiveDataPlugin;
import org.hyperic.hq.product.PluginException;
import org.hyperic.hq.product.jmx.MxUtil;
import org.hyperic.util.config.ConfigResponse;
public class GemFireLiveData extends LiveDataPlugin {
private static final Log log = LogFactory.getLog(GemFireLiveData.class);
private static final String[] cmds = {"getMembers", "getDetails", "getSystemID"};
public Object getData(String command, ConfigResponse config) throws PluginException {
Object res = null;
log.debug("[getData] command='" + command + "' config='" + config + "'");
try {
MBeanServerConnection mServer = MxUtil.getMBeanServer(config.toProperties());
log.debug("[getData] mServer=" + mServer);
if ("getDetails".equals(command)) {
res = getDetails(mServer);
} else if ("getMembers".equals(command)) {
res = getMembers(mServer);
} else if ("getSystemID".equals(command)) {
res = getSystemID(mServer);
} else {
throw new PluginException("command '" + command + "' not found");
}
} catch (Exception e) {
throw new PluginException(e.getMessage(), e);
}
return res;
}
public String[] getCommands() {
return cmds;
}
public static String getSystemID(MBeanServerConnection mServer) throws Exception {
ObjectName mbean = new ObjectName("GemFire:type=MemberInfoWithStatsMBean");
String id = (String) mServer.getAttribute(mbean, "Id");
if (id.equalsIgnoreCase("n/a")) {
getMembers(mServer); // initialitze the id Attribute on MemberInfoWithStatsMBean
id = getSystemID(mServer);
}
return id;
}
private static final Map<String,String> namesCache=new HashMap<String, String>();
private static String[][] getMembers(MBeanServerConnection mServer) throws Exception {
List<String> members=GemFireUtils.getMembers(mServer);
List<String[]> names=new ArrayList();
for(String member :members){
String name=namesCache.get(member);
if(name==null){
Map detail=getMemberDetails(mServer,member);
name=(String) detail.get("name");
namesCache.put(member,name);
}
String res[]=new String[]{name,member};
names.add(res);
}
//cleanig olds names.
List <String> idsToRemove = new ArrayList<String>();
for (String member : namesCache.keySet()) {
if (!members.contains(member)) {
idsToRemove.add(member);
}
}
if (idsToRemove.size() > 0) {
log.debug("[getMembers] namesCache.size="+namesCache.size());
log.debug("[getMembers] idsToRemove.size="+idsToRemove.size());
for (String member : idsToRemove) {
namesCache.remove(member);
}
log.debug("[getMembers] namesCache.size="+namesCache.size());
}
return names.toArray(new String[0][0]);
}
private static Map getDetails(MBeanServerConnection mServer) throws Exception {
List<String> members=GemFireUtils.getMembers(mServer);
Map data = new HashMap();
for (String member : members) {
data.put(member, getMemberDetails(mServer, member));
}
return data;
}
private static Map getMemberDetails(MBeanServerConnection mServer, String member) throws Exception {
Map details = new HashMap();
details.putAll(MemberCollector.getMetrics(member, mServer, true));
return details;
}
}