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

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

removed OptionPaneUtil
cleanup of deprecated Layer API
cleanup of deprecated APIs in OsmPrimitive and Way
cleanup of imports

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