mirror of
https://github.com/apache/zeppelin
synced 2026-05-24 09:38:26 +00:00
ZEPPELIN-3014: NPE bug fix and Error message enhancement with Kylin Interpreter
This commit is contained in:
parent
38ba2d4756
commit
4596470051
2 changed files with 106 additions and 28 deletions
|
|
@ -0,0 +1,63 @@
|
|||
/*
|
||||
* 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.zeppelin.kylin;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.JsonSyntaxException;
|
||||
import org.apache.zeppelin.common.JsonSerializable;
|
||||
|
||||
/**
|
||||
* class for Kylin Error Response.
|
||||
*/
|
||||
class KylinErrorResponse implements JsonSerializable {
|
||||
private static final Gson gson = new Gson();
|
||||
|
||||
private String stacktrace;
|
||||
private String exception;
|
||||
private String url;
|
||||
private String code;
|
||||
private Object data;
|
||||
private String msg;
|
||||
|
||||
public KylinErrorResponse(String stacktrace, String exception, String url,
|
||||
String code, Object data, String msg) {
|
||||
this.stacktrace = stacktrace;
|
||||
this.exception = exception;
|
||||
this.url = url;
|
||||
this.code = code;
|
||||
this.data = data;
|
||||
this.msg = msg;
|
||||
}
|
||||
|
||||
public String getException() {
|
||||
return exception;
|
||||
}
|
||||
|
||||
public String toJson() {
|
||||
return gson.toJson(this);
|
||||
}
|
||||
|
||||
public static KylinErrorResponse fromJson(String json) {
|
||||
try {
|
||||
return gson.fromJson(json, KylinErrorResponse.class);
|
||||
} catch (JsonSyntaxException ex) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -18,6 +18,7 @@
|
|||
package org.apache.zeppelin.kylin;
|
||||
|
||||
import org.apache.commons.codec.binary.Base64;
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import org.apache.http.HttpResponse;
|
||||
import org.apache.http.client.HttpClient;
|
||||
import org.apache.http.client.methods.HttpPost;
|
||||
|
|
@ -30,9 +31,7 @@ import org.apache.zeppelin.interpreter.thrift.InterpreterCompletion;
|
|||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.util.List;
|
||||
import java.util.Properties;
|
||||
import java.util.regex.Matcher;
|
||||
|
|
@ -166,28 +165,42 @@ public class KylinInterpreter extends Interpreter {
|
|||
}
|
||||
|
||||
private InterpreterResult executeQuery(String sql) throws IOException {
|
||||
|
||||
HttpResponse response = prepareRequest(sql);
|
||||
String result;
|
||||
|
||||
if (response.getStatusLine().getStatusCode() != 200) {
|
||||
logger.error("failed to execute query: " + response.getEntity().getContent().toString());
|
||||
return new InterpreterResult(InterpreterResult.Code.ERROR,
|
||||
"Failed : HTTP error code " + response.getStatusLine().getStatusCode());
|
||||
try {
|
||||
int code = response.getStatusLine().getStatusCode();
|
||||
result = IOUtils.toString(response.getEntity().getContent(), "UTF-8");
|
||||
|
||||
if (code != 200) {
|
||||
StringBuilder errorMessage = new StringBuilder("Failed : HTTP error code " + code);
|
||||
logger.error("Failed to execute query: " + result);
|
||||
|
||||
KylinErrorResponse kylinErrorResponse = KylinErrorResponse.fromJson(result);
|
||||
if (kylinErrorResponse == null) {
|
||||
logger.error("Cannot get json from string: " + result);
|
||||
// when code is 401, the response is html, not json
|
||||
if (code == 401) {
|
||||
errorMessage.append(". Error message: Unauthorized. This request requires "
|
||||
+ "HTTP authentication. Please make sure your have set your credentials"
|
||||
+ " correctly.");
|
||||
} else {
|
||||
errorMessage.append(". Error message: " + result);
|
||||
}
|
||||
} else {
|
||||
String exception = kylinErrorResponse.getException();
|
||||
logger.error("The exception is " + exception);
|
||||
errorMessage.append(". Error message: " + exception);
|
||||
}
|
||||
|
||||
return new InterpreterResult(InterpreterResult.Code.ERROR, errorMessage.toString());
|
||||
}
|
||||
} catch (NullPointerException | IOException e) {
|
||||
throw new IOException(e);
|
||||
}
|
||||
|
||||
BufferedReader br = new BufferedReader(
|
||||
new InputStreamReader((response.getEntity().getContent())));
|
||||
StringBuilder sb = new StringBuilder();
|
||||
|
||||
String output;
|
||||
logger.info("Output from Server .... \n");
|
||||
while ((output = br.readLine()) != null) {
|
||||
logger.info(output);
|
||||
sb.append(output).append('\n');
|
||||
}
|
||||
InterpreterResult rett = new InterpreterResult(InterpreterResult.Code.SUCCESS,
|
||||
formatResult(sb.toString()));
|
||||
return rett;
|
||||
return new InterpreterResult(InterpreterResult.Code.SUCCESS,
|
||||
formatResult(result));
|
||||
}
|
||||
|
||||
String formatResult(String msg) {
|
||||
|
|
@ -205,16 +218,18 @@ public class KylinInterpreter extends Interpreter {
|
|||
table = mr.group(1);
|
||||
}
|
||||
|
||||
String[] row = table.split("],\\[");
|
||||
for (int i = 0; i < row.length; i++) {
|
||||
String[] col = row[i].split(",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)", -1);
|
||||
for (int j = 0; j < col.length; j++) {
|
||||
if (col[j] != null) {
|
||||
col[j] = col[j].replaceAll("^\"|\"$", "");
|
||||
if (table != null && !table.isEmpty()) {
|
||||
String[] row = table.split("],\\[");
|
||||
for (int i = 0; i < row.length; i++) {
|
||||
String[] col = row[i].split(",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)", -1);
|
||||
for (int j = 0; j < col.length; j++) {
|
||||
if (col[j] != null) {
|
||||
col[j] = col[j].replaceAll("^\"|\"$", "");
|
||||
}
|
||||
res.append(col[j] + " \t");
|
||||
}
|
||||
res.append(col[j] + " \t");
|
||||
res.append(" \n");
|
||||
}
|
||||
res.append(" \n");
|
||||
}
|
||||
return res.toString();
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue