From 4d81b4675fa5e9c196e7de53e1069ec5fc45f87b Mon Sep 17 00:00:00 2001 From: "shrek.wang" Date: Wed, 15 Aug 2012 16:23:08 +0800 Subject: [PATCH] refactor sql-{id}.html to render data in html, and return more data in sql-{id}.json --- .../java/com/alibaba/druid/sql/SQLUtils.java | 4 +- .../druid/support/JSONDruidStatService.java | 32 ++++++- .../druid/support/http/StatViewServlet.java | 92 ++----------------- .../support/http/resources/js/sqlDetail.js | 23 +++++ .../support/http/resources/sqlDetail.html | 81 ++++++++++++++++ 5 files changed, 144 insertions(+), 88 deletions(-) create mode 100644 src/main/resources/support/http/resources/js/sqlDetail.js create mode 100644 src/main/resources/support/http/resources/sqlDetail.html diff --git a/src/main/java/com/alibaba/druid/sql/SQLUtils.java b/src/main/java/com/alibaba/druid/sql/SQLUtils.java index a05d04f77d..ee7daf6dcf 100644 --- a/src/main/java/com/alibaba/druid/sql/SQLUtils.java +++ b/src/main/java/com/alibaba/druid/sql/SQLUtils.java @@ -135,7 +135,9 @@ public class SQLUtils { return out.toString(); } catch (SQLParseException ex) { LOG.warn("format error", ex); - + return sql; + } catch (ParserException ex) { + LOG.warn("format error", ex); return sql; } } diff --git a/src/main/java/com/alibaba/druid/support/JSONDruidStatService.java b/src/main/java/com/alibaba/druid/support/JSONDruidStatService.java index 9718685702..5f85b2dbaf 100644 --- a/src/main/java/com/alibaba/druid/support/JSONDruidStatService.java +++ b/src/main/java/com/alibaba/druid/support/JSONDruidStatService.java @@ -1,5 +1,11 @@ package com.alibaba.druid.support; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.visitor.SchemaStatVisitor; +import com.alibaba.druid.sql.SQLUtils; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; @@ -82,9 +88,7 @@ public class JSONDruidStatService { if (url.startsWith("/sql-") && url.indexOf(".json") > 0) { Integer id = StringUtils.subStringToInteger(url, "sql-", ".json"); - - Object result = druidStatManager.getSqlStatData(id); - return returnJSONResult(result == null ? RESULT_CODE_ERROR : RESULT_CODE_SUCCESS, result); + return returnJSONSqlInfo(id); } if (url.startsWith("/weburi.json")) { @@ -162,6 +166,28 @@ public class JSONDruidStatService { return comparatorOrderBy(array, parameters); } + private String returnJSONSqlInfo(Integer id) { + Map map = druidStatManager.getSqlStatData(id); + map.put("formattedSql",SQLUtils.format((String) map.get("SQL"),(String) map.get("DbType"))); + List statementList = SQLUtils.parseStatements((String) map.get("SQL"), (String) map.get("DbType")); + + if (!statementList.isEmpty()) { + SQLStatement statemen = statementList.get(0); + SchemaStatVisitor visitor = SQLUtils.createSchemaStatVisitor(statementList, (String) map.get("DbType")); + statemen.accept(visitor); + map.put("parsedTable", visitor.getTables().toString()); + map.put("parsedFields", visitor.getColumns().toString()); + map.put("parsedConditions", visitor.getConditions().toString()); + map.put("parsedRelationships", visitor.getRelationships().toString()); + map.put("parsedOrderbycolumns", visitor.getOrderByColumns().toString()); + } + + DateFormat format = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss:SSS"); + map.put("MaxTimespanOccurTime", format.format(map.get("MaxTimespanOccurTime"))); + + return returnJSONResult(map == null ? RESULT_CODE_ERROR : RESULT_CODE_SUCCESS, map); + } + private String returnJSONActiveConnectionStackTrace(Integer id) { List result = druidStatManager.getActiveConnectionStackTraceByDataSourceId(id); diff --git a/src/main/java/com/alibaba/druid/support/http/StatViewServlet.java b/src/main/java/com/alibaba/druid/support/http/StatViewServlet.java index 241a11c959..33a9ab20a5 100644 --- a/src/main/java/com/alibaba/druid/support/http/StatViewServlet.java +++ b/src/main/java/com/alibaba/druid/support/http/StatViewServlet.java @@ -41,7 +41,7 @@ public class StatViewServlet extends HttpServlet { private static JSONDruidStatService jsonDruidStatService = JSONDruidStatService.getInstance(); public String templatePage; - private static DateFormat format = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss:SSS"); + private String permittedIp; private Pattern ipCheckPattern; @@ -127,7 +127,7 @@ public class StatViewServlet extends HttpServlet { if (path.startsWith("/sql-") && path.endsWith(".html")) { Integer id = StringUtils.subStringToInteger(path, "sql-", "."); - returnViewSqlStat(druidStatManager.getSqlStatData(id), response); + returnViewSqlStat(id, request,response); return; } @@ -150,87 +150,14 @@ public class StatViewServlet extends HttpServlet { response.getWriter().print(text); } - private void returnViewSqlStat(Map sqlStat, HttpServletResponse response) throws IOException { - if (sqlStat == null) return; - - StringBuilder content = new StringBuilder(); - - content.append("

FULL SQL

" + sqlStat.get("SQL") + "

"); - content.append("

Format View:

"); - content.append("
"); - content.append("

API:com.alibaba.druid.sql.SQLUtils.format(sql,DBType);

"); - content.append("
"); - - if (sqlStat.get("LastSlowParameters") != null - && sqlStat.get("LastSlowParameters").toString().trim().length() > 0) { - content.append("

LastSlow SQL View:

"); - content.append(""); - content.append(""); - content.append(""); - content.append(""); - content.append(""); - content.append(""); - content.append(""); - content.append(""); - content.append(""); - content.append("
SlowestSqlOccurTime" + format.format(sqlStat.get("MaxTimespanOccurTime")) + "
LastSlowParameters" + sqlStat.get("LastSlowParameters") + "
"); - content.append("
"); - } - - List statementList = SQLUtils.parseStatements((String) sqlStat.get("SQL"), - (String) sqlStat.get("DbType")); - - if (!statementList.isEmpty()) { - content.append("

Parse View:

"); - - SQLStatement statemen = statementList.get(0); - SchemaStatVisitor visitor = SQLUtils.createSchemaStatVisitor(statementList, (String) sqlStat.get("DbType")); - statemen.accept(visitor); - content.append(""); - content.append(""); - content.append(""); - content.append(""); - content.append(""); - - content.append(""); - content.append(""); - content.append(""); - content.append(""); - content.append(""); - content.append(""); - content.append(""); - content.append(""); - - content.append(""); - content.append(""); - content.append(""); - content.append(""); - - content.append(""); - content.append(""); - content.append(""); - content.append(""); - - content.append("
Tables" + visitor.getTables() + "
Fields" + visitor.getColumns() + "
Coditions" + visitor.getConditions() + "
Relationships" + visitor.getRelationships() + "
OrderByColumns" + visitor.getOrderByColumns() + "
"); - - content.append("
"); - content.append("

API:

"); - content.append("

"); - content.append("List statementList = SQLUtils.parseStatements(sqlStat.getSql(), sqlStat.getDbType())
"); - content.append("SQLStatement statemen = statementList.get(0);
"); - content.append("SchemaStatVisitor visitor = SQLUtils.createSchemaStatVisitor(statementList, sqlStat.getDbType());
"); - content.append("statemen.accept(visitor);
"); - content.append("visitor.getTables() / visitor.getColumns() / visitor.getOrderByColumns() / visitor.getConditions() / visitor.getRelationships()
"); - content.append("

"); - content.append("
"); - } - - response.getWriter().print(mergeTemplatePage("Druid Sql View", content.toString())); - + private void returnViewSqlStat(Integer id, HttpServletRequest request, HttpServletResponse response) throws IOException { + String text = IOUtils.readFromResource(RESOURCE_PATH + "/sqlDetail.html"); + text = text.replaceAll("\\{sqlId\\}", id.toString()); + response.getWriter().print(text); } + + private void returnResourceFile(String fileName, String uri, HttpServletResponse response) throws ServletException, IOException { String text = IOUtils.readFromResource(RESOURCE_PATH + fileName); if(text == null) { @@ -245,7 +172,4 @@ public class StatViewServlet extends HttpServlet { response.getWriter().write(text); } - private String mergeTemplatePage(String title, String content) { - return templatePage.replaceAll("\\{title\\}", title).replaceAll("\\{content\\}", content); - } } diff --git a/src/main/resources/support/http/resources/js/sqlDetail.js b/src/main/resources/support/http/resources/js/sqlDetail.js new file mode 100644 index 0000000000..e7bb9ffee3 --- /dev/null +++ b/src/main/resources/support/http/resources/js/sqlDetail.js @@ -0,0 +1,23 @@ +function ajaxRequestForSqlInfo(datasourceId) { + xmlHttpForConnectionInfo = getRequestObject(); + sendRequest(xmlHttpForConnectionInfo, 'sql-' + datasourceId + '.json', ajaxResponseForSqlInfo) +} + +function ajaxResponseForSqlInfo() { + var sqlInfo = getJSONResponseContent(xmlHttpForConnectionInfo); + if (sqlInfo == null) + return; + + changeInnerHtml("fullSql",sqlInfo.SQL); + changeInnerHtml("formattedSql",sqlInfo.formattedSql); + changeInnerHtml("parsed.table",sqlInfo.parsedTable); + changeInnerHtml("parsed.fields",sqlInfo.parsedFields); + changeInnerHtml("parsed.conditions",sqlInfo.parsedConditions); + changeInnerHtml("parsed.relationships",sqlInfo.parsedRelationships); + changeInnerHtml("parsed.orderbycolumns",sqlInfo.parsedOrderbycolumns); + + changeInnerHtml("MaxTimespanOccurTime",sqlInfo.MaxTimespanOccurTime); + changeInnerHtml("LastSlowParameters",sqlInfo.LastSlowParameters); + changeInnerHtml("MaxTimespan",sqlInfo.MaxTimespan); + +} diff --git a/src/main/resources/support/http/resources/sqlDetail.html b/src/main/resources/support/http/resources/sqlDetail.html new file mode 100644 index 0000000000..e06566c7c6 --- /dev/null +++ b/src/main/resources/support/http/resources/sqlDetail.html @@ -0,0 +1,81 @@ + + + + + + + + + + + +
+ + +
+
+

FULL SQL

+

+

Format View:

+ +
+
+

Parse View:

+ + + + + + + + + + + + + + + + + + + + +
Tables
Fields
Coditions
Relationships
OrderByColumns
+
+ +

LastSlow SQL View:

+ + + + + + + + + + + + + +
MaxTimespan
MaxTimespanOccurTime
LastSlowParameters
+ + +
+ +