source: josm/trunk/src/org/openstreetmap/josm/data/osm/visitor/MergeSourceBuildingVisitor.java@ 1937

Last change on this file since 1937 was 1937, checked in by jttt, 15 years ago

Replace some occurrences of RelationMember.member with getters

File size: 8.3 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.data.osm.visitor;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.util.ArrayList;
7import java.util.HashMap;
8import java.util.List;
9
10import org.openstreetmap.josm.data.osm.DataSet;
11import org.openstreetmap.josm.data.osm.Node;
12import org.openstreetmap.josm.data.osm.OsmPrimitive;
13import org.openstreetmap.josm.data.osm.Relation;
14import org.openstreetmap.josm.data.osm.RelationMember;
15import org.openstreetmap.josm.data.osm.Way;
16
17/**
18 * MergeSourceBuildingVisitor helps to build the "hull" of a collection of {@see OsmPrimitive}s
19 * which shall be merged into another layer. The "hull" is slightly bigger than the original
20 * collection. It includes, for instance the nodes of a way in the original collection even though
21 * these nodes might not be present explicitly in the original collection. The "hull" also includes
22 * incomplete {@see OsmPrimitive}s which are referred to by relations in the original collection. And
23 * it turns {@see OsmPrimitive} referred to by {@see Relation}s in the original collection into
24 * incomplete {@see OsmPrimitive}s in the "hull", if they are not themselves present in the
25 * original collection.
26 *
27 */
28public class MergeSourceBuildingVisitor extends AbstractVisitor {
29 private DataSet selectionBase;
30 private DataSet hull;
31 private HashMap<OsmPrimitive, OsmPrimitive> mappedPrimitives;
32
33 /**
34 * Creates the visitor. The visitor starts to build the "hull" from
35 * the currently selected primitives in the dataset <code>selectionBase</code>,
36 * i.e. from {@see DataSet#getSelected()}.
37 *
38 * @param selectionBase the dataset. Must not be null.
39 * @exception IllegalArgumentException thrown if selectionBase is null
40 *
41 */
42 public MergeSourceBuildingVisitor(DataSet selectionBase) throws IllegalArgumentException {
43 if (selectionBase == null)
44 throw new IllegalArgumentException(tr("parameter ''{0}'' must not be null", "selectionBase"));
45 this.selectionBase = selectionBase;
46 this.hull = new DataSet();
47 this.mappedPrimitives = new HashMap<OsmPrimitive, OsmPrimitive>();
48 }
49
50 /**
51 * Remebers a node in the "hull"
52 *
53 * @param n the node
54 */
55 protected void rememberNode(Node n) {
56 if (isAlreadyRemembered(n))
57 return;
58 Node clone = new Node(n);
59 mappedPrimitives.put(n, clone);
60 }
61
62 /**
63 * remembers a way in the hull
64 *
65 * @param w the way
66 */
67 protected void rememberWay(Way w) {
68 if (isAlreadyRemembered(w))
69 return;
70 Way clone = new Way(w);
71 List<Node> newNodes = new ArrayList<Node>();
72 for (Node n: w.getNodes()) {
73 newNodes.add((Node)mappedPrimitives.get(n));
74 }
75 clone.setNodes(newNodes);
76 mappedPrimitives.put(w, clone);
77 }
78
79 /**
80 * Remembers a relation in the hull
81 *
82 * @param r the relation
83 */
84 protected void rememberRelation(Relation r) {
85 Relation clone;
86 if (mappedPrimitives.keySet().contains(r)) {
87 clone = (Relation)mappedPrimitives.get(r);
88 clone.cloneFrom(r);
89 } else {
90 clone = new Relation(r);
91 }
92 clone.members.clear();
93 for (RelationMember member: r.getMembers()) {
94 RelationMember cloneMember = new RelationMember(member.getRole(), mappedPrimitives.get(member.getMember()));
95 clone.members.add(cloneMember);
96 }
97 if (! mappedPrimitives.keySet().contains(r)) {
98 mappedPrimitives.put(r, clone);
99 }
100 }
101
102 protected void rememberRelationPartial(Relation r) {
103 if (isAlreadyRemembered(r))
104 return;
105 Relation clone = new Relation(r);
106 clone.members.clear();
107 mappedPrimitives.put(r, clone);
108 }
109
110 protected void rememberIncomplete(OsmPrimitive primitive) {
111 if (isAlreadyRemembered(primitive))
112 return;
113 OsmPrimitive clone = null;
114 if (primitive instanceof Node) {
115 clone = new Node(primitive.id);
116 } else if (primitive instanceof Way) {
117 clone = new Way(primitive.id);
118 } else if (primitive instanceof Relation) {
119 clone = new Relation(primitive.id);
120 }
121 clone.incomplete = true;
122 mappedPrimitives.put(primitive, clone);
123 }
124
125 protected void rememberNodeIncomplete(Node n) {
126 if (isAlreadyRemembered(n))
127 return;
128 Node clone = new Node(n);
129 clone.incomplete = true;
130 mappedPrimitives.put(n, clone);
131 }
132
133 protected void rememberWayIncomplete(Way w) {
134 if (isAlreadyRemembered(w))
135 return;
136 Way clone = new Way(w);
137 clone.setNodes(null);
138 clone.incomplete = true;
139 mappedPrimitives.put(w, clone);
140 }
141
142 protected void rememberRelationIncomplete(Relation r) {
143 Relation clone;
144 if (isAlreadyRemembered(r)) {
145 clone = (Relation)mappedPrimitives.get(r);
146 clone.cloneFrom(r);
147 } else {
148 clone = new Relation(r);
149 }
150 clone.members.clear();
151 clone.incomplete = true;
152 if (! isAlreadyRemembered(r)) {
153 mappedPrimitives.put(r, clone);
154 }
155 }
156
157 public void visit(Node n) {
158 rememberNode(n);
159 }
160
161 public void visit(Way w) {
162 // remember all nodes this way refers to ...
163 //
164 for (Node n: w.getNodes()) {
165 if (! isAlreadyRemembered(n)) {
166 n.visit(this);
167 }
168 }
169 // ... and the way itself
170 rememberWay(w);
171 }
172
173 protected boolean isNew(OsmPrimitive primitive) {
174 return primitive.id == 0;
175 }
176
177 protected boolean isInSelectionBase(OsmPrimitive primitive) {
178 return selectionBase.getSelected().contains(primitive);
179 }
180
181 protected boolean isAlreadyRemembered(OsmPrimitive primitive) {
182 return mappedPrimitives.keySet().contains(primitive);
183 }
184
185 public void visit(Relation r) {
186 // first, remember all primitives members refer to (only if necessary, see
187 // below)
188 //
189 rememberRelationPartial(r);
190 for (RelationMember member: r.getMembers()) {
191 if (isAlreadyRemembered(member.getMember())) {
192 // referred primitive already remembered
193 //
194 continue;
195 }
196 if (member.isNode()) {
197 Node node = member.getNode();
198 if (isInSelectionBase(node)) {
199 rememberNode(node);
200 } else if (isNew(node)) {
201 rememberNode(node);
202 } else {
203 rememberNodeIncomplete(node);
204 }
205 } else if (member.isWay()) {
206 Way way = member.getWay();
207 if (isInSelectionBase(way)) {
208 way.visit(this);
209 } else if (isNew(way)) {
210 way.visit(this);
211 } else {
212 rememberWayIncomplete(way);
213 }
214 } else if (member.isRelation()) {
215 Relation relation = member.getRelation();
216 if (isInSelectionBase(member.getMember())) {
217 relation.visit(this);
218 } else if (isNew(relation)) {
219 relation.visit(this);
220 } else {
221 rememberRelationIncomplete(relation);
222 }
223 }
224 }
225 rememberRelation(r);
226 }
227
228 protected void buildHull() {
229 for (OsmPrimitive primitive : mappedPrimitives.keySet()) {
230 OsmPrimitive clone = mappedPrimitives.get(primitive);
231 if (clone instanceof Node) {
232 hull.nodes.add((Node)clone);
233 } else if (clone instanceof Way) {
234 hull.ways.add((Way)clone);
235 } else if (clone instanceof Relation) {
236 hull.relations.add((Relation)clone);
237 }
238 }
239 }
240
241 public DataSet build() {
242 for (OsmPrimitive primitive: selectionBase.getSelected()) {
243 primitive.visit(this);
244 }
245 buildHull();
246 return hull;
247 }
248}
Note: See TracBrowser for help on using the repository browser.