package io.lumify.core.formula; import io.lumify.core.util.LumifyLogger; import io.lumify.core.util.LumifyLoggerFactory; import org.apache.commons.io.IOUtils; import org.mozilla.javascript.Context; import org.mozilla.javascript.Function; import org.mozilla.javascript.Scriptable; import org.mozilla.javascript.ScriptableObject; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; public class RequireJsSupport extends ScriptableObject { private static final long serialVersionUID = 1L; private static LumifyLogger LOGGER = LumifyLoggerFactory.getLogger(RequireJsSupport.class); @Override public String getClassName() { return "RequireJsSupport"; } public static void print(Context cx, Scriptable thisObj, Object[] args, Function funObj) { for (int i = 0; i < args.length; i++) LOGGER.debug(Context.toString(args[i])); } public static void consoleWarn(Context cx, Scriptable thisObj, Object[] args, Function funObj) { for (int i = 0; i < args.length; i++) LOGGER.warn(Context.toString(args[i])); } public static void consoleError(Context cx, Scriptable thisObj, Object[] args, Function funObj) { for (int i = 0; i < args.length; i++) LOGGER.error(Context.toString(args[i])); } public static void load(Context cx, Scriptable thisObj, Object[] args, Function funObj) throws FileNotFoundException, IOException { RequireJsSupport shell = (RequireJsSupport) getTopLevelScope(thisObj); for (int i = 0; i < args.length; i++) { LOGGER.debug("Loading file " + Context.toString(args[i])); shell.processSource(cx, Context.toString(args[i])); } } public static String readFile(Context cx, Scriptable thisObj, Object[] args, Function funObj) throws FileNotFoundException, IOException { RequireJsSupport shell = (RequireJsSupport) getTopLevelScope(thisObj); if (args.length == 1) { return shell.getFileContents(Context.toString(args[0])); } return null; } private void processSource(Context cx, String filename) throws FileNotFoundException, IOException { String fileContents = getFileContents(filename); cx.evaluateString(this, fileContents, filename, 1, null); } private String getFileContents(String file) { InputStream is = RequireJsSupport.class.getResourceAsStream(file); if (is != null) { try { return IOUtils.toString(is); } catch (IOException e) { LOGGER.error("File not readable %s", file, e); } } else LOGGER.error("File not found %s", file); return ""; } }