package com.xcompwiz.lookingglass.imc;
import java.lang.reflect.Method;
import com.xcompwiz.lookingglass.api.APIInstanceProvider;
import com.xcompwiz.lookingglass.apiimpl.InternalAPI;
import com.xcompwiz.lookingglass.imc.IMCHandler.IMCProcessor;
import com.xcompwiz.lookingglass.log.LoggerUtils;
import cpw.mods.fml.common.event.FMLInterModComms.IMCMessage;
public class IMCAPIRegister implements IMCProcessor {
@Override
public void process(IMCMessage message) {
if (!message.isStringMessage()) return;
LoggerUtils.info(String.format("Receiving API registration request from [%s] for method %s", message.getSender(), message.getStringValue()));
callbackRegistration(message.getStringValue(), message.getSender());
}
/**
* This handles the classpath and method location and calling for API IMC calls Based on some code from WAILA.
* @param method The method (prefixed by classname) to call
* @param modname The name of the mod which made the request
*/
public static void callbackRegistration(String method, String modname) {
String[] splitName = method.split("\\.");
String methodName = splitName[splitName.length - 1];
String className = method.substring(0, method.length() - methodName.length() - 1);
APIInstanceProvider providerinst = InternalAPI.getAPIProviderInstance(modname);
if (providerinst == null) {
LoggerUtils.error(String.format("Could not initialize API provider instance for %s", modname));
return;
}
LoggerUtils.info(String.format("Trying to call (reflection) %s %s", className, methodName));
try {
Class reflectClass = Class.forName(className);
Method reflectMethod = reflectClass.getDeclaredMethod(methodName, APIInstanceProvider.class);
reflectMethod.invoke(null, providerinst);
LoggerUtils.info(String.format("API provided to %s", modname));
} catch (ClassNotFoundException e) {
LoggerUtils.error(String.format("Could not find class %s", className));
} catch (NoSuchMethodException e) {
LoggerUtils.error(String.format("Could not find method %s", methodName));
} catch (Exception e) {
LoggerUtils.error(String.format("Exception while calling the method %s.%s", className, methodName));
e.printStackTrace();
}
}
}