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;
     }
 

Reply via email to