package org.mobicents.slee.container.rmi;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import org.jboss.invocation.MarshalledInvocation;
import org.jboss.logging.Logger;
/**
*
* @author amit.bhayani
*
*/
public class RMIClient implements RMIProxy, InvocationHandler, Serializable {
private static final long serialVersionUID = -1227816478668532463L;
private static final Logger log = Logger.getLogger(RMIClient.class);
protected transient Object local = null;
private transient RMIServer rmiServer;
protected String key = null;
public RMIClient() {
}
public RMIClient(Object local, RMIServer server, String key) {
this.local = local;
this.rmiServer = server;
this.key = key;
}
public boolean isLocal() {
return local != null;
}
public Object invokeRemote(Object proxy, Method method, Object[] args)
throws Throwable {
MarshalledInvocation mi = new MarshalledInvocation(null, method, args,
null, null, null);
mi.setObjectName("");
RMIResponse rsp = this.rmiServer.invoke(mi);
return rsp.response;
}
public Method findLocalMethod(Method method, Object[] args)
throws Exception {
return method;
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
if (local != null) {
try {
Method localMethod = findLocalMethod(method, args);
return localMethod.invoke(local, args);
} catch (java.lang.reflect.InvocationTargetException ite) {
throw ite.getTargetException();
}
} else {
return invokeRemote(null, method, args);
}
}
private void readObject(ObjectInputStream stream) throws IOException,
ClassNotFoundException {
this.key = stream.readUTF();
RMIServer server = (RMIServer) RMIServer.rmiServers.get(key);
if (server != null) {
try {
local = server.getLocal();
} catch (Exception ignored) {
}
} else {
this.rmiServer = (RMIServer) stream.readObject();
}
}
private void writeObject(ObjectOutputStream stream) throws IOException {
stream.writeUTF(this.key);
stream.writeObject(this.rmiServer);
}
}