Repository: cayenne Updated Branches: refs/heads/master 50d04b380 -> 9451c9a83
First implementation of revert functionality. Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/b9d9378a Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/b9d9378a Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/b9d9378a Branch: refs/heads/master Commit: b9d9378a406cc72523444567ad24859bb753ceb5 Parents: 831442c Author: kkomyak <const1...@gmail.com> Authored: Tue Oct 30 14:29:33 2018 +0300 Committer: kkomyak <const1...@gmail.com> Committed: Tue Oct 30 17:36:44 2018 +0300 ---------------------------------------------------------------------- .../reverse/dbimport/DefaultDbImportAction.java | 99 +++++++++++++++----- .../dialog/db/load/DbLoadResultDialog.java | 12 ++- .../dialog/db/load/ModelerDbImportAction.java | 29 +++++- 3 files changed, 113 insertions(+), 27 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cayenne/blob/b9d9378a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/DefaultDbImportAction.java ---------------------------------------------------------------------- diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/DefaultDbImportAction.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/DefaultDbImportAction.java index 1a54fa4..e6b6e61 100644 --- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/DefaultDbImportAction.java +++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/DefaultDbImportAction.java @@ -88,6 +88,10 @@ public class DefaultDbImportAction implements DbImportAction { private final MergerTokenFactoryProvider mergerTokenFactoryProvider; private final DataChannelDescriptorLoader dataChannelDescriptorLoader; private final DataChannelMetaData metaData; + private boolean hasChanges; + private FiltersConfig filters; + private Collection<MergerToken> tokens; + private DataMap loadedDataMap; public DefaultDbImportAction(@Inject Logger logger, @Inject ProjectSaver projectSaver, @@ -140,13 +144,28 @@ public class DefaultDbImportAction implements DbImportAction { @Override public void execute(DbImportConfiguration config) throws Exception { + commit(config, loadDataMap(config)); + } + + protected void commit(DbImportConfiguration config, DataMap sourceDataMap) throws Exception{ + if (hasChanges) { + DataMap targetDataMap = loadedDataMap; + + syncDataMapProperties(targetDataMap, config); + applyTokens(targetDataMap, tokens, config); + syncProcedures(targetDataMap, sourceDataMap, filters); + + saveLoaded(targetDataMap, config); + this.loadedDataMap = null; + } + } + protected DataMap loadDataMap(DbImportConfiguration config) throws Exception { if (logger.isDebugEnabled()) { logger.debug("DB connection: " + config.getDataSourceInfo()); logger.debug(String.valueOf(config)); } - boolean hasChanges = false; DataNodeDescriptor dataNodeDescriptor = config.createDataNodeDescriptor(); DataSource dataSource = dataSourceFactory.getDataSource(dataNodeDescriptor); DbAdapter adapter = adapterFactory.createAdapter(dataNodeDescriptor, dataSource); @@ -179,29 +198,30 @@ public class DefaultDbImportAction implements DbImportAction { hasChanges = true; targetDataMap = newTargetDataMap(config); } + this.loadedDataMap = targetDataMap; + // In that moment our data map fills with sorce map // transform source DataMap before merging transformSourceBeforeMerge(sourceDataMap, targetDataMap, config); MergerTokenFactory mergerTokenFactory = mergerTokenFactoryProvider.get(adapter); DbLoaderConfiguration loaderConfig = config.getDbLoaderConfig(); - Collection<MergerToken> tokens = DataMapMerger.builder(mergerTokenFactory) - .filters(loaderConfig.getFiltersConfig()) - .skipPKTokens(loaderConfig.isSkipPrimaryKeyLoading()) - .skipRelationshipsTokens(loaderConfig.isSkipRelationshipsLoading()) - .build() - .createMergeTokens(targetDataMap, sourceDataMap); + tokens = DataMapMerger.builder(mergerTokenFactory) + .filters(loaderConfig.getFiltersConfig()) + .skipPKTokens(loaderConfig.isSkipPrimaryKeyLoading()) + .skipRelationshipsTokens(loaderConfig.isSkipRelationshipsLoading()) + .build() + .createMergeTokens(targetDataMap, sourceDataMap); tokens = log(sort(reverse(mergerTokenFactory, tokens))); + filters = loaderConfig.getFiltersConfig(); - hasChanges |= syncDataMapProperties(targetDataMap, config); - hasChanges |= applyTokens(targetDataMap, tokens, config); - hasChanges |= syncProcedures(targetDataMap, sourceDataMap, loaderConfig.getFiltersConfig()); - - if (hasChanges) { - saveLoaded(targetDataMap, config); - } + hasChanges |= checkDataMapProperties(targetDataMap, config); + hasChanges |= hasTokensToImport(tokens); + hasChanges |= checkIncludedProcedures(sourceDataMap, filters); + return sourceDataMap; } + private void putReverseEngineeringToConfig(ReverseEngineering reverseEngineering, DbImportConfiguration config) { config.setSkipRelationshipsLoading(reverseEngineering.getSkipRelationshipsLoading()); config.setSkipPrimaryKeyLoading(reverseEngineering.getSkipPrimaryKeyLoading()); @@ -233,20 +253,54 @@ public class DefaultDbImportAction implements DbImportAction { } } - private boolean syncDataMapProperties(DataMap targetDataMap, DbImportConfiguration config) { + public boolean hasTokensToImport(Collection<MergerToken> tokens) { + + if (tokens.isEmpty()) { + logger.info(""); + logger.info("Detected changes: No changes to import."); + return false; + } + + return true; + + } + + private boolean checkDataMapProperties(DataMap targetDataMap, DbImportConfiguration config) { String defaultPackage = config.getDefaultPackage(); if (defaultPackage == null || isBlank(defaultPackage)) { return false; } - if (defaultPackage.equals(targetDataMap.getDefaultPackage())) { + if(!defaultPackage.equals(targetDataMap.getDefaultPackage())) { return false; } - targetDataMap.setDefaultPackage(defaultPackage); return true; } + private boolean checkIncludedProcedures(DataMap loadedDataMap, FiltersConfig filters) { + Collection<Procedure> procedures = loadedDataMap.getProcedures(); + boolean hasChanges = false; + for (Procedure procedure : procedures) { + PatternFilter proceduresFilter = filters.proceduresFilter(procedure.getCatalog(), procedure.getSchema()); + if (proceduresFilter == null || !proceduresFilter.isIncluded(procedure.getName())) { + continue; + } + hasChanges = true; + } + return hasChanges; + } + + + private void syncDataMapProperties(DataMap targetDataMap, DbImportConfiguration config) { + String defaultPackage = config.getDefaultPackage(); + if (defaultPackage == null || isBlank(defaultPackage)) { + return; + } + + targetDataMap.setDefaultPackage(defaultPackage); + } + private void relationshipsSanity(DataMap executed) { for (ObjEntity objEntity : executed.getObjEntities()) { List<ObjRelationship> rels = new LinkedList<>(objEntity.getRelationships()); @@ -284,7 +338,6 @@ public class DefaultDbImportAction implements DbImportAction { DataMap dataMap = mapLoader.load(configurationResource); dataMap.setNamespace(new EntityResolver(Collections.singleton(dataMap))); dataMap.setConfigurationSource(configurationResource); - return dataMap; } @@ -343,12 +396,11 @@ public class DefaultDbImportAction implements DbImportAction { return tokens; } - private boolean applyTokens(DataMap targetDataMap, Collection<MergerToken> tokens, DbImportConfiguration config) { + private void applyTokens(DataMap targetDataMap, Collection<MergerToken> tokens, DbImportConfiguration config) { if (tokens.isEmpty()) { logger.info(""); logger.info("Detected changes: No changes to import."); - return false; } final Collection<ObjEntity> loadedObjEntities = new LinkedList<>(); @@ -394,7 +446,6 @@ public class DefaultDbImportAction implements DbImportAction { flattenManyToManyRelationships(targetDataMap, loadedObjEntities, nameGenerator); relationshipsSanity(targetDataMap); - return true; } protected void addMessageToLogs(String message, List<String> messages) { @@ -405,11 +456,11 @@ public class DefaultDbImportAction implements DbImportAction { messages.forEach(logger::info); } - protected boolean syncProcedures(DataMap targetDataMap, DataMap loadedDataMap, FiltersConfig filters) { + + protected void syncProcedures(DataMap targetDataMap, DataMap loadedDataMap, FiltersConfig filters) { Collection<Procedure> procedures = loadedDataMap.getProcedures(); List<String> messages = new LinkedList<>(); - boolean hasChanges = false; for (Procedure procedure : procedures) { PatternFilter proceduresFilter = filters.proceduresFilter(procedure.getCatalog(), procedure.getSchema()); if (proceduresFilter == null || !proceduresFilter.isIncluded(procedure.getName())) { @@ -425,10 +476,8 @@ public class DefaultDbImportAction implements DbImportAction { addMessageToLogs("Add new procedure " + procedure.getName(), messages); } targetDataMap.addProcedure(procedure); - hasChanges = true; } logMessages(messages); - return hasChanges; } /** http://git-wip-us.apache.org/repos/asf/cayenne/blob/b9d9378a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoadResultDialog.java ---------------------------------------------------------------------- diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoadResultDialog.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoadResultDialog.java index 9d44bf5..007a2e6 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoadResultDialog.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoadResultDialog.java @@ -42,6 +42,7 @@ public class DbLoadResultDialog extends JDialog { private DefaultTableModel tableModel; private JTable table; private JButton okButton; + private JButton revertButton; private String title; DbLoadResultDialog(String title) { @@ -73,8 +74,8 @@ public class DbLoadResultDialog extends JDialog { table.setRowHeight(TABLE_ROW_HIGH); table.setRowMargin(TABLE_ROW_MARGIN); tableModel.addColumn(""); + revertButton = new JButton("Revert"); okButton = new JButton("OK"); - okButton.addActionListener(e -> DbLoadResultDialog.this.setVisible(false)); } private void buildElements() { @@ -85,6 +86,7 @@ public class DbLoadResultDialog extends JDialog { builder.append(new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER)); JPanel panel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); + panel.add(revertButton); panel.add(okButton); builder.append(panel); this.add(builder.getPanel()); @@ -97,4 +99,12 @@ public class DbLoadResultDialog extends JDialog { public int getTableRowCount() { return tableModel.getRowCount(); } + + public JButton getOkButton() { + return okButton; + } + + public JButton getRevertButton() { + return revertButton; + } } http://git-wip-us.apache.org/repos/asf/cayenne/blob/b9d9378a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/ModelerDbImportAction.java ---------------------------------------------------------------------- diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/ModelerDbImportAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/ModelerDbImportAction.java index 22924ac..be83445 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/ModelerDbImportAction.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/ModelerDbImportAction.java @@ -19,6 +19,7 @@ package org.apache.cayenne.modeler.dialog.db.load; +import org.apache.cayenne.CayenneRuntimeException; import org.apache.cayenne.configuration.DataChannelDescriptorLoader; import org.apache.cayenne.configuration.DataMapLoader; import org.apache.cayenne.configuration.server.DataSourceFactory; @@ -31,6 +32,7 @@ import org.apache.cayenne.map.DataMap; import org.apache.cayenne.project.ProjectSaver; import org.apache.cayenne.dbsync.reverse.dbimport.DbImportConfiguration; import org.apache.cayenne.dbsync.reverse.dbimport.DefaultDbImportAction; +import org.apache.commons.lang3.SerializationUtils; import org.slf4j.Logger; import javax.swing.JDialog; @@ -46,6 +48,10 @@ public class ModelerDbImportAction extends DefaultDbImportAction { @Inject private DataMap targetMap; + DataMap sourceDataMap; + DbImportConfiguration config; + DbImportConfiguration tmpConfig; + private DbLoadResultDialog resultDialog; private boolean isNothingChanged; @@ -61,6 +67,17 @@ public class ModelerDbImportAction extends DefaultDbImportAction { } @Override + public void execute(DbImportConfiguration config) throws Exception { + this.config = config; + this.sourceDataMap = loadDataMap(config); + } + + + public void commit() throws Exception { + commit(config, sourceDataMap); + } + + @Override protected Collection<MergerToken> log(List<MergerToken> tokens) { resultDialog = new DbLoadResultDialog(DIALOG_TITLE); logger.info(""); @@ -79,8 +96,18 @@ public class ModelerDbImportAction extends DefaultDbImportAction { } logger.info(""); - resultDialog.setVisible(true); + resultDialog.getOkButton().addActionListener(e -> { + try { + commit(); + } catch (Exception ex) { + throw new CayenneRuntimeException("Nothing to commit."); + } finally { + resultDialog.setVisible(false); + } + }); + resultDialog.getRevertButton().addActionListener(e -> resultDialog.setVisible(false)); + resultDialog.setVisible(true); return tokens; }