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(); + } } /**