package com.jqmobile.core.server.rmi;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import com.jqmobile.core.server.rmi.RmiLoginImpl.User;
import com.jqmobile.core.server.service.ServiceFactory;
class RmiRemoteImpl extends UnicastRemoteObject implements IRmiRemote{
public RmiRemoteImpl() throws RemoteException {
super();
}
/**
*
*/
private static final long serialVersionUID = 7911662448169271887L;
@Override
public Object invoke(RmiRemote rmi) throws RemoteException {
// String clienthost = getClientHost();
// InetAddress ia=java.net.InetAddress.getByName(clienthost);
// String clentIp=ia.getHostAddress();
User u = null;
if(rmi.getManagerClass().equals(com.jqmobile.core.server.rmi2.IRmiLogin.class.getName()) && rmi.getMethod().equals("login")){
System.out.println("rmi login");
}else{
String session = rmi.getSession();
String ip = RmiUtils.getClientIp();
if(null == session){
RmiUtils.errorIp.add(ip);
}
u = RmiLoginImpl.sessionMap.get(session);
if(null == u){
throw new RmiException(RmiException.RMI_Session_Error);
}
u.addConn();
}
try {
String mc = rmi.getManagerClass();
Class<?> c = Class.forName(mc, false, Thread.currentThread().getContextClassLoader());
Object i = ServiceFactory.instance(c);
Method[] ms = i.getClass().getDeclaredMethods();
for(Method m : ms){
if(m.getName().equals(rmi.getMethod())){
if(m.getParameterTypes().length == rmi.getArgs().length){
try {
return m.invoke(i, rmi.getArgs());
} catch (IllegalArgumentException e) {
continue;
} catch (IllegalAccessException e) {
continue;
} catch (InvocationTargetException e) {
continue;
}
}
// try {
// if(null != rmi.getArgs()){// && rmi.getArgs().length>1){//.getClass().isArray()){
// Object[] objs = rmi.getArgs();
// Class<?>[] cs = new Class<?>[objs.length];
// try {
// Method mo = getMethod(c, rmi.getMethod(), cs);
// return mo.invoke(i, objs);
// } catch (SecurityException e) {
// e.printStackTrace();
// } catch (NoSuchMethodException e) {
// e.printStackTrace();
// }
// return m.invoke(i, (Object[])rmi.getArgs());
// }else
// return m.invoke(i, rmi.getArgs());
// } catch (IllegalArgumentException e) {
// e.printStackTrace();
// } catch (IllegalAccessException e) {
// e.printStackTrace();
// } catch (InvocationTargetException e) {
// e.printStackTrace();
// }
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}finally{
if(null != u)
u.subConn();
}
return null;
}
public static Method getMethod(Class<?> implClass,String methodName,Class<?>...params) throws SecurityException, NoSuchMethodException{
if(null == params || 0 == params.length){
return implClass.getMethod(methodName);
}
//20130813
Method cacheMethod = null;
try {
cacheMethod = implClass.getDeclaredMethod(methodName, params);
} catch (Exception e) {
}
if(null != cacheMethod){
return cacheMethod;
}
//
Method[] ms = implClass.getMethods();
L1:for(Method m : ms){
if(!m.getName().equals(methodName)){
continue;
}
Class<?>[] types = m.getParameterTypes();
if(null == types || 0==types.length || types.length != params.length){
continue;
}
for(int i=0; i<types.length; i++){
Class<?> p = params[i];
Class<?> t = types[i];
if(!equals(p,t)){
continue L1;
}
}
return m;
}
//20130813
L1:for(Method m : ms){
if(!m.getName().equals(methodName)){
continue;
}
Class<?>[] types = m.getParameterTypes();
if(null == types || 0==types.length || types.length != params.length){
continue;
}
for(int i=0; i<types.length; i++){
Class<?> p = params[i];
Class<?> t = types[i];
if(!equals1(p,t)){
continue L1;
}
}
return m;
}
//
return null;
}
private static boolean equals1(Class<?> p, Class<?> t) {
if(p.equals(t)){
return true;
}else if(p.equals(Integer.class)){
return t.equals(int.class);
}else if(p.equals(Long.class)){
return t.equals(long.class);
}else if(p.equals(Float.class)){
return t.equals(float.class);
}else if(p.equals(Double.class)){
return t.equals(double.class);
}else if(p.equals(Byte.class)){
return t.equals(byte.class);
}else if(p.equals(Short.class)){
return t.equals(short.class);
}else if(p.equals(Character.class)){
return t.equals(char.class);
}else if(p.equals(Boolean.class)){
return t.equals(boolean.class);
}else{
return t.isAssignableFrom(p);
}
// return false;
}
private static boolean equals(Class<?> p, Class<?> t) {
if(p.equals(t)){
return true;
}else if(p.equals(Integer.class)){
return t.equals(int.class);
}else if(p.equals(Long.class)){
return t.equals(long.class);
}else if(p.equals(Float.class)){
return t.equals(float.class);
}else if(p.equals(Double.class)){
return t.equals(double.class);
}else if(p.equals(Byte.class)){
return t.equals(byte.class);
}else if(p.equals(Short.class)){
return t.equals(short.class);
}else if(p.equals(Character.class)){
return t.equals(char.class);
}else if(p.equals(Boolean.class)){
return t.equals(boolean.class);
}
return false;
}
}