private boolean checkForbiddenStatements(List<Statement> aqlStatements, PrintWriter out) { for (Statement st : aqlStatements) { if (!getAllowedStatements().contains(st.getKind())) { JSONObject errorResp = ResultUtils.getErrorResponse(1, String.format(getErrorMessage(), st.getKind())); out.write(errorResp.toString()); return true; } } return false; }
@Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setContentType("application/json"); response.setCharacterEncoding("utf-8"); PrintWriter out = response.getWriter(); DisplayFormat format = DisplayFormat.HTML; String contentType = request.getContentType(); if ((contentType == null) || (contentType.equals("text/plain"))) { format = DisplayFormat.TEXT; } else if (contentType.equals("application/json")) { format = DisplayFormat.JSON; } String query = getQueryParameter(request); boolean asyncResults = isAsync(request); ServletContext context = getServletContext(); IHyracksClientConnection hcc; IHyracksDataset hds; try { synchronized (context) { hcc = (IHyracksClientConnection) context.getAttribute(HYRACKS_CONNECTION_ATTR); hds = (IHyracksDataset) context.getAttribute(HYRACKS_DATASET_ATTR); if (hds == null) { hds = new HyracksDataset(hcc, ResultReader.FRAME_SIZE, ResultReader.NUM_READERS); context.setAttribute(HYRACKS_DATASET_ATTR, hds); } } AQLParser parser = new AQLParser(query); List<Statement> aqlStatements = parser.Statement(); if (checkForbiddenStatements(aqlStatements, out)) { return; } SessionConfig sessionConfig = new SessionConfig(true, false, false, false, false, false, true, false); MetadataManager.INSTANCE.init(); AqlTranslator aqlTranslator = new AqlTranslator(aqlStatements, out, sessionConfig, format); aqlTranslator.compileAndExecute(hcc, hds, asyncResults); } catch (ParseException pe) { StringBuilder errorMessage = new StringBuilder(); String message = pe.getMessage(); message = message.replace("<", "<"); message = message.replace(">", ">"); errorMessage.append("SyntaxError:" + message + "\n"); int pos = message.indexOf("line"); if (pos > 0) { int columnPos = message.indexOf(",", pos + 1 + "line".length()); int lineNo = Integer.parseInt(message.substring(pos + "line".length() + 1, columnPos)); String line = query.split("\n")[lineNo - 1]; errorMessage.append("==> " + line + "\n"); } JSONObject errorResp = ResultUtils.getErrorResponse(2, errorMessage.toString()); out.write(errorResp.toString()); } catch (Exception e) { StringBuilder errorMessage = new StringBuilder(); errorMessage.append(e.getMessage()); JSONObject errorResp = ResultUtils.getErrorResponse(99, errorMessage.toString()); out.write(errorResp.toString()); } }
@Override public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { OutputFormat format; boolean csv_and_header = false; String output = request.getParameter("output-format"); if (output.equals("ADM")) { format = OutputFormat.ADM; } else if (output.equals("CSV")) { format = OutputFormat.CSV; } else if (output.equals("CSV-Header")) { format = OutputFormat.CSV; csv_and_header = true; } else { // Default output format format = OutputFormat.JSON; } String query = request.getParameter("query"); String printExprParam = request.getParameter("print-expr-tree"); String printRewrittenExprParam = request.getParameter("print-rewritten-expr-tree"); String printLogicalPlanParam = request.getParameter("print-logical-plan"); String printOptimizedLogicalPlanParam = request.getParameter("print-optimized-logical-plan"); String printJob = request.getParameter("print-job"); String executeQuery = request.getParameter("execute-query"); response.setCharacterEncoding("utf-8"); response.setContentType("text/html"); PrintWriter out = response.getWriter(); ServletContext context = getServletContext(); IHyracksClientConnection hcc; IHyracksDataset hds; try { synchronized (context) { hcc = (IHyracksClientConnection) context.getAttribute(HYRACKS_CONNECTION_ATTR); hds = (IHyracksDataset) context.getAttribute(HYRACKS_DATASET_ATTR); if (hds == null) { hds = new HyracksDataset(hcc, ResultReader.FRAME_SIZE, ResultReader.NUM_READERS); context.setAttribute(HYRACKS_DATASET_ATTR, hds); } } AQLParser parser = new AQLParser(query); List<Statement> aqlStatements = parser.parse(); SessionConfig sessionConfig = new SessionConfig(out, format, true, isSet(executeQuery), true); sessionConfig.set(SessionConfig.FORMAT_HTML, true); sessionConfig.set(SessionConfig.FORMAT_CSV_HEADER, csv_and_header); sessionConfig.setOOBData( isSet(printExprParam), isSet(printRewrittenExprParam), isSet(printLogicalPlanParam), isSet(printOptimizedLogicalPlanParam), isSet(printJob)); MetadataManager.INSTANCE.init(); AqlTranslator aqlTranslator = new AqlTranslator(aqlStatements, sessionConfig); double duration = 0; long startTime = System.currentTimeMillis(); aqlTranslator.compileAndExecute(hcc, hds, AqlTranslator.ResultDelivery.SYNC); long endTime = System.currentTimeMillis(); duration = (endTime - startTime) / 1000.00; out.println("<PRE>Duration of all jobs: " + duration + " sec</PRE>"); } catch (ParseException | TokenMgrError | edu.uci.ics.asterix.aqlplus.parser.TokenMgrError pe) { GlobalConfig.ASTERIX_LOGGER.log(Level.INFO, pe.toString(), pe); ResultUtils.webUIParseExceptionHandler(out, pe, query); } catch (Exception e) { GlobalConfig.ASTERIX_LOGGER.log(Level.SEVERE, e.getMessage(), e); ResultUtils.webUIErrorHandler(out, e); } }