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