set HTTP status code before writing the result

Change-Id: I46adb4aeaaa1ada6669b7535bb6d0879a26bc319
Reviewed-on: https://asterix-gerrit.ics.uci.edu/1134
Sonar-Qube: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: Michael Blow <mblow@apache.org>
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/servlet/QueryServiceServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/servlet/QueryServiceServlet.java
index b4097d1..3b69dd1 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/servlet/QueryServiceServlet.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/servlet/QueryServiceServlet.java
@@ -342,7 +342,7 @@
         printField(pw, ErrorField.CODE.str(), "1");
         final String msg = rootCause.getMessage();
         printField(pw, ErrorField.MSG.str(),
-                JSONUtil.escape(rootCause.getClass().getName() + ": " + msg != null ? msg : ""), addStack);
+                JSONUtil.escape(rootCause.getClass().getName() + ": " + (msg != null ? msg : "")), addStack);
         if (addStack) {
             StringWriter sw = new StringWriter();
             PrintWriter stackWriter = new PrintWriter(sw);
@@ -453,10 +453,10 @@
 
         GlobalConfig.ASTERIX_LOGGER.log(Level.SEVERE, result);
 
+        response.setStatus(respCode);
         response.getWriter().print(result);
         if (response.getWriter().checkError()) {
             LOGGER.warning("Error flushing output writer");
         }
-        response.setStatus(respCode);
     }
 }
diff --git a/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/aql/TestExecutor.java b/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/aql/TestExecutor.java
index 3e16802..52237d8 100644
--- a/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/aql/TestExecutor.java
+++ b/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/aql/TestExecutor.java
@@ -250,21 +250,25 @@
         }
     }
 
+    protected HttpResponse executeAndCheckHttpRequest(HttpUriRequest method) throws Exception {
+        return checkResponse(executeHttpRequest(method));
+    }
+
     protected HttpResponse executeHttpRequest(HttpUriRequest method) throws Exception {
         HttpClient client = HttpClients.custom()
                 .setRetryHandler(StandardHttpRequestRetryHandler.INSTANCE)
                 .build();
-        HttpResponse httpResponse;
-
         try {
-            httpResponse = client.execute(method);
+            return client.execute(method);
         } catch (Exception e) {
             GlobalConfig.ASTERIX_LOGGER.log(Level.SEVERE, e.getMessage(), e);
             e.printStackTrace();
             throw e;
         }
-        int statusCode = httpResponse.getStatusLine().getStatusCode();
-        if (statusCode != HttpStatus.SC_OK) {
+    }
+
+    protected HttpResponse checkResponse(HttpResponse httpResponse) throws Exception {
+        if (httpResponse.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
             // QQQ For now, we are indeed assuming we get back JSON errors.
             // In future this may be changed depending on the requested
             // output format sent to the servlet.
@@ -294,7 +298,7 @@
         HttpUriRequest method = constructHttpMethod(str, url, "query", false, params);
         // Set accepted output response type
         method.setHeader("Accept", fmt.mimeType());
-        HttpResponse response = executeHttpRequest(method);
+        HttpResponse response = executeAndCheckHttpRequest(method);
         return response.getEntity().getContent();
     }
 
@@ -368,7 +372,7 @@
     public InputStream executeClusterStateQuery(OutputFormat fmt, String url) throws Exception {
         HttpUriRequest request = RequestBuilder.get(url).setHeader("Accept", fmt.mimeType()).build();
 
-        HttpResponse response = executeHttpRequest(request);
+        HttpResponse response = executeAndCheckHttpRequest(request);
         return response.getEntity().getContent();
     }
 
@@ -381,7 +385,7 @@
                 .build();
 
         // Execute the method.
-        executeHttpRequest(request);
+        executeAndCheckHttpRequest(request);
     }
 
     // Executes AQL in either async or async-defer mode.
@@ -393,7 +397,7 @@
                 .setHeader("Accept", fmt.mimeType())
                 .build();
 
-        HttpResponse response = executeHttpRequest(request);
+        HttpResponse response = executeAndCheckHttpRequest(request);
         InputStream resultStream = response.getEntity().getContent();
 
         String theHandle = IOUtils.toString(resultStream, "UTF-8");
@@ -412,7 +416,7 @@
                 .setHeader("Accept", fmt.mimeType())
                 .build();
 
-        HttpResponse response = executeHttpRequest(request);
+        HttpResponse response = executeAndCheckHttpRequest(request);
         return response.getEntity().getContent();
     }
 
@@ -429,7 +433,7 @@
                 .build();
 
         // Execute the method.
-        executeHttpRequest(request);
+        executeAndCheckHttpRequest(request);
     }
 
     // Method that reads a DDL/Update/Query File