source: josm/trunk/src/org/openstreetmap/josm/data/osm/ChangesetCache.java@ 8444

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

remove extra whitespaces

  • Property svn:eol-style set to native
File size: 6.3 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.HashMap;
7import java.util.HashSet;
8import java.util.List;
9import java.util.Map;
10import java.util.Set;
11import java.util.concurrent.CopyOnWriteArrayList;
12
13import org.openstreetmap.josm.Main;
14import org.openstreetmap.josm.data.Preferences.PreferenceChangeEvent;
15import org.openstreetmap.josm.data.Preferences.PreferenceChangedListener;
16import org.openstreetmap.josm.gui.util.GuiHelper;
17
18/**
19 * ChangesetCache is global in-memory cache for changesets downloaded from
20 * an OSM API server. The unique instance is available as singleton, see
21 * {@link #getInstance()}.
22 *
23 * Clients interested in cache updates can register for {@link ChangesetCacheEvent}s
24 * using {@link #addChangesetCacheListener(ChangesetCacheListener)}. They can use
25 * {@link #removeChangesetCacheListener(ChangesetCacheListener)} to unregister as
26 * cache event listener.
27 *
28 * The cache itself listens to {@link java.util.prefs.PreferenceChangeEvent}s. It
29 * clears itself if the OSM API URL is changed in the preferences.
30 *
31 * {@link ChangesetCacheEvent}s are delivered on the EDT.
32 *
33 */
34public final class ChangesetCache implements PreferenceChangedListener{
35 /** the unique instance */
36 private static final ChangesetCache instance = new ChangesetCache();
37
38 /**
39 * Replies the unique instance of the cache
40 *
41 * @return the unique instance of the cache
42 */
43 public static ChangesetCache getInstance() {
44 return instance;
45 }
46
47 /** the cached changesets */
48 private final Map<Integer, Changeset> cache = new HashMap<>();
49
50 private final CopyOnWriteArrayList<ChangesetCacheListener> listeners = new CopyOnWriteArrayList<>();
51
52 private ChangesetCache() {
53 Main.pref.addPreferenceChangeListener(this);
54 }
55
56 public void addChangesetCacheListener(ChangesetCacheListener listener) {
57 if (listener != null) {
58 listeners.addIfAbsent(listener);
59 }
60 }
61
62 public void removeChangesetCacheListener(ChangesetCacheListener listener) {
63 if (listener != null) {
64 listeners.remove(listener);
65 }
66 }
67
68 protected void fireChangesetCacheEvent(final ChangesetCacheEvent e) {
69 GuiHelper.runInEDT(new Runnable() {
70 @Override public void run() {
71 for(ChangesetCacheListener l: listeners) {
72 l.changesetCacheUpdated(e);
73 }
74 }
75 });
76 }
77
78 protected void update(Changeset cs, DefaultChangesetCacheEvent e) {
79 if (cs == null) return;
80 if (cs.isNew()) return;
81 Changeset inCache = cache.get(cs.getId());
82 if (inCache != null) {
83 inCache.mergeFrom(cs);
84 e.rememberUpdatedChangeset(inCache);
85 } else {
86 e.rememberAddedChangeset(cs);
87 cache.put(cs.getId(), cs);
88 }
89 }
90
91 public void update(Changeset cs) {
92 DefaultChangesetCacheEvent e = new DefaultChangesetCacheEvent(this);
93 update(cs, e);
94 fireChangesetCacheEvent(e);
95 }
96
97 public void update(Collection<Changeset> changesets) {
98 if (changesets == null || changesets.isEmpty()) return;
99 DefaultChangesetCacheEvent e = new DefaultChangesetCacheEvent(this);
100 for (Changeset cs: changesets) {
101 update(cs, e);
102 }
103 fireChangesetCacheEvent(e);
104 }
105
106 public boolean contains(int id) {
107 if (id <=0) return false;
108 return cache.get(id) != null;
109 }
110
111 public boolean contains(Changeset cs) {
112 if (cs == null) return false;
113 if (cs.isNew()) return false;
114 return contains(cs.getId());
115 }
116
117 public Changeset get(int id) {
118 return cache.get(id);
119 }
120
121 public Set<Changeset> getChangesets() {
122 return new HashSet<>(cache.values());
123 }
124
125 protected void remove(int id, DefaultChangesetCacheEvent e) {
126 if (id <= 0) return;
127 Changeset cs = cache.get(id);
128 if (cs == null) return;
129 cache.remove(id);
130 e.rememberRemovedChangeset(cs);
131 }
132
133 public void remove(int id) {
134 DefaultChangesetCacheEvent e = new DefaultChangesetCacheEvent(this);
135 remove(id, e);
136 if (!e.isEmpty()) {
137 fireChangesetCacheEvent(e);
138 }
139 }
140
141 public void remove(Changeset cs) {
142 if (cs == null) return;
143 if (cs.isNew()) return;
144 remove(cs.getId());
145 }
146
147 /**
148 * Removes the changesets in <code>changesets</code> from the cache. A
149 * {@link ChangesetCacheEvent} is fired.
150 *
151 * @param changesets the changesets to remove. Ignored if null.
152 */
153 public void remove(Collection<Changeset> changesets) {
154 if (changesets == null) return;
155 DefaultChangesetCacheEvent evt = new DefaultChangesetCacheEvent(this);
156 for (Changeset cs : changesets) {
157 if (cs == null || cs.isNew()) {
158 continue;
159 }
160 remove(cs.getId(), evt);
161 }
162 if (!evt.isEmpty()) {
163 fireChangesetCacheEvent(evt);
164 }
165 }
166
167 public int size() {
168 return cache.size();
169 }
170
171 public void clear() {
172 DefaultChangesetCacheEvent e = new DefaultChangesetCacheEvent(this);
173 for (Changeset cs: cache.values()) {
174 e.rememberRemovedChangeset(cs);
175 }
176 cache.clear();
177 fireChangesetCacheEvent(e);
178 }
179
180 /**
181 * Replies the list of open changesets.
182 * @return The list of open changesets
183 */
184 public List<Changeset> getOpenChangesets() {
185 List<Changeset> ret = new ArrayList<>();
186 for (Changeset cs: cache.values()) {
187 if (cs.isOpen()) {
188 ret.add(cs);
189 }
190 }
191 return ret;
192 }
193
194 /* ------------------------------------------------------------------------- */
195 /* interface PreferenceChangedListener */
196 /* ------------------------------------------------------------------------- */
197 @Override
198 public void preferenceChanged(PreferenceChangeEvent e) {
199 if (e.getKey() == null || !"osm-server.url".equals(e.getKey()))
200 return;
201
202 // clear the cache when the API url changes
203 if (e.getOldValue() == null || e.getNewValue() == null || !e.getOldValue().equals(e.getNewValue())) {
204 clear();
205 }
206 }
207}
Note: See TracBrowser for help on using the repository browser.