This is an automated email from the ASF dual-hosted git repository.

mblow pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/asterixdb.git

commit d8da7b7edda15885e8aa0cd8e4b479e872b05cd8
Merge: 093e842 5543132
Author: Michael Blow <mb...@apache.org>
AuthorDate: Fri Feb 15 20:44:21 2019 -0500

    Merge commit '5543132' from 'stabilization-f69489' into 'master'
    
    Change-Id: Ic0e77df94ecea518e19b55edb90a2fe8157cac21

 asterixdb/asterix-app/pom.xml                      |   1 -
 .../api/http/server/QueryResultApiServlet.java     |  82 ++++++-
 .../api/http/server/QueryServiceServlet.java       |  90 +++++---
 .../asterix/api/http/server/RestApiServlet.java    | 251 --------------------
 .../api/common/AsterixHyracksIntegrationUtil.java  |  12 +
 .../asterix/app/result/ResultPrinterTest.java      |   3 +-
 .../org/apache/asterix/common/TestDataUtil.java    |   3 +-
 .../apache/asterix/runtime/ParseDurationTest.java  |   1 +
 .../test/common/CancellationTestExecutor.java      |   5 +-
 .../asterix/test/common/ResultExtractor.java       |  21 +-
 .../apache/asterix/test/common/TestExecutor.java   | 257 +++++++++++++--------
 .../asterix/test/runtime/ExecutionTestUtil.java    |   9 -
 .../asterix/test/sqlpp/ParserTestExecutor.java     |   4 +-
 .../org/apache/asterix/common/api/Duration.java    |  16 +-
 .../apache/asterix/test/server/RSSFeedServlet.java |   5 +-
 .../src/main/opt/local/bin/start-sample-cluster.sh |   2 +-
 .../src/main/opt/local/bin/stop-sample-cluster.sh  |  11 +-
 .../asterix/test/server/SampleLocalClusterIT.java  |   3 +-
 asterixdb/pom.xml                                  |   6 +
 hyracks-fullstack/hyracks/hyracks-http/pom.xml     |   6 +
 .../hyracks/http/server/ChunkedResponse.java       |   2 +-
 .../apache/hyracks/http/server/FullResponse.java   |   4 +-
 .../apache/hyracks/http/server/utils/HttpUtil.java |  30 ++-
 .../hyracks/test/http/HttpAcceptCharsetTest.java   |   4 +-
 .../hyracks/test/http/HttpServerEncodingTest.java  |  21 +-
 .../apache/hyracks/test/string/EncodingUtils.java  |  65 ++++++
 26 files changed, 452 insertions(+), 462 deletions(-)

diff --cc 
asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceServlet.java
index 31b784f,79401b8..ffbb614
--- 
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
@@@ -346,16 -369,33 +349,33 @@@ public class QueryServiceServlet extend
          pw.print("\t}\n");
      }
  
 -    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) {
 +    protected String getOptText(JsonNode node, String fieldName) {
          final JsonNode value = node.get(fieldName);
          return value != null ? value.asText() : null;
      }
  
-     private boolean getOptBoolean(JsonNode node, String fieldName, boolean 
defaultValue) {
 -    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);
+     }
+ 
      @FunctionalInterface
      interface CheckedFunction<I, O> {
          O apply(I requestParamValue) throws IOException;
@@@ -404,70 -462,26 +424,66 @@@
                  GlobalConfig.ASTERIX_LOGGER.log(Level.ERROR, e.getMessage(), 
e);
              }
          } else {
 -            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);
 -            }
 +            setParamFromRequest(request, param);
 +        }
 +    }
 +
 +    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);
 +    }
 +
 +    protected void setJsonOptionalParameters(JsonNode jsonRequest, 
Map<String, String> optionalParameters) {
 +        // allows extensions to set extra parameters
 +    }
 +
 +    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));
 +        } catch (JsonParseException | JsonMappingException e) {
 +            GlobalConfig.ASTERIX_LOGGER.log(Level.ERROR, e.getMessage(), e);
          }
 -        return param;
 +    }
 +
 +    private void setAccessControlHeaders(IServletRequest request, 
IServletResponse response) throws IOException {
 +        //CORS
 +        if (request.getHeader("Origin") != null) {
 +            response.setHeader("Access-Control-Allow-Origin", 
request.getHeader("Origin"));
 +        }
 +        response.setHeader("Access-Control-Allow-Headers", "Origin, 
X-Requested-With, Content-Type, Accept");
      }
  
      private static ResultDelivery parseResultDelivery(String mode) {
@@@ -510,20 -524,38 +526,20 @@@
      }
  
      private void handleRequest(IServletRequest request, IServletResponse 
response) throws IOException {
 -        QueryServiceRequestParameters param = getRequestParameters(request);
 -        LOGGER.info("handleRequest: {}", param);
 +        final IRequestReference requestRef = receptionist.welcome(request);
          long elapsedStart = System.nanoTime();
 -        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();
 -
 +        long errorCount = 1;
          Stats stats = new Stats();
          RequestExecutionState execution = new RequestExecutionState();
 -
 -        // buffer the output until we are ready to set the status of the 
response message correctly
 -        sessionOutput.hold();
 -        sessionOutput.out().print("{\n");
 -        printRequestId(sessionOutput.out());
 -        printClientContextID(sessionOutput.out(), param);
 -        printSignature(sessionOutput.out(), param);
 -        printType(sessionOutput.out(), sessionConfig);
 -        long errorCount = 1; // so far we just return 1 error
 -        List<ExecutionWarning> warnings = Collections.emptyList(); // we 
don't have any warnings yet
 +        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();
          try {
 -            if (param.getStatement() == null || 
param.getStatement().isEmpty()) {
 -                throw new 
RuntimeDataException(ErrorCode.NO_STATEMENT_PROVIDED);
 -            }
 -            String statementsText = param.getStatement() + ";";
 +            // buffer the output until we are ready to set the status of the 
response message correctly
 +            sessionOutput.hold();
 +            sessionOutput.out().print("{\n");
              Map<String, String> optionalParams = null;
              if (optionalParamProvider != null) {
                  optionalParams = optionalParamProvider.apply(request);
diff --cc 
asterixdb/asterix-app/src/test/java/org/apache/asterix/api/common/AsterixHyracksIntegrationUtil.java
index 9c24821,ae13e42..6eac23b
--- 
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,6 +117,8 @@@ public class AsterixHyracksIntegrationU
      }
  
      public void init(boolean deleteOldInstanceData, String confFile) throws 
Exception { //NOSONAR
++        configureExternalLibDir();
++
          final ICCApplication ccApplication = createCCApplication();
          if (confFile == null) {
              configManager = new ConfigManager();
@@@ -184,6 -180,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 --cc 
asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/CancellationTestExecutor.java
index 242c0dd,969d23d..564672a
--- 
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/CancellationTestExecutor.java
+++ 
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/CancellationTestExecutor.java
@@@ -49,9 -50,8 +50,9 @@@ public class CancellationTestExecutor e
  
      @Override
      public InputStream executeQueryService(String str, 
TestCaseContext.OutputFormat fmt, URI uri,
-             List<TestCase.CompilationUnit.Parameter> params, boolean 
jsonEncoded,
+             List<TestCase.CompilationUnit.Parameter> params, boolean 
jsonEncoded, Charset responseCharset,
              Predicate<Integer> responseCodeValidator, boolean cancellable) 
throws Exception {
 +        cancellable = cancellable && !containsClientContextID(str);
          String clientContextId = UUID.randomUUID().toString();
          final List<TestCase.CompilationUnit.Parameter> newParams = cancellable
                  ? upsertParam(params, "client_context_id", 
ParameterTypeEnum.STRING, clientContextId) : params;
diff --cc 
asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/ResultExtractor.java
index 705624a,de7dac2..c503579
--- 
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,8 +19,7 @@@
  package org.apache.asterix.test.common;
  
  import java.io.InputStream;
- import java.nio.charset.StandardCharsets;
+ import java.nio.charset.Charset;
 -import java.nio.charset.StandardCharsets;
  import java.util.EnumSet;
  import java.util.HashMap;
  import java.util.Iterator;
diff --cc 
asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java
index aed65e6,683d5c8..f621d34
--- 
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
@@@ -36,9 -37,10 +38,11 @@@ import java.net.InetSocketAddress
  import java.net.Socket;
  import java.net.URI;
  import java.net.URISyntaxException;
- import java.nio.charset.StandardCharsets;
+ import java.nio.CharBuffer;
+ 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;
@@@ -159,6 -156,8 +161,9 @@@ public class TestExecutor 
      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
       */
@@@ -182,6 -181,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) {
@@@ -229,22 -227,11 +235,22 @@@
                  }
                  return;
              } else if (actualFile.toString().endsWith(".regex")) {
-                 runScriptAndCompareWithResultRegex(scriptFile, expectedFile, 
actualFile);
+                 runScriptAndCompareWithResultRegex(scriptFile, 
readerExpected, readerActual);
                  return;
              } else if (actualFile.toString().endsWith(".regexadm")) {
-                 runScriptAndCompareWithResultRegexAdm(scriptFile, 
expectedFile, actualFile);
+                 runScriptAndCompareWithResultRegexAdm(scriptFile, 
readerExpected, readerActual);
                  return;
 +            } else if (actualFile.toString().endsWith(".regexjson")) {
 +                ObjectMapper OM = new ObjectMapper();
 +                JsonNode expectedJson = OM.readTree(readerExpected);
 +                JsonNode actualJson = OM.readTree(readerActual);
 +                if (expectedJson == null || actualJson == null) {
 +                    throw new NullPointerException("Error parsing expected or 
actual result file for " + scriptFile);
 +                }
 +                if (!TestHelper.equalJson(expectedJson, actualJson)) {
 +                    throw new ComparisonException("Result for " + scriptFile 
+ " didn't match the expected JSON");
 +                }
 +                return;
              }
              String lineExpected, lineActual;
              int num = 1;
@@@ -629,6 -612,49 +636,55 @@@
          return response.getEntity().getContent();
      }
  
+     private Charset selectCharset(File result) throws IOException {
+         // choose an encoding that works for this input
+         return selectCharset(FileUtils.readFileToString(result, UTF_8));
+     }
+ 
+     private Charset selectCharset(String payload) {
+         // choose an encoding that works for this input
+         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();
+                     if (test.test(next)) {
+                         iter.remove();
+                         return next;
+                     }
+                 }
 -                List<Charset> allCharsets = 
Charset.availableCharsets().values().stream()
 -                        .filter(c -> canEncodeDecode(c, 
"\n\t\\[]{}'\"")).collect(Collectors.toList());
+                 Collections.shuffle(allCharsets);
+                 charsetsRemaining.addAll(allCharsets);
+             }
+         }
+     }
+ 
+     // duplicated from hyracks-test-support as transitive dependencies on 
test-jars are not handled correctly
+     private static boolean canEncodeDecode(Charset charset, String input) {
+         try {
+             if (input.equals(new String(input.getBytes(charset), charset))) {
+                 // workaround for 
https://bugs.openjdk.java.net/browse/JDK-6392670 and similar
+                 if 
(input.equals(charset.decode(charset.encode(CharBuffer.wrap(input))).toString()))
 {
+                     return true;
+                 }
+             }
+         } catch (Exception e) {
+             LOGGER.debug("cannot encode / decode {} with {} due to 
exception", input, charset.displayName(), e);
+         }
+         return false;
+     }
+ 
      protected List<Parameter> upsertParam(List<Parameter> params, String 
name, ParameterTypeEnum type, String value) {
          boolean replaced = false;
          List<Parameter> result = new ArrayList<>();
@@@ -1228,18 -1251,14 +1282,19 @@@
          URI uri = testFile.getName().endsWith("aql") ? 
getEndpoint(Servlets.QUERY_AQL)
                  : getEndpoint(Servlets.QUERY_SERVICE);
          boolean isJsonEncoded = 
isJsonEncoded(extractHttpRequestType(statement));
+         Charset responseCharset = expectedResultFile == null ? UTF_8 : 
selectCharset(expectedResultFile);
          InputStream resultStream;
          if (DELIVERY_IMMEDIATE.equals(delivery)) {
-             resultStream =
-                     executeQueryService(statement, fmt, uri, params, 
isJsonEncoded, null, isCancellable(reqType));
+             resultStream = executeQueryService(statement, fmt, uri, params, 
isJsonEncoded, responseCharset, null,
+                     isCancellable(reqType));
 -            resultStream =
 -                    METRICS_QUERY_TYPE.equals(reqType) ? 
ResultExtractor.extractMetrics(resultStream, responseCharset)
 -                            : ResultExtractor.extract(resultStream, 
responseCharset);
 +            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;
 +            }
          } else {
              String handleVar = getHandleVariable(statement);
              resultStream = executeQueryService(statement, fmt, uri,
@@@ -1805,8 -1806,20 +1859,8 @@@
              ArrayList<String> toBeDropped = new ArrayList<>();
              InputStream resultStream = executeQueryService(
                      "select dv.DataverseName from Metadata.`Dataverse` as dv 
order by dv.DataverseName;",
 -                    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;
 -            }
 +                    getEndpoint(Servlets.QUERY_SERVICE), 
OutputFormat.CLEAN_JSON);
-             JsonNode result = extractResult(IOUtils.toString(resultStream, 
StandardCharsets.UTF_8));
++            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 --cc 
asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/ExecutionTestUtil.java
index b4c5b26,b4c5b26..05a301c
--- 
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,15 +43,6 @@@ public class ExecutionTestUtil 
  
      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 --cc 
hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/FullResponse.java
index f1ff92c,b42db39..417d082
--- 
a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/FullResponse.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/FullResponse.java
@@@ -49,12 -50,14 +49,12 @@@ public class FullResponse implements IS
      private PrintWriter writer;
      private ChannelFuture future;
  
 -    public FullResponse(ChannelHandlerContext ctx, FullHttpRequest request) {
 +    public FullResponse(HttpServerHandler<?> handler, ChannelHandlerContext 
ctx, FullHttpRequest request) {
 +        this.handler = handler;
          this.ctx = ctx;
-         baos = new ByteArrayOutputStream();
+         baos = new ByteArrayOutputStream(4096);
          response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, 
HttpResponseStatus.INTERNAL_SERVER_ERROR);
 -        keepAlive = HttpUtil.isKeepAlive(request);
 -        if (keepAlive) {
 -            response.headers().set(HttpHeaderNames.CONNECTION, 
HttpHeaderValues.KEEP_ALIVE);
 -        }
 +        HttpUtil.setConnectionHeader(request, response);
      }
  
      @Override
diff --cc 
hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/utils/HttpUtil.java
index 1a51318,6e4a273..78b5096
--- 
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
@@@ -174,13 -174,7 +179,13 @@@ public class HttpUtil 
          return clusterURL;
      }
  
 +    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) {
          return getPreferredCharset(request, DEFAULT_RESPONSE_CHARSET);
      }
  

Reply via email to