001 // License: GPL. For details, see LICENSE file.
002 package org.openstreetmap.josm.data.osm.history;
003
004 import java.text.MessageFormat;
005 import java.util.ArrayList;
006 import java.util.Collections;
007 import java.util.Date;
008 import java.util.List;
009
010 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
011 import org.openstreetmap.josm.data.osm.Relation;
012 import org.openstreetmap.josm.data.osm.RelationMemberData;
013 import org.openstreetmap.josm.data.osm.User;
014 import org.openstreetmap.josm.tools.CheckParameterUtil;
015
016 /**
017 * Represents an immutable OSM relation in the context of a historical view on
018 * OSM data.
019 *
020 */
021 public class HistoryRelation extends HistoryOsmPrimitive{
022
023 private ArrayList<RelationMemberData> members = new ArrayList<RelationMemberData>();
024
025 /**
026 * constructor
027 *
028 * @param id the id (>0 required)
029 * @param version the version (> 0 required)
030 * @param visible whether the primitive is still visible
031 * @param user the user (! null required)
032 * @param changesetId the changeset id (> 0 required)
033 * @param timestamp the timestamp (! null required)
034 *
035 * @throws IllegalArgumentException if preconditions are violated
036 */
037 public HistoryRelation(long id, long version, boolean visible, User user, long changesetId, Date timestamp) throws IllegalArgumentException {
038 super(id, version, visible, user, changesetId, timestamp);
039 }
040
041 /**
042 * constructor
043 *
044 * @param id the id (>0 required)
045 * @param version the version (> 0 required)
046 * @param visible whether the primitive is still visible
047 * @param user the user (! null required)
048 * @param changesetId the changeset id (> 0 required if {@code checkHistoricParams} is true)
049 * @param timestamp the timestamp (! null required if {@code checkHistoricParams} is true)
050 * @param checkHistoricParams If true, checks values of {@code changesetId} and {@code timestamp}
051 *
052 * @throws IllegalArgumentException if preconditions are violated
053 * @since 5440
054 */
055 public HistoryRelation(long id, long version, boolean visible, User user, long changesetId, Date timestamp, boolean checkHistoricParams) throws IllegalArgumentException {
056 super(id, version, visible, user, changesetId, timestamp, checkHistoricParams);
057 }
058
059 /**
060 * constructor
061 *
062 * @param id the id (>0 required)
063 * @param version the version (> 0 required)
064 * @param visible whether the primitive is still visible
065 * @param user the user (! null required)
066 * @param changesetId the changeset id (> 0 required)
067 * @param timestamp the timestamp (! null required)
068 * @param members list of members for this relation
069 *
070 * @throws IllegalArgumentException thrown if preconditions are violated
071 */
072 public HistoryRelation(long id, long version, boolean visible, User user, long changesetId,
073 Date timestamp, ArrayList<RelationMemberData> members) {
074 this(id, version, visible, user, changesetId, timestamp);
075 if (members != null) {
076 this.members.addAll(members);
077 }
078 }
079
080 /**
081 * Constructs a new {@code HistoryRelation} from an existing {@link Relation}.
082 * @param r the relation
083 */
084 public HistoryRelation(Relation r) {
085 super(r);
086 }
087
088 /**
089 * replies an immutable list of members of this relation
090 *
091 * @return an immutable list of members of this relation
092 */
093 public List<RelationMemberData> getMembers() {
094 return Collections.unmodifiableList(members);
095 }
096
097 /**
098 * replies the number of members
099 *
100 * @return the number of members
101 *
102 */
103 public int getNumMembers() {
104 return members.size();
105 }
106
107 /**
108 * replies the idx-th member
109 * @param idx the index
110 * @return the idx-th member
111 * @throws IndexOutOfBoundsException thrown, if idx is out of bounds
112 */
113 public RelationMemberData getRelationMember(int idx) throws IndexOutOfBoundsException {
114 if (idx < 0 || idx >= members.size())
115 throw new IndexOutOfBoundsException(MessageFormat.format("Parameter {0} not in range 0..{1}. Got ''{2}''.", "idx", members.size(),idx));
116 return members.get(idx);
117 }
118
119 /**
120 * replies the type, i.e. {@link OsmPrimitiveType#RELATION}
121 *
122 */
123 @Override
124 public OsmPrimitiveType getType() {
125 return OsmPrimitiveType.RELATION;
126 }
127
128 /**
129 * adds a member to the list of members
130 *
131 * @param member the member (must not be null)
132 * @exception IllegalArgumentException thrown, if member is null
133 */
134 public void addMember(RelationMemberData member) throws IllegalArgumentException {
135 CheckParameterUtil.ensureParameterNotNull(member, "member");
136 members.add(member);
137 }
138
139 @Override
140 public String getDisplayName(HistoryNameFormatter formatter) {
141 return formatter.format(this);
142 }
143 }