001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.plugins.streetside.cache;
003
004import java.net.URL;
005import java.util.HashMap;
006
007import org.openstreetmap.josm.data.cache.BufferedImageCacheEntry;
008import org.openstreetmap.josm.data.cache.JCSCachedTileLoaderJob;
009import org.openstreetmap.josm.data.imagery.TileJobOptions;
010import org.openstreetmap.josm.plugins.streetside.utils.StreetsideURL.VirtualEarth;
011
012/**
013 * Stores the downloaded pictures locally.
014 *
015 * @author nokutu
016 *
017 */
018public class StreetsideCache extends JCSCachedTileLoaderJob<String, BufferedImageCacheEntry> {
019
020        private final URL url;
021        private final String id;
022
023        /**
024         * Types of images.
025         *
026         * @author nokutu
027         */
028        public enum Type {
029                /** Full quality image */
030                FULL_IMAGE,
031                /** Low quality image */
032                THUMBNAIL,
033                /** cubemap faces */
034                // TODO: one class per cache/load required? really?!
035                CUBEMAP/*,
036                CUBEMAP_FRONT,
037                CUBEMAP_RIGHT,
038                CUBEMAP_BACK,
039                CUBEMAP_LEFT,
040                CUBEMAP_UP,
041                CUBEMAP_DOWN*/
042        }
043
044        /**
045         * Main constructor.
046         *
047         * @param id
048         *          The id of the image.
049         * @param type
050         *          The type of image that must be downloaded (THUMBNAIL or
051         *          FULL_IMAGE).
052         */
053        public StreetsideCache(final String id, final Type type) {
054                //ICacheAccess<String,BufferedImageCacheEntry>,TileJobOptions,ThreadPoolExecutor
055                // TODO: StreetsideCache.java:53: error: no suitable constructor found for JCSCachedTileLoaderJob(CacheAccess<String,BufferedImageCacheEntry>,int,int,HashMap<String,String>)
056//          [javac]             super(Caches.ImageCache.getInstance().getCache(), 50000, 50000, new HashMap<String,String>());
057//          [javac]             ^
058//          [javac]     constructor JCSCachedTileLoaderJob.JCSCachedTileLoaderJob(ICacheAccess<String,BufferedImageCacheEntry>,TileJobOptions,ThreadPoolExecutor) is not applicable
059//          [javac]       (actual and formal argument lists differ in length)
060//          [javac]     constructor JCSCachedTileLoaderJob.JCSCachedTileLoaderJob(ICacheAccess<String,BufferedImageCacheEntry>,TileJobOptions) is not applicable
061//          [javac]       (actual and formal argument lists differ in length)
062
063                //super(Caches.ImageCache.getInstance().getCache(), 50000, 50000, new HashMap<String,String>());
064                //super(Caches.ImageCache.getInstance().getCache(),TileJobOptions,ThreadpoolExecutor)
065                //TileJobOptions tjo = ;
066                super(Caches.ImageCache.getInstance().getCache(),new TileJobOptions(50000, 50000, new HashMap<String,String>(),50000l));
067
068                if (id == null || type == null) {
069                        this.id = null;
070                        url = null;
071                } else {
072                        //this.id = id + (type == Type.FULL_IMAGE ? ".FULL_IMAGE" : ".THUMBNAIL");
073                        // Add an "01" to the Streetside imageId in order to get a frontal thumbnail image for the display
074                        this.id = id;
075                        url = VirtualEarth.streetsideTile(id, type == Type.THUMBNAIL);
076                }
077        }
078
079        @Override
080        public String getCacheKey() {
081                return id;
082        }
083
084        @Override
085        public URL getUrl() {
086                return url;
087        }
088
089        @Override
090        protected BufferedImageCacheEntry createCacheEntry(byte[] content) {
091                return new BufferedImageCacheEntry(content);
092        }
093
094        @Override
095        protected boolean isObjectLoadable() {
096                if (cacheData == null) {
097                        return false;
098                }
099                final byte[] content = cacheData.getContent();
100                return content != null && content.length > 0;
101        }
102}