You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by nt...@apache.org on 2026/10/16 07:54:57 UTC
(cayenne) branch master updated: CAY-3052 Modeler: inconsistent classloading in dbimport
This is an automated email from the ASF dual-hosted git repository.
stariy95 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 bc70d6aa5 CAY-3052 Modeler: inconsistent classloading in dbimport
bc70d6aa5 is described below
commit bc70d6aa52c3db39c33327432e7955064bffe7cc
Author: Nikita Timofeev <st...@gmail.com>
AuthorDate: Fri Oct 16 11:54:45 2026 +0400
CAY-3052 Modeler: inconsistent classloading in dbimport
---
RELEASE-NOTES.txt | 1 +
.../java/org/apache/cayenne/modeler/Application.java | 20 +++++++++-----------
.../dbimport/runner/ModelerDbLoaderContext.java | 14 ++++++++++++++
3 files changed, 24 insertions(+), 11 deletions(-)
diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index 5e0b371fb..1cf43c7e8 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -74,6 +74,7 @@ CAY-3033 Selects with subqueries produce conflicting cache keys
CAY-3044 Paginated query with a joint to-many prefetch returns duplicate ids and unresolved Integer elements
CAY-3045 Race condition: ClassCastException resolving a to-one fault concurrently on a shared DataContext
CAY-3046 Refreshing an object from a snapshot discards to-ones, causing fault resolution on a shared DataContext
+CAY-3052 Modeler: inconsistent classloading in dbimport
----------------------------------
Release: 5.0-M3
diff --git a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Application.java b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Application.java
index 89a940065..954e0a9ef 100644
--- a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Application.java
+++ b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Application.java
@@ -194,15 +194,6 @@ public class Application {
refreshClassLoader();
- // TODO: is this used by DB Import and CGen? If so, the corresponding actions must set it in a proper scope.
- // Or a better idea - get rid of thread-bound classloaders everywhere
- ModelerClassLoader classLoader = getClassLoader();
- if (SwingUtilities.isEventDispatchThread()) {
- Thread.currentThread().setContextClassLoader(classLoader.getClassLoader());
- } else {
- SwingUtilities.invokeLater(() -> Thread.currentThread().setContextClassLoader(classLoader.getClassLoader()));
- }
-
this.undoManager = new CayenneUndoManager(this);
this.frame = new MainFrame(this);
this.platformInit.afterFrameCreated(this);
@@ -241,8 +232,15 @@ public class Application {
*/
public void refreshClassLoader() {
List<String> values = new ClasspathPrefs(prefsLocator.appNode(ClasspathPrefs.NODE)).getEntries();
- if (!values.isEmpty()) {
- getClassLoader().setFiles(values.stream().map(File::new).collect(Collectors.toList()));
+ getClassLoader().setFiles(values.stream().map(File::new).collect(Collectors.toList()));
+
+ // TODO: get rid of thread-bound classloaders everywhere. For now, keep the EDT context ClassLoader (inherited
+ // by the background threads started from the UI) in sync with the current classpath
+ ClassLoader classLoader = getClassLoader().getClassLoader();
+ if (SwingUtilities.isEventDispatchThread()) {
+ Thread.currentThread().setContextClassLoader(classLoader);
+ } else {
+ SwingUtilities.invokeLater(() -> Thread.currentThread().setContextClassLoader(classLoader));
}
}
diff --git a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/runner/ModelerDbLoaderContext.java b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/runner/ModelerDbLoaderContext.java
index 98c107b31..351ec83b7 100644
--- a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/runner/ModelerDbLoaderContext.java
+++ b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/runner/ModelerDbLoaderContext.java
@@ -19,6 +19,7 @@
package org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.runner;
+import org.apache.cayenne.CayenneRuntimeException;
import org.apache.cayenne.dbsync.reverse.dbimport.DbImportConfiguration;
import org.apache.cayenne.dbsync.reverse.dbimport.ReverseEngineering;
import org.apache.cayenne.dbsync.reverse.dbload.DbLoaderDelegate;
@@ -33,9 +34,11 @@ import org.apache.cayenne.util.Util;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import javax.sql.DataSource;
import javax.swing.*;
import java.io.File;
import java.sql.Connection;
+import java.sql.SQLException;
public class ModelerDbLoaderContext {
@@ -117,6 +120,17 @@ public class ModelerDbLoaderContext {
public DbLoaderDelegate createLoaderDelegate() {
return new ModelerDbLoaderDelegate(ModelerDbLoaderContext.this);
}
+
+ @Override
+ public DataSource createDataSource() {
+ try {
+ // load the driver from the current Modeler classpath
+ return new DBConnectorFactory(application.getClassLoader())
+ .makeDataSource(connectionInfo);
+ } catch (SQLException e) {
+ throw new CayenneRuntimeException("Error creating DataSource: %s", e, e.getMessage());
+ }
+ }
};
fillConfig(config, connectionInfo, reverseEngineering);
setConfig(config);