public static void include(Context cx, Scriptable thisObj, Object[] args, Function funObj) throws ScriptException { String functionName = "include"; int argsCount = args.length; if (argsCount != 1) { HostObjectUtil.invalidNumberOfArgs( CommonManager.HOST_OBJECT_NAME, functionName, argsCount, false); } if (!(args[0] instanceof String)) { HostObjectUtil.invalidArgsError( CommonManager.HOST_OBJECT_NAME, functionName, "1", "string", args[0], false); } JaggeryContext jaggeryContext = CommonManager.getJaggeryContext(); Stack<String> includesCallstack = jaggeryContext.getIncludesCallstack(); String parent = includesCallstack.lastElement(); String fileURL = (String) args[0]; if (CommonManager.isHTTP(fileURL) || CommonManager.isHTTP(parent)) { CommonManager.include(cx, thisObj, args, funObj); return; } executeScript(jaggeryContext, jaggeryContext.getScope(), fileURL, false, false, false); }
private static ScriptableObject executeScript( JaggeryContext jaggeryContext, ScriptableObject scope, String fileURL, final boolean isJSON, boolean isBuilt, boolean isIncludeOnce) throws ScriptException { WebAppContext webAppContext = (WebAppContext) jaggeryContext; Stack<String> includesCallstack = jaggeryContext.getIncludesCallstack(); Map<String, Boolean> includedScripts = jaggeryContext.getIncludedScripts(); ServletContext context = webAppContext.getServletConext(); String parent = includesCallstack.lastElement(); String keys[] = WebAppManager.getKeys(context.getContextPath(), parent, fileURL); fileURL = getNormalizedScriptPath(keys); if (includesCallstack.search(fileURL) != -1) { return scope; } if (isIncludeOnce && includedScripts.get(fileURL) != null) { return scope; } ScriptReader source; RhinoEngine engine = jaggeryContext.getEngine(); if (isBuilt) { source = new ScriptReader(context.getResourceAsStream(fileURL)) { @Override protected void build() throws IOException { try { if (isJSON) { sourceReader = new StringReader("(" + HostObjectUtil.streamToString(sourceIn) + ")"); } else { sourceReader = new StringReader(HostObjectUtil.streamToString(sourceIn)); } } catch (ScriptException e) { throw new IOException(e); } } }; } else { source = new ScriptReader(context.getResourceAsStream(fileURL)); } ScriptCachingContext sctx = new ScriptCachingContext(webAppContext.getTenantId(), keys[0], keys[1], keys[2]); sctx.setSecurityDomain(new JaggerySecurityDomain(fileURL, context)); long lastModified = WebAppManager.getScriptLastModified(context, fileURL); sctx.setSourceModifiedTime(lastModified); includedScripts.put(fileURL, true); includesCallstack.push(fileURL); if (isJSON) { scope = (ScriptableObject) engine.eval(source, scope, sctx); } else { engine.exec(source, scope, sctx); } includesCallstack.pop(); return scope; }