package org.jboss.mx.remoting;
import java.io.Serializable;
import java.io.IOException;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.Iterator;
import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import org.jboss.remoting.ident.Identity;
import org.jboss.remoting.InvokerLocator;
import org.jboss.remoting.ConnectionFailedException;
import org.jboss.remoting.network.NetworkRegistry;
import org.jboss.remoting.network.NetworkInstance;
import org.jboss.remoting.network.filter.IdentityFilter;
import org.jboss.mx.remoting.JMXUtil;
public class MBeanServerLocator implements Serializable
{
static final long serialVersionUID = 7632696197699845344L;
private final Identity identity;
private boolean autoLocate=true;
protected transient MBeanServer server;
public MBeanServerLocator (Identity identity)
{
this.identity = identity;
}
public int hashCode ()
{
return identity.hashCode();
}
public boolean equals (Object obj)
{
if (obj instanceof MBeanServerLocator)
{
return identity.equals(((MBeanServerLocator)obj).identity);
}
return false;
}
public String toString ()
{
return "MBeanServerLocator ["+identity.getJMXId()+"]";
}
public String getServerId ()
{
return identity.getJMXId();
}
public final Identity getIdentity ()
{
return identity;
}
public String getInstanceId ()
{
return identity.getInstanceId();
}
public InetAddress getAddress ()
{
return identity.getAddress();
}
public MBeanServer getMBeanServer ()
{
if (server==null)
{
server = resolveServer();
}
if (server==null)
{
throw new ConnectionFailedException("Couldn't find server at: "+identity);
}
else
{
return server;
}
}
protected MBeanServer resolveServer () throws ConnectionFailedException
{
Object server = null;
String id = System.getProperty("jboss.identity");
if (id!=null && id.equals(identity.getInstanceId()))
{
ArrayList list=MBeanServerFactory.findMBeanServer(null);
if (list.isEmpty()==false)
{
Iterator iter = list.iterator();
while(iter.hasNext())
{
MBeanServer s = (MBeanServer)iter.next();
try
{
if (JMXUtil.getServerId(s).equals(identity.getJMXId()))
{
return s;
}
}
catch (Exception ex) {}
}
}
}
server = MBeanServerRegistry.getMBeanServerFor(getServerId());
if (server==null)
{
NetworkInstance ni[]=NetworkRegistry.getInstance().queryServers(new IdentityFilter(identity));
if (ni!=null && ni.length>0)
{
InvokerLocator locators[]=ni[0].getLocators();
String jmxId = ni[0].getIdentity().getJMXId();
ArrayList list = MBeanServerFactory.findMBeanServer(jmxId);
if (list!=null && !list.isEmpty())
{
return (MBeanServer)list.get(0);
}
try
{
server = MBeanTransportPreference.getServerByTransport(identity,locators);
}
catch ( Exception e )
{
e.printStackTrace();
}
}
}
return (server==null) ? null : (MBeanServer) server;
}
private void readObject(java.io.ObjectInputStream stream)
throws IOException, ClassNotFoundException
{
stream.defaultReadObject();
if (autoLocate)
{
resolveServer();
}
}
public void setAutoLocate (boolean autoLocate)
{
this.autoLocate = autoLocate;
}
}