Michael Blow has submitted this change and it was merged. Change subject: Merge commit '5543132' from 'stabilization-f69489' into 'master' ......................................................................
Merge commit '5543132' from 'stabilization-f69489' into 'master' Change-Id: Ic0e77df94ecea518e19b55edb90a2fe8157cac21 --- M asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceServlet.java D asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/RestApiServlet.java M asterixdb/asterix-app/src/test/java/org/apache/asterix/api/common/AsterixHyracksIntegrationUtil.java M asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/ResultExtractor.java M asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java M asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/ExecutionTestUtil.java M hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/utils/HttpUtil.java 7 files changed, 65 insertions(+), 409 deletions(-) Approvals: Jenkins: No violations found Michael Blow: Looks good to me, approved; Verified diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceServlet.java index 5327d62..ffbb614 100644 --- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceServlet.java +++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceServlet.java @@ -349,33 +349,29 @@ pw.print("\t}\n"); } -<<<<<<< HEAD (093e84 Merge "Merge commit 'd9850dc' from 'stabilization-f69489' in) - protected String getOptText(JsonNode node, String fieldName) { -======= - private String getOptText(JsonNode node, Parameter parameter) { + protected String getOptText(JsonNode node, Parameter parameter) { return getOptText(node, parameter.str()); } - private String getOptText(JsonNode node, String fieldName) { ->>>>>>> BRANCH (554313 [NO ISSUE] Handle Accept-Charset in QueryResultApiServlet) + protected String getOptText(JsonNode node, String fieldName) { final JsonNode value = node.get(fieldName); return value != null ? value.asText() : null; } - private boolean getOptBoolean(JsonNode node, Parameter parameter, boolean defaultValue) { + protected boolean getOptBoolean(JsonNode node, Parameter parameter, boolean defaultValue) { return getOptBoolean(node, parameter.str(), defaultValue); } - private boolean getOptBoolean(JsonNode node, String fieldName, boolean defaultValue) { + protected boolean getOptBoolean(JsonNode node, String fieldName, boolean defaultValue) { final JsonNode value = node.get(fieldName); return value != null ? value.asBoolean() : defaultValue; } - private String getParameter(IServletRequest request, Parameter parameter) { + protected String getParameter(IServletRequest request, Parameter parameter) { return request.getParameter(parameter.str()); } - private boolean getOptBoolean(IServletRequest request, Parameter parameter, boolean defaultValue) { + protected boolean getOptBoolean(IServletRequest request, Parameter parameter, boolean defaultValue) { String value = request.getParameter(parameter.str()); return value == null ? defaultValue : Boolean.parseBoolean(value); } @@ -422,83 +418,37 @@ String contentType = HttpUtil.getContentTypeOnly(request); if (HttpUtil.ContentType.APPLICATION_JSON.equals(contentType)) { try { -<<<<<<< HEAD (093e84 Merge "Merge commit 'd9850dc' from 'stabilization-f69489' in) setParamFromJSON(request, param, optionalParams); -======= - JsonNode jsonRequest = OBJECT_MAPPER.readTree(HttpUtil.getRequestBody(request)); - param.setStatement(getOptText(jsonRequest, Parameter.STATEMENT)); - param.setFormat(toLower(getOptText(jsonRequest, Parameter.FORMAT))); - param.setPretty(getOptBoolean(jsonRequest, Parameter.PRETTY, false)); - param.setMode(toLower(getOptText(jsonRequest, Parameter.MODE))); - param.setClientContextID(getOptText(jsonRequest, Parameter.CLIENT_ID)); - param.setTimeout(getOptText(jsonRequest, Parameter.TIMEOUT)); - param.setMaxResultReads(getOptText(jsonRequest, Parameter.MAX_RESULT_READS)); - param.setPlanFormat(getOptText(jsonRequest, Parameter.PLAN_FORMAT)); - param.setExpressionTree(getOptBoolean(jsonRequest, Parameter.EXPRESSION_TREE, false)); - param.setRewrittenExpressionTree( - getOptBoolean(jsonRequest, Parameter.REWRITTEN_EXPRESSION_TREE, false)); - param.setLogicalPlan(getOptBoolean(jsonRequest, Parameter.LOGICAL_PLAN, false)); - param.setOptimizedLogicalPlan(getOptBoolean(jsonRequest, Parameter.OPTIMIZED_LOGICAL_PLAN, false)); - param.setJob(getOptBoolean(jsonRequest, Parameter.JOB, false)); - param.setSignature(getOptBoolean(jsonRequest, Parameter.SIGNATURE, true)); - param.setStatementParams( - getOptStatementParameters(jsonRequest, jsonRequest.fieldNames(), JsonNode::get, v -> v)); - param.setMultiStatement(getOptBoolean(jsonRequest, Parameter.MULTI_STATEMENT, true)); ->>>>>>> BRANCH (554313 [NO ISSUE] Handle Accept-Charset in QueryResultApiServlet) } catch (JsonParseException | JsonMappingException e) { // if the JSON parsing fails, the statement is empty and we get an empty statement error GlobalConfig.ASTERIX_LOGGER.log(Level.ERROR, e.getMessage(), e); } } else { -<<<<<<< HEAD (093e84 Merge "Merge commit 'd9850dc' from 'stabilization-f69489' in) setParamFromRequest(request, param); -======= - param.setStatement(getParameter(request, Parameter.STATEMENT)); - if (param.getStatement() == null) { - param.setStatement(HttpUtil.getRequestBody(request)); - } - param.setFormat(toLower(getParameter(request, Parameter.FORMAT))); - param.setPretty(Boolean.parseBoolean(getParameter(request, Parameter.PRETTY))); - param.setMode(toLower(getParameter(request, Parameter.MODE))); - param.setClientContextID(getParameter(request, Parameter.CLIENT_ID)); - param.setTimeout(getParameter(request, Parameter.TIMEOUT)); - param.setMaxResultReads(getParameter(request, Parameter.MAX_RESULT_READS)); - param.setPlanFormat(getParameter(request, Parameter.PLAN_FORMAT)); - param.setMultiStatement(getOptBoolean(request, Parameter.MULTI_STATEMENT, true)); - try { - param.setStatementParams(getOptStatementParameters(request, request.getParameterNames().iterator(), - IServletRequest::getParameter, OBJECT_MAPPER::readTree)); - } catch (JsonParseException | JsonMappingException e) { - GlobalConfig.ASTERIX_LOGGER.log(Level.ERROR, e.getMessage(), e); - } ->>>>>>> BRANCH (554313 [NO ISSUE] Handle Accept-Charset in QueryResultApiServlet) } } private void setParamFromJSON(IServletRequest request, QueryServiceRequestParameters param, Map<String, String> optionalParameters) throws IOException { JsonNode jsonRequest = OBJECT_MAPPER.readTree(HttpUtil.getRequestBody(request)); - param.setFormat(toLower(getOptText(jsonRequest, Parameter.FORMAT.str()))); - param.setPretty(getOptBoolean(jsonRequest, Parameter.PRETTY.str(), false)); - param.setMode(toLower(getOptText(jsonRequest, Parameter.MODE.str()))); - param.setClientContextID(getOptText(jsonRequest, Parameter.CLIENT_ID.str())); - param.setTimeout(getOptText(jsonRequest, Parameter.TIMEOUT.str())); - param.setMaxResultReads(getOptText(jsonRequest, Parameter.MAX_RESULT_READS.str())); - param.setPlanFormat(getOptText(jsonRequest, Parameter.PLAN_FORMAT.str())); - param.setExpressionTree(getOptBoolean(jsonRequest, Parameter.EXPRESSION_TREE.str(), false)); - param.setRewrittenExpressionTree(getOptBoolean(jsonRequest, Parameter.REWRITTEN_EXPRESSION_TREE.str(), false)); - param.setLogicalPlan(getOptBoolean(jsonRequest, Parameter.LOGICAL_PLAN.str(), false)); - param.setParseOnly(getOptBoolean(jsonRequest, Parameter.PARSE_ONLY.str(), false)); - param.setOptimizedLogicalPlan(getOptBoolean(jsonRequest, Parameter.OPTIMIZED_LOGICAL_PLAN.str(), false)); - param.setJob(getOptBoolean(jsonRequest, Parameter.JOB.str(), false)); - param.setSignature(getOptBoolean(jsonRequest, Parameter.SIGNATURE.str(), true)); + param.setStatement(getOptText(jsonRequest, Parameter.STATEMENT)); + param.setFormat(toLower(getOptText(jsonRequest, Parameter.FORMAT))); + param.setPretty(getOptBoolean(jsonRequest, Parameter.PRETTY, false)); + param.setMode(toLower(getOptText(jsonRequest, Parameter.MODE))); + param.setClientContextID(getOptText(jsonRequest, Parameter.CLIENT_ID)); + param.setTimeout(getOptText(jsonRequest, Parameter.TIMEOUT)); + param.setMaxResultReads(getOptText(jsonRequest, Parameter.MAX_RESULT_READS)); + param.setPlanFormat(getOptText(jsonRequest, Parameter.PLAN_FORMAT)); + param.setExpressionTree(getOptBoolean(jsonRequest, Parameter.EXPRESSION_TREE, false)); + param.setRewrittenExpressionTree(getOptBoolean(jsonRequest, Parameter.REWRITTEN_EXPRESSION_TREE, false)); + param.setLogicalPlan(getOptBoolean(jsonRequest, Parameter.LOGICAL_PLAN, false)); + param.setParseOnly(getOptBoolean(jsonRequest, Parameter.PARSE_ONLY, false)); + param.setOptimizedLogicalPlan(getOptBoolean(jsonRequest, Parameter.OPTIMIZED_LOGICAL_PLAN, false)); + param.setJob(getOptBoolean(jsonRequest, Parameter.JOB, false)); + param.setSignature(getOptBoolean(jsonRequest, Parameter.SIGNATURE, true)); param.setStatementParams( getOptStatementParameters(jsonRequest, jsonRequest.fieldNames(), JsonNode::get, v -> v)); - param.setMultiStatement(getOptBoolean(jsonRequest, Parameter.MULTI_STATEMENT.str(), true)); - String statementParam = Parameter.STATEMENT.str(); - if (jsonRequest.has(statementParam)) { - param.setStatement(jsonRequest.get(statementParam).asText()); - } + param.setMultiStatement(getOptBoolean(jsonRequest, Parameter.MULTI_STATEMENT, true)); setJsonOptionalParameters(jsonRequest, optionalParameters); } @@ -507,20 +457,19 @@ } private void setParamFromRequest(IServletRequest request, QueryServiceRequestParameters param) throws IOException { - param.setStatement(request.getParameter(Parameter.STATEMENT.str())); + param.setStatement(getParameter(request, Parameter.STATEMENT)); if (param.getStatement() == null) { param.setStatement(HttpUtil.getRequestBody(request)); } - param.setFormat(toLower(request.getParameter(Parameter.FORMAT.str()))); - param.setPretty(Boolean.parseBoolean(request.getParameter(Parameter.PRETTY.str()))); - param.setMode(toLower(request.getParameter(Parameter.MODE.str()))); - param.setClientContextID(request.getParameter(Parameter.CLIENT_ID.str())); - param.setTimeout(request.getParameter(Parameter.TIMEOUT.str())); - param.setMaxResultReads(request.getParameter(Parameter.MAX_RESULT_READS.str())); - param.setPlanFormat(request.getParameter(Parameter.PLAN_FORMAT.str())); - param.setParseOnly(Boolean.parseBoolean(request.getParameter(Parameter.PARSE_ONLY.str()))); - final String multiStatementParam = request.getParameter(Parameter.MULTI_STATEMENT.str()); - param.setMultiStatement(multiStatementParam == null || Boolean.parseBoolean(multiStatementParam)); + param.setFormat(toLower(getParameter(request, Parameter.FORMAT))); + param.setPretty(Boolean.parseBoolean(getParameter(request, Parameter.PRETTY))); + param.setMode(toLower(getParameter(request, Parameter.MODE))); + param.setClientContextID(getParameter(request, Parameter.CLIENT_ID)); + param.setTimeout(getParameter(request, Parameter.TIMEOUT)); + param.setMaxResultReads(getParameter(request, Parameter.MAX_RESULT_READS)); + param.setPlanFormat(getParameter(request, Parameter.PLAN_FORMAT)); + param.setParseOnly(getOptBoolean(request, Parameter.PARSE_ONLY, false)); + param.setMultiStatement(getOptBoolean(request, Parameter.MULTI_STATEMENT, true)); try { param.setStatementParams(getOptStatementParameters(request, request.getParameterNames().iterator(), IServletRequest::getParameter, OBJECT_MAPPER::readTree)); @@ -579,26 +528,11 @@ private void handleRequest(IServletRequest request, IServletResponse response) throws IOException { final IRequestReference requestRef = receptionist.welcome(request); long elapsedStart = System.nanoTime(); -<<<<<<< HEAD (093e84 Merge "Merge commit 'd9850dc' from 'stabilization-f69489' in) long errorCount = 1; -======= - Charset resultCharset = HttpUtil.setContentType(response, HttpUtil.ContentType.APPLICATION_JSON, request); - final PrintWriter httpWriter = response.writer(); - - ResultDelivery delivery = parseResultDelivery(param.getMode()); - - final ResultProperties resultProperties = param.getMaxResultReads() == null ? new ResultProperties(delivery) - : new ResultProperties(delivery, Long.parseLong(param.getMaxResultReads())); - - String handleUrl = getHandleUrl(param.getHost(), param.getPath(), delivery); - SessionOutput sessionOutput = createSessionOutput(param, handleUrl, httpWriter); - SessionConfig sessionConfig = sessionOutput.config(); - ->>>>>>> BRANCH (554313 [NO ISSUE] Handle Accept-Charset in QueryResultApiServlet) Stats stats = new Stats(); RequestExecutionState execution = new RequestExecutionState(); List<ExecutionWarning> warnings = Collections.emptyList(); - HttpUtil.setContentType(response, HttpUtil.ContentType.APPLICATION_JSON, request); + Charset resultCharset = HttpUtil.setContentType(response, HttpUtil.ContentType.APPLICATION_JSON, request); PrintWriter httpWriter = response.writer(); SessionOutput sessionOutput = createSessionOutput(httpWriter); QueryServiceRequestParameters param = new QueryServiceRequestParameters(); diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/RestApiServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/RestApiServlet.java deleted file mode 100644 index be7383d..0000000 --- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/RestApiServlet.java +++ /dev/null @@ -1,254 +0,0 @@ -<<<<<<< HEAD (093e84 Merge "Merge commit 'd9850dc' from 'stabilization-f69489' in) -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.asterix.api.http.server; - -import static org.apache.asterix.api.http.server.ServletConstants.HYRACKS_CONNECTION_ATTR; - -import java.io.IOException; -import java.util.List; -import java.util.concurrent.ConcurrentMap; - -import org.apache.asterix.app.translator.QueryTranslator; -import org.apache.asterix.app.translator.RequestParameters; -import org.apache.asterix.common.api.IRequestReference; -import org.apache.asterix.common.config.GlobalConfig; -import org.apache.asterix.common.context.IStorageComponentProvider; -import org.apache.asterix.common.dataflow.ICcApplicationContext; -import org.apache.asterix.common.exceptions.AsterixException; -import org.apache.asterix.compiler.provider.ILangCompilationProvider; -import org.apache.asterix.lang.aql.parser.TokenMgrError; -import org.apache.asterix.lang.common.base.IParser; -import org.apache.asterix.lang.common.base.IParserFactory; -import org.apache.asterix.lang.common.base.Statement; -import org.apache.asterix.metadata.MetadataManager; -import org.apache.asterix.translator.IRequestParameters; -import org.apache.asterix.translator.IStatementExecutor; -import org.apache.asterix.translator.IStatementExecutor.ResultDelivery; -import org.apache.asterix.translator.IStatementExecutorFactory; -import org.apache.asterix.translator.ResultProperties; -import org.apache.asterix.translator.SessionConfig; -import org.apache.asterix.translator.SessionConfig.OutputFormat; -import org.apache.asterix.translator.SessionConfig.PlanFormat; -import org.apache.asterix.translator.SessionOutput; -import org.apache.hyracks.api.client.IHyracksClientConnection; -import org.apache.hyracks.api.result.IResultSet; -import org.apache.hyracks.http.api.IServletRequest; -import org.apache.hyracks.http.api.IServletResponse; -import org.apache.hyracks.http.server.AbstractServlet; -import org.apache.hyracks.http.server.utils.HttpUtil; -import org.apache.logging.log4j.Level; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.node.ObjectNode; - -import io.netty.handler.codec.http.HttpMethod; -import io.netty.handler.codec.http.HttpResponseStatus; - -public abstract class RestApiServlet extends AbstractServlet { - private static final Logger LOGGER = LogManager.getLogger(); - private final ICcApplicationContext appCtx; - private final ILangCompilationProvider compilationProvider; - private final IParserFactory parserFactory; - private final IStatementExecutorFactory statementExecutorFactory; - private final IStorageComponentProvider componentProvider; - - public RestApiServlet(ConcurrentMap<String, Object> ctx, String[] paths, ICcApplicationContext appCtx, - ILangCompilationProvider compilationProvider, IStatementExecutorFactory statementExecutorFactory, - IStorageComponentProvider componentProvider) { - super(ctx, paths); - this.appCtx = appCtx; - this.compilationProvider = compilationProvider; - this.parserFactory = compilationProvider.getParserFactory(); - this.statementExecutorFactory = statementExecutorFactory; - this.componentProvider = componentProvider; - } - - /** - * Initialize the Content-Type of the response, and construct a - * SessionConfig with the appropriate output writer and output-format - * based on the Accept: header and other servlet parameters. - */ - static SessionOutput initResponse(IServletRequest request, IServletResponse response) throws IOException { - HttpUtil.setContentType(response, HttpUtil.ContentType.TEXT_PLAIN, request); - // CLEAN_JSON output is the default; most generally useful for a - // programmatic HTTP API - OutputFormat format = OutputFormat.CLEAN_JSON; - // First check the "output" servlet parameter. - String output = request.getParameter("output"); - String accept = request.getHeader("Accept", ""); - if (output != null) { - if ("CSV".equals(output)) { - format = OutputFormat.CSV; - } else if ("ADM".equals(output)) { - format = OutputFormat.ADM; - } - } else { - // Second check the Accept: HTTP header. - if (accept.contains("application/x-adm")) { - format = OutputFormat.ADM; - } else if (accept.contains("text/csv")) { - format = OutputFormat.CSV; - } - } - PlanFormat planFormat = - PlanFormat.get(request.getParameter("plan-format"), "plan format", PlanFormat.STRING, LOGGER); - - // If it's JSON, check for the "lossless" flag - - if (format == OutputFormat.CLEAN_JSON - && ("true".equals(request.getParameter("lossless")) || accept.contains("lossless=true"))) { - format = OutputFormat.LOSSLESS_JSON; - } - - SessionOutput.ResultAppender appendHandle = (app, handle) -> app.append("{ \"").append("handle") - .append("\":" + " \"").append(handle).append("\" }"); - SessionConfig sessionConfig = new SessionConfig(format, planFormat); - - // If it's JSON or ADM, check for the "wrapper-array" flag. Default is - // "true" for JSON and "false" for ADM. (Not applicable for CSV.) - boolean wrapperArray = format == OutputFormat.CLEAN_JSON || format == OutputFormat.LOSSLESS_JSON; - String wrapperParam = request.getParameter("wrapper-array"); - if (wrapperParam != null) { - wrapperArray = Boolean.valueOf(wrapperParam); - } else if (accept.contains("wrap-array=true")) { - wrapperArray = true; - } else if (accept.contains("wrap-array=false")) { - wrapperArray = false; - } - sessionConfig.set(SessionConfig.FORMAT_WRAPPER_ARRAY, wrapperArray); - // Now that format is set, output the content-type - switch (format) { - case ADM: - HttpUtil.setContentType(response, "application/x-adm"); - break; - case CLEAN_JSON: - // No need to reflect "clean-ness" in output type; fall through - case LOSSLESS_JSON: - HttpUtil.setContentType(response, "application/json"); - break; - case CSV: - // Check for header parameter or in Accept:. - if ("present".equals(request.getParameter("header")) || accept.contains("header=present")) { - HttpUtil.setContentType(response, "text/csv; header=present"); - sessionConfig.set(SessionConfig.FORMAT_CSV_HEADER, true); - } else { - HttpUtil.setContentType(response, "text/csv; header=absent"); - } - break; - default: - throw new IOException("Unknown format " + format); - } - return new SessionOutput(sessionConfig, response.writer(), null, null, appendHandle, null); - } - - @Override - protected void get(IServletRequest request, IServletResponse response) { - getOrPost(request, response); - } - - @Override - protected void post(IServletRequest request, IServletResponse response) { - getOrPost(request, response); - } - - private void getOrPost(IServletRequest request, IServletResponse response) { - try { - String query = query(request); - // enable cross-origin resource sharing - response.setHeader("Access-Control-Allow-Origin", "*"); - response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); - SessionOutput sessionOutput = initResponse(request, response); - QueryTranslator.ResultDelivery resultDelivery = whichResultDelivery(request); - final IRequestReference requestReference = appCtx.getReceptionist().welcome(request); - doHandle(requestReference, response, query, sessionOutput, resultDelivery); - } catch (Exception e) { - response.setStatus(HttpResponseStatus.INTERNAL_SERVER_ERROR); - LOGGER.log(Level.WARN, "Failure handling request", e); - } - } - - private void doHandle(IRequestReference requestReference, IServletResponse response, String query, - SessionOutput sessionOutput, ResultDelivery resultDelivery) throws JsonProcessingException { - try { - response.setStatus(HttpResponseStatus.OK); - IHyracksClientConnection hcc = (IHyracksClientConnection) ctx.get(HYRACKS_CONNECTION_ATTR); - IParser parser = parserFactory.createParser(query); - List<Statement> statements = parser.parse(); - validate(statements); - MetadataManager.INSTANCE.init(); - IStatementExecutor translator = statementExecutorFactory.create(appCtx, statements, sessionOutput, - compilationProvider, componentProvider); - final IResultSet resultSet = ServletUtil.getResultSet(hcc, appCtx, ctx); - final IRequestParameters requestParameters = new RequestParameters(requestReference, query, resultSet, - new ResultProperties(resultDelivery), new IStatementExecutor.Stats(), null, null, null, null, true); - translator.compileAndExecute(hcc, requestParameters); - } catch (AsterixException | TokenMgrError | org.apache.asterix.aqlplus.parser.TokenMgrError pe) { - response.setStatus(HttpResponseStatus.INTERNAL_SERVER_ERROR); - GlobalConfig.ASTERIX_LOGGER.log(Level.ERROR, pe.getMessage(), pe); - String errorMessage = ResultUtil.buildParseExceptionMessage(pe, query); - ObjectNode errorResp = - ResultUtil.getErrorResponse(2, errorMessage, "", ResultUtil.extractFullStackTrace(pe)); - sessionOutput.out().write(OBJECT_MAPPER.writeValueAsString(errorResp)); - } catch (Exception e) { - GlobalConfig.ASTERIX_LOGGER.log(Level.ERROR, e.getMessage(), e); - response.setStatus(HttpResponseStatus.INTERNAL_SERVER_ERROR); - ResultUtil.apiErrorHandler(sessionOutput.out(), e); - } - } - - //TODO: Both Get and Post of this API must use the same parameter names - private String query(IServletRequest request) { - if (request.getHttpRequest().method() == HttpMethod.POST) { - return HttpUtil.getRequestBody(request); - } else { - return getQueryParameter(request); - } - } - - private void validate(List<Statement> statements) throws AsterixException { - for (Statement st : statements) { - if ((st.getCategory() & getAllowedCategories()) == 0) { - throw new AsterixException(String.format(getErrorMessage(), st.getKind())); - } - } - } - - protected QueryTranslator.ResultDelivery whichResultDelivery(IServletRequest request) { - String mode = request.getParameter("mode"); - if (mode != null) { - if ("asynchronous".equals(mode) || "async".equals(mode)) { - return QueryTranslator.ResultDelivery.ASYNC; - } else if ("asynchronous-deferred".equals(mode) || "deferred".equals(mode)) { - return QueryTranslator.ResultDelivery.DEFERRED; - } - } - return QueryTranslator.ResultDelivery.IMMEDIATE; - } - - protected abstract String getQueryParameter(IServletRequest request); - - protected abstract byte getAllowedCategories(); - - protected abstract String getErrorMessage(); -} -======= ->>>>>>> BRANCH (554313 [NO ISSUE] Handle Accept-Charset in QueryResultApiServlet) diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/api/common/AsterixHyracksIntegrationUtil.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/api/common/AsterixHyracksIntegrationUtil.java index 9c24821..6eac23b 100644 --- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/api/common/AsterixHyracksIntegrationUtil.java +++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/api/common/AsterixHyracksIntegrationUtil.java @@ -117,6 +117,8 @@ } public void init(boolean deleteOldInstanceData, String confFile) throws Exception { //NOSONAR + configureExternalLibDir(); + final ICCApplication ccApplication = createCCApplication(); if (confFile == null) { configManager = new ConfigManager(); @@ -184,6 +186,16 @@ setTestPersistedResourceRegistry(); } + private void configureExternalLibDir() { + // hack to ensure we have a unique location for external libraries in our tests (asterix cluster has a shared + // home directory)-- TODO: rework this once the external lib dir can be configured explicitly + String appHome = joinPath(System.getProperty("app.home", System.getProperty("user.home")), + "appHome" + (int) (Math.random() * Integer.MAX_VALUE)); + LOGGER.info("setting app.home to {}", appHome); + System.setProperty("app.home", appHome); + new File(appHome).deleteOnExit(); + } + public void init(boolean deleteOldInstanceData, String externalLibPath, String confDir) throws Exception { List<ILibraryManager> libraryManagers = new ArrayList<>(); ExternalUDFLibrarian librarian = new ExternalUDFLibrarian(libraryManagers); diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/ResultExtractor.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/ResultExtractor.java index ff9ee18..c503579 100644 --- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/ResultExtractor.java +++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/ResultExtractor.java @@ -19,7 +19,7 @@ package org.apache.asterix.test.common; import java.io.InputStream; -import java.nio.charset.StandardCharsets; +import java.nio.charset.Charset; import java.util.EnumSet; import java.util.HashMap; import java.util.Iterator; @@ -106,14 +106,9 @@ return null; } -<<<<<<< HEAD (093e84 Merge "Merge commit 'd9850dc' from 'stabilization-f69489' in) - private static InputStream extract(InputStream resultStream, EnumSet<ResultField> resultFields) throws Exception { - final String resultStr = IOUtils.toString(resultStream, StandardCharsets.UTF_8); -======= private static InputStream extract(InputStream resultStream, EnumSet<ResultField> resultFields, Charset resultCharset) throws Exception { final String resultStr = IOUtils.toString(resultStream, resultCharset); ->>>>>>> BRANCH (554313 [NO ISSUE] Handle Accept-Charset in QueryResultApiServlet) final ObjectNode result = OBJECT_MAPPER.readValue(resultStr, ObjectNode.class); LOGGER.debug("+++++++\n" + result + "\n+++++++\n"); diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java index 7c3e037..f621d34 100644 --- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java +++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java @@ -42,6 +42,7 @@ import java.nio.charset.Charset; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; @@ -160,7 +161,8 @@ private static Map<String, InetSocketAddress> ncEndPoints; private static Map<String, InetSocketAddress> replicationAddress; - private static final List<Charset> charsetsRemaining = new ArrayList<>(); + private final List<Charset> allCharsets; + private final List<Charset> charsetsRemaining = new ArrayList<>(); /* * Instance members @@ -185,6 +187,8 @@ public TestExecutor(List<InetSocketAddress> endpoints) { this.endpoints = endpoints; + this.allCharsets = Charset.availableCharsets().values().stream() + .filter(c -> canEncodeDecode(c, "\n\t\\[]{}'\"")).collect(Collectors.toList()); } public void setLibrarian(IExternalUDFLibrarian librarian) { @@ -234,8 +238,7 @@ runScriptAndCompareWithResultRegex(scriptFile, readerExpected, readerActual); return; } else if (actualFile.toString().endsWith(".regexadm")) { -<<<<<<< HEAD (093e84 Merge "Merge commit 'd9850dc' from 'stabilization-f69489' in) - runScriptAndCompareWithResultRegexAdm(scriptFile, expectedFile, actualFile); + runScriptAndCompareWithResultRegexAdm(scriptFile, readerExpected, readerActual); return; } else if (actualFile.toString().endsWith(".regexjson")) { ObjectMapper OM = new ObjectMapper(); @@ -247,9 +250,6 @@ if (!TestHelper.equalJson(expectedJson, actualJson)) { throw new ComparisonException("Result for " + scriptFile + " didn't match the expected JSON"); } -======= - runScriptAndCompareWithResultRegexAdm(scriptFile, readerExpected, readerActual); ->>>>>>> BRANCH (554313 [NO ISSUE] Handle Accept-Charset in QueryResultApiServlet) return; } String lineExpected, lineActual; @@ -646,8 +646,16 @@ return nextCharset(charset -> canEncodeDecode(charset, payload)); } - public static Charset nextCharset(Predicate<Charset> test) { - synchronized (charsetsRemaining) { + public void setAvailableCharsets(Collection<Charset> charsets) { + synchronized (allCharsets) { + allCharsets.clear(); + allCharsets.addAll(charsets); + charsetsRemaining.clear(); + } + } + + public Charset nextCharset(Predicate<Charset> test) { + synchronized (allCharsets) { while (true) { for (Iterator<Charset> iter = charsetsRemaining.iterator(); iter.hasNext();) { Charset next = iter.next(); @@ -656,8 +664,6 @@ return next; } } - List<Charset> allCharsets = Charset.availableCharsets().values().stream() - .filter(c -> canEncodeDecode(c, "\n\t\\[]{}'\"")).collect(Collectors.toList()); Collections.shuffle(allCharsets); charsetsRemaining.addAll(allCharsets); } @@ -1281,21 +1287,14 @@ if (DELIVERY_IMMEDIATE.equals(delivery)) { resultStream = executeQueryService(statement, fmt, uri, params, isJsonEncoded, responseCharset, null, isCancellable(reqType)); - resultStream = -<<<<<<< HEAD (093e84 Merge "Merge commit 'd9850dc' from 'stabilization-f69489' in) - executeQueryService(statement, fmt, uri, params, isJsonEncoded, null, isCancellable(reqType)); switch (reqType) { case METRICS_QUERY_TYPE: - resultStream = ResultExtractor.extractMetrics(resultStream); + resultStream = ResultExtractor.extractMetrics(resultStream, responseCharset); break; default: - resultStream = ResultExtractor.extract(resultStream); + resultStream = ResultExtractor.extract(resultStream, responseCharset); break; } -======= - METRICS_QUERY_TYPE.equals(reqType) ? ResultExtractor.extractMetrics(resultStream, responseCharset) - : ResultExtractor.extract(resultStream, responseCharset); ->>>>>>> BRANCH (554313 [NO ISSUE] Handle Accept-Charset in QueryResultApiServlet) } else { String handleVar = getHandleVariable(statement); resultStream = executeQueryService(statement, fmt, uri, @@ -1860,25 +1859,8 @@ ArrayList<String> toBeDropped = new ArrayList<>(); InputStream resultStream = executeQueryService( "select dv.DataverseName from Metadata.`Dataverse` as dv order by dv.DataverseName;", -<<<<<<< HEAD (093e84 Merge "Merge commit 'd9850dc' from 'stabilization-f69489' in) getEndpoint(Servlets.QUERY_SERVICE), OutputFormat.CLEAN_JSON); - JsonNode result = extractResult(IOUtils.toString(resultStream, StandardCharsets.UTF_8)); -======= - getEndpoint(Servlets.QUERY_SERVICE), OutputFormat.CLEAN_JSON, UTF_8); - String out = IOUtils.toString(resultStream, UTF_8); - ObjectMapper om = new ObjectMapper(); - om.setConfig(om.getDeserializationConfig().with(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT)); - JsonNode result; - try { - result = om.readValue(out, ObjectNode.class).get("results"); - } catch (JsonMappingException e) { - LOGGER.warn("error mapping response '{}' to json", out, e); - result = null; - } - if (result == null) { - return; - } ->>>>>>> BRANCH (554313 [NO ISSUE] Handle Accept-Charset in QueryResultApiServlet) + JsonNode result = extractResult(IOUtils.toString(resultStream, UTF_8)); for (int i = 0; i < result.size(); i++) { JsonNode json = result.get(i); if (json != null) { diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/ExecutionTestUtil.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/ExecutionTestUtil.java index b4c5b26..05a301c 100644 --- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/ExecutionTestUtil.java +++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/ExecutionTestUtil.java @@ -43,15 +43,6 @@ protected static final Logger LOGGER = LogManager.getLogger(); - static { - // hack to ensure we have a unique location for external libraries in our tests (asterix cluster has a shared home directory) - String appHome = joinPath(System.getProperty("app.home", System.getProperty("user.home")), - "appHome" + (int) (Math.random() * Integer.MAX_VALUE)); - LOGGER.info("setting app.home to {}", appHome); - System.setProperty("app.home", appHome); - new File(appHome).deleteOnExit(); - } - protected static final String PATH_ACTUAL = "rttest" + File.separator; public static TestGroup FailedGroup; diff --git a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/utils/HttpUtil.java b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/utils/HttpUtil.java index b37ccb9..78b5096 100644 --- a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/utils/HttpUtil.java +++ b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/utils/HttpUtil.java @@ -179,17 +179,13 @@ return clusterURL; } -<<<<<<< HEAD (093e84 Merge "Merge commit 'd9850dc' from 'stabilization-f69489' in) public static void setConnectionHeader(HttpRequest request, DefaultHttpResponse response) { final boolean keepAlive = io.netty.handler.codec.http.HttpUtil.isKeepAlive(request); final AsciiString connectionHeaderValue = keepAlive ? HttpHeaderValues.KEEP_ALIVE : HttpHeaderValues.CLOSE; response.headers().set(HttpHeaderNames.CONNECTION, connectionHeaderValue); } - public static String getPreferredCharset(IServletRequest request) { -======= public static Charset getPreferredCharset(IServletRequest request) { ->>>>>>> BRANCH (554313 [NO ISSUE] Handle Accept-Charset in QueryResultApiServlet) return getPreferredCharset(request, DEFAULT_RESPONSE_CHARSET); } -- To view, visit https://asterix-gerrit.ics.uci.edu/3213 To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings Gerrit-MessageType: merged Gerrit-Change-Id: Ic0e77df94ecea518e19b55edb90a2fe8157cac21 Gerrit-PatchSet: 3 Gerrit-Project: asterixdb Gerrit-Branch: master Gerrit-Owner: Michael Blow <mb...@apache.org> Gerrit-Reviewer: Anon. E. Moose #1000171 Gerrit-Reviewer: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Gerrit-Reviewer: Michael Blow <mb...@apache.org>