1 | // License: GPL. For details, see LICENSE file.
|
---|
2 | package org.openstreetmap.josm.data.imagery;
|
---|
3 |
|
---|
4 | import java.io.IOException;
|
---|
5 | import java.util.Map;
|
---|
6 |
|
---|
7 | import org.apache.commons.jcs.access.behavior.ICacheAccess;
|
---|
8 | import org.openstreetmap.gui.jmapviewer.Tile;
|
---|
9 | import org.openstreetmap.gui.jmapviewer.interfaces.CachedTileLoader;
|
---|
10 | import org.openstreetmap.gui.jmapviewer.interfaces.TileCache;
|
---|
11 | import org.openstreetmap.gui.jmapviewer.interfaces.TileJob;
|
---|
12 | import org.openstreetmap.gui.jmapviewer.interfaces.TileLoader;
|
---|
13 | import org.openstreetmap.gui.jmapviewer.interfaces.TileLoaderListener;
|
---|
14 | import org.openstreetmap.gui.jmapviewer.interfaces.TileSource;
|
---|
15 | import org.openstreetmap.josm.data.cache.BufferedImageCacheEntry;
|
---|
16 | import org.openstreetmap.josm.data.cache.JCSCacheManager;
|
---|
17 | import org.openstreetmap.josm.data.preferences.IntegerProperty;
|
---|
18 |
|
---|
19 | /**
|
---|
20 | * @author Wiktor Niesiobędzki
|
---|
21 | *
|
---|
22 | * Wrapper class that bridges between JCS cache and Tile Loaders
|
---|
23 | *
|
---|
24 | */
|
---|
25 | public class TMSCachedTileLoader implements TileLoader, CachedTileLoader, TileCache {
|
---|
26 |
|
---|
27 | private ICacheAccess<String, BufferedImageCacheEntry> cache;
|
---|
28 | private int connectTimeout;
|
---|
29 | private int readTimeout;
|
---|
30 | private Map<String, String> headers;
|
---|
31 | private TileLoaderListener listener;
|
---|
32 | public static final String PREFERENCE_PREFIX = "imagery.tms.cache.";
|
---|
33 | // average tile size is about 20kb
|
---|
34 | public static IntegerProperty MAX_OBJECTS_ON_DISK = new IntegerProperty(PREFERENCE_PREFIX + "max_objects_disk", 25000); // 25000 is around 500MB under this assumptions
|
---|
35 |
|
---|
36 |
|
---|
37 | /**
|
---|
38 | * Constructor
|
---|
39 | * @param listener called when tile loading has finished
|
---|
40 | * @param name of the cache
|
---|
41 | * @param connectTimeout to remote resource
|
---|
42 | * @param readTimeout to remote resource
|
---|
43 | * @param headers to be sent along with request
|
---|
44 | * @param cacheDir where cache file shall reside
|
---|
45 | * @throws IOException when cache initialization fails
|
---|
46 | */
|
---|
47 | public TMSCachedTileLoader(TileLoaderListener listener, String name, int connectTimeout, int readTimeout, Map<String, String> headers, String cacheDir) throws IOException {
|
---|
48 | this.cache = JCSCacheManager.getCache(name,
|
---|
49 | 1000, // use JCS memory cache instead of MemoryTileCache
|
---|
50 | MAX_OBJECTS_ON_DISK.get(),
|
---|
51 | cacheDir);
|
---|
52 | this.connectTimeout = connectTimeout;
|
---|
53 | this.readTimeout = readTimeout;
|
---|
54 | this.headers = headers;
|
---|
55 | this.listener = listener;
|
---|
56 | }
|
---|
57 |
|
---|
58 | @Override
|
---|
59 | public TileJob createTileLoaderJob(Tile tile) {
|
---|
60 | return new TMSCachedTileLoaderJob(listener, tile, cache, connectTimeout, readTimeout, headers);
|
---|
61 | }
|
---|
62 |
|
---|
63 | @Override
|
---|
64 | public void clearCache() {
|
---|
65 | this.cache.clear();
|
---|
66 | }
|
---|
67 |
|
---|
68 | @Override
|
---|
69 | public Tile getTile(TileSource source, int x, int y, int z) {
|
---|
70 | return createTileLoaderJob(new Tile(source,x, y, z)).getTile();
|
---|
71 | }
|
---|
72 |
|
---|
73 | @Override
|
---|
74 | public void addTile(Tile tile) {
|
---|
75 | createTileLoaderJob(tile).submit();
|
---|
76 | }
|
---|
77 |
|
---|
78 | @Override
|
---|
79 | public int getTileCount() {
|
---|
80 | return 0;
|
---|
81 | }
|
---|
82 |
|
---|
83 | @Override
|
---|
84 | public void clear() {
|
---|
85 | cache.clear();
|
---|
86 | }
|
---|
87 |
|
---|
88 | public String getStats() {
|
---|
89 | return cache.getStats();
|
---|
90 | }
|
---|
91 | }
|
---|