package org.mef.sprig; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.mef.sprig.json.JsonFileReader; import org.mef.sprig.json.Reader; public class Wrapper { @SuppressWarnings("rawtypes") private SprigLoader loader; private Reader reader; public Map<Integer,Object> sprigIdMap = new HashMap<Integer, Object>(); public static final String SPRIG_ID_NAME = "sprig_id"; public Wrapper(SprigLoader loader, Reader reader) { this.loader = loader; this.reader = reader; } @SuppressWarnings("rawtypes") public String getNameOfClassBeingLoaded() { Class clazz = loader.getClassBeingLoaded(); return clazz.getSimpleName(); } public List<Object> load(String dir, List<ViaRef> viaL) throws Exception { String className = getNameOfClassBeingLoaded(); this.reader = new JsonFileReader(dir, className); List<Map<String,Object>> list = reader.load(); List<Object> L = parseObjects(list, viaL); return L; } @SuppressWarnings("rawtypes") public List<Object> parseObjects(List<Map<String,Object>> inputList, List<ViaRef> viaL) { List<Object> resultL = new ArrayList<Object>(); Map<String,Object> tmp = new HashMap<String,Object>(); for(Map<String,Object> params : inputList) { Object obj = null; try { Class clazz = loader.getClassBeingLoaded(); obj = clazz.newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } resultL.add(obj); parseSprigId(params, obj); for(String key : params.keySet()) { String val = (String) params.get(key).toString(); if (containsVia(val)) { // String data2 = "{'type':'Shirt', 'items':[{'id':1,'color':'<% sprig_record(Color,2)%>'}]}"; //System.out.println(key); val = val.replace("<%", ""); val = val.replace("%>", ""); // String target = "sprig_record("; int pos = val.indexOf('('); int pos2 = val.indexOf(',', pos); int pos3 = val.indexOf(')', pos); // String op = val.substring(0, pos).trim(); String namex = val.substring(pos + 1, pos2).trim(); String valx = val.substring(pos2 + 1, pos3).trim(); //sourceclass,field,obj,target class,field,val,obj ViaRef ref = new ViaRef(); ref.sourceClazz = loader.getClassBeingLoaded(); ref.sourceField = key; ref.sourceObj = obj; ref.targetClassName = namex; ref.targetField = "sprig_id"; ref.targetVal = valx; viaL.add(ref); } else if (! key.equals(SPRIG_ID_NAME)) { tmp.put(key, params.get(key)); } } //parse all the non-sprig-record ones loader.parse(obj, tmp); } return resultL; } private boolean containsVia(String key) { return (key.startsWith("<%") && key.endsWith("%>")); } private void parseSprigId(Map<String, Object> map, Object obj) { String idName = SPRIG_ID_NAME; if (map.containsKey(idName)) { Integer id = (Integer)map.get(idName); //support String later!!!!!!!!1111 this.sprigIdMap.put(id, obj); } } public SprigLoader getLoader() { return this.loader; } public void save(List<Object> L) { for(Object obj : L) { loader.save(obj); } } }