package amidst.minecraft;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import amidst.logging.Log;
public class MinecraftConstructor {
private MinecraftClass parent;
private Minecraft minecraft;
private Class<?>[] paramClasses;
private String[] paramNames;
private boolean hasParameters;
private Constructor<?> constructor;
private String name;
private static HashMap<String, Class<?>> primitives;
static {
primitives = new HashMap<String, Class<?>>();
primitives.put("byte", byte.class);
primitives.put("int", int.class);
primitives.put("float", float.class);
primitives.put("short", short.class);
primitives.put("long", long.class);
primitives.put("double", double.class);
primitives.put("boolean", boolean.class);
primitives.put("char", char.class);
primitives.put("String", String.class);
}
public MinecraftConstructor(MinecraftClass parent, String name) {
this.parent = parent;
hasParameters = false;
this.name = name;
paramClasses = new Class<?>[] {};
}
public MinecraftConstructor(MinecraftClass parent, String name, String... args) {
this.parent = parent;
paramNames = args;
paramClasses = new Class<?>[paramNames.length];
hasParameters = true;
this.name = name;
}
public void load(Minecraft mc, MinecraftClass mcClass) {
minecraft = mc;
Class<?> clazz = mcClass.getClazz();
int i = 0;
try {
if (hasParameters) {
for (; i < paramNames.length; i++) {
paramClasses[i] = primitives.get(paramNames[i]);
if (paramClasses[i] == null) {
if (paramNames[i].charAt(0) == '@') {
} else {
paramClasses[i] = Class.forName(paramNames[i], true, minecraft.getClassLoader());
}
}
}
}
constructor = clazz.getConstructor(paramClasses);
constructor.setAccessible(true);
} catch (ClassNotFoundException e) {
Log.crash(e, "Unabled to find class for constructor. (" + paramNames[i] + ") on (" + mcClass.getName() + " / " + mcClass.getClassName() + ")");
e.printStackTrace();
} catch (SecurityException e) {
Log.crash(e, "SecurityException on (" + mcClass.getName() + " / " + mcClass.getClassName() + ") contructor (" + name + ")");
e.printStackTrace();
} catch (NoSuchMethodException e) {
Log.crash(e, "Unable to find class constructor (" + mcClass.getName() + " / " + mcClass.getClassName() + ") (" + name + ")");
e.printStackTrace();
}
}
public MinecraftObject getNew(Object... param) {
return new MinecraftObject(parent, call(param));
}
private Object call(Object... param) {
try {
return constructor.newInstance(param);
} catch (IllegalArgumentException e) { // TODO : Add error text
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
return null;
}
public Object getParentName() {
return parent.getName();
}
public String getName() {
return name;
}
public Class<?>[] getParameters() {
return paramClasses;
}
@Override
public String toString() {
return "[Constructor " + name +" of class " + parent.getName() + "]";
}
}