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

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

commit bee2fc2f893dad553b9248a1481ff29e89b9174e
Author: Andrus Adamchik <[email protected]>
AuthorDate: Thu Jun 11 18:16:13 2026 -0400

    CAY-2959 Modeler: DbRelationship dialog "Cancel" does not cancel
---
 RELEASE-NOTES.txt                                  |   1 +
 .../modeler/toolkit/table/CMTableModel.java        |   9 +
 .../ui/action/CreateRelationshipAction.java        |   4 +-
 .../ui/dbrelationship/DbJoinTableModel.java        |  79 +++---
 .../ui/dbrelationship/DbRelationshipDialog.java    | 287 ++++++++++-----------
 .../dbentity/properties/DbRelationshipPanel.java   |   4 +-
 .../relinfo/ObjRelationshipInfoDialog.java         |  38 +--
 7 files changed, 202 insertions(+), 220 deletions(-)

diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index ede153c1b..a002a2091 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -19,6 +19,7 @@ CAY-2957 Get rid of adapter for legacy HSQLDB <= 1.8
 Bug Fixes:
 
 CAY-2958 Empty join is saved
+CAY-2959 Modeler: DbRelationship dialog "Cancel" doesn't cancel
 
 ----------------------------------
 Release: 5.0-M2
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 5f2fae576..ac4173fd3 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
@@ -108,6 +108,15 @@ public abstract class CMTableModel<T> extends 
AbstractTableModel {
         fireTableDataChanged();
     }
 
+    public void removeAllRows() {
+        if (objectList.isEmpty()) {
+            return;
+        }
+
+        objectList.clear();
+        fireTableDataChanged();
+    }
+
     /**
      * Moves a row up, jumping down if row is already at the top.
      */
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateRelationshipAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateRelationshipAction.java
index 972a8f2eb..41fb7983e 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateRelationshipAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateRelationshipAction.java
@@ -94,9 +94,7 @@ public class CreateRelationshipAction extends AppAction {
             DbEntity dbEnt = getProjectSession().getSelectedDbEntity();
             if (dbEnt != null) {
 
-                new DbRelationshipDialog(getProjectSession(), app.getFrame())
-                        .createNewRelationship(dbEnt)
-                        .open();
+                DbRelationshipDialog.openForCreate(getProjectSession(), 
app.getFrame(), dbEnt);
             }
         }
     }
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbrelationship/DbJoinTableModel.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbrelationship/DbJoinTableModel.java
index 1a8ab08b0..4dbbf2f55 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbrelationship/DbJoinTableModel.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbrelationship/DbJoinTableModel.java
@@ -19,6 +19,7 @@
 
 package org.apache.cayenne.modeler.ui.dbrelationship;
 
+import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.DbJoin;
 import org.apache.cayenne.map.DbRelationship;
@@ -26,49 +27,39 @@ import org.apache.cayenne.modeler.project.ProjectSession;
 import org.apache.cayenne.modeler.toolkit.table.CMTableModel;
 
 import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
 
-/**
- * Model for editing DbAttributePair-s. Changes in the join attributes
- * don't take place until commit() is called. Creation of the new
- * DbAttributes is not allowed - user should choose from the existing ones.
- */
-public class DbJoinTableModel extends CMTableModel<DbJoin> {
+class DbJoinTableModel extends CMTableModel<DbJoin> {
 
-    // Columns
     static final int SOURCE = 0;
     static final int TARGET = 1;
 
-    protected DbRelationship relationship;
-    protected DbEntity source;
-    protected DbEntity target;
-
-    /**
-     * Is the table editable.
-     */
-    private boolean editable;
+    private final DbRelationship relationship;
+    private final DbEntity source;
+    private final DbEntity target;
 
     public DbJoinTableModel(
             DbRelationship relationship,
             ProjectSession session,
-            Object src) {
+            Object src,
+            List<DbJoin> joins,
+            DbEntity target) {
 
-        super(session, src, new ArrayList<>(relationship.getJoins()));
+        super(session, src, copyJoins(relationship, joins));
         this.relationship = relationship;
         this.source = relationship.getSourceEntity();
-        this.target = relationship.getTargetEntity();
+        this.target = target;
     }
 
-    public DbJoinTableModel(
-            DbRelationship relationship,
-            ProjectSession session,
-            Object src,
-            boolean editable) {
-
-        this(relationship, session, src);
-        this.editable = editable;
+    private static List<DbJoin> copyJoins(DbRelationship relationship, 
List<DbJoin> joins) {
+        return joins.stream()
+                .map(j -> new DbJoin(relationship, j.getSourceName(), 
j.getTargetName()))
+                .collect(Collectors.toCollection(ArrayList::new));
     }
 
-    public Class getElementsClass() {
+    @Override
+    public Class<?> getElementsClass() {
         return DbJoin.class;
     }
 
@@ -79,6 +70,32 @@ public class DbJoinTableModel extends CMTableModel<DbJoin> {
                 .toList());
     }
 
+    /**
+     * Same check as {@link DbRelationship#isValidForDepPk()}, but over the 
uncommitted joins and target
+     * entity of this table.
+     */
+    public boolean isValidForDepPk() {
+        if (objectList.isEmpty()) {
+            return false;
+        }
+
+        for (DbJoin join : objectList) {
+            DbAttribute sourceAttribute = source != null && 
join.getSourceName() != null
+                    ? source.getAttribute(join.getSourceName())
+                    : null;
+            DbAttribute targetAttribute = target != null && 
join.getTargetName() != null
+                    ? target.getAttribute(join.getTargetName())
+                    : null;
+
+            if (targetAttribute != null && !targetAttribute.isPrimaryKey()
+                    || sourceAttribute != null && 
!sourceAttribute.isPrimaryKey()) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
     @Override
     public int getColumnCount() {
         return 2;
@@ -87,9 +104,9 @@ public class DbJoinTableModel extends CMTableModel<DbJoin> {
     @Override
     public String getColumnName(int column) {
         if (column == SOURCE)
-            return relationship.getSourceEntity().getName();
+            return source.getName();
         else if (column == TARGET)
-            return relationship.getTargetEntity().getName();
+            return target != null ? target.getName() : "";
         else
             return "";
     }
@@ -142,9 +159,9 @@ public class DbJoinTableModel extends CMTableModel<DbJoin> {
 
     public boolean isCellEditable(int row, int col) {
         if (col == SOURCE) {
-            return relationship.getSourceEntity() != null && editable;
+            return source != null;
         } else if (col == TARGET) {
-            return relationship.getTargetEntity() != null && editable;
+            return target != null;
         }
 
         return false;
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbrelationship/DbRelationshipDialog.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbrelationship/DbRelationshipDialog.java
index 804a716a8..377342a53 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbrelationship/DbRelationshipDialog.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbrelationship/DbRelationshipDialog.java
@@ -32,45 +32,28 @@ import org.apache.cayenne.map.ObjAttribute;
 import org.apache.cayenne.map.ObjRelationship;
 import org.apache.cayenne.modeler.event.display.DbRelationshipDisplayEvent;
 import org.apache.cayenne.modeler.event.model.DbRelationshipEvent;
+import org.apache.cayenne.modeler.pref.adapters.CMTablePrefs;
 import org.apache.cayenne.modeler.project.DbRelationshipOps;
+import org.apache.cayenne.modeler.project.ProjectSession;
+import org.apache.cayenne.modeler.toolkit.ProjectDialog;
 import org.apache.cayenne.modeler.toolkit.buttons.CMButtonPanel;
 import org.apache.cayenne.modeler.toolkit.combobox.AutoCompletion;
-import org.apache.cayenne.modeler.toolkit.combobox.CMComboBox;
 import 
org.apache.cayenne.modeler.toolkit.combobox.CMAutoCompleteComboBoxCellEditor;
+import org.apache.cayenne.modeler.toolkit.combobox.CMComboBox;
 import org.apache.cayenne.modeler.toolkit.table.CMTable;
-import org.apache.cayenne.modeler.pref.adapters.CMTablePrefs;
-import org.apache.cayenne.modeler.toolkit.ProjectDialog;
-import org.apache.cayenne.modeler.project.ProjectSession;
 import org.apache.cayenne.modeler.undo.CreateRelationshipUndoableEdit;
 import org.apache.cayenne.modeler.undo.RelationshipUndoableEdit;
 import org.apache.cayenne.project.extension.info.ObjectInfo;
-import java.util.Objects;
 
-import javax.swing.AbstractListModel;
-import javax.swing.ComboBoxModel;
-import javax.swing.DefaultListModel;
-import javax.swing.JButton;
-import javax.swing.JCheckBox;
-import javax.swing.JComboBox;
-import javax.swing.JLabel;
-import javax.swing.JList;
-import javax.swing.JOptionPane;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JTextField;
-import javax.swing.ListSelectionModel;
+import javax.swing.*;
 import javax.swing.table.TableColumn;
-import java.awt.BorderLayout;
-import java.awt.Dimension;
-import java.awt.FlowLayout;
-import java.awt.Window;
-import java.awt.event.WindowAdapter;
-import java.awt.event.WindowEvent;
+import java.awt.*;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
+import java.util.Objects;
 import java.util.Optional;
 import java.util.Set;
 import java.util.function.Function;
@@ -98,15 +81,46 @@ public class DbRelationshipDialog extends ProjectDialog {
     private final JButton saveButton;
     private final JButton cancelButton;
 
-    private DbRelationship relationship;
-    private DbRelationship reverseRelationship;
-    private boolean create;
-    private boolean cancelPressed;
-    private RelationshipUndoableEdit undo;
+    private final DbRelationship relationship;
+    private final DbRelationship reverseRelationship;
+    private final boolean create;
+    private boolean saved;
+    private final RelationshipUndoableEdit undo;
+
+    // dialog-local editing state, applied to the relationship only on save
+    private DbEntity currentTarget;
+    private boolean unsetReverseDepPk;
+
+    public static Optional<DbRelationship> openForCreate(ProjectSession 
session, Window owner, DbEntity sourceEntity) {
+        DbRelationship relationship = new DbRelationship();
+        relationship.setName(NameBuilder.builder(relationship, 
sourceEntity).name());
+        relationship.setSourceEntity(sourceEntity);
+
+        DbRelationshipDialog dialog = new DbRelationshipDialog(session, owner, 
relationship, true);
+        dialog.open();
+        return dialog.saved ? Optional.of(relationship) : Optional.empty();
+    }
+
+    public static void openForEdit(ProjectSession session, Window owner, 
DbRelationship relationship) {
+        new DbRelationshipDialog(session, owner, relationship, false).open();
+    }
 
-    public DbRelationshipDialog(ProjectSession session, Window owner) {
+    private DbRelationshipDialog(ProjectSession session, Window owner, 
DbRelationship relationship, boolean create) {
         super(session, owner, "Create dbRelationship", 
ModalityType.APPLICATION_MODAL);
 
+        if (relationship.getSourceEntity() == null) {
+            throw new CayenneRuntimeException("Null source entity: %s", 
relationship);
+        }
+        if (relationship.getSourceEntity().getDataMap() == null) {
+            throw new CayenneRuntimeException("Null DataMap: %s", 
relationship.getSourceEntity());
+        }
+
+        this.relationship = relationship;
+        this.create = create;
+        this.undo = new RelationshipUndoableEdit(session, relationship);
+        this.reverseRelationship = relationship.getReverseRelationship();
+        this.currentTarget = relationship.getTargetEntity();
+
         this.name = new JTextField(25);
         this.targetEntities = new JComboBox<>();
         this.toDepPk = new JCheckBox();
@@ -122,38 +136,8 @@ public class DbRelationshipDialog extends ProjectDialog {
         
this.table.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
 
         initLayout();
-    }
-
-    public DbRelationshipDialog createNewRelationship(DbEntity dbEntity) {
-        this.create = true;
-
-        DbRelationship rel = new DbRelationship();
-        rel.setName(NameBuilder.builder(rel, dbEntity).name());
-        rel.setSourceEntity(dbEntity);
-
-        return modifyRelationship(rel);
-    }
-
-    public DbRelationshipDialog modifyRelationship(DbRelationship 
dbRelationship) {
-        this.undo = new RelationshipUndoableEdit(session, dbRelationship);
-        this.relationship = dbRelationship;
-        this.reverseRelationship = relationship.getReverseRelationship();
-
-        if (relationship.getSourceEntity() == null) {
-            throw new CayenneRuntimeException("Null source entity: %s", 
relationship);
-        }
-        if (relationship.getSourceEntity().getDataMap() == null) {
-            throw new CayenneRuntimeException("Null DataMap: %s", 
relationship.getSourceEntity());
-        }
-
         initBindings();
         initFromModel();
-
-        return this;
-    }
-
-    public Optional<DbRelationship> getRelationship() {
-        return cancelPressed ? Optional.empty() : Optional.of(relationship);
     }
 
     private void initLayout() {
@@ -197,10 +181,7 @@ public class DbRelationshipDialog extends ProjectDialog {
     }
 
     private void initFromModel() {
-        TargetComboBoxModel targetComboBoxModel =
-                new 
TargetComboBoxModel(session.entityResolver().getDbEntities());
-        targetEntities.setModel(targetComboBoxModel);
-
+        targetEntities.setModel(new 
TargetComboBoxModel(session.entityResolver().getDbEntities()));
         sourceName.setText(relationship.getSourceEntityName());
         toDepPk.setSelected(relationship.isToDependentPK());
         toMany.setSelected(relationship.isToMany());
@@ -210,7 +191,7 @@ public class DbRelationshipDialog extends ProjectDialog {
             reverseName.setText(reverseRelationship.getName());
         }
 
-        if (relationship.getTargetEntity() == null) {
+        if (currentTarget == null) {
             enableOptions(false);
         } else {
             enableInfo();
@@ -222,27 +203,29 @@ public class DbRelationshipDialog extends ProjectDialog {
     private void initBindings() {
         targetEntities.addActionListener(action -> {
             DbEntity selectedItem = ((TargetComboBoxModel) 
targetEntities.getModel()).selected;
-            if (relationship.getTargetEntityName() == null) {
-                relationship.setTargetEntityName(selectedItem.getName());
-            } else if 
(!relationship.getTargetEntityName().equals(selectedItem.getName())) {
+            boolean joinsReset = false;
+            if (currentTarget == null) {
+                currentTarget = selectedItem;
+            } else if (currentTarget != selectedItem) {
                 if (showWarningDialog(relationship)) {
-                    relationship.removeAllJoins();
-                    relationship.setTargetEntityName(selectedItem.getName());
+                    currentTarget = selectedItem;
+                    joinsReset = true;
                 } else {
-                    
targetEntities.setSelectedItem(relationship.getTargetEntityName());
+                    targetEntities.setSelectedItem(currentTarget.getName());
                 }
-                relationship.setToDependentPK(false);
-                toDepPk.setSelected(relationship.isValidForDepPk());
-                
session.fireDbRelationshipEvent(DbRelationshipEvent.ofChange(this, 
relationship, relationship.getSourceEntity()));
             }
             enableInfo();
+            if (joinsReset) {
+                // joins to the old target make no sense for the new one; 
reset the uncommitted table rows
+                ((DbJoinTableModel) table.getModel()).removeAllRows();
+                toDepPk.setSelected(false);
+                toDepPk.setEnabled(false);
+            }
         });
 
         addButton.addActionListener(e -> {
             DbJoinTableModel model = (DbJoinTableModel) table.getModel();
-            DbJoin join = new DbJoin(relationship);
-            relationship.addJoin(join);
-            model.addRow(join);
+            model.addRow(new DbJoin(relationship));
             table.select(model.getRowCount() - 1);
         });
 
@@ -250,51 +233,36 @@ public class DbRelationshipDialog extends ProjectDialog {
             DbJoinTableModel model = (DbJoinTableModel) table.getModel();
             stopEditing();
             int row = table.getSelectedRow();
-            DbJoin join = model.getJoin(row);
+            model.removeRow(model.getJoin(row));
 
-            relationship.removeJoin(join);
-            if (relationship.isValidForDepPk()) {
+            if (model.isValidForDepPk()) {
                 toDepPk.setEnabled(true);
             } else {
                 toDepPk.setEnabled(false);
                 toDepPk.setSelected(false);
-                relationship.setToDependentPK(false);
             }
-
-            model.removeRow(join);
         });
 
         saveButton.addActionListener(e -> {
-            cancelPressed = false;
             save();
+            saved = true;
             dispose();
         });
 
-        cancelButton.addActionListener(e -> {
-            cancelPressed = true;
-            dispose();
-        });
-
-        addWindowListener(new WindowAdapter() {
-            @Override
-            public void windowClosing(WindowEvent e) {
-                cancelPressed = true;
-            }
-        });
+        cancelButton.addActionListener(e -> dispose());
 
         toDepPk.setEnabled(relationship.isValidForDepPk());
         toDepPk.addActionListener(selected -> {
-            boolean isSelected = toDepPk.isSelected();
-            DbRelationship reverse = relationship.getReverseRelationship();
-            if (reverse != null && reverse.isToDependentPK() && isSelected) {
-                boolean setToDepPk = JOptionPane.showConfirmDialog(
+            unsetReverseDepPk = false;
+            if (toDepPk.isSelected() && reverseRelationship != null && 
reverseRelationship.isToDependentPK()) {
+                unsetReverseDepPk = JOptionPane.showConfirmDialog(
                         app.getFrame(),
                         "Unset reverse relationship's \"To Dep PK\" setting?",
                         "Warning", JOptionPane.OK_CANCEL_OPTION, 
JOptionPane.PLAIN_MESSAGE) == JOptionPane.OK_OPTION;
-                relationship.setToDependentPK(setToDepPk);
-                reverse.setToDependentPK(!setToDepPk);
-            } else {
-                relationship.setToDependentPK(toDepPk.isSelected());
+                if (!unsetReverseDepPk) {
+                    // both sides can't be dep PK, and the user chose to keep 
it on the reverse
+                    toDepPk.setSelected(false);
+                }
             }
         });
     }
@@ -302,10 +270,16 @@ public class DbRelationshipDialog extends ProjectDialog {
     private void enableInfo() {
         enableOptions(true);
 
-        table.setModel(new DbJoinTableModel(relationship, session, this, 
true));
-        table.getModel().addTableModelListener(change -> {
+        // carry uncommitted joins over from the previous model, if any; the 
relationship itself only
+        // reflects the table state after "Done"
+        List<DbJoin> joins = table.getModel() instanceof DbJoinTableModel 
previous
+                ? previous.getObjectList()
+                : relationship.getJoins();
+        DbJoinTableModel model = new DbJoinTableModel(relationship, session, 
this, joins, currentTarget);
+        table.setModel(model);
+        model.addTableModelListener(change -> {
             if (change.getLastRow() != Integer.MAX_VALUE) {
-                toDepPk.setEnabled(relationship.isValidForDepPk());
+                toDepPk.setEnabled(model.isValidForDepPk());
             }
         });
 
@@ -317,7 +291,7 @@ public class DbRelationshipDialog extends ProjectDialog {
 
         TableColumn targetColumn = 
table.getColumnModel().getColumn(DbJoinTableModel.TARGET);
         JComboBox<String> targetCombo = new CMComboBox<>(
-                
dbAttributeNames(relationship.getTargetEntity()).stream().sorted().toArray(String[]::new));
+                
dbAttributeNames(currentTarget).stream().sorted().toArray(String[]::new));
         AutoCompletion.enable(targetCombo, session::getSelectedDataMap);
         targetColumn.setCellEditor(new 
CMAutoCompleteComboBoxCellEditor(targetCombo));
 
@@ -343,53 +317,81 @@ public class DbRelationshipDialog extends ProjectDialog {
     private void save() {
         stopEditing();
 
-        DbJoinTableModel model = (DbJoinTableModel) table.getModel();
-
         handleNameUpdate(relationship, name.getText().trim());
 
-        model.commit();
+        // the single place where the dialog editing state is written to the 
relationship
+        relationship.setTargetEntityName(currentTarget != null ? 
currentTarget.getName() : null);
+        relationship.setToMany(toMany.isSelected());
+        relationship.setToDependentPK(toDepPk.isSelected());
+        if (unsetReverseDepPk && reverseRelationship != null) {
+            reverseRelationship.setToDependentPK(false);
+        }
+
+        ((DbJoinTableModel) table.getModel()).commit();
 
         // check after commit, as it filters out empty joins
         boolean updatingReverse = !relationship.getJoins().isEmpty();
 
-        relationship.setToMany(toMany.isSelected());
-
         ObjectInfo.putToMetaData(app.getMetaData(), relationship, 
ObjectInfo.COMMENT, comment.getText());
 
         // If new reverse DbRelationship was created, add it to the target.
         // Don't create reverse with no joins - makes no sense...
         if (updatingReverse) {
 
-            if (reverseRelationship == null) {
-                reverseRelationship = new DbRelationship();
-                reverseRelationship.setName(NameBuilder
-                        .builder(reverseRelationship, 
relationship.getTargetEntity())
+            DbRelationship reverse = reverseRelationship;
+            if (reverse == null) {
+                reverse = new DbRelationship();
+                reverse.setName(NameBuilder
+                        .builder(reverse, relationship.getTargetEntity())
                         .baseName(reverseName.getText().trim())
                         .name());
 
-                
reverseRelationship.setSourceEntity(relationship.getTargetEntity());
-                
reverseRelationship.setTargetEntityName(relationship.getSourceEntity());
-                reverseRelationship.setToMany(!relationship.isToMany());
-                
relationship.getTargetEntity().addRelationship(reverseRelationship);
+                reverse.setSourceEntity(relationship.getTargetEntity());
+                reverse.setTargetEntityName(relationship.getSourceEntity());
+                reverse.setToMany(!relationship.isToMany());
+                relationship.getTargetEntity().addRelationship(reverse);
 
                 // fire only if the relationship is to the same entity (needed 
to update entity view)
                 if (relationship.getSourceEntity() == 
relationship.getTargetEntity()) {
                     session.fireDbRelationshipEvent(DbRelationshipEvent.ofAdd(
-                            this, reverseRelationship, 
reverseRelationship.getSourceEntity()));
+                            this, reverse, reverse.getSourceEntity()));
                 }
             } else {
-                handleNameUpdate(reverseRelationship, 
reverseName.getText().trim());
+                handleNameUpdate(reverse, reverseName.getText().trim());
             }
 
-            Collection<DbJoin> reverseJoins = getReverseJoins();
-            reverseRelationship.setJoins(reverseJoins);
+            reverse.setJoins(getReverseJoins(reverse));
 
-            if (!relationship.isToDependentPK() && 
reverseRelationship.isValidForDepPk()) {
-                reverseRelationship.setToDependentPK(true);
+            if (!relationship.isToDependentPK() && reverse.isValidForDepPk()) {
+                reverse.setToDependentPK(true);
             }
         }
 
-        fireDbRelationshipEvent(create);
+        if (create) {
+            DbEntity dbEntity = relationship.getSourceEntity();
+            if (dbEntity.getRelationship(relationship.getName()) == null) {
+                dbEntity.addRelationship(relationship);
+            }
+
+            session.fireDbRelationshipEvent(DbRelationshipEvent.ofAdd(this, 
relationship, dbEntity));
+
+            DbRelationshipDisplayEvent rde = new DbRelationshipDisplayEvent(
+                    this,
+                    (DataChannelDescriptor) session.project().getRootNode(),
+                    session.getSelectedDataMap(),
+                    dbEntity,
+                    relationship);
+
+            session.displayDbRelationship(rde);
+            app.getUndoManager().addEdit(
+                    new CreateRelationshipUndoableEdit(session, 
relationship.getSourceEntity(),
+                            new DbRelationship[]{relationship}));
+
+        } else {
+            session.fireDbRelationshipEvent(
+                    DbRelationshipEvent.ofChange(this, relationship, 
relationship.getSourceEntity()));
+            app.getUndoManager().addEdit(undo);
+        }
     }
 
     private void handleNameUpdate(DbRelationship rel, String userInputName) {
@@ -411,7 +413,7 @@ public class DbRelationshipDialog extends ProjectDialog {
         session.fireDbRelationshipEvent(DbRelationshipEvent.ofChange(this, 
rel, rel.getSourceEntity(), oldName));
     }
 
-    private Collection<DbJoin> getReverseJoins() {
+    private Collection<DbJoin> getReverseJoins(DbRelationship reverse) {
         Collection<DbJoin> joins = relationship.getJoins();
 
         if ((joins == null) || (joins.isEmpty())) {
@@ -424,40 +426,13 @@ public class DbRelationshipDialog extends ProjectDialog {
         for (DbJoin pair : joins) {
             DbJoin reverseJoin = pair.createReverseJoin();
             // since reverse relationship is not yet initialized, the reverse 
join is wired by hand
-            reverseJoin.setRelationship(reverseRelationship);
+            reverseJoin.setRelationship(reverse);
             reverseJoins.add(reverseJoin);
         }
 
         return reverseJoins;
     }
 
-    private void fireDbRelationshipEvent(boolean isCreate) {
-        if (!isCreate) {
-            session.fireDbRelationshipEvent(
-                    DbRelationshipEvent.ofChange(this, relationship, 
relationship.getSourceEntity()));
-            app.getUndoManager().addEdit(undo);
-        } else {
-            DbEntity dbEntity = relationship.getSourceEntity();
-            if (dbEntity.getRelationship(relationship.getName()) == null) {
-                dbEntity.addRelationship(relationship);
-            }
-
-            session.fireDbRelationshipEvent(DbRelationshipEvent.ofAdd(this, 
relationship, dbEntity));
-
-            DbRelationshipDisplayEvent rde = new DbRelationshipDisplayEvent(
-                    this,
-                    (DataChannelDescriptor) session.project().getRootNode(),
-                    session.getSelectedDataMap(),
-                    dbEntity,
-                    relationship);
-
-            session.displayDbRelationship(rde);
-            app.getUndoManager().addEdit(
-                    new CreateRelationshipUndoableEdit(session, 
relationship.getSourceEntity(),
-                            new DbRelationship[]{relationship}));
-        }
-    }
-
     private boolean showWarningDialog(DbRelationship relationship) {
         DataChannelDescriptor domain = (DataChannelDescriptor) 
session.project().getRootNode();
         Collection<ObjRelationship> objRelationships = 
DbRelationshipOps.objRelationshipsUsingDbRelationship(domain, relationship);
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbRelationshipPanel.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbRelationshipPanel.java
index 6f37b3848..5258cb378 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbRelationshipPanel.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbRelationshipPanel.java
@@ -267,9 +267,7 @@ public class DbRelationshipPanel extends ProjectPanel 
implements DbEntityDisplay
 
         DbRelationshipTableModel model = (DbRelationshipTableModel) 
table.getModel();
         DbRelationship rel = model.getRelationship(row);
-        new DbRelationshipDialog(session, app.getFrame())
-                .modifyRelationship(rel)
-                .open();
+        DbRelationshipDialog.openForEdit(session, app.getFrame(), rel);
     }
 
     private void valueChanged(ListSelectionEvent e) {
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/relinfo/ObjRelationshipInfoDialog.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/relinfo/ObjRelationshipInfoDialog.java
index 1af631bb9..d085d39e8 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/relinfo/ObjRelationshipInfoDialog.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/relinfo/ObjRelationshipInfoDialog.java
@@ -32,41 +32,30 @@ import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.ObjRelationship;
 import org.apache.cayenne.modeler.event.display.ObjRelationshipDisplayEvent;
 import org.apache.cayenne.modeler.event.model.ObjRelationshipEvent;
-import org.apache.cayenne.modeler.toolkit.columnview.ColumnViewPanel;
+import org.apache.cayenne.modeler.project.ProjectComparators;
+import org.apache.cayenne.modeler.project.ProjectSession;
+import org.apache.cayenne.modeler.toolkit.ProjectDialog;
 import org.apache.cayenne.modeler.toolkit.buttons.CMButtonPanel;
+import org.apache.cayenne.modeler.toolkit.columnview.ColumnViewPanel;
 import org.apache.cayenne.modeler.toolkit.combobox.CMComboBox;
-import org.apache.cayenne.modeler.toolkit.ProjectDialog;
+import org.apache.cayenne.modeler.toolkit.tree.EntityTreeModel;
+import org.apache.cayenne.modeler.toolkit.tree.EntityTreeRelationshipFilter;
 import org.apache.cayenne.modeler.ui.dbrelationship.DbRelationshipDialog;
-import org.apache.cayenne.modeler.project.ProjectSession;
 import org.apache.cayenne.modeler.undo.CreateRelationshipUndoableEdit;
 import org.apache.cayenne.modeler.undo.RelationshipUndoableEdit;
-import org.apache.cayenne.modeler.project.ProjectComparators;
-import org.apache.cayenne.modeler.toolkit.tree.EntityTreeModel;
-import org.apache.cayenne.modeler.toolkit.tree.EntityTreeRelationshipFilter;
 import org.apache.cayenne.project.extension.info.ObjectInfo;
 import org.apache.cayenne.util.DeleteRuleUpdater;
 
-import javax.swing.JButton;
-import javax.swing.JCheckBox;
-import javax.swing.JComboBox;
-import javax.swing.JLabel;
-import javax.swing.JOptionPane;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JTextField;
+import javax.swing.*;
 import javax.swing.event.TreeSelectionEvent;
 import javax.swing.event.TreeSelectionListener;
 import javax.swing.tree.TreePath;
-import java.awt.BorderLayout;
-import java.awt.Dimension;
-import java.awt.FlowLayout;
-import java.awt.Window;
+import java.awt.*;
 import java.awt.event.ItemEvent;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 import java.util.Objects;
-import java.util.Optional;
 
 /**
  * Modal "ObjRelationship inspector" — name, target entity, semantics, 
collection type,
@@ -363,12 +352,7 @@ public class ObjRelationshipInfoDialog extends 
ProjectDialog implements TreeSele
     private void createRelationship() {
         DbEntity dbEntity = relationship.getSourceEntity().getDbEntity();
 
-        DbRelationshipDialog dialog =
-                new DbRelationshipDialog(session, 
this).createNewRelationship(dbEntity);
-        dialog.open();
-
-        Optional<DbRelationship> dbRelationship = dialog.getRelationship();
-        if (dbRelationship.isPresent()) {
+        DbRelationshipDialog.openForCreate(session, this, 
dbEntity).ifPresent(dbRelationship -> {
             Object[] oldPath = new Object[]{getStartEntity()};
 
             EntityTreeModel treeModel = (EntityTreeModel) 
pathBrowser.getModel();
@@ -379,9 +363,9 @@ public class ObjRelationshipInfoDialog extends 
ProjectDialog implements TreeSele
 
             Object[] path = new Object[oldPath.length + 1];
             System.arraycopy(oldPath, 0, path, 0, path.length - 1);
-            path[path.length - 1] = dbRelationship.get();
+            path[path.length - 1] = dbRelationship;
             pathBrowser.setSelectionPath(new TreePath(path));
-        }
+        });
     }
 
     private void setDeleteRule() {

Reply via email to