source: josm/trunk/src/org/openstreetmap/josm/data/osm/PrimitiveDeepCopy.java@ 6890

Last change on this file since 6890 was 6890, checked in by Don-vip, 10 years ago

fix some Sonar issues (Constructor Calls Overridable Method)

  • Property svn:eol-style set to native
File size: 3.8 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.data.osm;
3
4import java.util.ArrayList;
5import java.util.Collection;
6import java.util.HashSet;
7import java.util.List;
8import java.util.Set;
9import java.util.concurrent.CopyOnWriteArrayList;
10
11import org.openstreetmap.josm.data.osm.visitor.AbstractVisitor;
12
13/**
14 * This class allows to create and keep a deep copy of primitives. Provides methods to access directly added
15 * primitives and reference primitives
16 *
17 */
18public class PrimitiveDeepCopy {
19
20 public interface PasteBufferChangedListener {
21 void pasteBufferChanged(PrimitiveDeepCopy pasteBuffer);
22 }
23
24 private final List<PrimitiveData> directlyAdded = new ArrayList<PrimitiveData>();
25 private final List<PrimitiveData> referenced = new ArrayList<PrimitiveData>();
26 private final CopyOnWriteArrayList<PasteBufferChangedListener> listeners = new CopyOnWriteArrayList<PasteBufferChangedListener>();
27
28 public PrimitiveDeepCopy() {
29
30 }
31
32 public PrimitiveDeepCopy(final Collection<OsmPrimitive> primitives) {
33 makeCopy(primitives);
34 }
35
36 /**
37 * Replace content of the object with copy of provided primitives
38 * @param primitives
39 */
40 public final void makeCopy(final Collection<OsmPrimitive> primitives) {
41 directlyAdded.clear();
42 referenced.clear();
43
44 final Set<Long> visitedNodeIds = new HashSet<Long>();
45 final Set<Long> visitedWayIds = new HashSet<Long>();
46 final Set<Long> visitedRelationIds = new HashSet<Long>();
47
48 new AbstractVisitor() {
49 boolean firstIteration;
50
51 @Override
52 public void visit(Node n) {
53 if (!visitedNodeIds.add(n.getUniqueId()))
54 return;
55 (firstIteration ? directlyAdded : referenced).add(n.save());
56 }
57 @Override
58 public void visit(Way w) {
59 if (!visitedWayIds.add(w.getUniqueId()))
60 return;
61 (firstIteration ? directlyAdded : referenced).add(w.save());
62 firstIteration = false;
63 for (Node n : w.getNodes()) {
64 visit(n);
65 }
66 }
67 @Override
68 public void visit(Relation r) {
69 if (!visitedRelationIds.add(r.getUniqueId()))
70 return;
71 (firstIteration ? directlyAdded : referenced).add(r.save());
72 firstIteration = false;
73 for (RelationMember m : r.getMembers()) {
74 m.getMember().accept(this);
75 }
76 }
77
78 public final void visitAll() {
79 for (OsmPrimitive osm : primitives) {
80 firstIteration = true;
81 osm.accept(this);
82 }
83 }
84 }.visitAll();
85
86 firePasteBufferChanged();
87 }
88
89 public List<PrimitiveData> getDirectlyAdded() {
90 return directlyAdded;
91 }
92
93 public List<PrimitiveData> getReferenced() {
94 return referenced;
95 }
96
97 public List<PrimitiveData> getAll() {
98 List<PrimitiveData> result = new ArrayList<PrimitiveData>(directlyAdded.size() + referenced.size());
99 result.addAll(directlyAdded);
100 result.addAll(referenced);
101 return result;
102 }
103
104 public boolean isEmpty() {
105 return directlyAdded.isEmpty() && referenced.isEmpty();
106 }
107
108 private void firePasteBufferChanged() {
109 for (PasteBufferChangedListener listener: listeners) {
110 listener.pasteBufferChanged(this);
111 }
112 }
113
114 public void addPasteBufferChangedListener(PasteBufferChangedListener listener) {
115 listeners.addIfAbsent(listener);
116 }
117
118 public void removePasteBufferChangedListener(PasteBufferChangedListener listener) {
119 listeners.remove(listener);
120 }
121
122}
Note: See TracBrowser for help on using the repository browser.