Ticket #23091: 23091.patch

File 23091.patch, 9.2 KB (added by taylor.smock, 3 years ago)
  • src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java

    Subject: [PATCH] Fix #23091: Opening preset from Relation Editor window causes crashes
    ---
    IDEA additional info:
    Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
    <+>UTF-8
    diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java b/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java
    a b  
    123123    /** the tag table and its model */
    124124    private final TagEditorPanel tagEditorPanel;
    125125    private final ReferringRelationsBrowser referrerBrowser;
    126     private final ReferringRelationsBrowserModel referrerModel;
    127126
    128127    /** the member table and its model */
    129128    private final MemberTable memberTable;
     
    153152     */
    154153    private final SelectAction selectAction;
    155154    /**
    156      * Action for performing the {@link DuplicateRelationAction}
    157      */
    158     private final DuplicateRelationAction duplicateAction;
    159     /**
    160      * Action for performing the {@link DeleteCurrentRelationAction}
    161      */
    162     private final DeleteCurrentRelationAction deleteAction;
    163     /**
    164      * Action for performing the {@link OKAction}
    165      */
    166     private final OKAction okAction;
    167     /**
    168155     * Action for performing the {@link CancelAction}
    169156     */
    170157    private final CancelAction cancelAction;
     
    174161    private final ArrayList<FlavorListener> clipboardListeners = new ArrayList<>();
    175162
    176163    private Component selectedTabPane;
    177     private JTabbedPane tabbedPane;
     164    private final JTabbedPane tabbedPane;
    178165
    179166    /**
    180167     * Creates a new relation editor for the given relation. The relation will be saved if the user
    181168     * selects "ok" in the editor.
    182      *
     169     * <p>
    183170     * If no relation is given, will create an editor for a new relation.
    184171     *
    185172     * @param layer the {@link OsmDataLayer} the new or edited relation belongs to
     
    201188
    202189            @Override
    203190            public Collection<OsmPrimitive> getSelection() {
    204                 Relation relation = new Relation();
    205                 tagEditorPanel.getModel().applyToPrimitive(relation);
    206                 return Collections.<OsmPrimitive>singletonList(relation);
     191                return Collections.singletonList(getRelation());
    207192            }
    208193        };
    209194
     
    213198        memberTableModel.register();
    214199        selectionTableModel = new SelectionTableModel(getLayer());
    215200        selectionTableModel.register();
    216         referrerModel = new ReferringRelationsBrowserModel(relation);
     201        ReferringRelationsBrowserModel referrerModel = new ReferringRelationsBrowserModel(relation);
    217202
    218203        tagEditorPanel = new TagEditorPanel(relation, presetHandler);
    219204        populateModels(relation);
     
    270255        refreshAction = new RefreshAction(actionAccess);
    271256        applyAction = new ApplyAction(actionAccess);
    272257        selectAction = new SelectAction(actionAccess);
    273         duplicateAction = new DuplicateRelationAction(actionAccess);
    274         deleteAction = new DeleteCurrentRelationAction(actionAccess);
     258        // Action for performing the {@link DuplicateRelationAction}
     259        final DuplicateRelationAction duplicateAction = new DuplicateRelationAction(actionAccess);
     260        // Action for performing the {@link DeleteCurrentRelationAction}
     261        final DeleteCurrentRelationAction deleteAction = new DeleteCurrentRelationAction(actionAccess);
    275262
    276263        this.memberTableModel.addTableModelListener(applyAction);
    277264        this.tagEditorPanel.getModel().addTableModelListener(applyAction);
    278265
    279266        addPropertyChangeListener(deleteAction);
    280267
    281         okAction = new OKAction(actionAccess);
     268        // Action for performing the {@link OKAction}
     269        final OKAction okAction = new OKAction(actionAccess);
    282270        cancelAction = new CancelAction(actionAccess);
    283271
    284272        getContentPane().add(buildToolBar(refreshAction, applyAction, selectAction, duplicateAction, deleteAction), BorderLayout.NORTH);
     
    304292        InputMapUtils.addCtrlEnterAction(getRootPane(), okAction);
    305293        // CHECKSTYLE.OFF: LineLength
    306294        registerCopyPasteAction(tagEditorPanel.getPasteAction(), "PASTE_TAGS",
    307                 Shortcut.registerShortcut("system:pastestyle", tr("Edit: {0}", tr("Paste Tags")), KeyEvent.VK_V, Shortcut.CTRL_SHIFT).getKeyStroke(),
     295                Shortcut.registerShortcut("system:pastestyle", tr("Edit: {0}", tr("Paste Tags")), KeyEvent.VK_V, Shortcut.CTRL_SHIFT)
     296                        .getKeyStroke(),
    308297                getRootPane(), memberTable, selectionTable);
    309298        // CHECKSTYLE.ON: LineLength
    310299
     
    517506     *
    518507     * @return the panel for the relation member editor
    519508     */
    520     protected static JPanel buildMemberEditorPanel(
     509    static JPanel buildMemberEditorPanel(
    521510            LeftButtonToolbar leftButtonToolbar, IRelationEditorActionAccess editorAccess) {
    522511        final JPanel pnl = new JPanel(new GridBagLayout());
    523512        final JScrollPane scrollPane = new JScrollPane(editorAccess.getMemberTable());
  • test/unit/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditorTest.java

    IDEA additional info:
    Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
    <+>UTF-8
    diff --git a/test/unit/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditorTest.java b/test/unit/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditorTest.java
    a b  
    44import static org.junit.jupiter.api.Assertions.assertEquals;
    55import static org.junit.jupiter.api.Assertions.assertNotNull;
    66import static org.junit.jupiter.api.Assertions.assertNull;
     7import static org.junit.jupiter.api.Assertions.assertSame;
    78
     9import java.util.Collection;
    810import java.util.Collections;
    911
    1012import javax.swing.JOptionPane;
    1113import javax.swing.JPanel;
    1214
     15import mockit.Mock;
     16import mockit.MockUp;
    1317import org.junit.jupiter.api.Test;
    14 import org.junit.jupiter.api.extension.RegisterExtension;
     18import org.junit.platform.commons.support.ReflectionSupport;
    1519import org.openstreetmap.josm.TestUtils;
    1620import org.openstreetmap.josm.data.osm.DataSet;
    1721import org.openstreetmap.josm.data.osm.Node;
    1822import org.openstreetmap.josm.data.osm.OsmPrimitive;
    1923import org.openstreetmap.josm.data.osm.Relation;
    2024import org.openstreetmap.josm.data.osm.Way;
     25import org.openstreetmap.josm.gui.dialogs.relation.actions.IRelationEditorActionAccess;
     26import org.openstreetmap.josm.gui.dialogs.relation.actions.PasteMembersAction;
    2127import org.openstreetmap.josm.gui.layer.OsmDataLayer;
    2228import org.openstreetmap.josm.gui.tagging.TagEditorPanel;
    2329import org.openstreetmap.josm.gui.tagging.ac.AutoCompletingTextField;
    24 import org.openstreetmap.josm.testutils.JOSMTestRules;
     30import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetHandler;
     31import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
     32import org.openstreetmap.josm.testutils.annotations.Main;
    2533import org.openstreetmap.josm.testutils.mockers.JOptionPaneSimpleMocker;
    2634
    27 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
    28 
    2935/**
    3036 * Unit tests of {@link GenericRelationEditor} class.
    3137 */
     38@BasicPreferences
     39@Main
    3240public class GenericRelationEditorTest {
    33 
    34     /**
    35      * Setup test.
    36      */
    37     @RegisterExtension
    38     @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
    39     public JOSMTestRules test = new JOSMTestRules().preferences().main();
    40 
    4141    /**
    4242     * Returns a new relation editor for unit tests.
    4343     * @param orig relation
     
    132132        assertNotNull(top);
    133133        assertNotNull(tagEditorPanel.getModel());
    134134    }
     135
     136    @Test
     137    void testNonRegression23091() throws Exception {
     138        new MockUp<PasteMembersAction>() {
     139            @Mock
     140            protected void updateEnabledState() {
     141                // Do nothing
     142            }
     143        };
     144
     145        DataSet ds = new DataSet();
     146        Relation relation = new Relation(1);
     147        ds.addPrimitive(relation);
     148        OsmDataLayer layer = new OsmDataLayer(ds, "test", null);
     149
     150        final GenericRelationEditor gr = new GenericRelationEditor(layer, relation, Collections.emptyList());
     151        final IRelationEditorActionAccess iAccess = (IRelationEditorActionAccess)
     152                ReflectionSupport.tryToReadFieldValue(GenericRelationEditor.class.getDeclaredField("actionAccess"), gr)
     153                        .get();
     154        final TaggingPresetHandler handler = (TaggingPresetHandler)
     155                ReflectionSupport.tryToReadFieldValue(MemberTableModel.class.getDeclaredField("presetHandler"), iAccess.getMemberTableModel())
     156                        .get();
     157        final Collection<OsmPrimitive> selection = handler.getSelection();
     158        assertEquals(1, selection.size());
     159        assertSame(relation, selection.iterator().next(), "The selection should be the same");
     160    }
    135161}