source: josm/trunk/src/org/openstreetmap/josm/data/osm/Relation.java@ 2077

Last change on this file since 2077 was 2077, checked in by Gubaer, 15 years ago

Had to replace DataSet:getPrimitiveById(id) with DataSet:getPrimitiveById(id,type). Primitive ids are not globally unique, only per type of primitive.
Fixed problems in unit test, available unit tests passing again.

  • Property svn:eol-style set to native
File size: 6.0 KB
Line 
1package org.openstreetmap.josm.data.osm;
2
3import java.util.ArrayList;
4import java.util.HashSet;
5import java.util.List;
6import java.util.Set;
7
8import org.openstreetmap.josm.data.osm.visitor.Visitor;
9import org.openstreetmap.josm.tools.CopyList;
10
11/**
12 * An relation, having a set of tags and any number (0...n) of members.
13 *
14 * @author Frederik Ramm <frederik@remote.org>
15 */
16public final class Relation extends OsmPrimitive {
17
18 /**
19 * All members of this relation. Note that after changing this,
20 * makeBackReferences and/or removeBackReferences should be called.
21 *
22 * @deprecated use the improved API instead of accessing this list directly
23 */
24 @Deprecated
25 public final List<RelationMember> members = new ArrayList<RelationMember>();
26
27 /**
28 * @return Members of the relation. Changes made in returned list are not mapped
29 * back to the primitive, use setMembers() to modify the members
30 * @since 1925
31 */
32 public List<RelationMember> getMembers() {
33 return new CopyList<RelationMember>(members.toArray(new RelationMember[members.size()]));
34 }
35
36 /**
37 *
38 * @param members Can be null, in that case all members are removed
39 * @since 1925
40 */
41 public void setMembers(List<RelationMember> members) {
42 this.members.clear();
43 if (members != null) {
44 this.members.addAll(members);
45 }
46 }
47
48 /**
49 *
50 * @since 1926
51 */
52 public int getMembersCount() {
53 return members.size();
54 }
55
56 /**
57 *
58 * @param index
59 * @return
60 * @since 1926
61 */
62 public RelationMember getMember(int index) {
63 return members.get(index);
64 }
65
66 /**
67 *
68 * @param member
69 * @since 1951
70 */
71 public void addMember(RelationMember member) {
72 members.add(member);
73 }
74
75 /**
76 *
77 * @param index
78 * @param member
79 * @since 1951
80 */
81 public void addMember(int index, RelationMember member) {
82 members.add(index, member);
83 }
84
85 /**
86 * Replace member at position specified by index.
87 * @param index
88 * @param member
89 * @return Member that was at the position
90 * @since 1951
91 */
92 public RelationMember setMember(int index, RelationMember member) {
93 return members.set(index, member);
94 }
95
96 /**
97 * Removes member at specified position.
98 * @param index
99 * @return Member that was at the position
100 * @since 1951
101 */
102 public RelationMember removeMember(int index) {
103 return members.remove(index);
104 }
105
106 @Override public void visit(Visitor visitor) {
107 visitor.visit(this);
108 }
109
110 /**
111 * Create a new relation with id 0
112 */
113 public Relation() {
114 super(0);
115 }
116
117 /**
118 * Create an identical clone of the argument (including the id)
119 */
120 public Relation(Relation clone) {
121 super(clone.getId());
122 cloneFrom(clone);
123 }
124
125 /**
126 * Creates a new relation for the given id. If the id > 0, the way is marked
127 * as incomplete.
128 *
129 * @param id the id. > 0 required
130 * @throws IllegalArgumentException thrown if id < 0
131 */
132 public Relation(long id) throws IllegalArgumentException {
133 super(id);
134 }
135
136
137 @Override public void cloneFrom(OsmPrimitive osm) {
138 super.cloneFrom(osm);
139 members.clear();
140 // we must not add the members themselves, but instead
141 // add clones of the members
142 for (RelationMember em : ((Relation)osm).getMembers()) {
143 members.add(new RelationMember(em));
144 }
145 }
146
147 @Override public String toString() {
148 // return "{Relation id="+id+" version="+version+" members="+Arrays.toString(members.toArray())+"}";
149 // adding members in string increases memory usage a lot and overflows for looped relations
150 return "{Relation id="+getId()+" version="+getVersion()+"}";
151 }
152
153 @Override
154 public boolean hasEqualSemanticAttributes(OsmPrimitive other) {
155 if (other == null || ! (other instanceof Relation) )
156 return false;
157 if (! super.hasEqualSemanticAttributes(other))
158 return false;
159 Relation r = (Relation)other;
160 return members.equals(r.members);
161 }
162
163 public int compareTo(OsmPrimitive o) {
164 return o instanceof Relation ? Long.valueOf(getId()).compareTo(o.getId()) : -1;
165 }
166
167 // seems to be different from member "incomplete" - FIXME
168 public boolean isIncomplete() {
169 for (RelationMember m : members)
170 if (m.getMember() == null)
171 return true;
172 return false;
173 }
174
175 public RelationMember firstMember() {
176 if (incomplete) return null;
177 return (members.size() == 0) ? null : members.get(0);
178 }
179 public RelationMember lastMember() {
180 if (incomplete) return null;
181 return (members.size() == 0) ? null : members.get(members.size() -1);
182 }
183
184 /**
185 * removes all members with member.member == primitive
186 *
187 * @param primitive the primitive to check for
188 */
189 public void removeMembersFor(OsmPrimitive primitive) {
190 if (primitive == null)
191 return;
192
193 ArrayList<RelationMember> todelete = new ArrayList<RelationMember>();
194 for (RelationMember member: members) {
195 if (member.getMember() == primitive) {
196 todelete.add(member);
197 }
198 }
199 members.removeAll(todelete);
200 }
201
202 @Override
203 public String getDisplayName(NameFormatter formatter) {
204 return formatter.format(this);
205 }
206
207 /**
208 * Replies the set of {@see OsmPrimitive}s referred to by at least one
209 * member of this relation
210 *
211 * @return the set of {@see OsmPrimitive}s referred to by at least one
212 * member of this relation
213 */
214 public Set<OsmPrimitive> getMemberPrimitives() {
215 HashSet<OsmPrimitive> ret = new HashSet<OsmPrimitive>();
216 for (RelationMember m: members) {
217 if (m.getMember() != null) {
218 ret.add(m.getMember());
219 }
220 }
221 return ret;
222 }
223}
Note: See TracBrowser for help on using the repository browser.