001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.plugins.streetside.cache;
003
004
005import java.io.IOException;
006
007import org.apache.log4j.Logger;
008import org.openstreetmap.josm.data.cache.CacheEntry;
009import org.openstreetmap.josm.data.cache.CacheEntryAttributes;
010import org.openstreetmap.josm.data.cache.ICachedLoaderListener;
011import org.openstreetmap.josm.plugins.streetside.StreetsideImage;
012import org.openstreetmap.josm.plugins.streetside.cubemap.CubemapBuilder;
013
014/**
015* Utility methods for working with cache.
016*
017* @author nokutu
018*
019*/
020public final class CacheUtils {
021
022final static Logger logger = Logger.getLogger(CacheUtils.class);
023
024private static IgnoreDownload ignoreDownload = new IgnoreDownload();
025
026/** Picture quality */
027public enum PICTURE {
028 /** Thumbnail quality picture (320 p) */
029 THUMBNAIL,
030 /** Full quality picture (2048 p) */
031 FULL_IMAGE,
032 /** Both of them */
033 BOTH,
034 /** Streetside cubemap */
035 CUBEMAP
036}
037
038private CacheUtils() {
039 // Private constructor to avoid instantiation
040}
041
042/**
043* Downloads the the thumbnail and the full resolution picture of the given
044* image. Does nothing if it is already in cache.
045*
046* @param img
047*          The image whose picture is going to be downloaded.
048*/
049public static void downloadPicture(StreetsideImage img) {
050 downloadPicture(img, PICTURE.BOTH);
051}
052
053/**
054* Downloads the the thumbnail and the full resolution picture of the given
055* image. Does nothing if it is already in cache.
056*
057* @param cm
058*          The image whose picture is going to be downloaded.
059*/
060public static void downloadCubemap(StreetsideImage cm) {
061        downloadPicture(cm, PICTURE.CUBEMAP);
062}
063
064/**
065* Downloads the picture of the given image. Does nothing when it is already
066* in cache.
067*
068* @param img
069*          The image to be downloaded.
070* @param pic
071*          The picture type to be downloaded (full quality, thumbnail or
072*          both.)
073*/
074public static void downloadPicture(StreetsideImage img, PICTURE pic) {
075 switch (pic) {
076   case BOTH:
077     if (new StreetsideCache(img.getId(), StreetsideCache.Type.THUMBNAIL).get() == null)
078       submit(img.getId(), StreetsideCache.Type.THUMBNAIL, ignoreDownload);
079     if (new StreetsideCache(img.getId(), StreetsideCache.Type.FULL_IMAGE).get() == null)
080       submit(img.getId(), StreetsideCache.Type.FULL_IMAGE, ignoreDownload);
081     break;
082   case THUMBNAIL:
083     submit(img.getId(), StreetsideCache.Type.THUMBNAIL, ignoreDownload);
084     break;
085   case FULL_IMAGE:
086     // not used (relic from Mapillary)
087     break;
088   case CUBEMAP:
089           if(img.getId()==null) {
090                   logger.error("Download cancelled. Image id is null.");
091           } else {
092                   CubemapBuilder.getInstance().downloadCubemapImages(img.getId());
093           }
094           break;
095   default:
096     submit(img.getId(), StreetsideCache.Type.FULL_IMAGE, ignoreDownload);
097     break;
098 }
099}
100
101/**
102* Requests the picture with the given key and quality and uses the given
103* listener.
104*
105* @param key
106*          The key of the picture to be requested.
107* @param type
108*          The quality of the picture to be requested.
109* @param lis
110*          The listener that is going to receive the picture.
111*/
112public static void submit(String key, StreetsideCache.Type type,
113   ICachedLoaderListener lis) {
114 try {
115   new StreetsideCache(key, type).submit(lis, false);
116 } catch (IOException e) {
117   logger.error(e);
118 }
119}
120
121  private static class IgnoreDownload implements ICachedLoaderListener {
122
123    @Override
124    public void loadingFinished(CacheEntry arg0, CacheEntryAttributes arg1, LoadResult arg2) {
125      // Ignore download
126    }
127  }
128}