// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.data.osm.history; import java.text.MessageFormat; import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.List; import org.openstreetmap.josm.data.osm.OsmPrimitiveType; import org.openstreetmap.josm.data.osm.Relation; import org.openstreetmap.josm.data.osm.RelationData; import org.openstreetmap.josm.data.osm.RelationMemberData; import org.openstreetmap.josm.data.osm.User; import org.openstreetmap.josm.tools.CheckParameterUtil; /** * Represents an immutable OSM relation in the context of a historical view on OSM data. * @since 1670 */ public class HistoryRelation extends HistoryOsmPrimitive { private final List<RelationMemberData> members = new ArrayList<>(); /** * constructor * * @param id the id (> 0 required) * @param version the version (> 0 required) * @param visible whether the primitive is still visible * @param user the user (!= null required) * @param changesetId the changeset id (> 0 required) * @param timestamp the timestamp (!= null required) * * @throws IllegalArgumentException if preconditions are violated */ public HistoryRelation(long id, long version, boolean visible, User user, long changesetId, Date timestamp) { super(id, version, visible, user, changesetId, timestamp); } /** * constructor * * @param id the id (> 0 required) * @param version the version (> 0 required) * @param visible whether the primitive is still visible * @param user the user (!= null required) * @param changesetId the changeset id (> 0 required if {@code checkHistoricParams} is true) * @param timestamp the timestamp (!= null required if {@code checkHistoricParams} is true) * @param checkHistoricParams If true, checks values of {@code changesetId} and {@code timestamp} * * @throws IllegalArgumentException if preconditions are violated * @since 5440 */ public HistoryRelation(long id, long version, boolean visible, User user, long changesetId, Date timestamp, boolean checkHistoricParams) { super(id, version, visible, user, changesetId, timestamp, checkHistoricParams); } /** * constructor * * @param id the id (> 0 required) * @param version the version (> 0 required) * @param visible whether the primitive is still visible * @param user the user (!= null required) * @param changesetId the changeset id (> 0 required) * @param timestamp the timestamp (!= null required) * @param members list of members for this relation * * @throws IllegalArgumentException if preconditions are violated */ public HistoryRelation(long id, long version, boolean visible, User user, long changesetId, Date timestamp, List<RelationMemberData> members) { this(id, version, visible, user, changesetId, timestamp); if (members != null) { this.members.addAll(members); } } /** * Constructs a new {@code HistoryRelation} from an existing {@link Relation}. * @param r the relation */ public HistoryRelation(Relation r) { super(r); } /** * replies an immutable list of members of this relation * * @return an immutable list of members of this relation */ public List<RelationMemberData> getMembers() { return Collections.unmodifiableList(members); } /** * replies the number of members * * @return the number of members * */ public int getNumMembers() { return members.size(); } /** * replies the idx-th member * @param idx the index * @return the idx-th member * @throws IndexOutOfBoundsException if idx is out of bounds */ public RelationMemberData getRelationMember(int idx) { if (idx < 0 || idx >= members.size()) throw new IndexOutOfBoundsException( MessageFormat.format("Parameter {0} not in range 0..{1}. Got ''{2}''.", "idx", members.size(), idx)); return members.get(idx); } /** * replies the type, i.e. {@link OsmPrimitiveType#RELATION} * */ @Override public OsmPrimitiveType getType() { return OsmPrimitiveType.RELATION; } /** * adds a member to the list of members * * @param member the member (must not be null) * @throws IllegalArgumentException if member is null */ public void addMember(RelationMemberData member) { CheckParameterUtil.ensureParameterNotNull(member, "member"); members.add(member); } @Override public String getDisplayName(HistoryNameFormatter formatter) { return formatter.format(this); } /** * Fills the relation attributes with values from this history. * @param data relation data to fill * @return filled relation data * @since 11878 */ public RelationData fillPrimitiveData(RelationData data) { super.fillPrimitiveCommonData(data); data.setMembers(members); return data; } }