package org.testng.mustache; import java.lang.reflect.Field; import java.util.Map; import java.util.Stack; public class Model { private Map<String, Object> m_model; private Stack<SubModel> m_subModels = new Stack<>(); private static class SubModel { String variable; Object subModel; } public Model(Map<String, Object> model) { m_model = model; } public void push(String variable, Object subModel) { SubModel sl = new SubModel(); sl.variable = variable; sl.subModel = subModel; m_subModels.push(sl); } public Value resolveValue(String variable) { if (! m_subModels.isEmpty()) { for (SubModel object : m_subModels) { Value value = resolveOnClass(object.subModel, variable); if (value != null) { return value; } } } return new Value(m_model.get(variable)); } private Value resolveOnClass(Object object, String variable) { // if (object instanceof Iterable) { // Iterable it = (Iterable) object; // List<Object> result = Lists.newArrayList(); // for (Object o : it) { // List<Object> values = resolveOnClass(o, variable); // result.addAll(values); // } // return result; // } else { Class<? extends Object> cls = object.getClass(); try { Field f = cls.getField(variable); return new Value(f.get(object)); } catch (IllegalAccessException | NoSuchFieldException | SecurityException e) { // e.printStackTrace(); } // } return null; } public Object getTopSubModel() { return m_subModels.peek().variable; } public void popSubModel() { m_subModels.pop(); } public String resolveValueToString(String variable) { StringBuilder result = new StringBuilder(); Value value = resolveValue(variable); if (value.get() != null) { return value.get().toString(); } else { return ""; } } @Override public String toString() { return "[Model " + m_model + " subModel:" + m_subModels + "]"; } }