* associated with the <code>beanClusteringInfo</code>'s <code>FamilyWrapper</code> to
* reflect the new cluster topoloyg, and rebinds the reference in JNDI.
*/
public void clusterTopologyChanged(ProxyClusteringInfo beanClusteringInfo)
{
JndiReferenceBindingSet bindings = null;
BeanClusteringRegistryInfo registryEntry = bindingsByContainer.get(beanClusteringInfo.getContainerName());
if (registryEntry != null)
{
bindings = registryEntry.bindings;
}
if (bindings == null)
{
// We aren't handling this bean
return;
}
Context context = bindings.getContext();
FamilyClusterInfo fci = beanClusteringInfo.getFamilyWrapper().get();
//JBPAPP-10211 hack -> targetsCopy
final List targetsCopy = fci.getTargets();
final long viewIDCopy = fci.getCurrentViewId();
String familyName = fci.getFamilyName();
log.debug("Cluster topology changed for family " + familyName + " new view id " + fci.getCurrentViewId()
+ " - Updating JNDI bindings for container " + beanClusteringInfo.getContainerName());
for (JndiReferenceBinding binding : bindings.getDefaultRemoteBindings())
{
RefAddr refAddr = getFirstRefAddr(binding.getReference(),
ClusteredProxyFactoryReferenceAddressTypes.REF_ADDR_TYPE_CLUSTER_FAMILY_NAME);
if (refAddr != null && familyName.equals(refAddr.getContent()))
{
redecorateReferenceForClusteringTargets(binding.getReference(), fci);
rebind(context, binding.getJndiName(), binding.getReference());
}
// The remote proxyfactory in JNDI too needs to be updated with the changes in the
// clustering family. This involves unbinding the remote proxyfactory from JNDI,
// creating a new proxy for the proxyfactory with this new FamilyCluster info
// and finally binding this new proxy for the proxyfactory to the JNDI
String proxyFactoryKey = this.getSingleRequiredRefAddr(binding.getReference(),
ProxyFactoryReferenceAddressTypes.REF_ADDR_TYPE_PROXY_FACTORY_REGISTRY_KEY);
// first create a new proxy. if we run into problems creating a new proxy,
// let's NOT unbind the existing one since a change in topology should not
// result in loss of proxy factory
ProxyFactory existingProxyFactoryInJNDI = null;
boolean gotJNDIRef = false;
try
{
existingProxyFactoryInJNDI = (ProxyFactory) context.lookup(proxyFactoryKey);
gotJNDIRef = true;
}
catch (NamingException ne)
{
// ignore and skip. If there is not proxyfactory bound or if there is some other
// issue related to naming, let's not try to "update" the proxy factory.
log.debug("Could not update the cluster topology changes to proxyfactory at key " + proxyFactoryKey);
continue;
} finally{
if(gotJNDIRef){
List currentTargets = fci.getTargets();
if(currentTargets.containsAll(targetsCopy) && targetsCopy.containsAll(currentTargets)){
//no nothing?
} else {
ClusteringTargetsRepository.initTarget(fci.getFamilyName(), targetsCopy, viewIDCopy);
}
}
}
// create a new proxy to proxyfactory with the available information in JNDI Reference,
// the previously bound proxy to the proxyfactory and the beanClusteringInfo which has
// contains the updated information of the cluster topology
ProxyFactory updatedProxyToProxyFactory = this.updateProxyForRemoteProxyFactory(proxyFactoryKey, binding
.getReference(), existingProxyFactoryInJNDI, beanClusteringInfo);
try
{
Util.rebind(context, proxyFactoryKey, updatedProxyToProxyFactory);
log.debug("Bound an updated proxyfactory at key " + proxyFactoryKey);
}
catch (NamingException ne)
{
// let's just log a WARN since we don't want the other operations to fail because of this
log.warn("Exception while rebinding a new proxyfactory at key " + proxyFactoryKey
+ " with updated clustered topology", ne);
}
}
for (JndiReferenceBinding binding : bindings.getHomeRemoteBindings())
{
RefAddr refAddr = getFirstRefAddr(binding.getReference(),
ClusteredProxyFactoryReferenceAddressTypes.REF_ADDR_TYPE_CLUSTER_FAMILY_NAME);
if (refAddr != null && familyName.equals(refAddr.getContent()))
{
redecorateReferenceForClusteringTargets(binding.getReference(), fci);
rebind(context, binding.getJndiName(), binding.getReference());
}
}
for (Set<JndiReferenceBinding> businessBindings : bindings.getBusinessRemoteBindings().values())
{
for (JndiReferenceBinding binding : businessBindings)
{
RefAddr refAddr = getFirstRefAddr(binding.getReference(),
ClusteredProxyFactoryReferenceAddressTypes.REF_ADDR_TYPE_CLUSTER_FAMILY_NAME);