package com.tinkerpop.rexster.servlet; import com.tinkerpop.rexster.gremlin.GremlinEvaluationJob; import com.tinkerpop.rexster.gremlin.GremlinSessions; import com.tinkerpop.rexster.gremlin.converter.ConsoleResultConverter; import com.tinkerpop.rexster.server.RexsterApplication; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintStream; import java.util.List; /** * Evaluator servlet migrated from Webling (https://github.com/xedin/webling) and modified. * <p/> * Credit to Neo Technology (http://neotechnology.com/) for most of the code related to the * Gremlin Terminal in Rexster. Specifically, this code was borrowed from * https://github.com/neo4j/webadmin and re-purposed for Rexster's needs. * <p/> * Original author Pavel A. Yaskevich */ public class EvaluatorServlet extends HttpServlet { private static final long serialVersionUID = 1L; private static final String newLineRegex = "(\r\n|\r|\n|\n\r)"; private final RexsterApplication rexsterApplication; public EvaluatorServlet(RexsterApplication rexsterApplication) { this.rexsterApplication = rexsterApplication; } @SuppressWarnings("unchecked") public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletContext sc = getServletContext(); String code = request.getParameter("code"); String logMessage = "[POST /exec?code=" + code.replaceAll(newLineRegex, " ") + "] "; String graphName = request.getParameter("g"); if (code.isEmpty()) { sc.log(logMessage + "400 ERROR"); response.setStatus(HttpServletResponse.SC_BAD_REQUEST); return; } String sessionId = request.getSession(true).getId(); response.setContentType("text/plain;charset=UTF-8"); response.setStatus(HttpServletResponse.SC_OK); // log request sc.log(logMessage + "200 OK"); // redirecting standard output to our custom printStream // to be able to show user result of g:print() function PrintStream out = new PrintStream(response.getOutputStream()); System.setOut(out); try { GremlinEvaluationJob job = GremlinSessions.getSession(sessionId, graphName, rexsterApplication).evaluate(code); List<String> lines = new ConsoleResultConverter(job.getOutputWriter()).convert(job.getResult()); for (String line : lines) { out.println("==>" + line); } } catch (Exception e) { out.println(e.getMessage()); } out.close(); } }