package org.radargun.service;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.management.ManagementFactory;
import java.util.Collections;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import javax.management.MBeanAttributeInfo;
import javax.management.MBeanInfo;
import javax.management.MBeanServer;
import javax.management.ObjectInstance;
import javax.management.ObjectName;
import org.jgroups.util.Util;
import org.radargun.Service;
import org.radargun.traits.ConfigurationProvider;
import org.radargun.traits.ProvidesTrait;
import org.radargun.utils.Utils;
/**
* @author Radim Vansa <rvansa@redhat.com>
*/
@Service(doc = "JGroupsService faking cache operations")
public class JGroups35Service extends JGroupsService {
@Override
public void stop() {
// the code is same but now it calls Util.close(Closeable)
Util.close(ch);
started = false;
}
@ProvidesTrait
ConfigurationProvider getConfigurationProvider() {
return new ConfigurationProvider() {
@Override
public Map<String, Properties> getNormalizedConfigs() {
return Collections.singletonMap("jgroups", dumpProperties());
}
@Override
public Map<String, byte[]> getOriginalConfigs() {
InputStream stream = null;
try {
stream = getClass().getResourceAsStream(configFile);
if (stream == null) {
stream = new FileInputStream(configFile);
}
return Collections.singletonMap(configFile, Utils.readAsBytes(stream));
} catch (IOException e) {
log.error("Cannot read configuration file " + configFile, e);
return Collections.EMPTY_MAP;
} finally {
Utils.close(stream);
}
}
};
}
private Properties dumpProperties() {
Properties p = new Properties();
try {
MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer();
Set<ObjectInstance> beanObjs = mbeanServer.queryMBeans(new ObjectName("jboss.infinispan:type=protocol,cluster=\"" + ch.getClusterName() + "\",protocol=*"), null);
if (beanObjs.isEmpty()) {
log.error("no JGroups protocols found");
return p;
}
for (ObjectInstance beanObj : beanObjs) {
ObjectName protocolObjectName = beanObj.getObjectName();
MBeanInfo protocolBean = mbeanServer.getMBeanInfo(protocolObjectName);
String protocolName = protocolObjectName.getKeyProperty("protocol");
for (MBeanAttributeInfo info : protocolBean.getAttributes()) {
String propName = info.getName();
Object propValue = mbeanServer.getAttribute(protocolObjectName, propName);
p.setProperty(protocolName + "." + propName, propValue == null ? "null" : propValue.toString());
}
}
return p;
} catch (Exception e) {
log.error("Error while dumping JGroups config as properties", e);
return p;
}
}
}