package com.jqmobile.core.server.rmi;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.sql.Connection;
import com.jqmobile.core.server.rmi.test.IRMITest;
import com.jqmobile.core.server.rmi.test.RMIDirectSocketFactory;
import com.jqmobile.core.server.rmi.test.User;
import com.jqmobile.core.server.service.ServiceFactory;
/**
* <p>2014-4-1废弃,后续请使用com.jqmobile.core.server.rmi2.RemoteServiceFactory</p>
* <p>接口最后有效期为2014-12
*
* <p>Copyright: 版权所有 (c) 2002 - 2015<br>
* Company: 久其</p>
*
* @author modi qq:411051729
* @version 2014年4月1日
*/
@Deprecated
public class RemoteServiceFactory extends ServiceFactory{
private final static RMIDirectSocketFactory rmiFactory = new RMIDirectSocketFactory();
public static void main(String[] args) {
// RemoteManagerFactory.setRemoteIp("10.2.5.86");
IRMITest r = RemoteServiceFactory.instance(IRMITest.class);
User u = r.login("userName", "password");
System.out.println(u);
}
private final static RemoteServiceFactory mf = new RemoteServiceFactory();
private String session;//远程相应回话机制
private String remoteIp="127.0.0.1";
private Integer remotePort=9700;
private String username;
private String password;
private RemoteServiceFactory(){
}
public RemoteServiceFactory(String ip){
this(ip, 9700);
}
public RemoteServiceFactory(String ip, int port){
this.remoteIp = ip;
this.remotePort = port;
}
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
public String getSession() {
return session;
}
/**
* 实例化Manager
* @param c
* @return
*/
public static <T> T instance(Class<T> c){
return mf.instanceService(c);
}
public static void setRemoteIp(String remoteIp) {
mf.remoteIp = remoteIp;
}
public static void setRemotePort(int remotePort) {
mf.remotePort = remotePort;
}
public static void setUserName(String username){
mf.setUsername(username);
}
public static void setPassWord(String password){
mf.setPassword(password);
}
//=============================================================
@Override
protected InvocationHandler getInvocationHandler(Class<?> c) {
return new RemoteBaseInvocationHandler(c, this);
}
@Override
public Connection newConnection() {
return null;
}
//=============================================================
static final class RemoteBaseInvocationHandler implements InvocationHandler{
private Class<?> c;
private RemoteServiceFactory f;
RemoteBaseInvocationHandler(Class<?> c, RemoteServiceFactory remoteManagerFactory){
this.c=c;
this.f = remoteManagerFactory;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
String ip = f.remoteIp;//==null?"127.0.0.1":f.remoteIp;
int port = f.remotePort;//==null?9700:f.remotePort;
Registry r = LocateRegistry.getRegistry(ip, port, rmiFactory);
Remote remote = r.lookup(IRmiRemote.class.getName());
L1: if(remote instanceof IRmiRemote){
if(null == f.session){
f.session = login((IRmiRemote)remote);
}
IRmiRemote mf = (IRmiRemote)remote;
RmiRemote rmi = new RmiRemote();
rmi.setManagerClass(c.getName());
rmi.setMethod(method.getName());
rmi.setArgs(args);
rmi.setSession(f.session);
try {
return mf.invoke(rmi);
} catch (Throwable e) {
Throwable e1 = e;
int i=6;
while(null != e1 && !(e1 instanceof RmiException) && i-->0){
e1 = e1.getCause();
}
if(null != e1 && e1 instanceof RmiException){
f.session = null;
int code = ((RmiException) e1).getCode();
switch (code) {
case RmiException.RMI_RequestIP_Error:
break;
case RmiException.RMI_AboveMaxConn_Error:
break;
case RmiException.RMI_Password_Error:
break;
case RmiException.RMI_NotFoundUsername_Error:
break;
case RmiException.RMI_Session_Error:
f.session = null;
break L1;
default:
break;
}
}
throw e;
// e.printStackTrace();
}
}
throw new RemoteException("未能找到远程代理对象,请检查是否注册远程代理,远程地址或端口是否正确");
}
private String login(IRmiRemote remote) throws RemoteException {
RmiRemote rmi = new RmiRemote();
rmi.setManagerClass("com.jqmobile.core.server.rmi.IRmiLogin");
rmi.setMethod("login");
rmi.setArgs(f.username,f.password);
return (String) remote.invoke(rmi);
}
}
}