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

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

fix sonar squid:S2039 - Member variable visibility should be specified

  • Property svn:eol-style set to native
File size: 4.1 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 * @since 2305
17 */
18public class PrimitiveDeepCopy {
19
20 public interface PasteBufferChangedListener {
21 void pasteBufferChanged(PrimitiveDeepCopy pasteBuffer);
22 }
23
24 private final List<PrimitiveData> directlyAdded = new ArrayList<>();
25 private final List<PrimitiveData> referenced = new ArrayList<>();
26 private final CopyOnWriteArrayList<PasteBufferChangedListener> listeners = new CopyOnWriteArrayList<>();
27
28 /**
29 * Constructs a new {@code PrimitiveDeepCopy} without data. Use {@link #makeCopy(Collection)} after that.
30 */
31 public PrimitiveDeepCopy() {
32 // Do nothing
33 }
34
35 /**
36 * Constructs a new {@code PrimitiveDeepCopy} of given OSM primitives.
37 * @param primitives OSM primitives to copy
38 * @since 7961
39 */
40 public PrimitiveDeepCopy(final Collection<? extends OsmPrimitive> primitives) {
41 makeCopy(primitives);
42 }
43
44 /**
45 * Replace content of the object with copy of provided primitives.
46 * @param primitives OSM primitives to copy
47 * @since 7961
48 */
49 public final void makeCopy(final Collection<? extends OsmPrimitive> primitives) {
50 directlyAdded.clear();
51 referenced.clear();
52
53 final Set<Long> visitedNodeIds = new HashSet<>();
54 final Set<Long> visitedWayIds = new HashSet<>();
55 final Set<Long> visitedRelationIds = new HashSet<>();
56
57 new AbstractVisitor() {
58 private boolean firstIteration;
59
60 @Override
61 public void visit(Node n) {
62 if (!visitedNodeIds.add(n.getUniqueId()))
63 return;
64 (firstIteration ? directlyAdded : referenced).add(n.save());
65 }
66 @Override
67 public void visit(Way w) {
68 if (!visitedWayIds.add(w.getUniqueId()))
69 return;
70 (firstIteration ? directlyAdded : referenced).add(w.save());
71 firstIteration = false;
72 for (Node n : w.getNodes()) {
73 visit(n);
74 }
75 }
76 @Override
77 public void visit(Relation r) {
78 if (!visitedRelationIds.add(r.getUniqueId()))
79 return;
80 (firstIteration ? directlyAdded : referenced).add(r.save());
81 firstIteration = false;
82 for (RelationMember m : r.getMembers()) {
83 m.getMember().accept(this);
84 }
85 }
86
87 public final void visitAll() {
88 for (OsmPrimitive osm : primitives) {
89 firstIteration = true;
90 osm.accept(this);
91 }
92 }
93 }.visitAll();
94
95 firePasteBufferChanged();
96 }
97
98 public List<PrimitiveData> getDirectlyAdded() {
99 return directlyAdded;
100 }
101
102 public List<PrimitiveData> getReferenced() {
103 return referenced;
104 }
105
106 public List<PrimitiveData> getAll() {
107 List<PrimitiveData> result = new ArrayList<>(directlyAdded.size() + referenced.size());
108 result.addAll(directlyAdded);
109 result.addAll(referenced);
110 return result;
111 }
112
113 public boolean isEmpty() {
114 return directlyAdded.isEmpty() && referenced.isEmpty();
115 }
116
117 private void firePasteBufferChanged() {
118 for (PasteBufferChangedListener listener: listeners) {
119 listener.pasteBufferChanged(this);
120 }
121 }
122
123 public void addPasteBufferChangedListener(PasteBufferChangedListener listener) {
124 listeners.addIfAbsent(listener);
125 }
126
127 public void removePasteBufferChangedListener(PasteBufferChangedListener listener) {
128 listeners.remove(listener);
129 }
130}
Note: See TracBrowser for help on using the repository browser.