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}