001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.dialogs.relation.actions;
003
004import java.util.ArrayList;
005import java.util.Collections;
006import java.util.List;
007
008import org.openstreetmap.josm.data.osm.OsmPrimitive;
009import org.openstreetmap.josm.data.osm.Relation;
010import org.openstreetmap.josm.data.validation.tests.RelationChecker;
011import org.openstreetmap.josm.gui.ConditionalOptionPaneUtil;
012import org.openstreetmap.josm.gui.dialogs.relation.GenericRelationEditor;
013import org.openstreetmap.josm.gui.dialogs.relation.GenericRelationEditor.AddAbortException;
014import org.openstreetmap.josm.tools.Utils;
015
016/**
017 * Abstract superclass of "Add from selection" actions.
018 * @since 9496
019 */
020abstract class AddFromSelectionAction extends AbstractRelationEditorAction {
021    private static final long serialVersionUID = 1L;
022
023    protected AddFromSelectionAction(IRelationEditorActionAccess editorAccess,
024            IRelationEditorUpdateOn... updateOn) {
025        super(editorAccess, updateOn);
026    }
027
028    protected boolean isPotentialDuplicate(OsmPrimitive primitive) {
029        return editorAccess.getMemberTableModel().hasMembersReferringTo(Collections.singleton(primitive));
030    }
031
032    protected List<OsmPrimitive> filterConfirmedPrimitives(List<OsmPrimitive> primitives) throws AddAbortException {
033        if (Utils.isEmpty(primitives))
034            return primitives;
035        List<OsmPrimitive> ret = new ArrayList<>();
036        ConditionalOptionPaneUtil.startBulkOperation("add_primitive_to_relation");
037        for (OsmPrimitive primitive : primitives) {
038            if (primitive instanceof Relation) {
039                List<Relation> loop = RelationChecker.checkAddMember(editorAccess.getEditor().getRelation(), (Relation) primitive);
040                if (!loop.isEmpty() && loop.get(0).equals(loop.get(loop.size() - 1))) {
041                    GenericRelationEditor.warnOfCircularReferences(primitive, loop);
042                    continue;
043                }
044            }
045            if (isPotentialDuplicate(primitive)) {
046                if (GenericRelationEditor.confirmAddingPrimitive(primitive)) {
047                    ret.add(primitive);
048                }
049            } else {
050                ret.add(primitive);
051            }
052        }
053        ConditionalOptionPaneUtil.endBulkOperation("add_primitive_to_relation");
054        return ret;
055    }
056}