diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/preview/desensitization/view/rule/DesensitizationRuleChoosePane.java b/designer-base/src/main/java/com/fr/design/data/datapane/preview/desensitization/view/rule/DesensitizationRuleChoosePane.java index 3b44c0b18..e1dc9d722 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/preview/desensitization/view/rule/DesensitizationRuleChoosePane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/preview/desensitization/view/rule/DesensitizationRuleChoosePane.java @@ -28,6 +28,7 @@ import java.awt.Component; import java.awt.event.ActionEvent; import java.util.LinkedHashSet; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.stream.Collectors; @@ -48,7 +49,10 @@ public class DesensitizationRuleChoosePane extends JPanel { private DesensitizationRuleSource currentRuleSource; - public DesensitizationRuleChoosePane() { + private Map> lastedRules; + + public DesensitizationRuleChoosePane(Map> lastedRules) { + this.lastedRules = lastedRules; this.cardLayout = new CardLayout(); this.setLayout(cardLayout); serverRuleEditPane = new UITableEditorPane<>(new DesensitizationRuleChooseTableModel(this, true)); @@ -76,8 +80,8 @@ public class DesensitizationRuleChoosePane extends JPanel { * 展示当前规则 */ private void populateDesensitizationRules() { - serverRuleEditPane.populate(DesensitizationRuleManager.getInstance().getRules(DesensitizationRuleSource.SERVER)); - customRuleEditPane.populate(DesensitizationRuleManager.getInstance().getRules(DesensitizationRuleSource.CUSTOM)); + serverRuleEditPane.populate(lastedRules.get(DesensitizationRuleSource.SERVER).values().toArray(new DesensitizationRule[0])); + customRuleEditPane.populate(lastedRules.get(DesensitizationRuleSource.CUSTOM).values().toArray(new DesensitizationRule[0])); } /** @@ -143,7 +147,7 @@ public class DesensitizationRuleChoosePane extends JPanel { return DesensitizationRule.getDescription(rule); case 3: // 脱敏规则状态 - DesensitizationRuleStatus ruleStatus = DesensitizationRuleManager.getInstance().getRuleStatus(rule); + DesensitizationRuleStatus ruleStatus = DesensitizationRuleManager.getInstance().getRuleStatus(rule, lastedRules); // 非正常状态需要标记为异常 return ruleStatus == DesensitizationRuleStatus.NORMAL ? StringUtils.EMPTY : Toolkit.i18nText("Fine-Design_Report_Desensitization_Rule_Status_Abnormal"); default: @@ -192,7 +196,7 @@ public class DesensitizationRuleChoosePane extends JPanel { * @param rule */ public void refreshRuleStatus(DesensitizationRule rule) { - DesensitizationRuleStatus ruleStatus = DesensitizationRuleManager.getInstance().getRuleStatus(rule); + DesensitizationRuleStatus ruleStatus = DesensitizationRuleManager.getInstance().getRuleStatus(rule, lastedRules); if (ruleStatus == DesensitizationRuleStatus.NORMAL) { // 正常规则时,重置提示Label this.ruleStatusLabel.setText(StringUtils.EMPTY); diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/preview/desensitization/view/rule/DesensitizationRulePane.java b/designer-base/src/main/java/com/fr/design/data/datapane/preview/desensitization/view/rule/DesensitizationRulePane.java index 715c40819..b26b288f0 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/preview/desensitization/view/rule/DesensitizationRulePane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/preview/desensitization/view/rule/DesensitizationRulePane.java @@ -9,6 +9,7 @@ import com.fr.design.layout.FRGUIPaneFactory; import javax.swing.JPanel; import java.awt.BorderLayout; +import java.util.Map; /** * 脱敏规则展示页 @@ -29,13 +30,19 @@ public class DesensitizationRulePane extends BasicBeanPane */ private DesensitizationRuleChoosePane ruleChoosePane; + /** + * 最新的所有规则 + */ + private Map> lastedRules; + /** * 内容面板 */ private JPanel contentPane; - public DesensitizationRulePane() { + public DesensitizationRulePane(Map> lastedRules) { this.setLayout(FRGUIPaneFactory.createBorderLayout()); + this.lastedRules = lastedRules; initPane(); } @@ -47,7 +54,7 @@ public class DesensitizationRulePane extends BasicBeanPane // 规则来源选择Pane ruleSourceChoosePane = new DesensitizationRuleSourceChoosePane(this); // 规则选择Pane - ruleChoosePane = new DesensitizationRuleChoosePane(); + ruleChoosePane = new DesensitizationRuleChoosePane(lastedRules); contentPane.add(ruleSourceChoosePane, BorderLayout.NORTH); contentPane.add(ruleChoosePane, BorderLayout.CENTER); } diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/preview/desensitization/view/setting/TableDataDesensitizationTableModel.java b/designer-base/src/main/java/com/fr/design/data/datapane/preview/desensitization/view/setting/TableDataDesensitizationTableModel.java index e70f5e2ce..595fa4b8a 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/preview/desensitization/view/setting/TableDataDesensitizationTableModel.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/preview/desensitization/view/setting/TableDataDesensitizationTableModel.java @@ -4,8 +4,8 @@ import com.fr.data.desensitize.base.DesensitizationTableData; import com.fr.data.desensitize.base.TableDataDesensitizationItem; import com.fr.data.desensitize.rule.DesensitizationRuleManager; import com.fr.data.desensitize.rule.base.DesensitizationRule; +import com.fr.data.desensitize.rule.base.DesensitizationRuleSource; import com.fr.data.desensitize.rule.base.DesensitizationRuleStatus; -import com.fr.design.data.datapane.preview.desensitization.TableDataPreviewDesensitizeManager; import com.fr.design.data.datapane.preview.desensitization.view.rule.DesensitizationRulePane; import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.DialogActionAdapter; @@ -20,7 +20,6 @@ import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.layout.TableLayout; import com.fr.design.layout.TableLayoutHelper; -import com.fr.log.FineLoggerFactory; import com.fr.stable.StringUtils; import org.jetbrains.annotations.Nullable; @@ -29,7 +28,6 @@ import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.JTable; import javax.swing.SwingUtilities; -import javax.swing.SwingWorker; import javax.swing.event.CellEditorListener; import javax.swing.event.ChangeEvent; import javax.swing.table.TableCellEditor; @@ -72,11 +70,16 @@ public class TableDataDesensitizationTableModel extends UITableModelAdapter roleMap = new LinkedHashMap<>(); + private Map roleMap = new LinkedHashMap<>(); + + /** + * 当前最新的所有规则 + */ + private Map> lastedRules = new LinkedHashMap<>(); private Component parent; - public TableDataDesensitizationTableModel(DesensitizationTableData tableData, Component parent) { + public TableDataDesensitizationTableModel(DesensitizationTableData tableData, Component parent, List columnNames, Map roleMap, Map> lastedRules) { // table相关 super(new String[]{ Toolkit.i18nText("Fine-Design_Report_Desensitization_Column"), @@ -86,6 +89,17 @@ public class TableDataDesensitizationTableModel extends UITableModelAdapter() { - - @Override - protected Void doInBackground() throws Exception { - // 获取当前数据集的所有列名 - columnNames.addAll(TableDataPreviewDesensitizeManager.getInstance().getColumnNamesByTableData(tableData)); - // 获取当前所有用户组 - roleMap.putAll(TableDataPreviewDesensitizeManager.getInstance().getAllRoles()); - return null; - } - - @Override - protected void done() { - try { - // 更新列名选择框和生效用户组选择框 - columnNamesComboBox.refresh(); - effectedRolesChooser.refresh(); - } catch (Exception e) { - FineLoggerFactory.getLogger().error(e, "[Desensitization] get column names or all roles failed for {}", e.getMessage()); - } - } - }.execute(); - } @Override @@ -231,14 +220,6 @@ public class TableDataDesensitizationTableModel extends UITableModelAdapter iterator = items.iterator(); while (iterator.hasNext()) { TableDataDesensitizationItem item = iterator.next(); - DesensitizationRuleStatus ruleStatus = DesensitizationRuleManager.getInstance().getRuleStatus(item.getRule()); + DesensitizationRuleStatus ruleStatus = DesensitizationRuleManager.getInstance().getRuleStatus(item.getRule(), lastedRules); if (ruleStatus == DesensitizationRuleStatus.REMOVED) { // 规则被移除,则删除整条脱敏Item iterator.remove(); } else { // 规则被修改、禁用等,更新一下规则 - item.setRule(DesensitizationRuleManager.getInstance().getLastedDesentizationRule(item.getRule())); + item.setRule(DesensitizationRuleManager.getInstance().getLastedDesentizationRule(item.getRule(), lastedRules)); } } fireTableDataChanged(); diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/preview/desensitization/view/setting/TableDataDesensitizationTablePane.java b/designer-base/src/main/java/com/fr/design/data/datapane/preview/desensitization/view/setting/TableDataDesensitizationTablePane.java index e6395fe8b..9ef6a7a2f 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/preview/desensitization/view/setting/TableDataDesensitizationTablePane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/preview/desensitization/view/setting/TableDataDesensitizationTablePane.java @@ -2,13 +2,25 @@ package com.fr.design.data.datapane.preview.desensitization.view.setting; import com.fr.data.desensitize.base.DesensitizationTableData; import com.fr.data.desensitize.base.TableDataDesensitizationItem; +import com.fr.data.desensitize.rule.DesensitizationRuleManager; +import com.fr.data.desensitize.rule.base.DesensitizationRule; +import com.fr.data.desensitize.rule.base.DesensitizationRuleSource; +import com.fr.design.data.datapane.preview.desensitization.TableDataPreviewDesensitizeManager; +import com.fr.design.data.tabledata.tabledatapane.loading.TipsPane; import com.fr.design.gui.itableeditorpane.UITableEditorPane; import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.log.FineLoggerFactory; import javax.swing.JPanel; +import javax.swing.SwingWorker; import java.awt.BorderLayout; +import java.awt.CardLayout; import java.awt.Component; +import java.util.ArrayList; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; /** * 脱敏字段设置页面中的Table @@ -34,6 +46,15 @@ public class TableDataDesensitizationTablePane extends JPanel { */ private UITableEditorPane editorPane; + private static final String LOADING_PANE = "loading"; + private static final String CONTENT_PANE = "content"; + + private CardLayout card; + + private JPanel loadingPane; + + private JPanel contentPane; + public TableDataDesensitizationTablePane(DesensitizationTableData tableData, Component parent) { this.tableData = tableData; this.parent = parent; @@ -41,10 +62,65 @@ public class TableDataDesensitizationTablePane extends JPanel { } private void initComponent() { - this.setLayout(FRGUIPaneFactory.createBorderLayout()); - this.editorPane = new UITableEditorPane<>(new TableDataDesensitizationTableModel(tableData, parent)); - this.editorPane.setHeaderResizing(false); - this.add(editorPane, BorderLayout.CENTER); + + card = new CardLayout(); + this.setLayout(card); + // 初始化Loading面板 + loadingPane = new TipsPane(true); + this.add(LOADING_PANE, loadingPane); + switchTo(LOADING_PANE); + + // 在SwingWorker中初始化Content面板并切换 + initContent(); + } + + /** + * 初始化内容面板 + * 考虑到远程设计下的性能,需要限制查询数据库的次数,所以这里查一次,之后子面板内复用 + */ + private void initContent() { + final List columnNames = new ArrayList<>(); + final Map roleMap = new LinkedHashMap<>(); + final Map> lastedRules = new LinkedHashMap<>(); + new SwingWorker() { + + @Override + protected Void doInBackground() throws Exception { + // 获取当前数据集的所有列名 + columnNames.addAll(TableDataPreviewDesensitizeManager.getInstance().getColumnNamesByTableData(tableData)); + // 获取当前所有用户组 + roleMap.putAll(TableDataPreviewDesensitizeManager.getInstance().getAllRoles()); + // 获取当前最新的所有规则 + lastedRules.putAll(DesensitizationRuleManager.getInstance().getAllRules()); + return null; + } + + @Override + protected void done() { + contentPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + editorPane = new UITableEditorPane<>(new TableDataDesensitizationTableModel(tableData, parent, columnNames, roleMap, lastedRules)); + editorPane.setHeaderResizing(false); + editorPane.populate(tableData.getDesensitizationConfig().getDesensitizationItems().toArray(new TableDataDesensitizationItem[0])); + contentPane.add(editorPane, BorderLayout.CENTER); + add(CONTENT_PANE, contentPane); + switchTo(CONTENT_PANE); + } + }.execute(); + } + + /** + * 切换面板 + * + * @param panelName + */ + public void switchTo(String panelName) { + try { + if (panelName != null) { + card.show(this, panelName); + } + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } } /** @@ -54,13 +130,22 @@ public class TableDataDesensitizationTablePane extends JPanel { */ public void populateDesensitizationSetting(DesensitizationTableData tableData) { this.tableData = tableData; - editorPane.populate(tableData.getDesensitizationConfig().getDesensitizationItems().toArray(new TableDataDesensitizationItem[0])); + if (editorPane != null) { + // editorPane的初始化在SwingWorker中完成,这里做个判空 + editorPane.populate(tableData.getDesensitizationConfig().getDesensitizationItems().toArray(new TableDataDesensitizationItem[0])); + } } /** * 获取当前对TableData的配置脱敏规则信息 */ public List updateDesensitizationSetting() { - return editorPane.update(); + + return editorPane == null ? + new ArrayList<>() : + editorPane.update() + .stream() + .filter(item -> TableDataDesensitizationItem.valid(item)) + .collect(Collectors.toList()); } }