source: josm/trunk/src/org/openstreetmap/josm/gui/layer/AbstractCachedTileSourceLayer.java@ 14481

Last change on this file since 14481 was 13643, checked in by wiktorn, 6 years ago

In case of any IOExceptions when creating disk cache return memory-only cache

Closes: #16193

  • Property svn:eol-style set to native
File size: 4.8 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.layer;
3
4import java.util.Map;
5import java.util.concurrent.ConcurrentHashMap;
6
7import org.apache.commons.jcs.access.CacheAccess;
8import org.apache.commons.jcs.access.behavior.ICacheAccess;
9import org.openstreetmap.gui.jmapviewer.interfaces.TileLoader;
10import org.openstreetmap.gui.jmapviewer.tilesources.AbstractTMSTileSource;
11import org.openstreetmap.josm.data.cache.BufferedImageCacheEntry;
12import org.openstreetmap.josm.data.cache.JCSCacheManager;
13import org.openstreetmap.josm.data.imagery.CachedTileLoaderFactory;
14import org.openstreetmap.josm.data.imagery.ImageryInfo;
15import org.openstreetmap.josm.data.imagery.TileLoaderFactory;
16import org.openstreetmap.josm.data.preferences.IntegerProperty;
17
18/**
19 *
20 * Class providing cache to other layers
21 *
22 * @author Wiktor Niesiobędzki
23 * @param <T> Tile Source class used by this Imagery Layer
24 *
25 */
26public abstract class AbstractCachedTileSourceLayer<T extends AbstractTMSTileSource> extends AbstractTileSourceLayer<T> {
27 /** loader factory responsible for loading tiles for all layers */
28 private static Map<String, TileLoaderFactory> loaderFactories = new ConcurrentHashMap<>();
29
30 private static final String PREFERENCE_PREFIX = "imagery.cache.";
31
32 private static volatile TileLoaderFactory loaderFactoryOverride;
33
34 /**
35 * how many object on disk should be stored for TMS region in MB. 500 MB is default value
36 */
37 public static final IntegerProperty MAX_DISK_CACHE_SIZE = new IntegerProperty(PREFERENCE_PREFIX + "max_disk_size", 512);
38
39 private ICacheAccess<String, BufferedImageCacheEntry> cache;
40 private volatile TileLoaderFactory loaderFactory;
41
42
43 /**
44 * Creates an instance of class based on InageryInfo
45 *
46 * @param info ImageryInfo describing the layer
47 */
48 public AbstractCachedTileSourceLayer(ImageryInfo info) {
49 super(info);
50
51 if (loaderFactoryOverride != null) {
52 loaderFactory = loaderFactoryOverride;
53 } else {
54 String key = this.getClass().getCanonicalName();
55 loaderFactory = loaderFactories.get(key);
56 if (loaderFactory == null) {
57 synchronized (AbstractCachedTileSourceLayer.class) {
58 // check again, maybe another thread initialized factory
59 loaderFactory = loaderFactories.get(key);
60 if (loaderFactory == null) {
61 loaderFactory = new CachedTileLoaderFactory(getCache(), getTileLoaderClass());
62 loaderFactories.put(key, loaderFactory);
63 }
64 }
65 }
66 }
67 }
68
69 @Override
70 protected synchronized TileLoaderFactory getTileLoaderFactory() {
71 if (loaderFactory == null) {
72 loaderFactory = new CachedTileLoaderFactory(getCache(), getTileLoaderClass());
73 }
74 return loaderFactory;
75 }
76
77 /**
78 * @return cache used by this layer
79 */
80 private synchronized ICacheAccess<String, BufferedImageCacheEntry> getCache() {
81 if (cache != null) {
82 return cache;
83 }
84 cache = JCSCacheManager.getCache(getCacheName(),
85 0,
86 getDiskCacheSize(),
87 CachedTileLoaderFactory.PROP_TILECACHE_DIR.get());
88 return cache;
89 }
90
91
92 /**
93 * Plugins that wish to set custom tile loader should call this method
94 * @param newLoaderFactory that will be used to load tiles
95 */
96
97 public static synchronized void setTileLoaderFactory(TileLoaderFactory newLoaderFactory) {
98 loaderFactoryOverride = newLoaderFactory;
99 }
100
101 /**
102 * Returns tile loader factory for cache region and specified TileLoader class
103 * @param name of the cache region
104 * @param klazz type of the TileLoader
105 * @return factory returning cached tile loaders using specified cache and TileLoaders
106 */
107 public static TileLoaderFactory getTileLoaderFactory(String name, Class<? extends TileLoader> klazz) {
108 CacheAccess<String, BufferedImageCacheEntry> cache = getCache(name);
109 if (cache == null) {
110 return null;
111 }
112 return new CachedTileLoaderFactory(cache, klazz);
113 }
114
115 /**
116 * @param name of cache region
117 * @return cache configured object for specified cache region
118 */
119 public static CacheAccess<String, BufferedImageCacheEntry> getCache(String name) {
120 return JCSCacheManager.getCache(name,
121 0,
122 MAX_DISK_CACHE_SIZE.get() * 1024, // MAX_DISK_CACHE_SIZE is in MB, needs to by in sync with getDiskCacheSize
123 CachedTileLoaderFactory.PROP_TILECACHE_DIR.get());
124 }
125
126 protected abstract Class<? extends TileLoader> getTileLoaderClass();
127
128 protected int getDiskCacheSize() {
129 return MAX_DISK_CACHE_SIZE.get() * 1024;
130 }
131
132 protected abstract String getCacheName();
133}
Note: See TracBrowser for help on using the repository browser.