package org.jboss.mx.remoting;
import java.util.StringTokenizer;
import javax.management.MBeanServer;
import org.jboss.logging.Logger;
import org.jboss.remoting.InvokerLocator;
import org.jboss.remoting.ConnectionFailedException;
import org.jboss.remoting.ident.Identity;
public class MBeanTransportPreference
{
private static final transient Logger log = Logger.getLogger(MBeanTransportPreference.class.getName());
private static String _preferences = System.getProperty("jboss.transport.preferences","socket,rmi,soap");
private static String preferences[] = initialize(_preferences);
private static MBeanServer ourServer;
private static Identity ourIdentity;
public static void setLocalServer (MBeanServer server, Identity identity)
{
if (log.isDebugEnabled())
{
log.debug("setLocalServer called - server="+server+",identity="+identity);
}
ourServer = server;
ourIdentity = identity;
}
private static String[] initialize (String list)
{
if (list==null)
{
return new String[1];
}
StringTokenizer tok=new StringTokenizer(list,",");
String pref [] = new String[tok.countTokens()];
int c=0;
while(tok.hasMoreTokens())
{
String token=tok.nextToken();
pref[c++]=token.trim();
}
return pref;
}
public static void setTransportPreferences (String order[])
{
preferences = (order==null || order.length<=0) ? initialize(_preferences) : order;
}
public static String[] getTransportPreferences ()
{
return preferences;
}
public static MBeanServer getServerByTransport (Identity identity, InvokerLocator locators[])
throws ConnectionFailedException
{
if (log.isDebugEnabled())
{
log.debug("getServerByTransport for identity="+identity+", ours is="+ourIdentity);
}
if (ourIdentity==null)
{
if (ourServer==null)
{
ourServer = JMXUtil.getMBeanServer();
}
ourIdentity = Identity.get(ourServer);
}
if (identity.isSameJVM(ourIdentity))
{
return ourServer;
}
for (int c=0;c<preferences.length;c++)
{
String transport = preferences[c];
if (transport!=null)
{
for (int x=0;x<locators.length;x++)
{
if (locators[x].getProtocol().equals(transport))
{
try
{
MBeanServer svr = MBeanServerRegistry.getMBeanServerFor(locators[x]);
if (svr!=null)
{
return svr;
}
svr = MBeanServerClientInvokerProxy.create(locators[x],ourIdentity.getJMXId(),identity.getJMXId());
if (svr!=null)
{
return svr;
}
}
catch (Throwable ex) {}
}
}
}
}
for (int x=0;x<locators.length;x++)
{
try
{
if (log.isDebugEnabled())
{
log.debug("attempting to connect via locator["+x+"] ("+locators[x]+") to: "+identity);
}
MBeanServer svr = MBeanServerRegistry.getMBeanServerFor(locators[x]);
if (svr!=null)
{
return svr;
}
svr = MBeanServerClientInvokerProxy.create(locators[x],ourIdentity.getJMXId(),identity.getJMXId());
if (svr!=null)
{
return svr;
}
}
catch (Throwable ex)
{
if (log.isDebugEnabled())
{
log.debug("Error connecting ... ",ex);
}
}
}
throw new ConnectionFailedException ("No transport/connection available to connect to: "+identity);
}
}