001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.command;
003
004import static org.openstreetmap.josm.tools.I18n.tr;
005
006import java.util.Collection;
007import java.util.List;
008import java.util.Objects;
009
010import org.openstreetmap.josm.data.osm.DataSet;
011import org.openstreetmap.josm.data.osm.DefaultNameFormatter;
012import org.openstreetmap.josm.data.osm.OsmPrimitive;
013import org.openstreetmap.josm.data.osm.Relation;
014import org.openstreetmap.josm.data.osm.RelationMember;
015
016/**
017 * Command that changes the members of a relation.
018 * The same can be done with ChangeCommand, but this is more efficient.
019 * @author Gerd Petermann
020 * @since 17199
021 *
022 */
023public class ChangeMembersCommand extends Command {
024
025    private final Relation relation;
026    private final List<RelationMember> cmdMembers;
027
028    /**
029     * Constructs a new {@code ChangeMembersCommand} in the context of a given data set.
030     * @param data the data set. Must not be null.
031     * @param relation the relation
032     * @param newMembers the new member list, must not be empty
033     */
034    public ChangeMembersCommand(DataSet data, Relation relation, List<RelationMember> newMembers) {
035        super(data);
036        this.relation = Objects.requireNonNull(relation, "relation");
037        this.cmdMembers = Objects.requireNonNull(newMembers, "newMembers");
038    }
039
040    /**
041     * Constructs a new {@code ChangeMembersCommand}  in the context of {@code r} data set.
042     * @param relation the relation. It must belong to a data set
043     * @param newMembers the new member list, must not be empty
044     */
045    public ChangeMembersCommand(Relation relation, List<RelationMember> newMembers) {
046        this(relation.getDataSet(), relation, newMembers);
047    }
048
049    @Override
050    public boolean executeCommand() {
051        super.executeCommand();
052        relation.setMembers(cmdMembers);
053        relation.setModified(true);
054        return true;
055
056    }
057
058    @Override
059    public String getDescriptionText() {
060        return tr("Change members of {0}", relation.getDisplayName(DefaultNameFormatter.getInstance()));
061    }
062
063    @Override
064    public void fillModifiedData(Collection<OsmPrimitive> modified, Collection<OsmPrimitive> deleted,
065            Collection<OsmPrimitive> added) {
066        modified.add(relation);
067    }
068
069    @Override
070    public int hashCode() {
071        return Objects.hash(super.hashCode(), relation, cmdMembers);
072    }
073
074    @Override
075    public boolean equals(Object obj) {
076        if (this == obj) return true;
077        if (obj == null || getClass() != obj.getClass()) return false;
078        if (!super.equals(obj)) return false;
079        ChangeMembersCommand that = (ChangeMembersCommand) obj;
080        return Objects.equals(relation, that.relation) &&
081               Objects.equals(cmdMembers, that.cmdMembers);
082    }
083
084}