This is an automated email from the ASF dual-hosted git repository. abulatski pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/cayenne.git
The following commit(s) were added to refs/heads/master by this push: new efc3834 CAY-2608 CayenneModeler: NPE when reverse engineering with an auto-adapter DataSource efc3834 is described below commit efc3834458874e42f60dd347c797f21200ccdd1e Author: Arseni Bulatski <ancars...@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 5b4c2e6..f806fc9 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -79,6 +79,7 @@ CAY-2600 Modeler DbImport: Can't retrieve schema for databases with no catalog s 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-2608 CayenneModeler: NPE when reverse engineering with an auto-adapter DataSource ---------------------------------- Release: 4.1.B1 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 7595eed..7c856f0 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 java.util.function.Function; @@ -256,11 +255,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 9112cb0..2e83a27 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 911b6d5..df85e6a 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 9d9d562..bf3f316 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 d357b95..4070b5a 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 {