package org.qrone.r7.handler; import java.io.IOException; import java.io.InputStream; import java.io.Writer; import java.net.URI; import java.net.URISyntaxException; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import net.arnx.jsonic.JSON; import org.mozilla.javascript.JavaScriptException; import org.mozilla.javascript.RhinoException; import org.mozilla.javascript.Scriptable; import org.mozilla.javascript.WrappedException; import org.qrone.r7.PortingService; import org.qrone.r7.parser.HTML5Deck; import org.qrone.r7.resolver.URIResolver; import org.qrone.r7.script.Scriptables; import org.qrone.r7.script.ServerJSDeck; import org.qrone.r7.script.ServerJSOM; import org.qrone.r7.script.ServletScope; import org.qrone.r7.script.browser.User; import org.qrone.r7.script.browser.Window; import org.qrone.r7.script.ext.MapPrototype; import org.qrone.util.QrONEUtils; import org.qrone.util.Stream; public class JavaScriptHandler implements URIHandler{ private PortingService services; private HTML5Deck deck; private ServerJSDeck vm; private URIResolver resolver; public JavaScriptHandler(PortingService services, ServerJSDeck vm, HTML5Deck deck) { this.services = services; this.resolver = services.getURIResolver(); this.deck = deck; this.vm = vm; } @Override public boolean handle(HttpServletRequest request, HttpServletResponse response, String uri, String path, String leftpath, List<String> arg) { Scriptable globalscope = null; try { if(resolver.exist(uri)){ URI urio = new URI(uri); ServerJSOM om = vm.compile(urio); if(om != null){ globalscope = vm.createScope(); ServletScope ss = new ServletScope(request, response, urio, path, leftpath, arg); Window window = new Window(ss,globalscope,deck,vm,services); window.init(globalscope); if(uri.indexOf("/api/") >= 0 && !ss.secure){ Map map = new HashMap(); map.put("status", "error"); map.put("code", "NO_TICKET"); map.put("message", "Need ticket for accessing apis."); map.put("url", "http://..."); Writer w = response.getWriter(); w.write(JSON.encode(map)); w.flush(); w.close(); return true; } Scriptable subscope = vm.createScope(); ServerJSOM defaultom = vm.compile(new URI("/system/resource/default.js")); defaultom.run(subscope); Object result = om.run(globalscope, window, subscope, window); String done = ss.getParameter(".done"); if(done != null && ss.secure){ //String r = QrONEUtils.escape(JSON.encode(result)); try { if(done.indexOf('?') >= 0){ response.sendRedirect(done); }else{ response.sendRedirect(done); } } catch (IOException e) { } } if(ss.getParameter(".debug") != null){ JavaScriptException e = new JavaScriptException(null, uri, 0); throw e; } window.close(); return true; } } } catch (RhinoException e) { if(e instanceof WrappedException){ ((WrappedException)e).getWrappedException().printStackTrace(); }else{ e.printStackTrace(); } try{ response.setStatus(500); Map map = new HashMap(); map.put("line", e.lineNumber()); map.put("file", e.sourceName()); map.put("message", e.getMessage()); map.put("stacktrace", e.getScriptStackTrace()); map.put("scope", JSON.encode(Scriptables.asMap(globalscope))); InputStream in = resolver.getInputStream(new URI(e.sourceName())); if(in != null){ map.put("source", new String(Stream.read(in))); } URI urio = new URI("/admin/error.server.js"); Scriptable scope = vm.createScope(); ServletScope ss = new ServletScope(request,response,urio, path, leftpath, arg); scope.put("exception", scope, new MapPrototype(scope, map)); ServerJSOM defaultom = vm.compile(new URI("/system/resource/default.js")); defaultom.run(scope); ServerJSOM om = vm.compile(urio); Window window = new Window(ss,scope,deck,vm,services); window.init(scope); om.run(scope, window, window); window.close(); }catch (Exception e1){ e1.printStackTrace(); } } catch (URISyntaxException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return false; } }