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

Last change on this file since 10308 was 9059, checked in by Don-vip, 8 years ago

checkstyle

  • 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
67 @Override
68 public void visit(Way w) {
69 if (!visitedWayIds.add(w.getUniqueId()))
70 return;
71 (firstIteration ? directlyAdded : referenced).add(w.save());
72 firstIteration = false;
73 for (Node n : w.getNodes()) {
74 visit(n);
75 }
76 }
77
78 @Override
79 public void visit(Relation r) {
80 if (!visitedRelationIds.add(r.getUniqueId()))
81 return;
82 (firstIteration ? directlyAdded : referenced).add(r.save());
83 firstIteration = false;
84 for (RelationMember m : r.getMembers()) {
85 m.getMember().accept(this);
86 }
87 }
88
89 public void visitAll() {
90 for (OsmPrimitive osm : primitives) {
91 firstIteration = true;
92 osm.accept(this);
93 }
94 }
95 }.visitAll();
96
97 firePasteBufferChanged();
98 }
99
100 public List<PrimitiveData> getDirectlyAdded() {
101 return directlyAdded;
102 }
103
104 public List<PrimitiveData> getReferenced() {
105 return referenced;
106 }
107
108 public List<PrimitiveData> getAll() {
109 List<PrimitiveData> result = new ArrayList<>(directlyAdded.size() + referenced.size());
110 result.addAll(directlyAdded);
111 result.addAll(referenced);
112 return result;
113 }
114
115 public boolean isEmpty() {
116 return directlyAdded.isEmpty() && referenced.isEmpty();
117 }
118
119 private void firePasteBufferChanged() {
120 for (PasteBufferChangedListener listener: listeners) {
121 listener.pasteBufferChanged(this);
122 }
123 }
124
125 public void addPasteBufferChangedListener(PasteBufferChangedListener listener) {
126 listeners.addIfAbsent(listener);
127 }
128
129 public void removePasteBufferChangedListener(PasteBufferChangedListener listener) {
130 listeners.remove(listener);
131 }
132}
Note: See TracBrowser for help on using the repository browser.