diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataPaneListPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataPaneListPane.java index 264a937999..0694222339 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataPaneListPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataPaneListPane.java @@ -5,8 +5,12 @@ import com.fr.base.TableDataBean; import com.fr.config.RemoteConfigEvent; import com.fr.data.MultiResultTableData; import com.fr.data.TableDataSource; +import com.fr.data.impl.*; +import com.fr.data.impl.storeproc.StoreProcedure; +import com.fr.data.metric.utils.DatabaseConnectionMetricHandler; import com.fr.design.data.BasicTableDataUtils; import com.fr.design.data.DesignTableDataManager; +import com.fr.design.data.MapCompareUtils; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.gui.controlpane.JListControlPane; import com.fr.design.gui.controlpane.NameableCreator; @@ -19,6 +23,7 @@ import com.fr.file.TableDataOperator; import com.fr.file.TableDataOperatorImpl; import com.fr.general.ComparatorUtils; import com.fr.general.NameObject; +import com.fr.general.jsqlparser.schema.Table; import com.fr.log.FineLoggerFactory; import com.fr.rpc.ExceptionHandler; import com.fr.rpc.RPCInvokerExceptionInfo; @@ -32,12 +37,8 @@ import com.fr.workspace.WorkContext; import javax.swing.DefaultListModel; import javax.swing.JPanel; import javax.swing.SwingUtilities; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; +import java.util.*; +import java.util.stream.Collectors; /** * TableDataList Pane. @@ -46,6 +47,8 @@ public class TableDataPaneListPane extends JListControlPane implements TableData private boolean isNamePermitted = true; private Map dsNameChangedMap = new HashMap<>(); + private final Map populatedTableDataSnapshot = new LinkedHashMap<>(); + public TableDataPaneListPane() { super(); dsNameChangedMap.clear(); @@ -225,10 +228,12 @@ public class TableDataPaneListPane extends JListControlPane implements TableData while (nameIt.hasNext()) { String name = nameIt.next(); nameObjectList.add(new NameObject(name, tableDataConfig.getTableData(name))); + populatedTableDataSnapshot.put(name, tableDataConfig.getTableData(name)); } while (procedurenameIt.hasNext()) { String name = procedurenameIt.next(); nameObjectList.add(new NameObject(name, ProcedureConfig.getInstance().getProcedure(name))); + populatedTableDataSnapshot.put(name, ProcedureConfig.getInstance().getProcedure(name)); } populate(nameObjectList.toArray(new NameObject[0])); @@ -236,17 +241,7 @@ public class TableDataPaneListPane extends JListControlPane implements TableData @Override public void update(TableDataConfig tableDataConfig) { - Nameable[] tableDataArray = this.update(); - List tableDataBeans = new ArrayList<>(); - Map map = MapUtils.invertMap(getDsNameChangedMap()); - for (int i = 0; i < tableDataArray.length; i++) { - NameObject nameObject = (NameObject) tableDataArray[i]; - String oldName = map.get(nameObject.getName()); - if (oldName == null) { - oldName = StringUtils.EMPTY; - } - tableDataBeans.add(new TableDataBean(nameObject.getName(), oldName, (TableData) nameObject.getObject())); - } + List tableDataBeans = getUpdateTableDataBeans(); try { WorkContext.getCurrent().get(TableDataOperator.class, new ExceptionHandler() { @Override @@ -255,6 +250,7 @@ public class TableDataPaneListPane extends JListControlPane implements TableData return saveByOldWay(tableDataBeans); } }).saveTableData(new ArrayList<>(tableDataConfig.getTableDatas().keySet()), tableDataBeans); + logOperateMessage(populatedTableDataSnapshot, getUpdateTableDataMap(tableDataBeans)); if (!WorkContext.getCurrent().isLocal()) { EventDispatcher.fire(RemoteConfigEvent.EDIT, TableDataConfig.getInstance().getNameSpace()); } @@ -263,6 +259,76 @@ public class TableDataPaneListPane extends JListControlPane implements TableData } } + /** + * 获取更新时的数据集快照 + * + * @return 快照 + */ + private List getUpdateTableDataBeans() { + Nameable[] tableDataArray = this.update(); + List tableDataBeans = new ArrayList<>(); + Map map = MapUtils.invertMap(getDsNameChangedMap()); + for (Nameable nameable : tableDataArray) { + NameObject nameObject = (NameObject) nameable; + String oldName = map.get(nameObject.getName()); + if (oldName == null) { + oldName = StringUtils.EMPTY; + } + tableDataBeans.add(new TableDataBean(nameObject.getName(), oldName, (TableData) nameObject.getObject())); + } + return tableDataBeans; + } + + private Map getUpdateTableDataMap(List tableDataBeans) { + Map updateTableDataMap = new HashMap<>(); + for (TableDataBean bean : tableDataBeans) { + updateTableDataMap.put(bean.getName(), bean.getTableData()); + } + return updateTableDataMap; + } + + private void logOperateMessage(Map old, Map newMap) { + List add = new ArrayList<>(); + List update = new ArrayList<>(); + List delete = new ArrayList<>(); + MapCompareUtils.contrastMapEntries(old, newMap, (entryEventKind, s, tableData) -> { + switch (entryEventKind) { + case REMOVED: + delete.add(s); + break; + case ADDED: + add.add(s); + break; + case UPDATED: + update.add(s); + break; + default: + break; + } + }, new MapCompareUtils.UpdateRule() { + @Override + public boolean needUpdate(TableData old, TableData update) { + return !update.equals(old) || !isEmbedConnection(update); + } + + /** + * 是否是主工程里内置的TableData + */ + private boolean isEmbedConnection(TableData tableData) { + return tableData instanceof DBTableData || + tableData instanceof ClassTableData || + tableData instanceof EmbeddedTableData || + tableData instanceof FileTableData || + tableData instanceof RecursionTableData || + tableData instanceof ConditionTableData || + tableData instanceof StoreProcedure; + } + }); + + WorkContext.getCurrent().get(TableDataOperator.class).logOperateMessage(add, update, delete); + } + + private boolean saveByOldWay(List tableDataBean) { try { return TableDataOperatorImpl.getInstance().saveTableData(tableDataBean);