You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by ab...@apache.org on 2019/08/26 09:02:17 UTC

[cayenne] branch STABLE-4.1 updated: CAY-2608 CayenneModeler: NPE when reverse engineering with an auto-adapter DataSource

This is an automated email from the ASF dual-hosted git repository.

abulatski pushed a commit to branch STABLE-4.1
in repository https://gitbox.apache.org/repos/asf/cayenne.git


The following commit(s) were added to refs/heads/STABLE-4.1 by this push:
     new 761fcee  CAY-2608 CayenneModeler: NPE when reverse engineering with an auto-adapter DataSource
761fcee is described below

commit 761fceea3edd49ef784d43e9d0e01c6f428d71f5
Author: Arseni Bulatski <an...@gmail.com>
AuthorDate: Mon Aug 26 11:56:23 2019 +0300

    CAY-2608 CayenneModeler: NPE when reverse engineering with an auto-adapter DataSource
---
 RELEASE-NOTES.txt                                  |  1 +
 .../java/org/apache/cayenne/dba/AutoAdapter.java   |  5 +--
 .../modeler/action/GetDbConnectionAction.java      | 12 +++---
 .../cayenne/modeler/action/LoadDbSchemaAction.java | 22 ++++++++---
 .../modeler/action/ReverseEngineeringAction.java   | 46 ++++++++++++++--------
 .../modeler/dialog/db/DataSourceWizard.java        | 24 +++++------
 6 files changed, 68 insertions(+), 42 deletions(-)

diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index dce7b52..8947fe4 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -35,6 +35,7 @@ CAY-2601 Modeler DbImport: result dialog issues
 CAY-2603 NPE reloading project in the model
 CAY-2605 Modeler: Unable to save - java.nio.file.InvalidPathException
 CAY-2606 Can't resolve obj path with embeddable component
+CAY-2608 CayenneModeler: NPE when reverse engineering with an auto-adapter DataSource
 
 ----------------------------------
 Release: 4.1.B2
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/AutoAdapter.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/AutoAdapter.java
index 77ef360..72ef6a5 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/AutoAdapter.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/AutoAdapter.java
@@ -22,7 +22,6 @@ package org.apache.cayenne.dba;
 import java.sql.PreparedStatement;
 import java.sql.SQLException;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.List;
 
 import org.apache.cayenne.CayenneRuntimeException;
@@ -247,11 +246,11 @@ public class AutoAdapter implements DbAdapter {
 
 	@Override
 	public List<String> getSystemCatalogs() {
-		return Collections.emptyList();
+		return getAdapter().getSystemCatalogs();
 	}
 
 	@Override
 	public List<String> getSystemSchemas() {
-		return Collections.emptyList();
+		return getAdapter().getSystemSchemas();
 	}
 }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/GetDbConnectionAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/GetDbConnectionAction.java
index 8328861..62c089e 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/GetDbConnectionAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/GetDbConnectionAction.java
@@ -19,19 +19,19 @@
 
 package org.apache.cayenne.modeler.action;
 
+import java.awt.event.ActionEvent;
+import java.util.Collection;
+
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.dialog.db.DataSourceWizard;
 import org.apache.cayenne.modeler.dialog.db.DbActionOptionsDialog;
 import org.apache.cayenne.modeler.pref.DataMapDefaults;
 
-import java.awt.event.ActionEvent;
-import java.util.Collection;
-
 import static org.apache.cayenne.modeler.pref.DBConnectionInfo.DB_ADAPTER_PROPERTY;
+import static org.apache.cayenne.modeler.pref.DBConnectionInfo.JDBC_DRIVER_PROPERTY;
+import static org.apache.cayenne.modeler.pref.DBConnectionInfo.PASSWORD_PROPERTY;
 import static org.apache.cayenne.modeler.pref.DBConnectionInfo.URL_PROPERTY;
 import static org.apache.cayenne.modeler.pref.DBConnectionInfo.USER_NAME_PROPERTY;
-import static org.apache.cayenne.modeler.pref.DBConnectionInfo.PASSWORD_PROPERTY;
-import static org.apache.cayenne.modeler.pref.DBConnectionInfo.JDBC_DRIVER_PROPERTY;
 
 /**
  * @since 4.1
@@ -69,6 +69,8 @@ public class GetDbConnectionAction extends DBWizardAction<DbActionOptionsDialog>
 
         if (connectWizard.getConnectionInfo().getDbAdapter() != null) {
             dataMapDefaults.getCurrentPreference().put(DB_ADAPTER_PROPERTY, connectWizard.getConnectionInfo().getDbAdapter());
+        } else {
+            dataMapDefaults.getCurrentPreference().remove(DB_ADAPTER_PROPERTY);
         }
         dataMapDefaults.getCurrentPreference().put(URL_PROPERTY, connectWizard.getConnectionInfo().getUrl());
         dataMapDefaults.getCurrentPreference().put(USER_NAME_PROPERTY, connectWizard.getConnectionInfo().getUserName());
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/LoadDbSchemaAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/LoadDbSchemaAction.java
index f055a91..4ac5be2 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/LoadDbSchemaAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/LoadDbSchemaAction.java
@@ -22,6 +22,7 @@ package org.apache.cayenne.modeler.action;
 import javax.swing.JOptionPane;
 import javax.swing.tree.TreePath;
 import java.awt.event.ActionEvent;
+import java.util.prefs.Preferences;
 
 import org.apache.cayenne.dbsync.reverse.dbimport.ReverseEngineering;
 import org.apache.cayenne.modeler.Application;
@@ -73,7 +74,7 @@ public class LoadDbSchemaAction extends CayenneAction {
             draggableTreePanel.getMoveInvertButton().setEnabled(false);
             try {
                 DBConnectionInfo connectionInfo;
-                if (!datamapPreferencesExist()) {
+                if (datamapPrefNotExist()) {
                     final DataSourceWizard connectWizard = new DataSourceWizard(getProjectController(), "Load Db Schema");
                     if (!connectWizard.startupAction()) {
                         return;
@@ -118,10 +119,14 @@ public class LoadDbSchemaAction extends CayenneAction {
         thread.start();
     }
 
-    private boolean datamapPreferencesExist() {
-        DataMapDefaults dataMapDefaults = getProjectController().
-                getDataMapPreferences(getProjectController().getCurrentDataMap());
-        return dataMapDefaults.getCurrentPreference().get(DB_ADAPTER_PROPERTY, null) != null;
+    private boolean datamapPrefNotExist() {
+        Preferences dataMapPreference = getProjectController().
+                getDataMapPreferences(getProjectController().getCurrentDataMap())
+                .getCurrentPreference();
+        return dataMapPreference == null || dataMapPreference.get(URL_PROPERTY, null) == null ||
+                dataMapPreference.get(USER_NAME_PROPERTY, null) == null ||
+                dataMapPreference.get(PASSWORD_PROPERTY, null) == null ||
+                dataMapPreference.get(JDBC_DRIVER_PROPERTY, null) == null;
     }
 
     private DBConnectionInfo getConnectionInfoFromPreferences() {
@@ -139,7 +144,12 @@ public class LoadDbSchemaAction extends CayenneAction {
     private void saveConnectionInfo(DataSourceWizard connectWizard) {
         DataMapDefaults dataMapDefaults = getProjectController().
                 getDataMapPreferences(getProjectController().getCurrentDataMap());
-        dataMapDefaults.getCurrentPreference().put(DB_ADAPTER_PROPERTY, connectWizard.getConnectionInfo().getDbAdapter());
+        String dbAdapter = connectWizard.getConnectionInfo().getDbAdapter();
+        if(dbAdapter != null) {
+            dataMapDefaults.getCurrentPreference().put(DB_ADAPTER_PROPERTY, connectWizard.getConnectionInfo().getDbAdapter());
+        } else {
+            dataMapDefaults.getCurrentPreference().remove(DB_ADAPTER_PROPERTY);
+        }
         dataMapDefaults.getCurrentPreference().put(URL_PROPERTY, connectWizard.getConnectionInfo().getUrl());
         dataMapDefaults.getCurrentPreference().put(USER_NAME_PROPERTY, connectWizard.getConnectionInfo().getUserName());
         dataMapDefaults.getCurrentPreference().put(PASSWORD_PROPERTY, connectWizard.getConnectionInfo().getPassword());
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ReverseEngineeringAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ReverseEngineeringAction.java
index 80d8288..71076d1 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ReverseEngineeringAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ReverseEngineeringAction.java
@@ -19,6 +19,16 @@
 
 package org.apache.cayenne.modeler.action;
 
+import javax.swing.JOptionPane;
+import javax.swing.SwingUtilities;
+import java.awt.event.ActionEvent;
+import java.sql.SQLException;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.prefs.Preferences;
+
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ProjectController;
@@ -32,16 +42,11 @@ import org.apache.cayenne.modeler.editor.dbimport.DbImportView;
 import org.apache.cayenne.modeler.pref.DBConnectionInfo;
 import org.apache.cayenne.modeler.pref.DataMapDefaults;
 
-import javax.swing.JOptionPane;
-import javax.swing.SwingUtilities;
-import java.awt.event.ActionEvent;
-import java.sql.SQLException;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import static org.apache.cayenne.modeler.pref.DBConnectionInfo.*;
+import static org.apache.cayenne.modeler.pref.DBConnectionInfo.DB_ADAPTER_PROPERTY;
+import static org.apache.cayenne.modeler.pref.DBConnectionInfo.JDBC_DRIVER_PROPERTY;
+import static org.apache.cayenne.modeler.pref.DBConnectionInfo.PASSWORD_PROPERTY;
+import static org.apache.cayenne.modeler.pref.DBConnectionInfo.URL_PROPERTY;
+import static org.apache.cayenne.modeler.pref.DBConnectionInfo.USER_NAME_PROPERTY;
 
 /**
  * Action that imports database structure into a DataMap.
@@ -82,7 +87,7 @@ public class ReverseEngineeringAction extends DBWizardAction<DbActionOptionsDial
     private void startImport(){
         final DbLoaderContext context = new DbLoaderContext(application.getMetaData());
         DBConnectionInfo connectionInfo;
-        if (!datamapPreferencesExist()) {
+        if (datamapPrefNotExist()) {
             final DataSourceWizard connectWizard = dataSourceWizardDialog(DIALOG_TITLE);
             if (connectWizard == null) {
                 return;
@@ -157,17 +162,26 @@ public class ReverseEngineeringAction extends DBWizardAction<DbActionOptionsDial
     private void saveConnectionInfo(DataSourceWizard connectWizard) {
         DataMapDefaults dataMapDefaults = getProjectController().
                 getDataMapPreferences(getProjectController().getCurrentDataMap());
-        dataMapDefaults.getCurrentPreference().put(DB_ADAPTER_PROPERTY, connectWizard.getConnectionInfo().getDbAdapter());
+        String dbAdapter = connectWizard.getConnectionInfo().getDbAdapter();
+        if(dbAdapter != null) {
+            dataMapDefaults.getCurrentPreference().put(DB_ADAPTER_PROPERTY, dbAdapter);
+        } else {
+            dataMapDefaults.getCurrentPreference().remove(DB_ADAPTER_PROPERTY);
+        }
         dataMapDefaults.getCurrentPreference().put(URL_PROPERTY, connectWizard.getConnectionInfo().getUrl());
         dataMapDefaults.getCurrentPreference().put(USER_NAME_PROPERTY, connectWizard.getConnectionInfo().getUserName());
         dataMapDefaults.getCurrentPreference().put(PASSWORD_PROPERTY, connectWizard.getConnectionInfo().getPassword());
         dataMapDefaults.getCurrentPreference().put(JDBC_DRIVER_PROPERTY, connectWizard.getConnectionInfo().getJdbcDriver());
     }
 
-    private boolean datamapPreferencesExist() {
-        DataMapDefaults dataMapDefaults = getProjectController().
-                getDataMapPreferences(getProjectController().getCurrentDataMap());
-        return dataMapDefaults.getCurrentPreference().get(DB_ADAPTER_PROPERTY, null) != null;
+    private boolean datamapPrefNotExist() {
+        Preferences dataMapPreference = getProjectController().
+                getDataMapPreferences(getProjectController().getCurrentDataMap())
+                .getCurrentPreference();
+        return dataMapPreference == null || dataMapPreference.get(URL_PROPERTY, null) == null ||
+                dataMapPreference.get(USER_NAME_PROPERTY, null) == null ||
+                dataMapPreference.get(PASSWORD_PROPERTY, null) == null ||
+                dataMapPreference.get(JDBC_DRIVER_PROPERTY, null) == null;
     }
 
     private void runLoaderInThread(final DbLoaderContext context, final Runnable callback) {
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataSourceWizard.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataSourceWizard.java
index 7ef6a1a..087f2ae 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataSourceWizard.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataSourceWizard.java
@@ -19,6 +19,17 @@
 
 package org.apache.cayenne.modeler.dialog.db;
 
+import javax.sql.DataSource;
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.JOptionPane;
+import javax.swing.WindowConstants;
+import java.awt.Component;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.Arrays;
+import java.util.Map;
+import java.util.prefs.Preferences;
+
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.modeler.ClassLoadingService;
 import org.apache.cayenne.modeler.ProjectController;
@@ -33,17 +44,6 @@ import org.apache.cayenne.modeler.util.CayenneController;
 import org.apache.cayenne.swing.BindingBuilder;
 import org.apache.cayenne.swing.ObjectBinding;
 
-import javax.sql.DataSource;
-import javax.swing.DefaultComboBoxModel;
-import javax.swing.JOptionPane;
-import javax.swing.WindowConstants;
-import java.awt.Component;
-import java.sql.Connection;
-import java.sql.SQLException;
-import java.util.Arrays;
-import java.util.Map;
-import java.util.prefs.Preferences;
-
 import static org.apache.cayenne.modeler.pref.DBConnectionInfo.DB_ADAPTER_PROPERTY;
 import static org.apache.cayenne.modeler.pref.DBConnectionInfo.JDBC_DRIVER_PROPERTY;
 import static org.apache.cayenne.modeler.pref.DBConnectionInfo.PASSWORD_PROPERTY;
@@ -53,7 +53,7 @@ import static org.apache.cayenne.modeler.pref.DBConnectionInfo.USER_NAME_PROPERT
 /**
  * A subclass of ConnectionWizard that tests configured DataSource, but does not
  * keep an open connection.
- * 
+ *
  */
 public class DataSourceWizard extends CayenneController {