package TaiGameCore.dev; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.HashMap; import java.util.LinkedList; import java.util.Scanner; import TaiGameCore.GameDataBase; import TaiGameCore.GameDataBase.DefaultValue; /** * For any instances of game databases in a class, adds a key,value pair to a corresponding universal lookup map. */ public class GameDataBase$SetAutomator { public static void main(String[] args) throws Throwable{ Scanner in = new Scanner(System.in); while(in.hasNextLine()){ try { main(in.nextLine()); } catch (Throwable e){ e.printStackTrace(); } } } public static void main(String className) throws ClassNotFoundException{ String[] parts = className.split("/"); Class got = GameDataBase$SetAutomator.class.getClassLoader().loadClass(parts[0]); for(int k = 1; k < parts.length; k++){ got = getInArray(got.getDeclaredClasses(),parts[k]); } //System.out.println(got); Field[] fields = got.getDeclaredFields(); HashMap<String, LinkedList<Field>> fieldsOfType = new HashMap(); for(Field k : fields){ if (!GameDataBase.class.isAssignableFrom(k.getType())){ continue; } String kstr = k.getType().getSimpleName(); LinkedList<Field> gotList = fieldsOfType.get(kstr); if (gotList==null){ gotList = new LinkedList<Field>(); fieldsOfType.put(kstr,gotList); } gotList.add(k); } for(String k : fieldsOfType.keySet()){ String mapName = makeMapName(k); System.out.println("\tprivate HashMap<String, "+k+"> "+mapName+" = new HashMap(); "); } System.out.println("\tpublic "+got.getSimpleName()+"(){"); for(String k : fieldsOfType.keySet()){ String mapName = makeMapName(k); for(Field g : fieldsOfType.get(k)){ String defaultValue = ""; DefaultValue defVal = ((DefaultValue)g.getAnnotation(DefaultValue.class)); if (defVal!=null){ defaultValue = defVal.value(); if (defaultValue.length()==0){ defaultValue = null; } } if (defaultValue==null){ //Look for a generator. try { Method found = got.getMethod(g.getName()+"_generator"); if (found!=null){ GameDataBase created = (GameDataBase)found.invoke(null); if (created!=null){ defaultValue = created.hashToString(); } } } catch (Throwable e){ // } } if (defaultValue==null){ defaultValue = ""; } System.out.println("\t\t"+mapName+".put(\""+g.getName()+"\","+g.getName()+" = new "+k+"(\""+defaultValue+"\"));"); } } System.out.println("\t}"); } public static String makeMapName(String className){ return "all"+className+"s"; } private static Class getInArray(Class[] declaredClasses, String string) { for(Class stuff : declaredClasses){ if (stuff.getSimpleName().equals(string)){ return stuff; } } return null; } }