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

Last change on this file since 2615 was 2613, checked in by Gubaer, 14 years ago

new: global in-memory cache for downloaded changesets
new: toggle dialog for changesets
new: downloading of changesets (currently without changeset content, will follow later)

File size: 4.0 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.List;
8import java.util.Map;
9import java.util.concurrent.CopyOnWriteArrayList;
10import java.util.logging.Logger;
11
12public class ChangesetCache {
13 static private final Logger logger = Logger.getLogger(ChangesetCache.class.getName());
14 static private final ChangesetCache instance = new ChangesetCache();
15
16 public static ChangesetCache getInstance() {
17 return instance;
18 }
19
20 private final Map<Integer, Changeset> cache = new HashMap<Integer, Changeset>();
21
22 private final CopyOnWriteArrayList<ChangesetCacheListener> listeners =
23 new CopyOnWriteArrayList<ChangesetCacheListener>();
24
25 private ChangesetCache() {
26 }
27
28 public void addChangesetCacheListener(ChangesetCacheListener listener) {
29 synchronized(listeners) {
30 if (listener != null && ! listeners.contains(listener)) {
31 listeners.add(listener);
32 }
33 }
34 }
35
36 public void removeChangesetCacheListener(ChangesetCacheListener listener) {
37 synchronized(listeners) {
38 if (listener != null && listeners.contains(listener)) {
39 listeners.remove(listener);
40 }
41 }
42 }
43
44 protected void fireChangesetCacheEvent(ChangesetCacheEvent e) {
45 for(ChangesetCacheListener l: listeners) {
46 l.changesetCacheUpdated(e);
47 }
48 }
49
50 protected void update(Changeset cs, DefaultChangesetCacheEvent e) {
51 if (cs == null) return;
52 if (cs.isNew()) return;
53 Changeset inCache = cache.get(cs.getId());
54 if (inCache != null) {
55 inCache.mergeFrom(cs);
56 e.rememberUpdatedChangeset(inCache);
57 } else {
58 e.rememberAddedChangeset(cs);
59 cache.put(cs.getId(), cs);
60 }
61 }
62
63 public void update(Changeset cs) {
64 DefaultChangesetCacheEvent e = new DefaultChangesetCacheEvent(this);
65 update(cs, e);
66 fireChangesetCacheEvent(e);
67 }
68
69 public void update(Collection<Changeset> changesets) {
70 if (changesets == null || changesets.isEmpty()) return;
71 DefaultChangesetCacheEvent e = new DefaultChangesetCacheEvent(this);
72 for (Changeset cs: changesets) {
73 update(cs, e);
74 }
75 fireChangesetCacheEvent(e);
76 }
77
78 public boolean contains(int id) {
79 if (id <=0) return false;
80 return cache.get(id) != null;
81 }
82
83 public boolean contains(Changeset cs) {
84 if (cs == null) return false;
85 if (cs.isNew()) return false;
86 return contains(cs.getId());
87 }
88
89 public Changeset get(int id) {
90 return cache.get(id);
91 }
92
93 protected void remove(int id, DefaultChangesetCacheEvent e) {
94 if (id <= 0) return;
95 Changeset cs = cache.get(id);
96 if (cs == null) return;
97 cache.remove(id);
98 e.rememberRemovedChangeset(cs);
99 }
100
101 public void remove(int id) {
102 DefaultChangesetCacheEvent e = new DefaultChangesetCacheEvent(this);
103 remove(id, e);
104 if (! e.isEmpty()) {
105 fireChangesetCacheEvent(e);
106 }
107 }
108
109 public void remove(Changeset cs) {
110 if (cs == null) return;
111 if (cs.isNew()) return;
112 remove(cs.getId());
113 }
114
115 public int size() {
116 return cache.size();
117 }
118
119 public void clear() {
120 DefaultChangesetCacheEvent e = new DefaultChangesetCacheEvent(this);
121 for (Changeset cs: cache.values()) {
122 e.rememberRemovedChangeset(cs);
123 }
124 cache.clear();
125 fireChangesetCacheEvent(e);
126 }
127
128 public List<Changeset> getOpenChangesets() {
129 List<Changeset> ret = new ArrayList<Changeset>();
130 for (Changeset cs: cache.values()) {
131 if (cs.isOpen()) {
132 ret.add(cs);
133 }
134 }
135 return ret;
136 }
137}
Note: See TracBrowser for help on using the repository browser.