From 80a6ac5801c1a7fd04785780b64df0753e88ffa4 Mon Sep 17 00:00:00 2001
From: datagear
Date: Wed, 29 Jan 2020 23:13:18 +0800
Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E7=9C=8B=E6=9D=BF=E6=A8=A1?=
=?UTF-8?q?=E6=9D=BF=E5=86=85=E7=9A=84=E5=9B=BE=E8=A1=A8=E5=AD=98=E5=9C=A8?=
=?UTF-8?q?=E8=B6=8A=E6=9D=83=E5=BC=95=E7=94=A8=E7=9A=84=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../analysis/support/ChartWidgetSource.java | 3 +-
.../html/HtmlTplDashboardWidgetRenderer.java | 54 +++++++++++++-
.../service/HtmlChartWidgetEntityService.java | 72 +++++++++++++++++++
.../HtmlTplDashboardWidgetEntityService.java | 2 +-
.../service/{impl => }/ServiceContext.java | 14 +++-
.../impl/AuthorizationQueryContext.java | 1 +
.../HtmlChartWidgetEntityServiceImpl.java | 11 ++-
...mlTplDashboardWidgetEntityServiceImpl.java | 5 +-
.../web/controller/DashboardController.java | 41 +++++++----
9 files changed, 178 insertions(+), 25 deletions(-)
rename datagear-management/src/main/java/org/datagear/management/service/{impl => }/ServiceContext.java (80%)
diff --git a/datagear-analysis/src/main/java/org/datagear/analysis/support/ChartWidgetSource.java b/datagear-analysis/src/main/java/org/datagear/analysis/support/ChartWidgetSource.java
index ca755a93..0ac84ed7 100644
--- a/datagear-analysis/src/main/java/org/datagear/analysis/support/ChartWidgetSource.java
+++ b/datagear-analysis/src/main/java/org/datagear/analysis/support/ChartWidgetSource.java
@@ -19,6 +19,7 @@ public interface ChartWidgetSource
*
* @param id
* @return
+ * @throws Throwable
*/
- ChartWidget getChartWidget(String id);
+ ChartWidget getChartWidget(String id) throws Throwable;
}
diff --git a/datagear-analysis/src/main/java/org/datagear/analysis/support/html/HtmlTplDashboardWidgetRenderer.java b/datagear-analysis/src/main/java/org/datagear/analysis/support/html/HtmlTplDashboardWidgetRenderer.java
index 24b24156..32ada161 100644
--- a/datagear-analysis/src/main/java/org/datagear/analysis/support/html/HtmlTplDashboardWidgetRenderer.java
+++ b/datagear-analysis/src/main/java/org/datagear/analysis/support/html/HtmlTplDashboardWidgetRenderer.java
@@ -90,6 +90,8 @@ public abstract class HtmlTplDashboardWidgetRenderer htmlChartPluginForWidgetGetException = new ValueHtmlChartPlugin(
+ StringUtil.firstLowerCase(Global.PRODUCT_NAME_EN) + "HtmlChartPluginForWidgetGetException",
+ PROPERTY_VALUE_FOR_WIDGET_GET_EXCEPTION);
+
private HtmlChartPlugin htmlChartPluginForWidgetNotFound = new ValueHtmlChartPlugin(
StringUtil.firstLowerCase(Global.PRODUCT_NAME_EN) + "HtmlChartPluginForWidgetNotFound",
PROPERTY_VALUE_FOR_WIDGET_NOT_FOUND);
@@ -223,6 +229,17 @@ public abstract class HtmlTplDashboardWidgetRenderer getHtmlChartPluginForWidgetGetException()
+ {
+ return htmlChartPluginForWidgetGetException;
+ }
+
+ public void setHtmlChartPluginForWidgetGetException(
+ HtmlChartPlugin htmlChartPluginForWidgetGetException)
+ {
+ this.htmlChartPluginForWidgetGetException = htmlChartPluginForWidgetGetException;
+ }
+
public HtmlChartPlugin getHtmlChartPluginForWidgetNotFound()
{
return htmlChartPluginForWidgetNotFound;
@@ -612,7 +629,16 @@ public abstract class HtmlTplDashboardWidgetRenderer
- * 此方法不会返回{@code null},如果找不到指定ID的{@linkplain ChartWidget},它将返回{@linkplain #htmlChartWidgetForNotFound}。
+ * 此方法不会返回{@code null}。
+ *
+ *
+ * 如果没有找到,则返回{@linkplain #createHtmlChartWidgetForNotFound(String)}。
+ *
+ *
+ * 如果出现异常,则返回{@linkplain #createHtmlChartWidgetForGetException(String, Throwable)}。
+ *
+ *
+ * 如果{@linkplain HtmlChartWidget#getChartPlugin()}为{@code null},则返回{@linkplain #createHtmlChartWidgetForPluginNull(ChartWidget)}。
*
*
* @param renderContext
@@ -622,7 +648,19 @@ public abstract class HtmlTplDashboardWidgetRenderer getHtmlChartWidgetForRender(HtmlRenderContext renderContext, String id)
{
- ChartWidget chartWidget = (StringUtil.isEmpty(id) ? null : this.chartWidgetSource.getChartWidget(id));
+ ChartWidget chartWidget = null;
+
+ if (!StringUtil.isEmpty(id))
+ {
+ try
+ {
+ chartWidget = this.chartWidgetSource.getChartWidget(id);
+ }
+ catch(Throwable t)
+ {
+ chartWidget = createHtmlChartWidgetForGetException(id, t);
+ }
+ }
if (chartWidget == null)
chartWidget = createHtmlChartWidgetForNotFound(id);
@@ -633,6 +671,18 @@ public abstract class HtmlTplDashboardWidgetRenderer) chartWidget;
}
+ protected HtmlChartWidget createHtmlChartWidgetForGetException(String exceptionWidgetId,
+ Throwable t)
+ {
+ HtmlChartWidget widget = new HtmlChartWidget(IDUtil.uuid(),
+ "HtmlChartWidgetForWidgetGetException", this.htmlChartPluginForWidgetGetException);
+
+ widget.addChartPropertyValue(PROPERTY_VALUE_FOR_WIDGET_GET_EXCEPTION,
+ "Chart '" + (exceptionWidgetId == null ? "" : exceptionWidgetId) + "' exception : " + t.getMessage());
+
+ return widget;
+ }
+
protected HtmlChartWidget createHtmlChartWidgetForNotFound(String notFoundWidgetId)
{
HtmlChartWidget widget = new HtmlChartWidget(IDUtil.uuid(),
diff --git a/datagear-management/src/main/java/org/datagear/management/service/HtmlChartWidgetEntityService.java b/datagear-management/src/main/java/org/datagear/management/service/HtmlChartWidgetEntityService.java
index 73b93a7a..40b8c3fa 100644
--- a/datagear-management/src/main/java/org/datagear/management/service/HtmlChartWidgetEntityService.java
+++ b/datagear-management/src/main/java/org/datagear/management/service/HtmlChartWidgetEntityService.java
@@ -9,6 +9,7 @@ package org.datagear.management.service;
import org.datagear.analysis.support.ChartWidgetSource;
import org.datagear.management.domain.HtmlChartWidgetEntity;
+import org.datagear.management.domain.User;
/**
* {@linkplain HtmlChartWidgetEntity}业务服务接口。
@@ -19,5 +20,76 @@ import org.datagear.management.domain.HtmlChartWidgetEntity;
public interface HtmlChartWidgetEntityService
extends DataPermissionEntityService, ChartWidgetSource
{
+ /**
+ * {@linkplain ChartWidgetSource}上下文。
+ *
+ * {@linkplain ChartWidgetSource#getChartWidget(String)}实现方法可以使用此类处理权限。
+ *
+ *
+ * @author datagear@163.com
+ *
+ */
+ class ChartWidgetSourceContext
+ {
+ protected static final String NAME_FOR_SERVICE_CONTEXT = ChartWidgetSourceContext.class.getName();
+ private User user;
+ public ChartWidgetSourceContext()
+ {
+ super();
+ }
+
+ public ChartWidgetSourceContext(User user)
+ {
+ super();
+ this.user = user;
+ }
+
+ public boolean hasUser()
+ {
+ return (this.user != null);
+ }
+
+ public User getUser()
+ {
+ return user;
+ }
+
+ public void setUser(User user)
+ {
+ this.user = user;
+ }
+
+ /**
+ * 获取当前{@linkplain ChartWidgetSourceContext}线程变量,不会返回{@code null}。
+ *
+ * @return
+ */
+ public static ChartWidgetSourceContext get()
+ {
+ ChartWidgetSourceContext context = ServiceContext.get().getValue(NAME_FOR_SERVICE_CONTEXT);
+ if (context == null)
+ context = new ChartWidgetSourceContext();
+
+ return context;
+ }
+
+ /**
+ * 设置当前{@linkplain ChartWidgetSourceContext}至线程变量。
+ *
+ * @param context
+ */
+ public static void set(ChartWidgetSourceContext context)
+ {
+ ServiceContext.get().setValue(NAME_FOR_SERVICE_CONTEXT, context);
+ }
+
+ /**
+ * 移除当前{@linkplain ChartWidgetSourceContext}线程变量。
+ */
+ public static void remove()
+ {
+ ServiceContext.get().removeValue(NAME_FOR_SERVICE_CONTEXT);
+ }
+ }
}
diff --git a/datagear-management/src/main/java/org/datagear/management/service/HtmlTplDashboardWidgetEntityService.java b/datagear-management/src/main/java/org/datagear/management/service/HtmlTplDashboardWidgetEntityService.java
index a1ba563e..d1c0aa44 100644
--- a/datagear-management/src/main/java/org/datagear/management/service/HtmlTplDashboardWidgetEntityService.java
+++ b/datagear-management/src/main/java/org/datagear/management/service/HtmlTplDashboardWidgetEntityService.java
@@ -36,5 +36,5 @@ public interface HtmlTplDashboardWidgetEntityService
* @param id
* @return
*/
- HtmlTplDashboardWidget getHtmlTplDashboardWidget(User user, String id);
+ HtmlTplDashboardWidgetEntity getHtmlTplDashboardWidget(User user, String id);
}
diff --git a/datagear-management/src/main/java/org/datagear/management/service/impl/ServiceContext.java b/datagear-management/src/main/java/org/datagear/management/service/ServiceContext.java
similarity index 80%
rename from datagear-management/src/main/java/org/datagear/management/service/impl/ServiceContext.java
rename to datagear-management/src/main/java/org/datagear/management/service/ServiceContext.java
index fe67738f..696f4769 100644
--- a/datagear-management/src/main/java/org/datagear/management/service/impl/ServiceContext.java
+++ b/datagear-management/src/main/java/org/datagear/management/service/ServiceContext.java
@@ -2,7 +2,7 @@
* Copyright (c) 2018 datagear.tech. All Rights Reserved.
*/
-package org.datagear.management.service.impl;
+package org.datagear.management.service;
import java.util.HashMap;
import java.util.Map;
@@ -58,6 +58,18 @@ public class ServiceContext
return (T) this.values.get(name);
}
+ /**
+ * 移除上下文名字值。
+ *
+ * @param name
+ * @return
+ */
+ @SuppressWarnings("unchecked")
+ public T removeValue(String name)
+ {
+ return (T) this.values.remove(name);
+ }
+
/**
* 获取全部上下文名字值。
*
diff --git a/datagear-management/src/main/java/org/datagear/management/service/impl/AuthorizationQueryContext.java b/datagear-management/src/main/java/org/datagear/management/service/impl/AuthorizationQueryContext.java
index 3369e3ba..c022e851 100644
--- a/datagear-management/src/main/java/org/datagear/management/service/impl/AuthorizationQueryContext.java
+++ b/datagear-management/src/main/java/org/datagear/management/service/impl/AuthorizationQueryContext.java
@@ -7,6 +7,7 @@ package org.datagear.management.service.impl;
import java.io.Serializable;
import org.datagear.management.domain.Authorization;
+import org.datagear.management.service.ServiceContext;
/**
* {@linkplain Authorization}查询上下文。
diff --git a/datagear-management/src/main/java/org/datagear/management/service/impl/HtmlChartWidgetEntityServiceImpl.java b/datagear-management/src/main/java/org/datagear/management/service/impl/HtmlChartWidgetEntityServiceImpl.java
index e323bd33..a5dfa2a6 100644
--- a/datagear-management/src/main/java/org/datagear/management/service/impl/HtmlChartWidgetEntityServiceImpl.java
+++ b/datagear-management/src/main/java/org/datagear/management/service/impl/HtmlChartWidgetEntityServiceImpl.java
@@ -111,9 +111,16 @@ public class HtmlChartWidgetEntityServiceImpl
@SuppressWarnings("unchecked")
@Override
- public ChartWidget getChartWidget(String id)
+ public ChartWidget getChartWidget(String id) throws Throwable
{
- HtmlChartWidgetEntity entity = getById(id);
+ ChartWidgetSourceContext context = ChartWidgetSourceContext.get();
+
+ HtmlChartWidgetEntity entity = null;
+
+ if (context.hasUser())
+ entity = getById(context.getUser(), id);
+ else
+ entity = getById(id);
if (entity == null)
return null;
diff --git a/datagear-management/src/main/java/org/datagear/management/service/impl/HtmlTplDashboardWidgetEntityServiceImpl.java b/datagear-management/src/main/java/org/datagear/management/service/impl/HtmlTplDashboardWidgetEntityServiceImpl.java
index 1784f579..e62e9d47 100644
--- a/datagear-management/src/main/java/org/datagear/management/service/impl/HtmlTplDashboardWidgetEntityServiceImpl.java
+++ b/datagear-management/src/main/java/org/datagear/management/service/impl/HtmlTplDashboardWidgetEntityServiceImpl.java
@@ -12,7 +12,6 @@ import java.util.Map;
import org.apache.ibatis.session.SqlSessionFactory;
import org.datagear.analysis.support.html.HtmlRenderContext;
-import org.datagear.analysis.support.html.HtmlTplDashboardWidget;
import org.datagear.analysis.support.html.HtmlTplDashboardWidgetFmkRenderer;
import org.datagear.analysis.support.html.HtmlTplDashboardWidgetRenderer;
import org.datagear.management.domain.HtmlChartWidgetEntity;
@@ -87,9 +86,9 @@ public class HtmlTplDashboardWidgetEntityServiceImpl
}
@Override
- public HtmlTplDashboardWidget getHtmlTplDashboardWidget(User user, String id)
+ public HtmlTplDashboardWidgetEntity getHtmlTplDashboardWidget(User user, String id)
{
- HtmlTplDashboardWidget dashboard = getById(user, id);
+ HtmlTplDashboardWidgetEntity dashboard = getById(user, id);
if (dashboard != null)
dashboard.setRenderer(this.htmlTplDashboardWidgetRenderer);
diff --git a/datagear-web/src/main/java/org/datagear/web/controller/DashboardController.java b/datagear-web/src/main/java/org/datagear/web/controller/DashboardController.java
index 5d94464b..59bf5a66 100644
--- a/datagear-web/src/main/java/org/datagear/web/controller/DashboardController.java
+++ b/datagear-web/src/main/java/org/datagear/web/controller/DashboardController.java
@@ -30,6 +30,7 @@ import org.datagear.analysis.support.html.HtmlTplDashboardWidgetRenderer;
import org.datagear.analysis.support.html.HtmlTplDashboardWidgetRenderer.AddPrefixHtmlTitleHandler;
import org.datagear.management.domain.HtmlTplDashboardWidgetEntity;
import org.datagear.management.domain.User;
+import org.datagear.management.service.HtmlChartWidgetEntityService.ChartWidgetSourceContext;
import org.datagear.management.service.HtmlTplDashboardWidgetEntityService;
import org.datagear.persistence.PagingData;
import org.datagear.persistence.PagingQuery;
@@ -494,33 +495,43 @@ public class DashboardController extends AbstractDataAnalysisController
{
User user = WebUtils.getUser(request, response);
- HtmlTplDashboardWidget dashboardWidget = this.htmlTplDashboardWidgetEntityService
+ HtmlTplDashboardWidgetEntity dashboardWidget = this.htmlTplDashboardWidgetEntityService
.getHtmlTplDashboardWidget(user, id);
if (dashboardWidget == null)
throw new RecordNotFoundException();
- TemplateDashboardWidgetResManager dashboardWidgetResManager = this.htmlTplDashboardWidgetEntityService
- .getHtmlTplDashboardWidgetRenderer().getTemplateDashboardWidgetResManager();
+ // 上面已确保当前用户对此看板有读权限,这里则确保看板创建用户对看板模板内定义的图表有权限
+ ChartWidgetSourceContext.set(new ChartWidgetSourceContext(dashboardWidget.getCreateUser()));
- String responseEncoding = dashboardWidget.getTemplateEncoding();
+ try
+ {
+ TemplateDashboardWidgetResManager dashboardWidgetResManager = this.htmlTplDashboardWidgetEntityService
+ .getHtmlTplDashboardWidgetRenderer().getTemplateDashboardWidgetResManager();
- if (StringUtil.isEmpty(responseEncoding))
- responseEncoding = dashboardWidgetResManager.getDefaultEncoding();
+ String responseEncoding = dashboardWidget.getTemplateEncoding();
- response.setCharacterEncoding(responseEncoding);
+ if (StringUtil.isEmpty(responseEncoding))
+ responseEncoding = dashboardWidgetResManager.getDefaultEncoding();
- Writer out = response.getWriter();
+ response.setCharacterEncoding(responseEncoding);
- HtmlRenderContext renderContext = createHtmlRenderContext(request, createWebContext(request), out);
- AddPrefixHtmlTitleHandler htmlTitleHandler = new AddPrefixHtmlTitleHandler(
- getMessage(request, "dashboard.show.htmlTitlePrefix", getMessage(request, "app.name")));
- HtmlRenderAttributes.setHtmlTitleHandler(renderContext, htmlTitleHandler);
+ Writer out = response.getWriter();
- HtmlDashboard dashboard = dashboardWidget.render(renderContext);
+ HtmlRenderContext renderContext = createHtmlRenderContext(request, createWebContext(request), out);
+ AddPrefixHtmlTitleHandler htmlTitleHandler = new AddPrefixHtmlTitleHandler(
+ getMessage(request, "dashboard.show.htmlTitlePrefix", getMessage(request, "app.name")));
+ HtmlRenderAttributes.setHtmlTitleHandler(renderContext, htmlTitleHandler);
- SessionHtmlDashboardManager dashboardManager = getSessionHtmlDashboardManagerNotNull(request);
- dashboardManager.put(dashboard);
+ HtmlDashboard dashboard = dashboardWidget.render(renderContext);
+
+ SessionHtmlDashboardManager dashboardManager = getSessionHtmlDashboardManagerNotNull(request);
+ dashboardManager.put(dashboard);
+ }
+ finally
+ {
+ ChartWidgetSourceContext.remove();
+ }
}
/**