package br.com.centralit.bpm.util; import java.util.HashMap; import java.util.List; import java.util.Map; import org.mozilla.javascript.Context; import org.mozilla.javascript.Scriptable; import br.com.citframework.util.Reflexao; import br.com.citframework.util.UtilStrings; public class UtilScript { public static Object executaScript(final String nome, String script, final Map<String, Object> objetos) throws Exception { Object object = null; final Map<String, Object> params = getParams(objetos); if (script != null) { script = substituiParametros(script, params); Context cx = Context.enter(); final Scriptable scope = cx.initStandardObjects(); scope.put("params", scope, params); try { object = cx.evaluateString(scope, script, "script", 1, null); } catch (final Exception e) { final String msg = e.getLocalizedMessage(); // + "\n" + script; throw new Exception(msg); } finally { Context.exit(); cx = null; } cx = null; } return object; } public static Map<String, Object> getParams(final Map<String, Object> objetos) throws Exception { final Map<String, Object> params = new HashMap<>(); for (final String key : objetos.keySet()) { final Object objeto = objetos.get(key); params.put(key, objeto); try { final List lstGets = Reflexao.findGets(objeto); for (int i = 0; i < lstGets.size(); i++) { final String propriedade = UtilStrings.convertePrimeiraLetra((String) lstGets.get(i), "L"); final Object value = Reflexao.getPropertyValue(objeto, propriedade); if (value != null) { final String id = key + "." + UtilStrings.convertePrimeiraLetra(propriedade, "L"); params.put(id, value); } } } catch (final Exception e) { } } return params; } public static String substituiParametros(String str, final Map<String, Object> params) throws Exception { if (str != null) { for (final String key : params.keySet()) { str = str.replaceAll("\\#\\{" + key + "\\}", "params.get(\"" + key + "\")"); } } return str; } }