package org.jboss.remoting.transport.rmi;
import org.jboss.remoting.CannotConnectException;
import org.jboss.remoting.ConnectionFailedException;
import org.jboss.remoting.InvokerLocator;
import org.jboss.remoting.RemoteClientInvoker;
import org.jboss.remoting.marshal.Marshaller;
import org.jboss.remoting.marshal.UnMarshaller;
import org.jboss.remoting.marshal.serializable.SerializableMarshaller;
import java.io.IOException;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.util.Map;
public class RMIClientInvoker extends RemoteClientInvoker
{
private RMIServerInvokerInf server;
private boolean connected = false;
public RMIClientInvoker(InvokerLocator locator)
{
super(locator);
}
private int getRegistryPort(InvokerLocator locator)
{
int port = RMIServerInvoker.DEFAULT_REGISTRY_PORT;
Map params = locator.getParameters();
if(params != null)
{
String value = (String)params.get(RMIServerInvoker.REGISTRY_PORT_KEY);
if(value != null)
{
try
{
port = Integer.parseInt(value);
log.debug("Using port " + port + " for rmi registry.");
}
catch (NumberFormatException e)
{
log.error("Can not set the RMIServerInvoker RMI registry to port " + value + ". This is not a valid port number.");
}
}
}
return port;
}
public void setServerStub(RMIServerInvokerInf server)
{
this.server = server;
System.err.println(this.server);
}
public RMIServerInvokerInf getServerStub()
{
return this.server;
}
protected void handleConnect()
throws ConnectionFailedException
{
try
{
String host = locator.getHost();
int port = getRegistryPort(locator);
Registry regsitry = LocateRegistry.getRegistry(host, port);
Remote remoteObj = regsitry.lookup("remoting/RMIServerInvoker/" + locator.getPort());
log.debug("Remote RMI Stub: " + remoteObj);
setServerStub((RMIServerInvokerInf)remoteObj);
connected = true;
}
catch(Exception e)
{
connected = false;
log.debug("Error connecting RMI invoker client.", e);
throw new CannotConnectException("Error connecting RMI invoker client", e);
}
}
protected void handleDisconnect()
{
}
protected String getDefaultDataType()
{
return SerializableMarshaller.DATATYPE;
}
protected Object transport(String sessionId, Object invocation, Map metadata, Marshaller marshaller, UnMarshaller unmarshaller)
throws IOException, ConnectionFailedException
{
if (this.server == null)
{
log.error("Server stub has not been set in RMI invoker client. See previous errors for details.");
throw new CannotConnectException("Server stub has not been set.");
}
try
{
return server.transport(invocation);
}
catch (RemoteException e)
{
throw new CannotConnectException("Error making invocation in RMI client invoker.", e);
}
}
}