package org.radargun.service; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.jgroups.JChannel; import org.jgroups.protocols.relay.RELAY2; import org.jgroups.protocols.relay.Relayer; import org.radargun.protocols.SLAVE_PARTITION; public class Infinispan52Lifecycle extends InfinispanPartitionableLifecycle { public Infinispan52Lifecycle(Infinispan52EmbeddedService service) { super(service); } @Override protected List<JChannel> getChannels(JChannel parentChannel) { List<JChannel> list; if (parentChannel == null) { list = super.getChannels(null); } else { list = new ArrayList<JChannel>(); list.add(parentChannel); } if (list.size() == 0) { log.info("No JGroups channels available"); return list; } RELAY2 relay = (RELAY2) list.get(0).getProtocolStack().findProtocol(RELAY2.class); if (relay != null) { try { Field relayerField = RELAY2.class.getDeclaredField("relayer"); relayerField.setAccessible(true); Relayer relayer = (Relayer) relayerField.get(relay); if (relayer == null) { log.debug("No relayer found"); return list; } Field bridgesField = Relayer.class.getDeclaredField("bridges"); bridgesField.setAccessible(true); Collection<?> bridges = (Collection<?>) bridgesField.get(relayer); if (bridges == null) { return list; } Field channelField = null; for (Object bridge : bridges) { if (channelField == null) { channelField = bridge.getClass().getDeclaredField("channel"); channelField.setAccessible(true); } JChannel bridgeChannel = (JChannel) channelField.get(bridge); if (bridgeChannel.isOpen()) { list.add(bridgeChannel); } } } catch (Exception e) { log.error("Failed to get channel from RELAY2 protocol", e); } } else { log.info("No RELAY2 protocol in XS service"); } return list; } @Override protected Class<? extends SLAVE_PARTITION> getPartitionProtocolClass() { return SLAVE_PARTITION_33.class; } }