package org.teachingextensions.logo.utils.MVCUtils; import java.lang.reflect.Field; import java.util.List; import org.teachingextensions.approvals.lite.util.ObjectUtils; import org.teachingextensions.approvals.lite.util.io.FileUtils; import org.teachingextensions.approvals.lite.util.lambda.Function1; import org.teachingextensions.approvals.lite.util.lambda.Query; /** * <img src="http://www.orbis-software.com/sage/gfx/Text%20Parser%20Icon.gif" style="text-align: left" alt="A parser"> * Parses a data object for display, using a template */ public class Parser { /** * Parses a template with a data object to create a string * * <div><b>Example:</b><pre>{@code * Words data = new Words(); * data.action = "Shake"; * data.weapon = "speare"; * String greeting = Parser.parse("Captain {action}{weapon}!!!", data); * }</pre></div> * * Captain Shakespeare!!! * * @param text * The template with the fields from the data object surrounded in {curlyBraces} * @param data * an object whose fields will be merged with the template during parsing * @return the completed string */ public static String parse(String text, Object data) { return parse(text, "{", "}", data); } public static String parse(String text, String startCharacter, String endCharacter, Object data) { StringBuilder sb = new StringBuilder(); String temp = text; int start = temp.indexOf(startCharacter); while (start > 0) { int end = temp.indexOf(endCharacter, start); sb.append(temp.substring(0, start)); String key = temp.substring(start + startCharacter.length(), end); sb.append(getValue(key, data)); temp = temp.substring(end + endCharacter.length()); start = temp.indexOf(startCharacter); } sb.append(temp); return sb.toString(); } private static String getValue(final String piece, Object data) { try { Field[] declaredFields = data.getClass().getDeclaredFields(); List<Field> f = Query.where(declaredFields, new Function1<Field, Boolean>() { @Override public Boolean call(Field i) { return i.getName().equals(piece); } }); f.get(0).setAccessible(true); return "" + f.get(0).get(data); } catch (Exception e) { return piece; } } /** * Parses a file * <div><b>Example:</b> {@code parser.parseRtfFile(filename,data)} </div> * * @param fileName A filename for the new file, built from the template view.rtf * @param data A data object to put into the template fields. * @return the completed template */ public static String parseRtfFile(String fileName, Object data) { try { String text = FileUtils.readFromClassPath(data.getClass(), fileName); return parse(text, "\\{", "\\}", data); } catch (Exception e) { throw ObjectUtils.throwAsError(e); } } }