package games.strategy.engine.message;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Comparator;
import java.util.logging.Level;
import java.util.logging.Logger;
import games.strategy.util.Tuple;
public class RemoteInterfaceHelper {
private static final Logger s_logger = Logger.getLogger(RemoteInterfaceHelper.class.getName());
public static int getNumber(final String methodName, final Class<?>[] argTypes, final Class<?> remoteInterface) {
final Method[] methods = remoteInterface.getMethods();
Arrays.sort(methods, methodComparator);
if (s_logger.isLoggable(Level.FINEST)) {
s_logger.fine("Sorted methods:" + Arrays.asList(methods));
}
for (int i = 0; i < methods.length; i++) {
if (methods[i].getName().equals(methodName)) {
final Class<?>[] types = methods[i].getParameterTypes();
// both null
if (types == argTypes) {
return i;
} else if (types != null && argTypes != null && types.length == argTypes.length) {
boolean match = true;
for (int j = 0; j < argTypes.length; j++) {
if (!argTypes[j].equals(types[j])) {
match = false;
break;
}
}
if (match) {
return i;
}
}
}
}
throw new IllegalStateException("Method not found");
}
public static Tuple<String, Class<?>[]> getMethodInfo(final int methodNumber, final Class<?> remoteInterface) {
final Method[] methods = remoteInterface.getMethods();
Arrays.sort(methods, methodComparator);
if (s_logger.isLoggable(Level.FINEST)) {
s_logger.fine("Sorted methods:" + Arrays.asList(methods));
}
return Tuple.of(methods[methodNumber].getName(), methods[methodNumber].getParameterTypes());
}
/**
* get methods does not guarantee an order, so sort.
*/
private static Comparator<Method> methodComparator = (o1, o2) -> {
if (o1 == o2) {
return 0;
}
if (!o1.getName().equals(o2.getName())) {
return o1.getName().compareTo(o2.getName());
}
final Class<?>[] t1 = o1.getParameterTypes();
final Class<?>[] t2 = o2.getParameterTypes();
// both null
if (t1 == t2) {
return 0;
}
if (t1 == null) {
return -1;
}
if (t2 == null) {
return 1;
}
if (t1.length != t2.length) {
return t1.length - t2.length;
}
for (int i = 0; i < t1.length; i++) {
if (!t1[i].getName().equals(t2[i].getName())) {
return t1[i].getName().compareTo(t2[i].getName());
}
}
return 0;
};
}