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

asf-gitbox-commits pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git

commit 9443f33e63c87e61e2c7359b172d8a52f53df772
Author: Andrus Adamchik <[email protected]>
AuthorDate: Tue May 5 18:08:01 2026 -0400

    Modeler cleanup
---
 .../apache/cayenne/modeler/toolkit/AppAction.java  |  23 +--
 .../modeler/toolkit/table/CMTableModel.java        |  10 --
 .../modeler/ui/action/ImportEOModelAction.java     |   4 +-
 .../modeler/ui/action/OpenProjectAction.java       |   6 +-
 .../cayenne/modeler/ui/action/PasteAction.java     |  16 +-
 .../cayenne/modeler/ui/errors/ErrorDialog.java     | 165 ++++++---------------
 .../modeler/ui/errors/ErrorsController.java        |  32 ----
 .../cayenne/modeler/ui/errors/WarningDialog.java   |  38 -----
 8 files changed, 76 insertions(+), 218 deletions(-)

diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/AppAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/AppAction.java
index 06598128f..57e18a6cf 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/AppAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/AppAction.java
@@ -22,11 +22,13 @@ package org.apache.cayenne.modeler.toolkit;
 
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.toolkit.icon.IconFactory;
-import org.apache.cayenne.modeler.ui.errors.ErrorsController;
 import org.apache.cayenne.modeler.project.ProjectSession;
+import org.apache.cayenne.modeler.toolkit.icon.IconFactory;
+import org.apache.cayenne.modeler.ui.errors.ErrorDialog;
 import org.apache.cayenne.project.Project;
 import org.apache.cayenne.util.Util;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import javax.swing.*;
 import java.awt.event.ActionEvent;
@@ -37,6 +39,8 @@ import java.awt.event.ActionEvent;
  */
 public abstract class AppAction extends AbstractAction {
 
+    private static final Logger LOGGER = 
LoggerFactory.getLogger(AppAction.class);
+
     protected final Application app;
     protected boolean alwaysOn;
 
@@ -59,7 +63,7 @@ public abstract class AppAction extends AbstractAction {
         if (accelerator != null) {
             super.putValue(Action.ACCELERATOR_KEY, accelerator);
         }
-        
+
         if (shortDescription != null && !shortDescription.isEmpty()) {
             super.putValue(Action.SHORT_DESCRIPTION, shortDescription);
         }
@@ -119,6 +123,7 @@ public abstract class AppAction extends AbstractAction {
      * Subclasses must implement this method instead of 
<code>actionPerformed</code> to
      * allow for exception handling.
      */
+    // TODO: make protected, don't call directly
     public abstract void performAction(ActionEvent e);
 
     /**
@@ -141,9 +146,9 @@ public abstract class AppAction extends AbstractAction {
     public void actionPerformed(ActionEvent e) {
         try {
             performAction(e);
-        }
-        catch (Throwable th) {
-            ErrorsController.guiException(app, th);
+        } catch (Throwable th) {
+            LOGGER.info("Action Exception: " + getValue(Action.DEFAULT), th);
+            new ErrorDialog(app, "CayenneModeler Error", th).open();
         }
     }
 
@@ -153,7 +158,7 @@ public abstract class AppAction extends AbstractAction {
     public JMenuItem buildMenu() {
         return new JMenuItem(this);
     }
-    
+
     /**
      * Factory method that creates a checkbox menu item hooked up to this 
action.
      */
@@ -174,7 +179,7 @@ public abstract class AppAction extends AbstractAction {
 
     /**
      * Returns true if this action is always enabled.
-     * 
+     *
      * @return boolean
      */
     public boolean isAlwaysOn() {
@@ -183,7 +188,7 @@ public abstract class AppAction extends AbstractAction {
 
     /**
      * Sets the alwaysOn.
-     * 
+     *
      * @param alwaysOn The alwaysOn to set
      */
     public void setAlwaysOn(boolean alwaysOn) {
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/table/CMTableModel.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/table/CMTableModel.java
index 01ca00ab1..efb3af888 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/table/CMTableModel.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/table/CMTableModel.java
@@ -94,16 +94,6 @@ public abstract class CMTableModel<T> extends 
AbstractTableModel {
         return objectList.size();
     }
 
-    /**
-     * Returns EventController object.
-     */
-    public ProjectSession getSession() {
-        return session;
-    }
-
-    /**
-     * Returns internal object list.
-     */
     public List<T> getObjectList() {
         return objectList;
     }
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ImportEOModelAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ImportEOModelAction.java
index eec84b13e..6ce4070e6 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ImportEOModelAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ImportEOModelAction.java
@@ -54,7 +54,7 @@ import org.apache.cayenne.modeler.event.model.QueryEvent;
 import org.apache.cayenne.modeler.project.ProjectSession;
 import org.apache.cayenne.modeler.toolkit.AppAction;
 import org.apache.cayenne.modeler.toolkit.filechooser.CMFileChooserPrefs;
-import org.apache.cayenne.modeler.ui.errors.ErrorsController;
+import org.apache.cayenne.modeler.ui.errors.ErrorDialog;
 import org.apache.cayenne.wocompat.EOModelProcessor;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -152,7 +152,7 @@ public class ImportEOModelAction extends AppAction {
 
             } catch (Exception ex) {
                 LOGGER.info("EOModel Loading Exception", ex);
-                ErrorsController.guiException(app, ex);
+                new ErrorDialog(app, "Import EOModel Error", ex).open();
             }
 
         }
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/OpenProjectAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/OpenProjectAction.java
index 5cae3f7a9..07f8753d5 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/OpenProjectAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/OpenProjectAction.java
@@ -22,7 +22,7 @@ package org.apache.cayenne.modeler.ui.action;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.toolkit.AppAction;
 import org.apache.cayenne.modeler.ui.MainFrame;
-import org.apache.cayenne.modeler.ui.errors.ErrorsController;
+import org.apache.cayenne.modeler.ui.errors.ErrorDialog;
 import org.apache.cayenne.project.Project;
 import org.apache.cayenne.project.upgrade.UpgradeMetaData;
 import org.apache.cayenne.project.upgrade.UpgradeService;
@@ -179,9 +179,11 @@ public class OpenProjectAction extends AppAction {
             }
 
             openProjectResourse(rootSource, controller);
+
+
         } catch (Exception ex) {
             LOGGER.warn("Error loading project file.", ex);
-            ErrorsController.guiWarning(app, ex, "Error loading project");
+            new ErrorDialog(app, "Error loading project", ex).open();
         }
     }
 
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/PasteAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/PasteAction.java
index 6bee4c6cd..7b55fb226 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/PasteAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/PasteAction.java
@@ -37,20 +37,20 @@ import org.apache.cayenne.map.Procedure;
 import org.apache.cayenne.map.ProcedureParameter;
 import org.apache.cayenne.map.QueryDescriptor;
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.toolkit.AppAction;
-import org.apache.cayenne.modeler.ui.errors.ErrorsController;
+import org.apache.cayenne.modeler.event.model.CallbackMethodEvent;
 import org.apache.cayenne.modeler.project.ProjectSession;
-import org.apache.cayenne.modeler.ui.project.querytype.QueryTypeDialog;
+import org.apache.cayenne.modeler.toolkit.AppAction;
+import org.apache.cayenne.modeler.toolkit.copypaste.CMTransferable;
+import org.apache.cayenne.modeler.ui.errors.ErrorDialog;
 import 
org.apache.cayenne.modeler.ui.project.editor.objentity.callbacks.ObjCallbackMethod;
-import org.apache.cayenne.modeler.event.model.CallbackMethodEvent;
+import org.apache.cayenne.modeler.ui.project.querytype.QueryTypeDialog;
 import org.apache.cayenne.modeler.undo.PasteCompoundUndoableEdit;
 import org.apache.cayenne.modeler.undo.PasteUndoableEdit;
-import org.apache.cayenne.modeler.toolkit.copypaste.CMTransferable;
 import org.apache.cayenne.query.Query;
 
-import javax.swing.KeyStroke;
+import javax.swing.*;
 import javax.swing.undo.UndoableEdit;
-import java.awt.Toolkit;
+import java.awt.*;
 import java.awt.datatransfer.FlavorEvent;
 import java.awt.datatransfer.FlavorListener;
 import java.awt.datatransfer.UnsupportedFlavorException;
@@ -131,7 +131,7 @@ public class PasteAction extends AppAction implements 
FlavorListener {
         } catch (UnsupportedFlavorException ufe) {
             // do nothing
         } catch (Exception ex) {
-            ErrorsController.guiException(app, ex);
+            new ErrorDialog(app, "Paste Error", ex).open();
         }
     }
 
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/errors/ErrorDialog.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/errors/ErrorDialog.java
index c2572e095..d71c829ac 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/errors/ErrorDialog.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/errors/ErrorDialog.java
@@ -21,47 +21,31 @@
 package org.apache.cayenne.modeler.ui.errors;
 
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.toolkit.url.UrlOpener;
-import org.apache.cayenne.modeler.toolkit.buttons.CMButtonPanel;
 import org.apache.cayenne.modeler.toolkit.AppDialog;
+import org.apache.cayenne.modeler.toolkit.buttons.CMButtonPanel;
+import org.apache.cayenne.modeler.toolkit.url.UrlOpener;
 import org.apache.cayenne.util.LocalizedStringsHandler;
 import org.apache.cayenne.util.Util;
 
 import javax.swing.*;
 import javax.swing.event.HyperlinkEvent;
 import java.awt.*;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.io.StringWriter;
 
-class ErrorDialog extends AppDialog implements ActionListener {
+public class ErrorDialog extends AppDialog {
 
     private static final String BUGREPORT_URL = 
"https://issues.apache.org/jira/browse/CAY";;
 
-    protected JButton close;
-    protected JButton showHide;
-    protected JTextArea exText = new JTextArea();
-    protected JPanel exPanel;
-    protected Throwable throwable;
-    protected boolean detailed;
-
-    public ErrorDialog(
-            Application application,
-            String title,
-            Throwable throwable,
-            boolean detailed,
-            boolean modal)
-            throws HeadlessException {
-
-        super(application,
-                application.getFrame(),
-                title,
-                modal ? ModalityType.APPLICATION_MODAL : 
ModalityType.MODELESS);
-
-        setThrowable(Util.unwindException(throwable));
-        setDetailed(detailed);
+    private final JButton close;
+
+    public ErrorDialog(Application app, String title, Throwable throwable) {
+
+        super(app, app.getFrame(), title, ModalityType.MODELESS);
+
+        close = new JButton("Close");
+        close.addActionListener(e -> dispose());
 
         setResizable(false);
 
@@ -69,7 +53,7 @@ class ErrorDialog extends AppDialog implements ActionListener 
{
         pane.setLayout(new BorderLayout());
 
         // info area
-        JEditorPane infoText = new JEditorPane("text/html", 
infoHTML(application));
+        JEditorPane infoText = new JEditorPane("text/html", infoHTML(app));
         infoText.setBackground(pane.getBackground());
         infoText.setEditable(false);
         // popup hyperlinks
@@ -84,41 +68,33 @@ class ErrorDialog extends AppDialog implements 
ActionListener {
         infoPanel.add(infoText);
         pane.add(infoPanel, BorderLayout.NORTH);
 
-        // exception area
+
         if (throwable != null) {
+            JTextArea exText = new JTextArea();
+
+            exText.setText(throwableText(throwable));
+
             exText.setEditable(false);
             exText.setLineWrap(true);
             exText.setWrapStyleWord(true);
             exText.setRows(16);
             exText.setColumns(40);
+
             JScrollPane exScroll =
                     new JScrollPane(
                             exText,
                             ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
                             
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
-            exPanel = new JPanel();
+
+            JPanel exPanel = new JPanel();
             exPanel.setLayout(new BorderLayout());
             exPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
             exPanel.add(exScroll, BorderLayout.CENTER);
-
-            // buttons
-            showHide = new JButton("");
-            showHide.addActionListener(this);
-            if (isDetailed()) {
-                showDetails();
-            } else {
-                hideDetails();
-            }
+            getContentPane().add(exPanel, BorderLayout.CENTER);
         }
 
-        close = new JButton("Close");
-        close.addActionListener(this);
-
-        getRootPane().setDefaultButton(showHide);
-
-        JButton[] buttons = (showHide != null) ? new JButton[]{close, showHide}
-                : new JButton[]{close};
-        pane.add(new CMButtonPanel(buttons), BorderLayout.SOUTH);
+        getRootPane().setDefaultButton(close);
+        pane.add(new CMButtonPanel(close), BorderLayout.SOUTH);
     }
 
     protected String infoHTML(Application application) {
@@ -134,36 +110,36 @@ class ErrorDialog extends AppDialog implements 
ActionListener {
                 + "</a></font>";
     }
 
-    protected void setThrowable(Throwable throwable) {
-        this.throwable = throwable;
+    private static String throwableText(Throwable throwable) {
 
-        String text = null;
-        if (throwable != null) {
-            StringWriter str = new StringWriter();
-            PrintWriter out = new PrintWriter(str);
-
-            // first add extra diagnostics
-
-            out.println("CayenneModeler Info");
-            out.println("Version: " + 
LocalizedStringsHandler.getString("cayenne.version"));
-            out.println("Build Date: " + 
LocalizedStringsHandler.getString("cayenne.build.date"));
-            out.println("Exception: ");
-            out.println("=================================");
-            buildStackTrace(out, throwable);
-
-            try {
-                out.close();
-                str.close();
-            } catch (IOException ioex) {
-                // this should never happen
-            }
-            text = str.getBuffer().toString();
+        if (throwable == null) {
+            return null;
         }
 
-        exText.setText(text);
+        throwable = Util.unwindException(throwable);
+
+        StringWriter str = new StringWriter();
+        PrintWriter out = new PrintWriter(str);
+
+        // first add extra diagnostics
+
+        out.println("CayenneModeler Info");
+        out.println("Version: " + 
LocalizedStringsHandler.getString("cayenne.version"));
+        out.println("Build Date: " + 
LocalizedStringsHandler.getString("cayenne.build.date"));
+        out.println("Exception: ");
+        out.println("=================================");
+        buildStackTrace(out, throwable);
+
+        try {
+            out.close();
+            str.close();
+        } catch (IOException ioex) {
+            // this should never happen
+        }
+        return str.getBuffer().toString();
     }
 
-    protected void buildStackTrace(PrintWriter out, Throwable th) {
+    private static void buildStackTrace(PrintWriter out, Throwable th) {
         if (th == null) {
             return;
         }
@@ -176,49 +152,4 @@ class ErrorDialog extends AppDialog implements 
ActionListener {
             buildStackTrace(out, cause);
         }
     }
-
-    @Override
-    public void actionPerformed(ActionEvent e) {
-        if (e.getSource() == close) {
-            this.dispose();
-        } else if (e.getSource() == showHide) {
-            if (isDetailed()) {
-                hideDetails();
-            } else {
-                showDetails();
-            }
-            this.pack();
-            this.centerOnOwner();
-        }
-    }
-
-    protected void hideDetails() {
-        getContentPane().remove(exPanel);
-        showHide.setText("Show Details");
-        setDetailed(false);
-    }
-
-    protected void showDetails() {
-        getContentPane().add(exPanel, BorderLayout.CENTER);
-        showHide.setText("Hide Details");
-        setDetailed(true);
-    }
-
-    /**
-     * Returns the detailed.
-     *
-     * @return boolean
-     */
-    public boolean isDetailed() {
-        return detailed;
-    }
-
-    /**
-     * Sets the detailed.
-     *
-     * @param detailed The detailed to set
-     */
-    public void setDetailed(boolean detailed) {
-        this.detailed = detailed;
-    }
 }
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/errors/ErrorsController.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/errors/ErrorsController.java
deleted file mode 100644
index 8bb94a241..000000000
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/errors/ErrorsController.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package org.apache.cayenne.modeler.ui.errors;
-
-import org.apache.cayenne.modeler.Application;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class ErrorsController {
-
-    private static final Logger LOGGER = 
LoggerFactory.getLogger(ErrorsController.class);
-
-    /**
-     * Shows an error dialog with stack trace
-     */
-    public static void guiException(Application application, Throwable th) {
-        if (th != null) {
-            LOGGER.error("CayenneModeler Error", th);
-        }
-
-        new ErrorDialog(application, "CayenneModeler Error", th, true, 
false).open();
-    }
-
-    /**
-     * Shows a warning dialog with stack trace
-     */
-    public static void guiWarning(Application application, Throwable th, 
String message) {
-        if (th != null) {
-            LOGGER.warn("CayenneModeler Warning", th);
-        }
-
-        new WarningDialog(application, message, th, false, 
false).setDetailed(true);
-    }
-}
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/errors/WarningDialog.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/errors/WarningDialog.java
deleted file mode 100644
index 380ab18c2..000000000
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/errors/WarningDialog.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.modeler.ui.errors;
-
-import org.apache.cayenne.modeler.Application;
-
-import java.awt.*;
-
-class WarningDialog extends ErrorDialog {
-
-    public WarningDialog(Application application, String title, Throwable 
throwable, boolean detailed, boolean modal) throws HeadlessException {
-        super(application, title, throwable, detailed, modal);
-    }
-
-    @Override
-    protected String infoHTML(Application application) {
-        return "<font face='Arial,Helvetica' size='+1' color='blue'>"
-                + getTitle()
-                + "</font>";
-    }
-}

Reply via email to