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

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

Removed deprecated constructors in ExtendedDialog
Turned most of the fields in the OSM data classes into private fields

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