package at.gv.egiz.pdfas.utils; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import ognl.Ognl; import ognl.OgnlException; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; /** * Utility class for ognl evaluation. * ognl website * @author dferbas * @author mhiess * */ public class OgnlUtil { private static final String EXP_END = "}"; private static final String EXP_START = "${"; private static final Logger log = Logger.getLogger(OgnlUtil.class); private Map context = new HashMap(); private Object root = null; public OgnlUtil() { this.init(null); } public OgnlUtil(Map context) { this.init(context); } public OgnlUtil(Object root) { this.root = root; this.init(null); } /** * Adds the default utils to the context * * @param context1 */ private void init(Map context1) { if (context1 != null) { this.context = context1; } } private List extractExpressions(String text) { List expressions = new ArrayList(); int indexStart = 0; int indexEnd = 0; String exp; while (indexStart != -1) { indexStart = text.indexOf(EXP_START, indexStart); indexEnd = text.indexOf(EXP_END, indexStart); if (indexStart != -1 && indexEnd != -1) { exp = text.substring(indexStart + 2, indexEnd); log.debug("Found expression in template: " + exp); if (!exp.equals("") && exp != null) { if (!expressions.contains(exp)) { expressions.add(exp); } else { log.debug("Duplicated expression '" + exp + "' found"); } } indexStart = indexEnd; } } return expressions; } public boolean containsExpression(String template) { return template != null && StringUtils.contains(template,"${") && StringUtils.contains(template, "}"); } /** * Compile/evaluate a message with ognl expressions marked with ${expression} * * @param template * @return */ public String compileMessage(String template) { if (this.context != null) { String compiledMsg = template; List expressions = this.extractExpressions(template); String value; for (Iterator it = expressions.iterator(); it.hasNext();) { String expr = (String) it.next(); try { if (this.root != null) { value = String.valueOf(Ognl.getValue(expr, this.root)); } else { value = String.valueOf(Ognl.getValue(expr, this.context)); } log.debug("Found value: '" + value + "' for expression: '" + expr + "'"); if (value == null) { value = ""; log.debug("Set value for expression to: empty string"); } compiledMsg = StringUtils.replace(compiledMsg, EXP_START + expr + EXP_END, value); } catch (OgnlException e) { log.error(e.getMessage(), e); } } log.debug("Returning compiled message: " + compiledMsg); return compiledMsg; } return null; } /** * Evaluate an expression as ognl, returning result as object. No placeholders ${ } allowed. * @param ognlExp * @return */ public Object evaluate(String ognlExp) { if (this.context != null) { Object value = null; try { value = Ognl.getValue(ognlExp, this.context); log.debug("Found value: '" + value + "' for expression: '" + ognlExp + "'"); } catch (OgnlException e) { log.error(e.getMessage(), e); } return value; } else return null; } /** * This method compiles a map of ognl expression to a map with entries * * @param toCompile * @return */ public Map compileExpressions(Map toCompile) { if (this.context != null) { Map result = new HashMap(); for (Iterator it = result.entrySet().iterator(); it.hasNext();) { Entry entry = (Entry) it.next(); try { result.put(entry.getKey(), Ognl.getValue(entry.getValue(), this.context)); } catch (OgnlException e) { result.put(entry.getKey(), null); log.warn(e.getMessage(), e); } } return result; } return null; } public Map getContext() { return this.context; } public void mergeOgnlContext(OgnlUtil ognlUtil) { this.context.putAll(ognlUtil.getContext()); } }